{"$schema":"https://ui.shadcn.com/schema/registry.json","name":"beui","homepage":"https://beui.dev","items":[{"name":"tilt-card","type":"registry:component","title":"Tilt Card","description":"3D perspective tilt on hover with cursor-tracked glare.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/tilt-card.tsx","type":"registry:component","target":"@components/motion/tilt-card.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/hooks/use-hover-capable.ts","type":"registry:hook","target":"@lib/hooks/use-hover-capable.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"button-base","type":"registry:component","title":"Button Button","description":"Press scale, hover lift, variants and sizes.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/button/base.tsx","type":"registry:component","target":"@components/motion/button/base.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/hooks/use-hover-capable.ts","type":"registry:hook","target":"@lib/hooks/use-hover-capable.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"button-stateful","type":"registry:component","title":"Button Stateful Button","description":"Idle → loading → success / error with blur-swap slots and morphing width.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/button/stateful.tsx","type":"registry:component","target":"@components/motion/button/stateful.tsx"},{"path":"components/motion/button/base.tsx","type":"registry:component","target":"@components/motion/button/base.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/hooks/use-hover-capable.ts","type":"registry:hook","target":"@lib/hooks/use-hover-capable.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"button-magnetic","type":"registry:component","title":"Button Magnetic Button","description":"Button composed with the Magnetic wrapper for cursor-attracted pull.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/button/magnetic.tsx","type":"registry:component","target":"@components/motion/button/magnetic.tsx"},{"path":"components/motion/magnetic.tsx","type":"registry:component","target":"@components/motion/magnetic.tsx"},{"path":"components/motion/button/base.tsx","type":"registry:component","target":"@components/motion/button/base.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/hooks/use-hover-capable.ts","type":"registry:hook","target":"@lib/hooks/use-hover-capable.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"marquee","type":"registry:component","title":"Marquee","description":"Infinite horizontal or vertical scroll with pause-on-hover.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/marquee.tsx","type":"registry:component","target":"@components/motion/marquee.tsx"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"tabs","type":"registry:component","title":"Tabs","description":"Pill, segment or underline tabs with a spring layoutId indicator.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/tabs.tsx","type":"registry:component","target":"@components/motion/tabs.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"switch","type":"registry:component","title":"Switch","description":"Toggle with a spring-driven thumb and press feedback.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/switch.tsx","type":"registry:component","target":"@components/motion/switch.tsx"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"input","type":"registry:component","title":"Input","description":"Text input with label, left/right icons, error shake and success check draw.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/input.tsx","type":"registry:component","target":"@components/motion/input.tsx"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"select","type":"registry:component","title":"Select Select","description":"Composable primitives (Select, SelectTrigger, SelectValue, SelectContent, SelectItem); the panel pinches off the trigger and separates, with staggered items. Position-aware (opens upward when needed).","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/select.tsx","type":"registry:component","target":"@components/motion/select.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"select-morph","type":"registry:component","title":"Select Morph Select","description":"Composable primitives (MorphSelect, MorphSelectTrigger, MorphSelectValue, MorphSelectContent, MorphSelectItem) where the trigger morphs into the panel via a shared layoutId — one continuous surface that grows open and shrinks back, never detaching.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/select-morph.tsx","type":"registry:component","target":"@components/motion/select-morph.tsx"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"checkbox","type":"registry:component","title":"Checkbox","description":"Form choice control with a draw-on checkmark, spring press feedback and indeterminate state support.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/checkbox.tsx","type":"registry:component","target":"@components/motion/checkbox.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"radio","type":"registry:component","title":"Radio Group","description":"Single-select choice control with a gliding layoutId indicator dot and spring press feedback.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/radio.tsx","type":"registry:component","target":"@components/motion/radio.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"bottom-sheet","type":"registry:component","title":"Bottom Sheet","description":"Vaul-inspired draggable bottom sheet with snap points, inertia and glass surface.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/bottom-sheet.tsx","type":"registry:component","target":"@components/motion/bottom-sheet.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"shared-layout-bg","type":"registry:component","title":"Shared Layout Background","description":"A pill that glides between hovered items via motion's shared layout, with blur enter/exit.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/shared-layout-bg.tsx","type":"registry:component","target":"@components/motion/shared-layout-bg.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"dock","type":"registry:component","title":"Dock","description":"macOS-style dock with grouped actions and a gliding active pill.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/dock.tsx","type":"registry:component","target":"@components/motion/dock.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"tooltip","type":"registry:component","title":"Tooltip","description":"Hover or focus tooltip with blur enter/exit and spring spawn.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/tooltip.tsx","type":"registry:component","target":"@components/motion/tooltip.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/hooks/use-hover-capable.ts","type":"registry:hook","target":"@lib/hooks/use-hover-capable.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"popover","type":"registry:component","title":"Popover","description":"Gooey popover whose panel oozes out of the trigger through an SVG goo filter — a liquid neck that stretches and pinches — with crisp content fading in on top. Click or hover trigger, controlled or uncontrolled.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/popover.tsx","type":"registry:component","target":"@components/motion/popover.tsx"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"morphing-modal","type":"registry:component","title":"Morphing Modal","description":"Family-app-style modal. A single panel that morphs its height as you navigate between inner views, with blur cross-fade on content.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/morphing-modal.tsx","type":"registry:component","target":"@components/motion/morphing-modal.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"text-reveal","type":"registry:component","title":"Text Animation Text Reveal","description":"Word or character reveal with spring slide-up and blur.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/text-reveal.tsx","type":"registry:component","target":"@components/motion/text-reveal.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"text-shimmer","type":"registry:component","title":"Text Animation Text Shimmer","description":"Gradient sweep across text for loading or emphasis.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/text-shimmer.tsx","type":"registry:component","target":"@components/motion/text-shimmer.tsx"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"text-cascade","type":"registry:component","title":"Text Animation Text Cascade","description":"Letter-by-letter slot roll for standalone text — old letters drop away as new ones land, left to right.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/text-cascade.tsx","type":"registry:component","target":"@components/motion/text-cascade.tsx"},{"path":"components/motion/action-swap.tsx","type":"registry:component","target":"@components/motion/action-swap.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"number-ticker","type":"registry:component","title":"Number Animation Number Ticker","description":"Slot-machine rolling digits with staggered entry.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/number-ticker.tsx","type":"registry:component","target":"@components/motion/number-ticker.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"animated-number","type":"registry:component","title":"Number Animation Animated Number","description":"Spring-driven count-up triggered when in view.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/animated-number.tsx","type":"registry:component","target":"@components/motion/animated-number.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"animated-badge","type":"registry:component","title":"Animated Badge","description":"Status badge with animated state icons, pulse feedback and compact size variants.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/animated-badge.tsx","type":"registry:component","target":"@components/motion/animated-badge.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"action-swap-cascade","type":"registry:component","title":"Action Swap Cascade","description":"Letter-by-letter slot roll — the old label's letters drop away as the new ones land, left to right.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/action-swap-cascade.tsx","type":"registry:component","target":"@components/motion/action-swap-cascade.tsx"},{"path":"components/motion/action-swap.tsx","type":"registry:component","target":"@components/motion/action-swap.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"action-swap-blur","type":"registry:component","title":"Action Swap Blur","description":"Copy-button style swap with blur, opacity and scale.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/action-swap-blur.tsx","type":"registry:component","target":"@components/motion/action-swap-blur.tsx"},{"path":"components/motion/action-swap.tsx","type":"registry:component","target":"@components/motion/action-swap.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"action-swap-roll","type":"registry:component","title":"Action Swap Roll","description":"The next text or icon rolls in from below with blur.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/action-swap-roll.tsx","type":"registry:component","target":"@components/motion/action-swap-roll.tsx"},{"path":"components/motion/action-swap.tsx","type":"registry:component","target":"@components/motion/action-swap.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"animated-toast-stack","type":"registry:component","title":"Animated Toast Stack","description":"Stacked toasts with status morphs, swipe dismissal, actions and layout-aware motion.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/animated-toast-stack.tsx","type":"registry:component","target":"@components/motion/animated-toast-stack.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"theme-toggle","type":"registry:component","title":"Theme Toggle","description":"Theme toggle button with a full-page rectangle clip-path reveal via the View Transition API.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","lucide-react","motion","next-themes","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/theme-toggle.tsx","type":"registry:component","target":"@components/motion/theme-toggle.tsx"},{"path":"components/motion/action-swap.tsx","type":"registry:component","target":"@components/motion/action-swap.tsx"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"}]},{"name":"bouncy-accordion","type":"registry:component","title":"Bouncy Accordion","description":"Single-open accordion with weighted spring layout, icon rows and reduced-motion-safe content reveals.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/bouncy-accordion.tsx","type":"registry:component","target":"@components/motion/bouncy-accordion.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"drawer","type":"registry:component","title":"Drawer","description":"Side panel that slides in from the left or right with a spring, backdrop blur, body scroll lock and esc-to-close.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/drawer.tsx","type":"registry:component","target":"@components/motion/drawer.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"smooth-scroll","type":"registry:component","title":"Scroll Animation Smooth Scroll","description":"Smooth-scroll provider over Lenis with a useSmoothScroll hook exposing scroll offset, progress and velocity. Reduced-motion safe.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["lenis","motion"],"registryDependencies":[],"files":[{"path":"components/motion/smooth-scroll.tsx","type":"registry:component","target":"@components/motion/smooth-scroll.tsx"}]},{"name":"scroll-progress","type":"registry:component","title":"Scroll Animation Scroll Progress","description":"Reading-progress indicator — fixed bar or circular ring — driven by scroll position via useSmoothScroll, with spring smoothing.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","lenis","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/scroll-progress.tsx","type":"registry:component","target":"@components/motion/scroll-progress.tsx"},{"path":"components/motion/smooth-scroll.tsx","type":"registry:component","target":"@components/motion/smooth-scroll.tsx"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"parallax","type":"registry:component","title":"Scroll Animation Parallax","description":"Wrapper that drifts its children at a speed factor as they cross the viewport, on either axis. Reduced-motion safe.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/parallax.tsx","type":"registry:component","target":"@components/motion/parallax.tsx"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"scroll-to","type":"registry:component","title":"Scroll Animation Scroll To","description":"Button that smooth-scrolls to a target (offset, selector or element) via the active SmoothScroll provider; reduced-motion jumps instantly.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","lenis","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/scroll-to.tsx","type":"registry:component","target":"@components/motion/scroll-to.tsx"},{"path":"components/motion/smooth-scroll.tsx","type":"registry:component","target":"@components/motion/smooth-scroll.tsx"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"scroll-reveal","type":"registry:component","title":"Scroll Animation Scroll Reveal","description":"Reveals its children with a spring slide and blur as they enter the viewport, once or every time. Reduced-motion keeps a fade.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/scroll-reveal.tsx","type":"registry:component","target":"@components/motion/scroll-reveal.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"range-slider","type":"registry:component","title":"Range Slider","description":"Range slider with tick dots and a bouncy vertical-bar thumb that glides between snapped steps; drag and keyboard control, reduced-motion safe.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/range-slider.tsx","type":"registry:component","target":"@components/motion/range-slider.tsx"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"table","type":"registry:component","title":"Table Data Table","description":"10k virtualized rows with sortable headers, row selection, column resize and reorder.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["@tanstack/react-virtual","clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/table/index.tsx","type":"registry:component","target":"@components/motion/table/index.tsx"},{"path":"components/motion/table/editable-cell.tsx","type":"registry:component","target":"@components/motion/table/editable-cell.tsx"},{"path":"components/motion/table/row-handle.tsx","type":"registry:component","target":"@components/motion/table/row-handle.tsx"},{"path":"components/motion/table/skeleton-rows.tsx","type":"registry:component","target":"@components/motion/table/skeleton-rows.tsx"},{"path":"components/motion/table/table-header.tsx","type":"registry:component","target":"@components/motion/table/table-header.tsx"},{"path":"components/motion/table/types.ts","type":"registry:component","target":"@components/motion/table/types.ts"},{"path":"components/motion/table/use-column-reorder.ts","type":"registry:component","target":"@components/motion/table/use-column-reorder.ts"},{"path":"components/motion/table/use-column-resize.ts","type":"registry:component","target":"@components/motion/table/use-column-resize.ts"},{"path":"components/motion/table/use-column-sort.ts","type":"registry:component","target":"@components/motion/table/use-column-sort.ts"},{"path":"components/motion/table/use-row-selection.ts","type":"registry:component","target":"@components/motion/table/use-row-selection.ts"},{"path":"components/motion/table/utils.ts","type":"registry:component","target":"@components/motion/table/utils.ts"},{"path":"components/motion/checkbox.tsx","type":"registry:component","target":"@components/motion/checkbox.tsx"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"components/motion/table/table-menu.tsx","type":"registry:component","target":"@components/motion/table/table-menu.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"}]},{"name":"table-editable","type":"registry:component","title":"Table Editable Table","description":"Edit cells inline and insert or delete rows and columns via border handles; the table re-renders from the updated data and column defs.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["@tanstack/react-virtual","clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/table/index.tsx","type":"registry:component","target":"@components/motion/table/index.tsx"},{"path":"components/motion/table/editable-cell.tsx","type":"registry:component","target":"@components/motion/table/editable-cell.tsx"},{"path":"components/motion/table/row-handle.tsx","type":"registry:component","target":"@components/motion/table/row-handle.tsx"},{"path":"components/motion/table/skeleton-rows.tsx","type":"registry:component","target":"@components/motion/table/skeleton-rows.tsx"},{"path":"components/motion/table/table-header.tsx","type":"registry:component","target":"@components/motion/table/table-header.tsx"},{"path":"components/motion/table/types.ts","type":"registry:component","target":"@components/motion/table/types.ts"},{"path":"components/motion/table/use-column-reorder.ts","type":"registry:component","target":"@components/motion/table/use-column-reorder.ts"},{"path":"components/motion/table/use-column-resize.ts","type":"registry:component","target":"@components/motion/table/use-column-resize.ts"},{"path":"components/motion/table/use-column-sort.ts","type":"registry:component","target":"@components/motion/table/use-column-sort.ts"},{"path":"components/motion/table/use-row-selection.ts","type":"registry:component","target":"@components/motion/table/use-row-selection.ts"},{"path":"components/motion/table/utils.ts","type":"registry:component","target":"@components/motion/table/utils.ts"},{"path":"components/motion/checkbox.tsx","type":"registry:component","target":"@components/motion/checkbox.tsx"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"components/motion/table/table-menu.tsx","type":"registry:component","target":"@components/motion/table/table-menu.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"}]},{"name":"table-async","type":"registry:component","title":"Table Async Table","description":"Loads pages on demand — skeleton rows on first load, then infinite scroll via onEndReached as the virtualized list nears the bottom.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["@tanstack/react-virtual","clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/table/index.tsx","type":"registry:component","target":"@components/motion/table/index.tsx"},{"path":"components/motion/table/editable-cell.tsx","type":"registry:component","target":"@components/motion/table/editable-cell.tsx"},{"path":"components/motion/table/row-handle.tsx","type":"registry:component","target":"@components/motion/table/row-handle.tsx"},{"path":"components/motion/table/skeleton-rows.tsx","type":"registry:component","target":"@components/motion/table/skeleton-rows.tsx"},{"path":"components/motion/table/table-header.tsx","type":"registry:component","target":"@components/motion/table/table-header.tsx"},{"path":"components/motion/table/types.ts","type":"registry:component","target":"@components/motion/table/types.ts"},{"path":"components/motion/table/use-column-reorder.ts","type":"registry:component","target":"@components/motion/table/use-column-reorder.ts"},{"path":"components/motion/table/use-column-resize.ts","type":"registry:component","target":"@components/motion/table/use-column-resize.ts"},{"path":"components/motion/table/use-column-sort.ts","type":"registry:component","target":"@components/motion/table/use-column-sort.ts"},{"path":"components/motion/table/use-row-selection.ts","type":"registry:component","target":"@components/motion/table/use-row-selection.ts"},{"path":"components/motion/table/utils.ts","type":"registry:component","target":"@components/motion/table/utils.ts"},{"path":"components/motion/checkbox.tsx","type":"registry:component","target":"@components/motion/checkbox.tsx"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"components/motion/table/table-menu.tsx","type":"registry:component","target":"@components/motion/table/table-menu.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"}]},{"name":"shader-background","type":"registry:component","title":"Shader Background","description":"Canvas shader backgrounds (mesh gradient, grain, warp, waves, voronoi, dot orbit and more) with a single typed variant prop. Reduced-motion freezes animated variants.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["@paper-design/shaders-react","clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/shader-background.tsx","type":"registry:component","target":"@components/motion/shader-background.tsx"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"cylinder-carousel","type":"registry:component","title":"Cylinder Carousel","description":"A carousel whose items line the inside of a cylinder, receding into the center and growing toward the edges. Drag, scroll or arrow-key to roll it, with a springy glide and snap. Reduced-motion drops the glide.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/cylinder-carousel.tsx","type":"registry:component","target":"@components/motion/cylinder-carousel.tsx"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"loader","type":"registry:component","title":"Loader","description":"Loading indicator with seventeen variants: spinner, dots, bars, dot-matrix, dither, morph, comet, scramble, metaballs, newton, helix, percent, and five terminal-style ascii spinners. Scales from one size prop, uses currentColor, and reduced-motion swaps every transform for a calm opacity pulse.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/loader.tsx","type":"registry:component","target":"@components/motion/loader.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"swap","type":"registry:block","title":"Multi-chain Swap","description":"Cross-chain swap widget with chain + token selectors, morphing views, animated flip and quote.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/swap.tsx","type":"registry:component","target":"@components/motion/swap.tsx"},{"path":"components/motion/swap/constants.ts","type":"registry:component","target":"@components/motion/swap/constants.ts"},{"path":"components/motion/swap/controls.tsx","type":"registry:component","target":"@components/motion/swap/controls.tsx"},{"path":"components/motion/swap/data.ts","type":"registry:component","target":"@components/motion/swap/data.ts"},{"path":"components/motion/swap/field.tsx","type":"registry:component","target":"@components/motion/swap/field.tsx"},{"path":"components/motion/swap/quote-row.tsx","type":"registry:component","target":"@components/motion/swap/quote-row.tsx"},{"path":"components/motion/swap/token-picker.tsx","type":"registry:component","target":"@components/motion/swap/token-picker.tsx"},{"path":"components/motion/swap/types.ts","type":"registry:component","target":"@components/motion/swap/types.ts"},{"path":"components/motion/swap/utils.ts","type":"registry:component","target":"@components/motion/swap/utils.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"components/motion/swap/token-badges.tsx","type":"registry:component","target":"@components/motion/swap/token-badges.tsx"}]},{"name":"dynamic-island","type":"registry:block","title":"Dynamic Island","description":"iOS-style island pill that morphs between live activity views with bouncy shell resize and blur crossfades.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/dynamic-island.tsx","type":"registry:component","target":"@components/motion/dynamic-island.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"command-palette","type":"registry:block","title":"Command Palette","description":"⌘K palette with fuzzy filter, spring-animated active row and glass surface.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/command-palette.tsx","type":"registry:component","target":"@components/motion/command-palette.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"expandable-action-bar","type":"registry:block","title":"Expandable Action Bar","description":"Compact icon actions that expand into labeled controls on hover or focus with shared layout motion.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/expandable-action-bar.tsx","type":"registry:component","target":"@components/motion/expandable-action-bar.tsx"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"overflow-actions","type":"registry:block","title":"Overflow Actions","description":"Connected pill rail for primary actions that springs open to reveal extra controls.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/overflow-actions.tsx","type":"registry:component","target":"@components/motion/overflow-actions.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/hooks/use-hover-capable.ts","type":"registry:hook","target":"@lib/hooks/use-hover-capable.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"expandable-tabs","type":"registry:block","title":"Expandable Tabs","description":"Icon tab bar where the active tab expands to a labelled pill, with a panel above that morphs height and slides content direction-aware on switch.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/expandable-tabs.tsx","type":"registry:component","target":"@components/motion/expandable-tabs.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"swipeable-list","type":"registry:block","title":"Swipeable List","description":"Mobile-style list rows that swipe left or right to reveal contextual action buttons.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/swipeable-list.tsx","type":"registry:component","target":"@components/motion/swipeable-list.tsx"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"file-upload","type":"registry:block","title":"File Upload","description":"Drag-and-drop upload queue with progress rows, retry/remove actions and reduced-motion-safe state changes.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/file-upload.tsx","type":"registry:component","target":"@components/motion/file-upload.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"prediction-market","type":"registry:block","title":"Prediction Market","description":"Prediction market trade ticket with buy/sell modes, outcome prices, rolling amount entry, quick add chips and trade states.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/prediction-market.tsx","type":"registry:component","target":"@components/motion/prediction-market.tsx"},{"path":"components/motion/button/stateful.tsx","type":"registry:component","target":"@components/motion/button/stateful.tsx"},{"path":"components/motion/number-ticker.tsx","type":"registry:component","target":"@components/motion/number-ticker.tsx"},{"path":"components/motion/tabs.tsx","type":"registry:component","target":"@components/motion/tabs.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"components/motion/button/base.tsx","type":"registry:component","target":"@components/motion/button/base.tsx"},{"path":"lib/hooks/use-hover-capable.ts","type":"registry:hook","target":"@lib/hooks/use-hover-capable.ts"}]},{"name":"wallet-card","type":"registry:block","title":"Wallet Card","description":"Wallet overview card with an account switcher and search that morph open from their triggers, a cascading balance with a live change pill and privacy toggle, copy-address, and Send / Deposit / Swap / Buy actions.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/wallet-card/index.tsx","type":"registry:component","target":"@components/motion/wallet-card/index.tsx"},{"path":"components/motion/wallet-card/account-switcher.tsx","type":"registry:component","target":"@components/motion/wallet-card/account-switcher.tsx"},{"path":"components/motion/wallet-card/actions.tsx","type":"registry:component","target":"@components/motion/wallet-card/actions.tsx"},{"path":"components/motion/wallet-card/balance-delta.tsx","type":"registry:component","target":"@components/motion/wallet-card/balance-delta.tsx"},{"path":"components/motion/wallet-card/search-bar.tsx","type":"registry:component","target":"@components/motion/wallet-card/search-bar.tsx"},{"path":"components/motion/wallet-card/types.ts","type":"registry:component","target":"@components/motion/wallet-card/types.ts"},{"path":"components/motion/action-swap.tsx","type":"registry:component","target":"@components/motion/action-swap.tsx"},{"path":"components/motion/button/index.tsx","type":"registry:component","target":"@components/motion/button/index.tsx"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"components/motion/wallet-card/account-avatar.tsx","type":"registry:component","target":"@components/motion/wallet-card/account-avatar.tsx"},{"path":"components/motion/wallet-card/constants.ts","type":"registry:component","target":"@components/motion/wallet-card/constants.ts"},{"path":"components/motion/wallet-card/copy-button.tsx","type":"registry:component","target":"@components/motion/wallet-card/copy-button.tsx"},{"path":"components/motion/wallet-card/use-dismiss.ts","type":"registry:component","target":"@components/motion/wallet-card/use-dismiss.ts"},{"path":"components/motion/wallet-card/utils.ts","type":"registry:component","target":"@components/motion/wallet-card/utils.ts"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"components/motion/button/base.tsx","type":"registry:component","target":"@components/motion/button/base.tsx"},{"path":"components/motion/button/magnetic.tsx","type":"registry:component","target":"@components/motion/button/magnetic.tsx"},{"path":"components/motion/button/stateful.tsx","type":"registry:component","target":"@components/motion/button/stateful.tsx"},{"path":"lib/hooks/use-hover-capable.ts","type":"registry:hook","target":"@lib/hooks/use-hover-capable.ts"},{"path":"components/motion/magnetic.tsx","type":"registry:component","target":"@components/motion/magnetic.tsx"}]},{"name":"otp-input","type":"registry:block","title":"OTP Input","description":"One-time-code input with a gliding focus ring, digits that roll in per slot, error shake and a success check draw.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/otp-input.tsx","type":"registry:component","target":"@components/motion/otp-input.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"bloom-menu","type":"registry:block","title":"Bloom Menu","description":"A button that morphs open into a menu and blooms iris-out from the center, the grid revealing in every direction with radially staggered items.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/bloom-menu.tsx","type":"registry:component","target":"@components/motion/bloom-menu.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"feedback-widget","type":"registry:block","title":"Feedback Widget","description":"Corner trigger that morphs open into a feedback popup with message entry and animated sending, success and retry states.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/feedback-widget.tsx","type":"registry:component","target":"@components/motion/feedback-widget.tsx"},{"path":"components/motion/button/index.tsx","type":"registry:component","target":"@components/motion/button/index.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"components/motion/button/base.tsx","type":"registry:component","target":"@components/motion/button/base.tsx"},{"path":"components/motion/button/magnetic.tsx","type":"registry:component","target":"@components/motion/button/magnetic.tsx"},{"path":"components/motion/button/stateful.tsx","type":"registry:component","target":"@components/motion/button/stateful.tsx"},{"path":"lib/hooks/use-hover-capable.ts","type":"registry:hook","target":"@lib/hooks/use-hover-capable.ts"},{"path":"components/motion/magnetic.tsx","type":"registry:component","target":"@components/motion/magnetic.tsx"}]},{"name":"not-found-glitch","type":"registry:block","title":"404 / Not Found Glitch","description":"Digits scramble through random glyphs before resolving, with a chromatic split on hover.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/not-found/glitch.tsx","type":"registry:component","target":"@components/motion/not-found/glitch.tsx"},{"path":"components/motion/not-found/shared.tsx","type":"registry:component","target":"@components/motion/not-found/shared.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/hooks/use-hover-capable.ts","type":"registry:hook","target":"@lib/hooks/use-hover-capable.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"not-found-magnetic","type":"registry:block","title":"404 / Not Found Magnetic","description":"Each digit is cursor-attracted via the Magnetic wrapper and springs back on leave.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/not-found/magnetic.tsx","type":"registry:component","target":"@components/motion/not-found/magnetic.tsx"},{"path":"components/motion/not-found/shared.tsx","type":"registry:component","target":"@components/motion/not-found/shared.tsx"},{"path":"components/motion/magnetic.tsx","type":"registry:component","target":"@components/motion/magnetic.tsx"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/hooks/use-hover-capable.ts","type":"registry:hook","target":"@lib/hooks/use-hover-capable.ts"}]},{"name":"not-found-spotlight","type":"registry:block","title":"404 / Not Found Spotlight","description":"A dark panel where a cursor-tracked spotlight reveals the bright code from a dim base.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/not-found/spotlight.tsx","type":"registry:component","target":"@components/motion/not-found/spotlight.tsx"},{"path":"components/motion/not-found/shared.tsx","type":"registry:component","target":"@components/motion/not-found/shared.tsx"},{"path":"lib/hooks/use-hover-capable.ts","type":"registry:hook","target":"@lib/hooks/use-hover-capable.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"}]},{"name":"not-found-stacked","type":"registry:block","title":"404 / Not Found Stacked","description":"A code card over a hidden stack that fans out with a spring on hover.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/not-found/stacked.tsx","type":"registry:component","target":"@components/motion/not-found/stacked.tsx"},{"path":"components/motion/not-found/shared.tsx","type":"registry:component","target":"@components/motion/not-found/shared.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/hooks/use-hover-capable.ts","type":"registry:hook","target":"@lib/hooks/use-hover-capable.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"not-found-terminal","type":"registry:block","title":"404 / Not Found Terminal","description":"A terminal window that types a failed cd command and a 404 status, with a blinking caret.","author":"Saurabh <saurabh10102@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/not-found/terminal.tsx","type":"registry:component","target":"@components/motion/not-found/terminal.tsx"},{"path":"components/motion/not-found/shared.tsx","type":"registry:component","target":"@components/motion/not-found/shared.tsx"},{"path":"components/motion/text-reveal.tsx","type":"registry:component","target":"@components/motion/text-reveal.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/hooks/use-hover-capable.ts","type":"registry:hook","target":"@lib/hooks/use-hover-capable.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]}]}