{"$schema":"https://ui.shadcn.com/schema/registry.json","name":"karaui","homepage":"https://karaui.kamisama-v0.my.id","items":[{"name":"tilt-card","type":"registry:component","title":"Tilt Card","description":"Wrap a product shot, pricing tier or profile in TiltCard and it leans toward the cursor in 3D while a soft highlight follows the pointer; tilt angle and glare are props, and it stays flat on touch screens and under reduced motion.","author":"kara <ztzyrant@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":"The everyday button: primary, secondary, ghost and outline styles in sm, md, lg and icon sizes, a spring dip on press, a slight grow on hover and an opt-in ripple from the press point. ButtonLink renders the same look as an anchor.","author":"kara <ztzyrant@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/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"button-stateful","type":"registry:component","title":"Button Stateful Button","description":"Set state to idle, loading, success or error and the label rolls over letter by letter, the icon slides in or out, and the button width eases to fit the new text. Copy for each state is a prop.","author":"kara <ztzyrant@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/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"button-magnetic","type":"registry:component","title":"Button Magnetic Button","description":"Button inside a Magnetic container, so it is tugged a little toward the cursor as it passes; strength (0.25 by default) sets the pull and the wrapper takes its own class.","author":"kara <ztzyrant@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"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"}]},{"name":"expanding-arrow-button","type":"registry:component","title":"Animated CTA Buttons Expanding Arrow Button","description":"The accent block on the left widens to cover the button and lays out a dotted arrow trail when you hover or tab to it, while the label fades aside.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/expanding-arrow-button.tsx","type":"registry:component","target":"@components/motion/expanding-arrow-button.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":"hold-action-button","type":"registry:component","title":"Animated CTA Buttons Hold Action Button","description":"Keep pressing with a mouse, finger, Space or Enter and a liquid fill rises or sweeps across; onHoldComplete fires only when it finishes, and letting go or sliding off cancels. Duration and labels are configurable.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/hold-action-button.tsx","type":"registry:component","target":"@components/motion/hold-action-button.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"slide-action-button","type":"registry:component","title":"Animated CTA Buttons Slide Action Button","description":"A thumb you drag along a track: past the threshold it locks in and calls onComplete, short of it the thumb springs home. Enter or Space completes it from the keyboard, and it resets after resetDelay.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/slide-action-button.tsx","type":"registry:component","target":"@components/motion/slide-action-button.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"marquee","type":"registry:component","title":"Marquee","description":"Loops logos, testimonials or tickers without end in any of four directions on a plain CSS keyframe animation, with adjustable speed and gap, a soft fade mask at both ends and an optional pause while the pointer rests on it.","author":"kara <ztzyrant@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":"Tabs, TabsList, TabsTrigger and TabsContent in pill, segment or underline styles; the active marker slides to the chosen trigger on a slightly weighty spring, hidden panels stay in the HTML for crawlers, and triggers grow to a 44px hit area on touch screens.","author":"kara <ztzyrant@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/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"switch","type":"registry:component","title":"Switch","description":"An on/off control exposed as role=\"switch\": a heavy spring carries the thumb across, it squashes a little while held, it shakes if pressed while disabled, and on coarse pointers the hit area grows to 44px. Label text is optional.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/switch.tsx","type":"registry:component","target":"@components/motion/switch.tsx"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"input","type":"registry:component","title":"Input","description":"A labelled form field with left and right icon slots: setting error shakes it, turns the border red and blurs a message in underneath, while success draws a check mark at the right edge. Works controlled or uncontrolled, with a classNames hook for every part.","author":"kara <ztzyrant@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":"Compose Select, SelectTrigger, SelectValue, SelectContent and SelectItem. Opening squeezes the list away from the button like a droplet splitting off, options cascade in, and it opens upward when there is no room below.","author":"kara <ztzyrant@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/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"select-morph","type":"registry:component","title":"Select Morph Select","description":"The same composable API with a Morph prefix, except trigger and list share a layoutId: the button stretches into the open list and shrinks back into a button without ever breaking into two pieces.","author":"kara <ztzyrant@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":"combobox","type":"registry:component","title":"Combobox","description":"A select you type into: the input is the trigger, items filter by label or extra keywords across groups, arrow keys move a sliding highlight, and the list springs open in a portal that holds its side while closing. Value, open state and query are controllable.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/combobox.tsx","type":"registry:component","target":"@components/motion/combobox.tsx"},{"path":"components/motion/combobox/content.tsx","type":"registry:component","target":"@components/motion/combobox/content.tsx"},{"path":"components/motion/combobox/context.tsx","type":"registry:component","target":"@components/motion/combobox/context.tsx"},{"path":"components/motion/combobox/list.tsx","type":"registry:component","target":"@components/motion/combobox/list.tsx"},{"path":"components/motion/combobox/trigger.tsx","type":"registry:component","target":"@components/motion/combobox/trigger.tsx"},{"path":"components/motion/popover-position.ts","type":"registry:component","target":"@components/motion/popover-position.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"}]},{"name":"checkbox","type":"registry:component","title":"Checkbox","description":"A role=\"checkbox\" control whose tick is drawn as an SVG stroke, that dips when pressed and shows a dash for the mixed state through indeterminate. Takes an optional label and aria-describedby for error text, and grows to a 44px hit area on touch devices.","author":"kara <ztzyrant@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/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"radio","type":"registry:component","title":"Radio Group","description":"RadioGroup and RadioGroupItem for picking one option: the filled dot travels from the old choice to the new one through a shared layoutId, items dip when pressed, groups run vertically or horizontally, and every item gets a 44px touch target.","author":"kara <ztzyrant@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/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"bottom-sheet","type":"registry:component","title":"Bottom Sheet","description":"A mobile-style sheet you drag between snap points (screen fractions or auto height); a fast flick or long pull dismisses it. It portals to the body, pins the page so iOS cannot scroll underneath, and closes on Escape or a scrim tap.","author":"kara <ztzyrant@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/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"pull-to-refresh","type":"registry:component","title":"Pull to Refresh","description":"Wrap a scrollable feed to get the gesture from native apps: dragging down from the top meets growing resistance, the indicator shows pull, release and refreshing states, and onRefresh can return a promise that keeps the spinner up until it resolves. Mouse drags work too.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/pull-to-refresh.tsx","type":"registry:component","target":"@components/motion/pull-to-refresh.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"shared-layout-bg","type":"registry:component","title":"Shared Layout Background","description":"Put it around a list of links or menu rows and a soft highlight follows whichever item is under the pointer, sliding from row to row through a shared layout animation and blurring in or out as you enter or leave the list.","author":"kara <ztzyrant@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":"bounce-sidebar","type":"registry:component","title":"Bounce Sidebar","description":"Vertical navigation where the active marker swings out on a curve to reach the newly chosen item rather than sliding straight down, bowing wider and landing heavier on longer trips. Items can be links or buttons with icons; selection is controlled or uncontrolled.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/bounce-sidebar.tsx","type":"registry:component","target":"@components/motion/bounce-sidebar.tsx"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"animated-sidebar","type":"registry:component","title":"Animated Sidebar","description":"An app-shell sidebar in shadcn's shape (provider, header, groups, menus, sub-menus, rail) whose nested menus open with a clip reveal. On desktop it collapses to an icon strip or off-canvas with Ctrl/Cmd+B; under 768px it becomes a sheet that traps and returns focus.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/animated-sidebar.tsx","type":"registry:component","target":"@components/motion/animated-sidebar.tsx"},{"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":"preview-rail","type":"registry:component","title":"Preview Rail","description":"A slim navigation rail of short tick marks, modeled on the Codex app: hovering swells the ticks near the pointer into a pyramid and floats a card with the destination's label and details. Runs vertically or horizontally and accepts your own preview renderer.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/preview-rail.tsx","type":"registry:component","target":"@components/motion/preview-rail.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/hooks/use-dismiss.ts","type":"registry:hook","target":"@lib/hooks/use-dismiss.ts"},{"path":"lib/hooks/use-hover-gesture.ts","type":"registry:hook","target":"@lib/hooks/use-hover-gesture.ts"},{"path":"lib/hooks/use-tap-gesture.ts","type":"registry:hook","target":"@lib/hooks/use-tap-gesture.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"}]},{"name":"dock","type":"registry:component","title":"Dock","description":"A floating toolbar after the macOS dock: Dock, DockItem and DockSeparator group icon actions on a frosted surface, and a highlight slides to whichever item is marked active. Items render as buttons or wrap links you supply.","author":"kara <ztzyrant@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":"Short labels for icon buttons and clipped text: shown after a brief delay on hover or keyboard focus, at once if another tooltip just closed, and on tap for touch users. A fixed portal keeps overflow from cutting it off.","author":"kara <ztzyrant@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-dismiss.ts","type":"registry:hook","target":"@lib/hooks/use-dismiss.ts"},{"path":"lib/hooks/use-hover-gesture.ts","type":"registry:hook","target":"@lib/hooks/use-hover-gesture.ts"},{"path":"lib/hooks/use-tap-gesture.ts","type":"registry:hook","target":"@lib/hooks/use-tap-gesture.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"}]},{"name":"context-menu","type":"registry:component","title":"Animated Context Menu","description":"A right-click menu assembled from parts (items, checkbox and radio items, labels, separators, shortcuts) that opens from the exact spot you clicked, or long-pressed on touch, with a highlight that slides between rows, arrow-key movement and type-to-jump search.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/context-menu.tsx","type":"registry:component","target":"@components/motion/context-menu.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"popover","type":"registry:component","title":"Popover Gooey Popover","description":"Popover, PopoverTrigger and PopoverContent with side, align, gap and corner radius props; trigger and panel melt together through a blur-based goo filter (gooStrength sets how runny), while the real content fades in sharp on top. Opens on click or hover.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/popover.tsx","type":"registry:component","target":"@components/motion/popover.tsx"},{"path":"components/motion/popover-position.ts","type":"registry:component","target":"@components/motion/popover-position.ts"},{"path":"lib/hooks/use-dismiss.ts","type":"registry:hook","target":"@lib/hooks/use-dismiss.ts"},{"path":"lib/hooks/use-hover-gesture.ts","type":"registry:hook","target":"@lib/hooks/use-hover-gesture.ts"},{"path":"lib/hooks/use-tap-gesture.ts","type":"registry:hook","target":"@lib/hooks/use-tap-gesture.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"}]},{"name":"popover-morph","type":"registry:component","title":"Popover Morph Popover","description":"MorphPopover, MorphPopoverTrigger and MorphPopoverContent: the panel is rendered full size from the start but cropped down to the corner beside the trigger, then the crop springs open, so text and borders never scale. Escape or an outside click closes it.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/popover-morph.tsx","type":"registry:component","target":"@components/motion/popover-morph.tsx"},{"path":"components/motion/popover-position.ts","type":"registry:component","target":"@components/motion/popover-position.ts"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"morphing-modal","type":"registry:component","title":"Morphing Modal","description":"A modal for multi-step flows, inspired by the Family app: change viewId and one panel resizes to fit the next screen while the old content blurs out and the new content blurs in. Anchors to the bottom like a sheet or sits centered.","author":"kara <ztzyrant@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":"center-morph-modal","type":"registry:component","title":"Center Morph Modal","description":"A dialog that opens by growing out of its own middle: the full panel starts clipped to a small rounded point at the center and expands to every edge, then shrinks back on close. Traps Tab, closes on Escape or backdrop, and hands focus back to its trigger.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/center-morph-modal.tsx","type":"registry:component","target":"@components/motion/center-morph-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-scramble","type":"registry:component","title":"Text Animation Text Scramble","description":"Change the text prop and the characters churn through random glyphs before settling on the new value within a set duration; screen readers only hear the final text, and reduced motion shows it at once.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/text-scramble.tsx","type":"registry:component","target":"@components/motion/text-scramble.tsx"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"chromatic-text-reveal","type":"registry:component","title":"Text Animation Dia Text Animation","description":"Holds the start of a sentence still and swaps the last word in turn, each new word painted in by a band of color that leaves plain text behind. Inspired by the Dia browser, with loop, pause and start-on-view options.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/chromatic-text-reveal.tsx","type":"registry:component","target":"@components/motion/chromatic-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-reveal","type":"registry:component","title":"Text Animation Text Reveal","description":"Splits text into words or characters and lifts each piece into place as its blur clears, on mount or when scrolled into view, with stagger, delay and offset props.","author":"kara <ztzyrant@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":"A band of light passes over the text on a loop, handy for 'Thinking…' or 'Loading' labels; choose the element type and the cycle length.","author":"kara <ztzyrant@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/text-shimmer.ts","type":"registry:lib","target":"@lib/text-shimmer.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"text-cascade","type":"registry:component","title":"Text Animation Text Cascade","description":"Give it a new string and the letters flip over one at a time from left to right like a departure board, old characters falling out as new ones drop in.","author":"kara <ztzyrant@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":"Every digit spins into place on its own reel, each starting a beat after the last; supports zero padding, prefix, suffix, comma grouping and an optional blur mid-roll. Screen readers get the formatted number as plain text.","author":"kara <ztzyrant@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":"Eases from the previous value to the new one through a format function you provide; with startOnView it waits until most of the element is on screen before counting.","author":"kara <ztzyrant@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":"A small status pill for neutral, info, success, warning, danger and loading states. Each state brings its own icon, changing status rolls the icon over, and a soft breathing ring (on by default while loading) draws the eye. Comes in two sizes.","author":"kara <ztzyrant@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":"Each letter of the outgoing label falls away while its replacement lands in the same slot, travelling left to right, so a change like Copy to Copied reads as one motion.","author":"kara <ztzyrant@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":"The old content blurs, fades and shrinks while the new content grows in sharp: the familiar copy-to-check feedback.","author":"kara <ztzyrant@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 current label or icon slides up and out as its successor comes up from underneath, softened by a light blur.","author":"kara <ztzyrant@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 Animated Toast Stack","description":"The base stack: neutral, info, success, error and loading toasts with icons, action buttons and swipe-away, placed top or bottom at the left, center or right, with a cap on how many stay visible.","author":"kara <ztzyrant@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":"toast-promise","type":"registry:component","title":"Animated Toast Stack Toast Promise","description":"Hand a promise to the hook and a single toast shows a spinner, then turns into a success or error message in the same spot once it settles, and only then starts counting down to close.","author":"kara <ztzyrant@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":"A light/dark switch for next-themes that animates the whole page change with the View Transition API: wipe the new theme in as a rectangle from a corner, center or bottom, grow a sharp or blurred circle, or open it like window blinds.","author":"kara <ztzyrant@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/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"bouncy-accordion","type":"registry:component","title":"Bouncy Accordion","description":"An FAQ-style list where one row opens at a time: the open row breaks away from its neighbours with a bouncy gap and rounded corners, its content expands to its measured height, and rows can carry icons. Collapsible, controlled or uncontrolled.","author":"kara <ztzyrant@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":"An off-canvas panel for filters, carts or settings that springs in from either side of the screen over a blurred backdrop, stops the page behind it from scrolling, and closes on Escape or a backdrop click unless dismissable is turned off.","author":"kara <ztzyrant@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":"Wraps the page or a contained scroller in Lenis and hands out scrollY, progress and velocity motion values plus a scrollTo helper through useSmoothScroll; with reduced motion it keeps native scrolling.","author":"kara <ztzyrant@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":"Shows how far through a page the reader is, as a thin bar pinned to the top or bottom or as a circular ring, optionally spring-smoothed and fed by any progress value you pass in.","author":"kara <ztzyrant@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":"Moves its content faster or slower than the page as it passes through view, along x or y; a negative speed pushes it the other way, and it can track a custom scroll container.","author":"kara <ztzyrant@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":"A button that glides the page to a pixel position, CSS selector or element, with an offset for sticky headers; it uses the SmoothScroll provider when present and native scrolling otherwise.","author":"kara <ztzyrant@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":"Fades content up into place through a short blur as it enters the viewport or a custom scroll root, once by default or every time, with distance, duration and visibility threshold props.","author":"kara <ztzyrant@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 Range Slider","description":"The base RangeSlider: a dot marks every step and the bar-shaped thumb gives a small hop each time it snaps to a new one; the dots can be turned off.","author":"kara <ztzyrant@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/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/hooks/use-slider.ts","type":"registry:hook","target":"@lib/hooks/use-slider.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"range-slider-fluid","type":"registry:component","title":"Range Slider Fluid Slider","description":"The whole pill is the control. A fill with a rounded cap flows to the value and the label text inverts where the fill sits under it; format controls the readout.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/range-slider-fluid.tsx","type":"registry:component","target":"@components/motion/range-slider-fluid.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/hooks/use-slider.ts","type":"registry:hook","target":"@lib/hooks/use-slider.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"range-slider-wave","type":"registry:component","title":"Range Slider Wave Slider","description":"A row of bars swells into a crest centred on the value and sinks back as it moves on; bars before the value are filled, so the level reads at a glance.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/range-slider-wave.tsx","type":"registry:component","target":"@components/motion/range-slider-wave.tsx"},{"path":"lib/hooks/use-slider.ts","type":"registry:hook","target":"@lib/hooks/use-slider.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"range-slider-bubble","type":"registry:component","title":"Range Slider Bubble Slider","description":"Pressing the thumb pops up a bubble with the current value that leans toward the direction of travel and flattens the faster you drag, straightening once you let go.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/range-slider-bubble.tsx","type":"registry:component","target":"@components/motion/range-slider-bubble.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/hooks/use-slider.ts","type":"registry:hook","target":"@lib/hooks/use-slider.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"range-slider-ruler","type":"registry:component","title":"Range Slider Ruler Slider","description":"A fixed needle over a moving scale instead of a thumb: flick it and it coasts before resting on a tick. Major ticks carry labels, a unit can follow the number, and decimal steps keep their precision.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/range-slider-ruler.tsx","type":"registry:component","target":"@components/motion/range-slider-ruler.tsx"},{"path":"lib/hooks/use-slider.ts","type":"registry:hook","target":"@lib/hooks/use-slider.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"wheel-picker","type":"registry:component","title":"Wheel Picker","description":"An iOS-style scroll wheel: options sit on a 3D drum with its own momentum physics, so a flick coasts and snaps to a row with a soft bounce. Drag, mouse wheel or arrow keys pick; line several up for dates or times. Optional tick sound.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/wheel-picker.tsx","type":"registry:component","target":"@components/motion/wheel-picker.tsx"},{"path":"lib/tick-sound.ts","type":"registry:lib","target":"@lib/tick-sound.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"chart-area","type":"registry:component","title":"Chart Area Chart","description":"Stacked gradient areas with a time-range switch; the reveal replays whenever the range changes.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/chart/area-chart.tsx","type":"registry:component","target":"@components/motion/chart/area-chart.tsx"},{"path":"components/motion/chart/cartesian.tsx","type":"registry:component","target":"@components/motion/chart/cartesian.tsx"},{"path":"components/motion/chart/shared.tsx","type":"registry:component","target":"@components/motion/chart/shared.tsx"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"}]},{"name":"chart-bar","type":"registry:component","title":"Chart Bar Chart","description":"Grouped columns that grow from the baseline; hovering a category dims the rest and reads every series.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/chart/bar-chart.tsx","type":"registry:component","target":"@components/motion/chart/bar-chart.tsx"},{"path":"components/motion/chart/shared.tsx","type":"registry:component","target":"@components/motion/chart/shared.tsx"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"}]},{"name":"chart-line","type":"registry:component","title":"Chart Line Chart","description":"Smooth monotone lines with dots, a snapping cursor and one tooltip for every series.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/chart/line-chart.tsx","type":"registry:component","target":"@components/motion/chart/line-chart.tsx"},{"path":"components/motion/chart/cartesian.tsx","type":"registry:component","target":"@components/motion/chart/cartesian.tsx"},{"path":"components/motion/chart/shared.tsx","type":"registry:component","target":"@components/motion/chart/shared.tsx"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"}]},{"name":"chart-donut","type":"registry:component","title":"Chart Donut Chart","description":"Slices sweep in clockwise; the hovered slice lifts and the center swaps from the total to its value and share. variant=\"pie\" for a solid pie.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/chart/donut-chart.tsx","type":"registry:component","target":"@components/motion/chart/donut-chart.tsx"},{"path":"components/motion/chart/shared.tsx","type":"registry:component","target":"@components/motion/chart/shared.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"chart-radial","type":"registry:component","title":"Chart Radial Chart","description":"Concentric progress rings with rounded caps that fill clockwise toward a target.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/chart/radial-chart.tsx","type":"registry:component","target":"@components/motion/chart/radial-chart.tsx"},{"path":"components/motion/chart/shared.tsx","type":"registry:component","target":"@components/motion/chart/shared.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"sparkline","type":"registry:component","title":"Chart Sparkline","description":"Word-sized trend line for stat tiles that ends on the latest value, with a spoken summary.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/chart/sparkline.tsx","type":"registry:component","target":"@components/motion/chart/sparkline.tsx"},{"path":"components/motion/chart/shared.tsx","type":"registry:component","target":"@components/motion/chart/shared.tsx"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"}]},{"name":"chart-heatmap","type":"registry:component","title":"Chart Heatmap Chart","description":"GitHub-style contribution calendar; cells fade in week by week and arrow keys read each day.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/chart/heatmap-chart.tsx","type":"registry:component","target":"@components/motion/chart/heatmap-chart.tsx"},{"path":"components/motion/chart/shared.tsx","type":"registry:component","target":"@components/motion/chart/shared.tsx"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"}]},{"name":"chart-gauge","type":"registry:component","title":"Chart Gauge Chart","description":"Arc meter with threshold bands; the fill and a springy needle swing to the value together.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/chart/gauge-chart.tsx","type":"registry:component","target":"@components/motion/chart/gauge-chart.tsx"},{"path":"components/motion/chart/shared.tsx","type":"registry:component","target":"@components/motion/chart/shared.tsx"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"}]},{"name":"chart-funnel","type":"registry:component","title":"Chart Funnel Chart","description":"Horizontal conversion funnel whose stages grow in one by one; hovering a stage reads its step conversion.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/chart/funnel-chart.tsx","type":"registry:component","target":"@components/motion/chart/funnel-chart.tsx"},{"path":"components/motion/chart/shared.tsx","type":"registry:component","target":"@components/motion/chart/shared.tsx"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"}]},{"name":"sortable-list","type":"registry:component","title":"Sortable List","description":"Drag-to-reorder list where only the grip handle lifts a row, the lifted row rises with a soft shadow and slight scale while its siblings spring out of the way, and a full keyboard path (Space to pick up, arrows to move, Space to drop, Escape to restore) announces every move to screen readers. Generic over any item with an id, controlled/uncontrolled, reduced-motion safe.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/sortable-list.tsx","type":"registry:component","target":"@components/motion/sortable-list.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"tree-view","type":"registry:component","title":"Tree View","description":"Keyboard-first WAI-ARIA tree with spring-rotating chevrons, height-morphing nested groups, indent guide lines, a selection pill that glides between rows via shared layout, typeahead, and controlled or uncontrolled selection and expansion.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/tree-view.tsx","type":"registry:component","target":"@components/motion/tree-view.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"resizable-panels","type":"registry:component","title":"Resizable Panels","description":"Horizontal or vertical split panes with pointer-captured drag handles, per-panel min/max sizes, collapsible panels that spring shut below a threshold, double-click reset, nestable layouts, and keyboard-resizable separators.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/resizable-panels.tsx","type":"registry:component","target":"@components/motion/resizable-panels.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"image-compare","type":"registry:component","title":"Image Compare","description":"Before/after comparison whose top layer is clipped by a spring-smoothed clip-path divider, with a draggable knob, optional hover-follow mode, edge-fading labels, keyboard slider control, and images or any React node on either side.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/image-compare.tsx","type":"registry:component","target":"@components/motion/image-compare.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"timeline","type":"registry:component","title":"Timeline","description":"Vertical changelog timeline whose connector line draws with scroll progress, with dots that pop in, content that slides into view, done/current/upcoming states, a pulsing ring on the current step, and a static line under reduced motion.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/timeline.tsx","type":"registry:component","target":"@components/motion/timeline.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"tag-input","type":"registry:component","title":"Tag Input","description":"Chip field where Enter, comma or Tab adds a tag that springs in while the rest glide aside via shared layout, with Backspace-twice removal, arrow-key chip navigation, a filtered keyboard-navigable suggestion combobox, max tags, duplicate prevention and a shake on validation rejection; controlled/uncontrolled, reduced-motion safe.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/tag-input.tsx","type":"registry:component","target":"@components/motion/tag-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":"color-picker","type":"registry:component","title":"Color Picker","description":"HSV color picker with a 2D saturation/brightness area, hue and optional alpha sliders whose thumbs spring to a clicked point and follow drags 1:1, a validated hex field, preset swatches with a gliding selection ring and a ColorPickerPopover trigger mode; keyboard accessible, dependency-free color math.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/color-picker.tsx","type":"registry:component","target":"@components/motion/color-picker.tsx"},{"path":"components/motion/popover-morph.tsx","type":"registry:component","target":"@components/motion/popover-morph.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/hooks/use-slider.ts","type":"registry:hook","target":"@lib/hooks/use-slider.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"components/motion/popover-position.ts","type":"registry:component","target":"@components/motion/popover-position.ts"}]},{"name":"rating","type":"registry:component","title":"Rating","description":"Star rating radiogroup with hover preview fill, a staggered spring bounce on pick, optional half-star precision from the pointer position, click-to-clear, arrow/Home/End keyboard control, custom icons and a read-only display mode; controlled/uncontrolled, reduced-motion safe.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/rating.tsx","type":"registry:component","target":"@components/motion/rating.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"number-stepper","type":"registry:component","title":"Number Stepper","description":"Spinbutton with −/+ controls whose digits roll in the direction of change, press-and-hold repeat that accelerates, direct typing, arrow/Page/Home/End keys, min/max/step with a shake when pushed past a bound, and Intl.NumberFormat formatting; controlled/uncontrolled.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/number-stepper.tsx","type":"registry:component","target":"@components/motion/number-stepper.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"pagination","type":"registry:component","title":"Pagination","description":"Page navigation with sibling and boundary ellipsis logic, a spring-gliding active pill, numbers that roll as the window shifts, arrow-nudge prev/next controls, and a compact dots variant.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/pagination.tsx","type":"registry:component","target":"@components/motion/pagination.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/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"copy-button","type":"registry:component","title":"Copy Button","description":"Copy-to-clipboard button with a blur-and-scale copy-to-check icon morph, optional rolling Copy/Copied label, execCommand fallback, error state, and screen reader announcements.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/copy-button.tsx","type":"registry:component","target":"@components/motion/copy-button.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"carousel","type":"registry:component","title":"Carousel","description":"Swipeable slide carousel driven by one motion value: momentum drag that snaps to slides with rubber-band edges, seamless loop, responsive slidesPerView, dot or thumbnail indicators with a gliding active pill, and autoplay with a progress bar that pauses on hover, focus or hidden tabs.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/carousel.tsx","type":"registry:component","target":"@components/motion/carousel.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"markdown-editor","type":"registry:component","title":"Markdown Editor","description":"Textarea Markdown editor with an undo-safe formatting toolbar and shortcuts, list continuation and Tab indenting, a floating selection toolbar, Write/Preview/Split tabs with a gliding indicator, and a built-in safe renderer that outputs React elements, never raw HTML.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/markdown-editor.tsx","type":"registry:component","target":"@components/motion/markdown-editor.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"tour","type":"registry:component","title":"Tour","description":"Onboarding tour that dims the page and cuts a rounded spotlight around each target, gliding and resizing it from step to step, with a card that flips and shifts to stay in the viewport, a gliding progress dot, Back/Next/Skip/Done, targets scrolled into view, Escape to close, trapped focus that returns to the trigger, controlled/uncontrolled open and step, and reduced-motion safe.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/tour.tsx","type":"registry:component","target":"@components/motion/tour.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":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"components/motion/magnetic.tsx","type":"registry:component","target":"@components/motion/magnetic.tsx"}]},{"name":"avatar-group","type":"registry:component","title":"Avatar Group","description":"Overlapping avatar stack that springs apart on hover or keyboard focus, with name tooltips, online/away/busy presence dots, an optional is-typing pulse ring and a +N chip that opens the full list in a popover, plus LiveCursors: collaboration cursors with colored arrows and name labels that spring toward container-relative positions.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/avatar-group.tsx","type":"registry:component","target":"@components/motion/avatar-group.tsx"},{"path":"components/motion/popover-morph.tsx","type":"registry:component","target":"@components/motion/popover-morph.tsx"},{"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"},{"path":"components/motion/popover-position.ts","type":"registry:component","target":"@components/motion/popover-position.ts"},{"path":"lib/hooks/use-dismiss.ts","type":"registry:hook","target":"@lib/hooks/use-dismiss.ts"},{"path":"lib/hooks/use-hover-gesture.ts","type":"registry:hook","target":"@lib/hooks/use-hover-gesture.ts"},{"path":"lib/hooks/use-tap-gesture.ts","type":"registry:hook","target":"@lib/hooks/use-tap-gesture.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"}]},{"name":"dropdown-menu","type":"registry:component","title":"Dropdown Menu","description":"Composable WAI-ARIA dropdown menu that springs open with a scale and fade from the trigger side, with a gliding active-row highlight, checkbox and radio items, icons and shortcuts, a destructive variant, hover-intent submenus, typeahead, full arrow/Home/End/Escape keyboard support and viewport-aware flipping.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/dropdown-menu.tsx","type":"registry:component","target":"@components/motion/dropdown-menu.tsx"},{"path":"components/motion/anchored-placement.ts","type":"registry:component","target":"@components/motion/anchored-placement.ts"},{"path":"components/motion/popover-position.ts","type":"registry:component","target":"@components/motion/popover-position.ts"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/hooks/use-dismiss.ts","type":"registry:hook","target":"@lib/hooks/use-dismiss.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"hover-card","type":"registry:component","title":"Hover Card","description":"Hover card that springs out of its trigger after an open delay and stays open while the pointer travels into it; also opens on keyboard focus, closes on Escape or blur, and flips and aligns on any side to stay in the viewport, while touch taps simply follow the link.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/hover-card.tsx","type":"registry:component","target":"@components/motion/hover-card.tsx"},{"path":"components/motion/anchored-placement.ts","type":"registry:component","target":"@components/motion/anchored-placement.ts"},{"path":"components/motion/popover-position.ts","type":"registry:component","target":"@components/motion/popover-position.ts"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/hooks/use-hover-gesture.ts","type":"registry:hook","target":"@lib/hooks/use-hover-gesture.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"}]},{"name":"kbd","type":"registry:component","title":"Kbd","description":"Keyboard key chips and key combos that render ⌘ or Ctrl for the visitor's platform without hydration mismatch, in two sizes, with a spring dip when pressed and an optional listen mode that animates each key as the real one is held.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/kbd.tsx","type":"registry:component","target":"@components/motion/kbd.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"dialog","type":"registry:component","title":"Dialog","description":"Composable modal Dialog and AlertDialog that portal to the body over a blurred backdrop, scale the panel up and exit faster, trap focus, close on Escape, lock page scroll without layout shift and hand focus back to the trigger, with controlled/uncontrolled open, a bottom-sheet layout below sm, an alertdialog that ignores outside clicks and focuses Cancel first, and an optional type-to-confirm field that shakes when Delete is pressed too early.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/dialog.tsx","type":"registry:component","target":"@components/motion/dialog.tsx"},{"path":"components/motion/button/index.tsx","type":"registry:component","target":"@components/motion/button/index.tsx"},{"path":"components/motion/input.tsx","type":"registry:component","target":"@components/motion/input.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":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"components/motion/magnetic.tsx","type":"registry:component","target":"@components/motion/magnetic.tsx"}]},{"name":"alert","type":"registry:component","title":"Alert","description":"Inline alert banner in info, success, warning and destructive tones that keep contrast in light and dark, with icons, a title, description and optional actions, polite status or assertive alert roles by severity, and a dismiss that fades the banner and collapses its height so the content below slides up, plus an AlertStack whose gaps collapse with it.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/alert.tsx","type":"registry:component","target":"@components/motion/alert.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"progress","type":"registry:component","title":"Progress","description":"Progress indicators in three forms: a linear Progress bar whose fill springs smoothly with an optional label and rolling percentage, a ProgressCircle ring drawn around a centered value, and ProgressSteps segments that fill in sequence; indeterminate modes slide or spin, every variant exposes role=\"progressbar\" with value text, and reduced motion swaps movement for an opacity pulse.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/progress.tsx","type":"registry:component","target":"@components/motion/progress.tsx"},{"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":"skeleton","type":"registry:component","title":"Skeleton","description":"Loading placeholders: Skeleton blocks in rect, circle or text shapes with a gradient shimmer, SkeletonText paragraphs with a natural short last line, and SkeletonSwap, which cross-fades from skeleton to real content in one grid cell and holds the last measured height on reload so nothing jumps; reduced motion swaps the shimmer for an opacity pulse.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/skeleton.tsx","type":"registry:component","target":"@components/motion/skeleton.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"empty-state","type":"registry:component","title":"Empty State","description":"Empty-state block with an icon or illustration slot, title, description, primary and secondary actions, three sizes and an optional dashed border; the default SVG art (a floating document stack or a search lens) draws in and drifts gently, and the whole block staggers in when scrolled into view.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/empty-state.tsx","type":"registry:component","target":"@components/motion/empty-state.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"breadcrumb","type":"registry:component","title":"Breadcrumb","description":"Composable breadcrumb trail with a hover underline that slides in from the left, links that render through your router via a render prop, and a data-driven items mode whose maxItems collapse folds middle crumbs into an ellipsis that either expands them inline with a spring layout reflow or opens a small keyboard-navigable menu.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/breadcrumb.tsx","type":"registry:component","target":"@components/motion/breadcrumb.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"segmented-control","type":"registry:component","title":"Segmented Control","description":"Form-ready SegmentedControl with radiogroup semantics, a raised thumb that glides between options on a shared-layout spring, icon and/or label options, sizes, full-width layout, disabled options, arrow-key roving where selection follows focus and an optional hidden input for forms, plus a ToggleGroup of spring-pressed buttons in single or multiple mode.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/segmented-control.tsx","type":"registry:component","target":"@components/motion/segmented-control.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"multi-select","type":"registry:component","title":"Multi Select","description":"Searchable multi-value select whose field is the combobox input: picked options ride as chips that spring in, glide aside and collapse into a \"+N\" overflow chip, over a grouped listbox with draw-in check marks, a gliding active row, Select all / Clear actions, a max limit that shakes on refusal, optional creatable options, full keyboard control and controlled/uncontrolled string[] value.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/multi-select.tsx","type":"registry:component","target":"@components/motion/multi-select.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/hooks/use-dismiss.ts","type":"registry:hook","target":"@lib/hooks/use-dismiss.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"phone-input","type":"registry:component","title":"Phone Input","description":"International phone field with a searchable country picker (emoji flags, dial codes, ~45 built-in countries or your own list), per-country grouping applied as you type without losing the caret, E.164 output with { country, national, valid }, paste-a-full-+number country detection, and a blur-time length check that shakes the field with an inline error.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/phone-input.tsx","type":"registry:component","target":"@components/motion/phone-input.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/hooks/use-dismiss.ts","type":"registry:hook","target":"@lib/hooks/use-dismiss.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"password-input","type":"registry:component","title":"Password Input","description":"Password field with an eye icon that morphs to eye-off, a caps-lock warning, a segmented strength meter whose bars spring-fill and recolor with a sliding Weak/Fair/Good/Strong label from a length-weighted NIST-style heuristic, an optional requirement checklist whose items check off with a draw-in tick, and onStrengthChange.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/password-input.tsx","type":"registry:component","target":"@components/motion/password-input.tsx"},{"path":"components/motion/input.tsx","type":"registry:component","target":"@components/motion/input.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/password-strength.ts","type":"registry:lib","target":"@lib/password-strength.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"textarea","type":"registry:component","title":"Textarea","description":"Multi-line companion to Input with the same label, error shake and message API plus a description line, auto-growing between minRows and maxRows through a measured height transition before it scrolls behind a thin themed scrollbar, and an optional maxLength counter that shifts to warning then destructive near the limit and shakes when a keystroke or paste is refused.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/textarea.tsx","type":"registry:component","target":"@components/motion/textarea.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"inline-edit","type":"registry:component","title":"Inline Edit","description":"Click-to-edit text that turns into an input or auto-growing textarea in the exact same box (no layout jump) on click, Enter or F2, saves on Enter or blur and cancels on Escape, blocks saves with a validate message and shake, and runs async onSave with a pending spinner, rollback plus error on rejection, and a drawn check-mark flash on success.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/inline-edit.tsx","type":"registry:component","target":"@components/motion/inline-edit.tsx"},{"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":"toggle-group","type":"registry:component","title":"Toggle Group","description":"Composable toolbar toggles: a standalone aria-pressed Toggle plus a shadcn-shaped ToggleGroup of ToggleGroupItem children in single or multiple mode, with default/outline variants, sm/md/lg sizes, one roving tab stop with arrow/Home/End keys, a pressed surface that glides between items in single mode and pops per item in multiple mode — the composable, icon-first counterpart to SegmentedControl's radiogroup.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/toggle-group.tsx","type":"registry:component","target":"@components/motion/toggle-group.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"card","type":"registry:component","title":"Card","description":"Plain, shadcn-compatible Card building block (CardHeader, CardTitle, CardDescription, CardAction, CardContent, CardFooter) with default, outline, elevated and interactive variants — the interactive one lifts on hover and dips on press and becomes a whole-card link or button via asChild — plus an optional height-morphing CardExpandTrigger/CardExpandContent disclosure.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/card.tsx","type":"registry:component","target":"@components/motion/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":"scroll-area","type":"registry:component","title":"Scroll Area","description":"Native-scrolling container that keeps wheel, touch momentum and keyboard scrolling but hides the browser bar behind an overlay thumb (vertical, horizontal or both) that fades in on hover or scroll and out when idle, drags, pages on track click, and pairs with distance-scaled edge fade masks, all sized by a ResizeObserver.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/scroll-area.tsx","type":"registry:component","target":"@components/motion/scroll-area.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"collapsible","type":"registry:component","title":"Collapsible","description":"Unstyled disclosure primitive (Collapsible, CollapsibleTrigger with asChild, CollapsibleContent) with controlled or uncontrolled open state, an in-flow height morph that fades content in and closes faster than it opens, aria-expanded/aria-controls wiring, an inert closed panel and a reduced-motion snap.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/collapsible.tsx","type":"registry:component","target":"@components/motion/collapsible.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"accordion","type":"registry:component","title":"Accordion","description":"Calm shadcn-compatible accordion built on Collapsible (Accordion, AccordionItem, AccordionTrigger, AccordionContent) with type single or multiple, collapsible, controlled or uncontrolled value, a spring-rotating chevron, height-morphing panels and Arrow/Home/End focus movement between triggers; the quiet counterpart to the springy Bouncy Accordion.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/accordion.tsx","type":"registry:component","target":"@components/motion/accordion.tsx"},{"path":"components/motion/collapsible.tsx","type":"registry:component","target":"@components/motion/collapsible.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"menubar","type":"registry:component","title":"Menubar","description":"Desktop-app menubar (File / Edit / View) on the WAI-ARIA menubar pattern where every menu renders into one shared floating panel, so once a menu is open hovering another title or pressing Left/Right switches instantly while the panel glides and resizes to fit, with Kbd shortcuts, checkbox and radio rows, separators, disabled items, hover-intent submenus, typeahead and a spring-gliding active row.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/menubar.tsx","type":"registry:component","target":"@components/motion/menubar.tsx"},{"path":"components/motion/kbd.tsx","type":"registry:component","target":"@components/motion/kbd.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/hooks/use-dismiss.ts","type":"registry:hook","target":"@lib/hooks/use-dismiss.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"badge","type":"registry:component","title":"Badge","description":"General-purpose badge in default, secondary, outline, destructive, success and warning (soft or solid), three sizes, with an optional pulsing status dot or icon, removable filter chips whose x plays an exit before onRemove while siblings glide into the gap, and a count mode whose digits roll in the direction of change and cap at 99+ (complements AnimatedBadge, which animates status transitions).","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/badge.tsx","type":"registry:component","target":"@components/motion/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":"stepper","type":"registry:component","title":"Stepper","description":"Multi-step flow with an active ring that glides between step markers, connectors that fill as steps complete, panels that slide in from the direction of travel while the container morphs to each panel's height, and an async per-step guard that shakes the marker when it refuses. Linear or free navigation, controlled/uncontrolled, reduced-motion safe.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/stepper.tsx","type":"registry:component","target":"@components/motion/stepper.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":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"components/motion/magnetic.tsx","type":"registry:component","target":"@components/motion/magnetic.tsx"}]},{"name":"date-picker","type":"registry:component","title":"Date Picker Date Picker","description":"Date field whose calendar morphs open from the trigger corner and closes on pick.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/date-picker.tsx","type":"registry:component","target":"@components/motion/date-picker.tsx"},{"path":"components/motion/calendar.tsx","type":"registry:component","target":"@components/motion/calendar.tsx"},{"path":"components/motion/popover-morph.tsx","type":"registry:component","target":"@components/motion/popover-morph.tsx"},{"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/popover-position.ts","type":"registry:component","target":"@components/motion/popover-position.ts"}]},{"name":"calendar","type":"registry:component","title":"Date Picker Calendar","description":"Inline single-date calendar; the selected pill glides between days. Weekends disabled in this demo.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/calendar.tsx","type":"registry:component","target":"@components/motion/calendar.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"date-range-picker","type":"registry:component","title":"Date Picker Date Range Picker","description":"Range field whose two-month calendar morphs open beside one-click presets and commits once the end day is picked.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/date-range-picker.tsx","type":"registry:component","target":"@components/motion/date-range-picker.tsx"},{"path":"components/motion/calendar.tsx","type":"registry:component","target":"@components/motion/calendar.tsx"},{"path":"components/motion/popover-morph.tsx","type":"registry:component","target":"@components/motion/popover-morph.tsx"},{"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/popover-position.ts","type":"registry:component","target":"@components/motion/popover-position.ts"}]},{"name":"booking-calendar","type":"registry:component","title":"Date Picker Booking Calendar","description":"Two-month stay picker with nightly prices under each day and the cheapest days tinted, booked nights struck through, a minimum stay, and a footer with dates, nights, total and a Reserve button.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/booking-calendar.tsx","type":"registry:component","target":"@components/motion/booking-calendar.tsx"},{"path":"components/motion/button/index.tsx","type":"registry:component","target":"@components/motion/button/index.tsx"},{"path":"components/motion/calendar.tsx","type":"registry:component","target":"@components/motion/calendar.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":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"components/motion/magnetic.tsx","type":"registry:component","target":"@components/motion/magnetic.tsx"}]},{"name":"time-picker","type":"registry:component","title":"Date Picker Time Picker","description":"iOS-style hour, minute and AM/PM drums composed from WheelPicker, inline or as a time field whose wheels morph open and commit on Done.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/time-picker.tsx","type":"registry:component","target":"@components/motion/time-picker.tsx"},{"path":"components/motion/popover-morph.tsx","type":"registry:component","target":"@components/motion/popover-morph.tsx"},{"path":"components/motion/wheel-picker.tsx","type":"registry:component","target":"@components/motion/wheel-picker.tsx"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"components/motion/popover-position.ts","type":"registry:component","target":"@components/motion/popover-position.ts"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/tick-sound.ts","type":"registry:lib","target":"@lib/tick-sound.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"}]},{"name":"date-time-picker","type":"registry:component","title":"Date Picker Date & Time Picker","description":"One field whose panel morphs open with the calendar beside time wheels; edits a draft and commits on Done, labelled like \"Oct 14, 2026, 9:30 AM\".","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/date-time-picker.tsx","type":"registry:component","target":"@components/motion/date-time-picker.tsx"},{"path":"components/motion/calendar.tsx","type":"registry:component","target":"@components/motion/calendar.tsx"},{"path":"components/motion/popover-morph.tsx","type":"registry:component","target":"@components/motion/popover-morph.tsx"},{"path":"components/motion/time-picker.tsx","type":"registry:component","target":"@components/motion/time-picker.tsx"},{"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/popover-position.ts","type":"registry:component","target":"@components/motion/popover-position.ts"},{"path":"components/motion/wheel-picker.tsx","type":"registry:component","target":"@components/motion/wheel-picker.tsx"},{"path":"lib/tick-sound.ts","type":"registry:lib","target":"@lib/tick-sound.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"}]},{"name":"month-picker","type":"registry:component","title":"Date Picker Month Picker","description":"Twelve-month grid with a gliding selection pill, year slides and a zoom-out year grid, single or range mode, min/max and full keyboard navigation, plus a popover month field.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/month-picker.tsx","type":"registry:component","target":"@components/motion/month-picker.tsx"},{"path":"components/motion/popover-morph.tsx","type":"registry:component","target":"@components/motion/popover-morph.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/popover-position.ts","type":"registry:component","target":"@components/motion/popover-position.ts"}]},{"name":"table","type":"registry:component","title":"Table Data Table","description":"Virtualized rows under a sticky header, click-to-sort columns, checkbox selection with select-all, and drag handles to resize or move columns; a fixed row height keeps 10,000 rows scrolling smoothly.","author":"kara <ztzyrant@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/stacked.tsx","type":"registry:component","target":"@components/motion/table/stacked.tsx"},{"path":"components/motion/table/table-header.tsx","type":"registry:component","target":"@components/motion/table/table-header.tsx"},{"path":"components/motion/table/table-menu.tsx","type":"registry:component","target":"@components/motion/table/table-menu.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":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"}]},{"name":"table-editable","type":"registry:component","title":"Table Editable Table","description":"Mark columns editable to type straight into cells, and use the row and column menus to add or remove rows and columns; your data and column definitions stay the single source of truth.","author":"kara <ztzyrant@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/stacked.tsx","type":"registry:component","target":"@components/motion/table/stacked.tsx"},{"path":"components/motion/table/table-header.tsx","type":"registry:component","target":"@components/motion/table/table-header.tsx"},{"path":"components/motion/table/table-menu.tsx","type":"registry:component","target":"@components/motion/table/table-menu.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":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"}]},{"name":"table-async","type":"registry:component","title":"Table Async Table","description":"Fetches more as you near the end: skeleton rows fill in while loading, onEndReached asks for the next page, and the loading flag holds back further requests until it arrives.","author":"kara <ztzyrant@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/stacked.tsx","type":"registry:component","target":"@components/motion/table/stacked.tsx"},{"path":"components/motion/table/table-header.tsx","type":"registry:component","target":"@components/motion/table/table-header.tsx"},{"path":"components/motion/table/table-menu.tsx","type":"registry:component","target":"@components/motion/table/table-menu.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":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"}]},{"name":"table-advanced","type":"registry:component","title":"Table Advanced Data Table","description":"The paginated DataTable: Shift+click to sort by several columns, per-column text or select filters plus a global search, a column visibility picker, column reordering, rows that expand into detail panels and range selection with a bulk-action bar.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/table/data-table.tsx","type":"registry:component","target":"@components/motion/table/data-table.tsx"},{"path":"components/motion/table/stacked.tsx","type":"registry:component","target":"@components/motion/table/stacked.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/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":"components/motion/pagination.tsx","type":"registry:component","target":"@components/motion/pagination.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"lib/hooks/use-hover-capable.ts","type":"registry:hook","target":"@lib/hooks/use-hover-capable.ts"}]},{"name":"shader-background","type":"registry:component","title":"Shader Background","description":"Twenty-one GPU shader fills from Paper Design behind one typed variant prop, from mesh and grain gradients to warp, water, voronoi, metaballs, god rays, dithering and noise fields. Animated variants hold still when the visitor prefers reduced motion.","author":"kara <ztzyrant@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 horizontal carousel that bends items around a cylinder: concave makes the middle item smallest and enlarges toward the edges, convex does the reverse. Roll it by drag, mouse wheel or arrow keys, snap to items, or let it auto-rotate until someone touches it.","author":"kara <ztzyrant@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/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"loader","type":"registry:component","title":"Loader","description":"Seventeen loading animations behind one Loader component: comet, helix, metaballs and Newton's cradle next to classic spinners, bouncing dots and bars, a dot matrix, dithered noise, morphing shapes, a text scramble, a percent counter and five ASCII spinners. One size prop, currentColor, role=\"status\".","author":"kara <ztzyrant@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":"voice-input","type":"registry:component","title":"Voice Input","description":"A mic button that morphs into a recording pill with a live Web Audio waveform, elapsed timer, cancel and confirm actions, a shimmering transcription state, and graceful permission-denied fallback.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/voice-input.tsx","type":"registry:component","target":"@components/agents/voice-input.tsx"},{"path":"components/motion/text-shimmer.tsx","type":"registry:component","target":"@components/motion/text-shimmer.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"lib/text-shimmer.ts","type":"registry:lib","target":"@lib/text-shimmer.ts"}]},{"name":"message-bubble","type":"registry:component","title":"Message Bubble","description":"The visible surface of a single chat message: six tones from solid to danger, start or end alignment inherited from its Message row, tight bubble groups, a line-clamped show-more toggle, and room for links or buttons inside.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/message-bubble.tsx","type":"registry:component","target":"@components/agents/message-bubble.tsx"},{"path":"components/agents/message-context.tsx","type":"registry:component","target":"@components/agents/message-context.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"message","type":"registry:component","title":"Message","description":"Building blocks for one chat transcript row: Message, MessageGroup, MessageAvatar, header, content and footer slots, a live marker and a typing indicator. A freshly sent row can pop up once from its trailing corner.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/message.tsx","type":"registry:component","target":"@components/agents/message.tsx"},{"path":"components/agents/message-bubble.tsx","type":"registry:component","target":"@components/agents/message-bubble.tsx"},{"path":"components/agents/message-context.tsx","type":"registry:component","target":"@components/agents/message-context.tsx"},{"path":"components/agents/message-scroller.tsx","type":"registry:component","target":"@components/agents/message-scroller.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/preview-rail.tsx","type":"registry:component","target":"@components/motion/preview-rail.tsx"},{"path":"lib/hooks/use-dismiss.ts","type":"registry:hook","target":"@lib/hooks/use-dismiss.ts"},{"path":"lib/hooks/use-hover-gesture.ts","type":"registry:hook","target":"@lib/hooks/use-hover-gesture.ts"},{"path":"lib/hooks/use-tap-gesture.ts","type":"registry:hook","target":"@lib/hooks/use-tap-gesture.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"}]},{"name":"message-scroller","type":"registry:component","title":"Message Scroller","description":"A scroll container for chat transcripts that stays pinned to the newest streamed text only while the reader sits near the bottom, stops following once they scroll up, and can add a rail for jumping between messages.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/message-scroller.tsx","type":"registry:component","target":"@components/agents/message-scroller.tsx"},{"path":"components/motion/preview-rail.tsx","type":"registry:component","target":"@components/motion/preview-rail.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-dismiss.ts","type":"registry:hook","target":"@lib/hooks/use-dismiss.ts"},{"path":"lib/hooks/use-hover-gesture.ts","type":"registry:hook","target":"@lib/hooks/use-hover-gesture.ts"},{"path":"lib/hooks/use-tap-gesture.ts","type":"registry:hook","target":"@lib/hooks/use-tap-gesture.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"}]},{"name":"prompt-input","type":"registry:component","title":"Prompt Input","description":"The text box where people talk to your agent: it grows with the draft up to a row limit, sends on Enter with Shift+Enter for a new line, offers a model picker and a prompt action menu, and swaps send for stop during a reply.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/prompt-input.tsx","type":"registry:component","target":"@components/agents/prompt-input.tsx"},{"path":"components/motion/button/index.tsx","type":"registry:component","target":"@components/motion/button/index.tsx"},{"path":"components/motion/popover-morph.tsx","type":"registry:component","target":"@components/motion/popover-morph.tsx"},{"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"},{"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":"components/motion/popover-position.ts","type":"registry:component","target":"@components/motion/popover-position.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"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":"todo-list","type":"registry:component","title":"Todo List","description":"Shows the plan an agent is working through: each task carries a pending, in-progress, completed or cancelled mark that morphs between states, optional progress and detail, a done count in the header, and a panel that can fold away when all is finished.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/todo-list.tsx","type":"registry:component","target":"@components/agents/todo-list.tsx"},{"path":"components/agents/agent-disclosure.tsx","type":"registry:component","target":"@components/agents/agent-disclosure.tsx"},{"path":"components/motion/action-swap-roll.tsx","type":"registry:component","target":"@components/motion/action-swap-roll.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/action-swap.tsx","type":"registry:component","target":"@components/motion/action-swap.tsx"}]},{"name":"code-block","type":"registry:component","title":"Code Block","description":"Displays code while an agent is still writing it: highlighting for TypeScript, TSX, JSON, bash, diff or plain text, line numbers, emphasis on chosen lines, a height cap that trails new output, optional wrapping and a copy button that confirms.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","shiki","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/code-block.tsx","type":"registry:component","target":"@components/agents/code-block.tsx"},{"path":"components/agents/agent-code.tsx","type":"registry:component","target":"@components/agents/agent-code.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"approval-card","type":"registry:component","title":"Approval Card","description":"Pauses an agent to get a decision from a person: walk them through single-choice, multi-choice or write-in questions step by step, or ask them to approve, request changes or reject, then shrink to a record of what they chose.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/approval-card/index.tsx","type":"registry:component","target":"@components/agents/approval-card/index.tsx"},{"path":"components/agents/approval-card/types.ts","type":"registry:component","target":"@components/agents/approval-card/types.ts"},{"path":"components/agents/agent-disclosure.tsx","type":"registry:component","target":"@components/agents/agent-disclosure.tsx"},{"path":"components/motion/action-swap-roll.tsx","type":"registry:component","target":"@components/motion/action-swap-roll.tsx"},{"path":"components/motion/button/index.tsx","type":"registry:component","target":"@components/motion/button/index.tsx"},{"path":"components/motion/checkbox.tsx","type":"registry:component","target":"@components/motion/checkbox.tsx"},{"path":"components/motion/input.tsx","type":"registry:component","target":"@components/motion/input.tsx"},{"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"},{"path":"components/motion/action-swap.tsx","type":"registry:component","target":"@components/motion/action-swap.tsx"},{"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/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"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":"file-diff","type":"registry:component","title":"File Diff","description":"Shows what an agent changed in a file: added, removed and context lines with old and new numbers and syntax colors, rows that stream in while the edit lands, running plus and minus counts, a copy button and an optional collapse once complete.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","shiki","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/file-diff.tsx","type":"registry:component","target":"@components/agents/file-diff.tsx"},{"path":"components/agents/agent-code.tsx","type":"registry:component","target":"@components/agents/agent-code.tsx"},{"path":"components/agents/agent-disclosure.tsx","type":"registry:component","target":"@components/agents/agent-disclosure.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"tool-result","type":"registry:component","title":"Tool Result","description":"Shows what a tool call returned: a header with the tool, title and a running, success, error or cancelled status, a capped log that tracks terminal output or a highlighted response body, retry and copy actions, and a short summary once done.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","shiki","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/tool-result.tsx","type":"registry:component","target":"@components/agents/tool-result.tsx"},{"path":"components/agents/agent-code.tsx","type":"registry:component","target":"@components/agents/agent-code.tsx"},{"path":"components/agents/agent-disclosure.tsx","type":"registry:component","target":"@components/agents/agent-disclosure.tsx"},{"path":"components/motion/action-swap-roll.tsx","type":"registry:component","target":"@components/motion/action-swap-roll.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/action-swap.tsx","type":"registry:component","target":"@components/motion/action-swap.tsx"}]},{"name":"streaming-response","type":"registry:component","title":"Streaming Response","description":"Wraps an assistant answer during and after streaming: content renders as it arrives, then copy, retry and thumbs up or down appear, along with a collapsible footer listing the sources behind the answer.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/streaming-response.tsx","type":"registry:component","target":"@components/agents/streaming-response.tsx"},{"path":"components/agents/agent-disclosure.tsx","type":"registry:component","target":"@components/agents/agent-disclosure.tsx"},{"path":"components/agents/citations.tsx","type":"registry:component","target":"@components/agents/citations.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"lib/hooks/use-favicon.ts","type":"registry:hook","target":"@lib/hooks/use-favicon.ts"},{"path":"lib/favicon.ts","type":"registry:lib","target":"@lib/favicon.ts"}]},{"name":"image-generation","type":"registry:component","title":"Image Generation","description":"A placeholder for AI images that reserves the final aspect ratio up front, moves through queued, generating and refining stages with a dither pattern and a clearing blur, then shows your image, video or canvas, with retry on failure.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/image-generation.tsx","type":"registry:component","target":"@components/agents/image-generation.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":"tool-approval","type":"registry:component","title":"Tool Approval","description":"Asks a person before an agent runs a tool: it lists the call's parameters, can show the code or command to be executed, lets them approve a single run, grant standing access or deny, then follows the call through running, complete or error.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","shiki","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/tool-approval.tsx","type":"registry:component","target":"@components/agents/tool-approval.tsx"},{"path":"components/agents/agent-code.tsx","type":"registry:component","target":"@components/agents/agent-code.tsx"},{"path":"components/agents/agent-disclosure.tsx","type":"registry:component","target":"@components/agents/agent-disclosure.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"citations","type":"registry:component","title":"Citations","description":"Numbered markers you drop into an answer's text, linked to a source list that opens and closes, fills in row by row and shows each site's favicon, title and domain, plus a stacked-favicon summary for compact footers.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/citations.tsx","type":"registry:component","target":"@components/agents/citations.tsx"},{"path":"components/agents/agent-disclosure.tsx","type":"registry:component","target":"@components/agents/agent-disclosure.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/hooks/use-favicon.ts","type":"registry:hook","target":"@lib/hooks/use-favicon.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"lib/favicon.ts","type":"registry:lib","target":"@lib/favicon.ts"}]},{"name":"agent-activity","type":"registry:component","title":"Agent Activity","description":"One feed for everything an agent does while it works: free text, reasoning steps, web searches with results, read, edit and run tool calls, or compact trace entries, shown alone or interleaved in order, then folded into a one-line summary.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/agent-activity/index.tsx","type":"registry:component","target":"@components/agents/agent-activity/index.tsx"},{"path":"components/agents/agent-activity/activity-row.tsx","type":"registry:component","target":"@components/agents/agent-activity/activity-row.tsx"},{"path":"components/agents/agent-activity/types.ts","type":"registry:component","target":"@components/agents/agent-activity/types.ts"},{"path":"components/agents/agent-disclosure.tsx","type":"registry:component","target":"@components/agents/agent-disclosure.tsx"},{"path":"components/agents/loading-states/thinking-shimmer.tsx","type":"registry:component","target":"@components/agents/loading-states/thinking-shimmer.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/text-shimmer.tsx","type":"registry:component","target":"@components/motion/text-shimmer.tsx"},{"path":"lib/text-shimmer.ts","type":"registry:lib","target":"@lib/text-shimmer.ts"}]},{"name":"reasoning-text","type":"registry:component","title":"Agent Loading States Reasoning Text","description":"Cycles through phrases beside an ASCII spinner, switching them with a cascade, a swap or a letter-by-letter scramble while a shimmer passes over.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/loading-states/reasoning-text.tsx","type":"registry:component","target":"@components/agents/loading-states/reasoning-text.tsx"},{"path":"components/motion/loader.tsx","type":"registry:component","target":"@components/motion/loader.tsx"},{"path":"components/motion/text-scramble.tsx","type":"registry:component","target":"@components/motion/text-scramble.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/text-shimmer.ts","type":"registry:lib","target":"@lib/text-shimmer.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"thinking-shimmer","type":"registry:component","title":"Agent Loading States Thinking Shimmer","description":"A single status line with light gliding across it, so the words stay legible for as long as the agent works.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/loading-states/thinking-shimmer.tsx","type":"registry:component","target":"@components/agents/loading-states/thinking-shimmer.tsx"},{"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"},{"path":"lib/text-shimmer.ts","type":"registry:lib","target":"@lib/text-shimmer.ts"}]},{"name":"agent-progress","type":"registry:component","title":"Agent Loading States Agent Progress","description":"A small animated glyph, an action word and a ticking timer in tabular digits for jobs that take a while.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/loading-states/agent-progress.tsx","type":"registry:component","target":"@components/agents/loading-states/agent-progress.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"model-selector","type":"registry:component","title":"Model Selector","description":"Searchable AI model picker (`ModelSelector`) that morphs open from its trigger with models grouped by provider, generic geometric provider glyphs, vision/tools/reasoning/fast capability badges, context size, relative cost dots, a New tag and a gliding active row with full keyboard navigation; a richer standalone alternative to PromptInput's compact model select, controlled or uncontrolled.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/model-selector.tsx","type":"registry:component","target":"@components/agents/model-selector.tsx"},{"path":"components/motion/badge.tsx","type":"registry:component","target":"@components/motion/badge.tsx"},{"path":"components/motion/kbd.tsx","type":"registry:component","target":"@components/motion/kbd.tsx"},{"path":"components/motion/popover-morph.tsx","type":"registry:component","target":"@components/motion/popover-morph.tsx"},{"path":"components/motion/scroll-area.tsx","type":"registry:component","target":"@components/motion/scroll-area.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/popover-position.ts","type":"registry:component","target":"@components/motion/popover-position.ts"}]},{"name":"context-meter","type":"registry:component","title":"Context Meter","description":"Token usage indicator (`ContextMeter`) whose compact ring and \"42k / 200k\" readout expand on hover or click into a breakdown bar of system, conversation, files and tool segments in chart colors, turning warning then critical near the limit and offering an async \"Compact conversation\" action; drops into PromptInput's `leadingAction` slot.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/context-meter.tsx","type":"registry:component","target":"@components/agents/context-meter.tsx"},{"path":"components/motion/badge.tsx","type":"registry:component","target":"@components/motion/badge.tsx"},{"path":"components/motion/button/index.tsx","type":"registry:component","target":"@components/motion/button/index.tsx"},{"path":"components/motion/popover-morph.tsx","type":"registry:component","target":"@components/motion/popover-morph.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"},{"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":"components/motion/popover-position.ts","type":"registry:component","target":"@components/motion/popover-position.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"components/motion/magnetic.tsx","type":"registry:component","target":"@components/motion/magnetic.tsx"}]},{"name":"prompt-suggestions","type":"registry:component","title":"Prompt Suggestions","description":"Suggested prompt cards or chips (`PromptSuggestions`) that stagger in on first reveal, filter and highlight as the composer text changes via `query`, reflow with spring layout, move with arrow keys and hand the chosen prompt to `onSelect` — built for empty-chat welcome screens above a PromptInput.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/prompt-suggestions.tsx","type":"registry:component","target":"@components/agents/prompt-suggestions.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"message-actions","type":"registry:component","title":"Message Actions","description":"Assistant message action row (`MessageActions`) with copy that morphs into a drawn check, regenerate that spins (continuously while its promise runs), exclusive thumbs up/down that pop in filled, a thumbs-down reason popover with toggle chips and comment, share and a more menu; reveals on message hover or focus and stays visible on touch or with `visibility=\"always\"` for the last message — a standalone, richer counterpart to StreamingResponse's built-in actions.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/message-actions.tsx","type":"registry:component","target":"@components/agents/message-actions.tsx"},{"path":"components/motion/button/index.tsx","type":"registry:component","target":"@components/motion/button/index.tsx"},{"path":"components/motion/dropdown-menu.tsx","type":"registry:component","target":"@components/motion/dropdown-menu.tsx"},{"path":"components/motion/popover-morph.tsx","type":"registry:component","target":"@components/motion/popover-morph.tsx"},{"path":"components/motion/textarea.tsx","type":"registry:component","target":"@components/motion/textarea.tsx"},{"path":"components/motion/toggle-group.tsx","type":"registry:component","target":"@components/motion/toggle-group.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":"components/motion/anchored-placement.ts","type":"registry:component","target":"@components/motion/anchored-placement.ts"},{"path":"components/motion/popover-position.ts","type":"registry:component","target":"@components/motion/popover-position.ts"},{"path":"lib/hooks/use-dismiss.ts","type":"registry:hook","target":"@lib/hooks/use-dismiss.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"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":"branch-navigator","type":"registry:component","title":"Branch Navigator","description":"Version switcher for regenerated or edited messages: `Branches` shares a controlled or uncontrolled index, `BranchContent` cross-fades and slides the active version in from the direction you navigated, and `BranchNavigator` renders a \"‹ 2 / 3 ›\" control with a rolling counter, arrow/Home/End keys and live announcements, usable standalone too.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/branch-navigator.tsx","type":"registry:component","target":"@components/agents/branch-navigator.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"conversation-history","type":"registry:component","title":"Conversation History","description":"Chat history sidebar list grouped into Pinned, Today, Yesterday, Previous 7 days and Older from a now read after mount, with search, a spring-gliding active highlight, hover or focus row actions to pin, rename in place through InlineEdit and delete with a slide-out exit while neighbours glide up, and new chats that drop in at the top with a streaming title caret.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/conversation-history.tsx","type":"registry:component","target":"@components/agents/conversation-history.tsx"},{"path":"components/motion/empty-state.tsx","type":"registry:component","target":"@components/motion/empty-state.tsx"},{"path":"components/motion/inline-edit.tsx","type":"registry:component","target":"@components/motion/inline-edit.tsx"},{"path":"components/motion/scroll-area.tsx","type":"registry:component","target":"@components/motion/scroll-area.tsx"},{"path":"components/motion/skeleton.tsx","type":"registry:component","target":"@components/motion/skeleton.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/loader.tsx","type":"registry:component","target":"@components/motion/loader.tsx"}]},{"name":"artifact-panel","type":"registry:component","title":"Artifact Panel","description":"Side canvas that slides open beside a chat (its width eases so the conversation reflows smoothly) to show a generated artifact, with a version switcher whose label rolls by direction, Preview/Code tabs rendering code through CodeBlock, copy, download and close actions, a shared-layout expand into a fullscreen overlay, cross-fading content between versions and a skeleton while a new version generates.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","shiki","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/artifact-panel.tsx","type":"registry:component","target":"@components/agents/artifact-panel.tsx"},{"path":"components/agents/agent-code.tsx","type":"registry:component","target":"@components/agents/agent-code.tsx"},{"path":"components/agents/code-block.tsx","type":"registry:component","target":"@components/agents/code-block.tsx"},{"path":"components/motion/copy-button.tsx","type":"registry:component","target":"@components/motion/copy-button.tsx"},{"path":"components/motion/skeleton.tsx","type":"registry:component","target":"@components/motion/skeleton.tsx"},{"path":"components/motion/tabs.tsx","type":"registry:component","target":"@components/motion/tabs.tsx"},{"path":"components/motion/text-shimmer.tsx","type":"registry:component","target":"@components/motion/text-shimmer.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"lib/text-shimmer.ts","type":"registry:lib","target":"@lib/text-shimmer.ts"}]},{"name":"voice-orb","type":"registry:component","title":"Voice Orb","description":"Audio-reactive orb for voice mode whose blurred --chart and --primary color blobs orbit inside a glossy sphere and swell with a 0..1 level prop, easing between idle breathing, listening ripples, a circling thinking arc and churning speaking motion, with a simulate mode that synthesizes speech-like levels and a gentle opacity pulse under reduced motion; pairs with VoiceInput for capture.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/voice-orb.tsx","type":"registry:component","target":"@components/agents/voice-orb.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"ai-sidebar","type":"registry:component","title":"AI Sidebar","description":"A file-tree sidebar for agent workspaces: folders and projects expand, files and bookmarks open, rows move by drag, keyboard or menu with rollback when your save fails, F2 renames in place, and long names truncate cleanly.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/ai-sidebar.tsx","type":"registry:component","target":"@components/agents/ai-sidebar.tsx"},{"path":"components/motion/popover-morph.tsx","type":"registry:component","target":"@components/motion/popover-morph.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/hooks/use-touch-capable.ts","type":"registry:hook","target":"@lib/hooks/use-touch-capable.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"components/motion/popover-position.ts","type":"registry:component","target":"@components/motion/popover-position.ts"}]},{"name":"chat-app","type":"registry:component","title":"Chat App","description":"A full agent chat to start from: an app shell whose docked sidebar folds off-canvas when its own container gets too narrow, filled with the workspace tree, transcript, streamed answers, plans, approvals, tool output, code, diffs, images, sources and the composer.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","shiki","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/chat-app.tsx","type":"registry:component","target":"@components/agents/chat-app.tsx"},{"path":"components/agents/agent-activity/index.tsx","type":"registry:component","target":"@components/agents/agent-activity/index.tsx"},{"path":"components/agents/ai-sidebar.tsx","type":"registry:component","target":"@components/agents/ai-sidebar.tsx"},{"path":"components/agents/approval-card/index.tsx","type":"registry:component","target":"@components/agents/approval-card/index.tsx"},{"path":"components/agents/code-block.tsx","type":"registry:component","target":"@components/agents/code-block.tsx"},{"path":"components/agents/file-diff.tsx","type":"registry:component","target":"@components/agents/file-diff.tsx"},{"path":"components/agents/image-generation.tsx","type":"registry:component","target":"@components/agents/image-generation.tsx"},{"path":"components/agents/loading-states/thinking-shimmer.tsx","type":"registry:component","target":"@components/agents/loading-states/thinking-shimmer.tsx"},{"path":"components/agents/message.tsx","type":"registry:component","target":"@components/agents/message.tsx"},{"path":"components/agents/message-bubble.tsx","type":"registry:component","target":"@components/agents/message-bubble.tsx"},{"path":"components/agents/message-scroller.tsx","type":"registry:component","target":"@components/agents/message-scroller.tsx"},{"path":"components/agents/prompt-input.tsx","type":"registry:component","target":"@components/agents/prompt-input.tsx"},{"path":"components/agents/streaming-response.tsx","type":"registry:component","target":"@components/agents/streaming-response.tsx"},{"path":"components/agents/todo-list.tsx","type":"registry:component","target":"@components/agents/todo-list.tsx"},{"path":"components/agents/tool-approval.tsx","type":"registry:component","target":"@components/agents/tool-approval.tsx"},{"path":"components/agents/tool-result.tsx","type":"registry:component","target":"@components/agents/tool-result.tsx"},{"path":"components/motion/animated-sidebar.tsx","type":"registry:component","target":"@components/motion/animated-sidebar.tsx"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"components/agents/agent-activity/activity-row.tsx","type":"registry:component","target":"@components/agents/agent-activity/activity-row.tsx"},{"path":"components/agents/agent-activity/types.ts","type":"registry:component","target":"@components/agents/agent-activity/types.ts"},{"path":"components/agents/agent-disclosure.tsx","type":"registry:component","target":"@components/agents/agent-disclosure.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"components/motion/popover-morph.tsx","type":"registry:component","target":"@components/motion/popover-morph.tsx"},{"path":"lib/hooks/use-touch-capable.ts","type":"registry:hook","target":"@lib/hooks/use-touch-capable.ts"},{"path":"components/agents/approval-card/types.ts","type":"registry:component","target":"@components/agents/approval-card/types.ts"},{"path":"components/motion/action-swap-roll.tsx","type":"registry:component","target":"@components/motion/action-swap-roll.tsx"},{"path":"components/motion/button/index.tsx","type":"registry:component","target":"@components/motion/button/index.tsx"},{"path":"components/motion/checkbox.tsx","type":"registry:component","target":"@components/motion/checkbox.tsx"},{"path":"components/motion/input.tsx","type":"registry:component","target":"@components/motion/input.tsx"},{"path":"components/motion/radio.tsx","type":"registry:component","target":"@components/motion/radio.tsx"},{"path":"components/agents/agent-code.tsx","type":"registry:component","target":"@components/agents/agent-code.tsx"},{"path":"lib/hooks/use-hover-capable.ts","type":"registry:hook","target":"@lib/hooks/use-hover-capable.ts"},{"path":"components/motion/text-shimmer.tsx","type":"registry:component","target":"@components/motion/text-shimmer.tsx"},{"path":"components/agents/message-context.tsx","type":"registry:component","target":"@components/agents/message-context.tsx"},{"path":"components/motion/preview-rail.tsx","type":"registry:component","target":"@components/motion/preview-rail.tsx"},{"path":"components/motion/select.tsx","type":"registry:component","target":"@components/motion/select.tsx"},{"path":"components/agents/citations.tsx","type":"registry:component","target":"@components/agents/citations.tsx"},{"path":"components/motion/shared-layout-bg.tsx","type":"registry:component","target":"@components/motion/shared-layout-bg.tsx"},{"path":"components/motion/popover-position.ts","type":"registry:component","target":"@components/motion/popover-position.ts"},{"path":"components/motion/action-swap.tsx","type":"registry:component","target":"@components/motion/action-swap.tsx"},{"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/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"lib/text-shimmer.ts","type":"registry:lib","target":"@lib/text-shimmer.ts"},{"path":"lib/hooks/use-dismiss.ts","type":"registry:hook","target":"@lib/hooks/use-dismiss.ts"},{"path":"lib/hooks/use-hover-gesture.ts","type":"registry:hook","target":"@lib/hooks/use-hover-gesture.ts"},{"path":"lib/hooks/use-tap-gesture.ts","type":"registry:hook","target":"@lib/hooks/use-tap-gesture.ts"},{"path":"lib/hooks/use-favicon.ts","type":"registry:hook","target":"@lib/hooks/use-favicon.ts"},{"path":"components/motion/magnetic.tsx","type":"registry:component","target":"@components/motion/magnetic.tsx"},{"path":"lib/favicon.ts","type":"registry:lib","target":"@lib/favicon.ts"}]},{"name":"inbox-app","type":"registry:block","title":"Inbox App","description":"Mail client with a folder rail and unread counts (virtual folders like Starred via `filter`), a searchable message list with unread dots, stars, checkboxes and a gliding selection highlight, a reading pane that cross-fades between messages, and swipe-right-to-archive / swipe-left-to-delete rows that slide out with an Undo bar.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/inbox-app.tsx","type":"registry:component","target":"@components/motion/inbox-app.tsx"},{"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"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"}]},{"name":"music-player","type":"registry:block","title":"Music Player","description":"Now-playing card with a token-gradient cover that breathes with playback, title and artist that cross-fade in the skip direction, a draggable scrub bar with buffered and played layers, play/pause icon swap, shuffle and repeat-all/one toggles, volume slider with mute, and a queue drawer that slides up over the card; playback is simulated unless a track has a `src`.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/music-player.tsx","type":"registry:component","target":"@components/motion/music-player.tsx"},{"path":"components/motion/toggle-group.tsx","type":"registry:component","target":"@components/motion/toggle-group.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/hooks/use-slider.ts","type":"registry:hook","target":"@lib/hooks/use-slider.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"}]},{"name":"file-manager","type":"registry:block","title":"File Manager","description":"File browser with breadcrumb navigation, folders that slide in from the side you travel, grid/list views, click / Cmd-Ctrl-click / Shift-click range selection with arrow-key movement, kind-tinted file icons, a sort menu, a storage usage meter, and a drop overlay that adds dragged-in files to the open folder.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/file-manager.tsx","type":"registry:component","target":"@components/motion/file-manager.tsx"},{"path":"components/motion/breadcrumb.tsx","type":"registry:component","target":"@components/motion/breadcrumb.tsx"},{"path":"components/motion/dropdown-menu.tsx","type":"registry:component","target":"@components/motion/dropdown-menu.tsx"},{"path":"components/motion/progress.tsx","type":"registry:component","target":"@components/motion/progress.tsx"},{"path":"components/motion/toggle-group.tsx","type":"registry:component","target":"@components/motion/toggle-group.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/anchored-placement.ts","type":"registry:component","target":"@components/motion/anchored-placement.ts"},{"path":"components/motion/popover-position.ts","type":"registry:component","target":"@components/motion/popover-position.ts"},{"path":"lib/hooks/use-dismiss.ts","type":"registry:hook","target":"@lib/hooks/use-dismiss.ts"},{"path":"components/motion/number-ticker.tsx","type":"registry:component","target":"@components/motion/number-ticker.tsx"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"}]},{"name":"dashboard-shell","type":"registry:block","title":"Dashboard Shell","description":"Container-sized app shell whose sidebar collapses to icons with tooltips and a gliding active pill, a top bar with a Mod+K search field and avatar menu, and a content slot with breadcrumbs, title and actions that cross-fades per page; below its own `mobileBelow` width (768px default) the sidebar moves into a Drawer — a data-driven complement to the viewport-height AnimatedSidebar primitives.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/dashboard-shell.tsx","type":"registry:component","target":"@components/motion/dashboard-shell.tsx"},{"path":"components/motion/breadcrumb.tsx","type":"registry:component","target":"@components/motion/breadcrumb.tsx"},{"path":"components/motion/drawer.tsx","type":"registry:component","target":"@components/motion/drawer.tsx"},{"path":"components/motion/dropdown-menu.tsx","type":"registry:component","target":"@components/motion/dropdown-menu.tsx"},{"path":"components/motion/kbd.tsx","type":"registry:component","target":"@components/motion/kbd.tsx"},{"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/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"components/motion/anchored-placement.ts","type":"registry:component","target":"@components/motion/anchored-placement.ts"},{"path":"components/motion/popover-position.ts","type":"registry:component","target":"@components/motion/popover-position.ts"},{"path":"lib/hooks/use-dismiss.ts","type":"registry:hook","target":"@lib/hooks/use-dismiss.ts"},{"path":"lib/hooks/use-hover-gesture.ts","type":"registry:hook","target":"@lib/hooks/use-hover-gesture.ts"},{"path":"lib/hooks/use-tap-gesture.ts","type":"registry:hook","target":"@lib/hooks/use-tap-gesture.ts"}]},{"name":"comparison-table","type":"registry:block","title":"Comparison Table","description":"Plan comparison grid with a monthly/yearly switch that rolls every price, plan columns in a sticky header over scrolling feature rows, collapsible feature groups, check / dash / partial / text cells, a recommended column tinted top to bottom, and a plan switcher with one cross-fading column in narrow containers — the detailed companion to PricingTable.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/comparison-table.tsx","type":"registry:component","target":"@components/motion/comparison-table.tsx"},{"path":"components/motion/button/index.tsx","type":"registry:component","target":"@components/motion/button/index.tsx"},{"path":"components/motion/collapsible.tsx","type":"registry:component","target":"@components/motion/collapsible.tsx"},{"path":"components/motion/number-ticker.tsx","type":"registry:component","target":"@components/motion/number-ticker.tsx"},{"path":"components/motion/segmented-control.tsx","type":"registry:component","target":"@components/motion/segmented-control.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":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"components/motion/magnetic.tsx","type":"registry:component","target":"@components/motion/magnetic.tsx"}]},{"name":"feature-section","type":"registry:block","title":"Feature Section","description":"Marketing features section with a vertical tab list beside a visual panel that cross-fades and slides in the direction of travel to each feature's visual, autoplay that fills a progress rail on the active row and advances, pausing on hover or focus, with a pause button and keyboard tabs.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/feature-section.tsx","type":"registry:component","target":"@components/motion/feature-section.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"blog-list","type":"registry:block","title":"Blog List","description":"Blog index with category chips and a gliding pill, a wide featured post, and cards with gradient or image covers, excerpt, author avatar, read time and an en-US date that lift on hover; filtering reflows the grid with shared layout and Load more appends the next page with a stagger, falling back to `onLoadMore` for server pagination.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/blog-list.tsx","type":"registry:component","target":"@components/motion/blog-list.tsx"},{"path":"components/motion/button/index.tsx","type":"registry:component","target":"@components/motion/button/index.tsx"},{"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/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":"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/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"components/motion/magnetic.tsx","type":"registry:component","target":"@components/motion/magnetic.tsx"}]},{"name":"status-page","type":"registry:block","title":"Status Page","description":"Service status block with an overall banner derived from today's worst status, per-service 90-day uptime bars that grow in on view and reveal a date, status and incident tooltip on hover or arrow-key focus, computed uptime percentages, and an incident timeline whose entries expand into their update history, all formatted in UTC from deterministic data.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/status-page.tsx","type":"registry:component","target":"@components/motion/status-page.tsx"},{"path":"components/motion/badge.tsx","type":"registry:component","target":"@components/motion/badge.tsx"},{"path":"components/motion/collapsible.tsx","type":"registry:component","target":"@components/motion/collapsible.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"changelog","type":"registry:block","title":"Changelog","description":"Release notes list with a version and date rail, New/Improved/Fixed badges, entries that expand to reveal their staggered change lines, a tag filter with counts that reflows the list with layout animation, and an email subscribe field driven by a StatefulButton promise.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/changelog.tsx","type":"registry:component","target":"@components/motion/changelog.tsx"},{"path":"components/motion/badge.tsx","type":"registry:component","target":"@components/motion/badge.tsx"},{"path":"components/motion/button/index.tsx","type":"registry:component","target":"@components/motion/button/index.tsx"},{"path":"components/motion/collapsible.tsx","type":"registry:component","target":"@components/motion/collapsible.tsx"},{"path":"components/motion/empty-state.tsx","type":"registry:component","target":"@components/motion/empty-state.tsx"},{"path":"components/motion/input.tsx","type":"registry:component","target":"@components/motion/input.tsx"},{"path":"components/motion/toggle-group.tsx","type":"registry:component","target":"@components/motion/toggle-group.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/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"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":"roadmap","type":"registry:block","title":"Roadmap","description":"Public product roadmap with Planned, In progress and Shipped columns or a quarter timeline, where cards fly between the two views through shared layout, re-sort by votes as you upvote with a direction-aware rolling count, carry tag badges, and can be filtered by status.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/roadmap.tsx","type":"registry:component","target":"@components/motion/roadmap.tsx"},{"path":"components/motion/badge.tsx","type":"registry:component","target":"@components/motion/badge.tsx"},{"path":"components/motion/empty-state.tsx","type":"registry:component","target":"@components/motion/empty-state.tsx"},{"path":"components/motion/segmented-control.tsx","type":"registry:component","target":"@components/motion/segmented-control.tsx"},{"path":"components/motion/toggle-group.tsx","type":"registry:component","target":"@components/motion/toggle-group.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"}]},{"name":"login-form","type":"registry:block","title":"Login Form","description":"Sign-in card that pairs with Signup Form — email, password and remember-me with generic SSO/passkey buttons — whose \"Forgot password?\" flow morphs inside the same card from requesting a code to a check-your-inbox screen with a resend cooldown, then an OTP plus new-password step and a drawn success check, with every async handler driving pending states and shaking the card on rejection.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/login-form.tsx","type":"registry:component","target":"@components/motion/login-form.tsx"},{"path":"components/motion/button/index.tsx","type":"registry:component","target":"@components/motion/button/index.tsx"},{"path":"components/motion/checkbox.tsx","type":"registry:component","target":"@components/motion/checkbox.tsx"},{"path":"components/motion/input.tsx","type":"registry:component","target":"@components/motion/input.tsx"},{"path":"components/motion/otp-input.tsx","type":"registry:component","target":"@components/motion/otp-input.tsx"},{"path":"components/motion/password-input.tsx","type":"registry:component","target":"@components/motion/password-input.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/password-strength.ts","type":"registry:lib","target":"@lib/password-strength.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/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"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":"settings-page","type":"registry:block","title":"Settings Page","description":"Account settings with a side nav whose pill glides between Profile, Notifications, Appearance and Billing, sections built from inline edits, switches, selects, toggle groups and usage bars, a draft that slides up a sticky unsaved-changes bar with Reset and an async Save that shakes on failure, and a danger zone behind a type-to-confirm dialog.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/settings-page.tsx","type":"registry:component","target":"@components/motion/settings-page.tsx"},{"path":"components/motion/badge.tsx","type":"registry:component","target":"@components/motion/badge.tsx"},{"path":"components/motion/button/index.tsx","type":"registry:component","target":"@components/motion/button/index.tsx"},{"path":"components/motion/dialog.tsx","type":"registry:component","target":"@components/motion/dialog.tsx"},{"path":"components/motion/inline-edit.tsx","type":"registry:component","target":"@components/motion/inline-edit.tsx"},{"path":"components/motion/progress.tsx","type":"registry:component","target":"@components/motion/progress.tsx"},{"path":"components/motion/scroll-area.tsx","type":"registry:component","target":"@components/motion/scroll-area.tsx"},{"path":"components/motion/select.tsx","type":"registry:component","target":"@components/motion/select.tsx"},{"path":"components/motion/switch.tsx","type":"registry:component","target":"@components/motion/switch.tsx"},{"path":"components/motion/toggle-group.tsx","type":"registry:component","target":"@components/motion/toggle-group.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":"components/motion/input.tsx","type":"registry:component","target":"@components/motion/input.tsx"},{"path":"components/motion/loader.tsx","type":"registry:component","target":"@components/motion/loader.tsx"},{"path":"components/motion/number-ticker.tsx","type":"registry:component","target":"@components/motion/number-ticker.tsx"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"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":"contact-form","type":"registry:block","title":"Contact Form","description":"Contact section with name, email, a topic select and an auto-growing message textarea with a live character counter, validation that only flags fields after blur, an async submit that shakes on error and morphs the card into a drawn-check thank-you panel, plus a side panel of contact methods.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/contact-form.tsx","type":"registry:component","target":"@components/motion/contact-form.tsx"},{"path":"components/motion/button/index.tsx","type":"registry:component","target":"@components/motion/button/index.tsx"},{"path":"components/motion/input.tsx","type":"registry:component","target":"@components/motion/input.tsx"},{"path":"components/motion/select.tsx","type":"registry:component","target":"@components/motion/select.tsx"},{"path":"components/motion/textarea.tsx","type":"registry:component","target":"@components/motion/textarea.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/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"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":"checkout","type":"registry:block","title":"Checkout","description":"Checkout flow on Stepper — shipping with a gliding delivery-speed choice, display-only payment fields and an editable review — beside an order summary with compact quantity steppers, a promo code that shakes when invalid and pops a removable badge when valid, and subtotal, discount, tax and total that roll on every change.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/checkout.tsx","type":"registry:component","target":"@components/motion/checkout.tsx"},{"path":"components/motion/badge.tsx","type":"registry:component","target":"@components/motion/badge.tsx"},{"path":"components/motion/button/index.tsx","type":"registry:component","target":"@components/motion/button/index.tsx"},{"path":"components/motion/input.tsx","type":"registry:component","target":"@components/motion/input.tsx"},{"path":"components/motion/number-ticker.tsx","type":"registry:component","target":"@components/motion/number-ticker.tsx"},{"path":"components/motion/stepper.tsx","type":"registry:component","target":"@components/motion/stepper.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":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"components/motion/magnetic.tsx","type":"registry:component","target":"@components/motion/magnetic.tsx"}]},{"name":"invoice","type":"registry:block","title":"Invoice","description":"Printable invoice with number and UTC-formatted dates, an animated Paid / Due / Overdue status badge, bill-from and bill-to, a staggered line-item table and subtotal, tax and total, plus Download, Send and Mark-as-paid actions that stamp the sheet and roll the amount due to zero, with print variants that hide the actions and switch to ink-friendly colors.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/invoice.tsx","type":"registry:component","target":"@components/motion/invoice.tsx"},{"path":"components/motion/badge.tsx","type":"registry:component","target":"@components/motion/badge.tsx"},{"path":"components/motion/button/index.tsx","type":"registry:component","target":"@components/motion/button/index.tsx"},{"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"},{"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":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"components/motion/magnetic.tsx","type":"registry:component","target":"@components/motion/magnetic.tsx"}]},{"name":"onboarding-checklist","type":"registry:block","title":"Onboarding Checklist","description":"Getting-started card with a progress ring and bar and steps that expand to a description and an async CTA; finishing a step pops its check, strikes its title and opens the next unfinished step, and at 100% the list gives way to a confetti celebration, with a dismiss that animates the card away.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/onboarding-checklist.tsx","type":"registry:component","target":"@components/motion/onboarding-checklist.tsx"},{"path":"components/motion/button/index.tsx","type":"registry:component","target":"@components/motion/button/index.tsx"},{"path":"components/motion/collapsible.tsx","type":"registry:component","target":"@components/motion/collapsible.tsx"},{"path":"components/motion/progress.tsx","type":"registry:component","target":"@components/motion/progress.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":"components/motion/number-ticker.tsx","type":"registry:component","target":"@components/motion/number-ticker.tsx"},{"path":"lib/hooks/use-hover-capable.ts","type":"registry:hook","target":"@lib/hooks/use-hover-capable.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"components/motion/magnetic.tsx","type":"registry:component","target":"@components/motion/magnetic.tsx"}]},{"name":"cta-section","type":"registry:block","title":"CTA Section","description":"Closing call-to-action section in a centered layout (large headline, two CTAs and a reassurance checklist inside a card) or a split layout (copy beside a visual or an email capture with a stateful submit), with a word-by-word headline reveal on scroll, a rotating gradient beam on the card border or a soft dotted field, and a layout that adapts to its own container width.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/cta-section.tsx","type":"registry:component","target":"@components/motion/cta-section.tsx"},{"path":"components/motion/button/index.tsx","type":"registry:component","target":"@components/motion/button/index.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/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":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"components/motion/magnetic.tsx","type":"registry:component","target":"@components/motion/magnetic.tsx"}]},{"name":"logo-cloud","type":"registry:block","title":"Logo Cloud","description":"Trusted-by logo strip with an infinite marquee variant behind edge fade masks that pauses on hover or focus, and a grid variant whose logos fade in with a stagger and lift on hover; logos start muted and grayscale and take their own colors on hover, accept any SVG or node, and fall back to a static row under reduced motion.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/logo-cloud.tsx","type":"registry:component","target":"@components/motion/logo-cloud.tsx"},{"path":"components/motion/marquee.tsx","type":"registry:component","target":"@components/motion/marquee.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"how-it-works","type":"registry:block","title":"How It Works","description":"Numbered steps section whose connector draws from marker to marker as it scrolls into view, lighting each marker as the line arrives; horizontal on wide containers and a vertical timeline on narrow ones, with optional per-step media that cross-fades when a step is hovered, focused or chosen with arrow keys like a tab.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/how-it-works.tsx","type":"registry:component","target":"@components/motion/how-it-works.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"integrations-section","type":"registry:block","title":"Integrations Section","description":"Integrations showcase pairing a hub-and-spoke orbit (your logo at the center, integration icons on counter-rotating rings that keep icons upright and pause on hover) with a searchable card grid filtered by category chips behind a gliding pill, where cards enter, leave and reflow with spring layout animation.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/integrations-section.tsx","type":"registry:component","target":"@components/motion/integrations-section.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"image-gallery","type":"registry:block","title":"Image Gallery","description":"Photo gallery laid out as a masonry or uniform grid sized by its own container width, with hover zoom and caption reveal, category filters behind a gliding chip with spring layout reflow, and a lightbox that grows out of the clicked tile with prev/next, arrow keys, Escape, swipe, a counter and a focus trap; reduced motion turns every move into a fade.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/image-gallery.tsx","type":"registry:component","target":"@components/motion/image-gallery.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":"newsletter-section","type":"registry:block","title":"Newsletter Section","description":"Newsletter signup section with an email field, light validation and a submit button that steps through idle, loading, success and error from your onSubscribe promise, a form that morphs into a confirmation with a draw-in check, a privacy note, optional reader avatars for social proof, and card or inline layouts.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/newsletter-section.tsx","type":"registry:component","target":"@components/motion/newsletter-section.tsx"},{"path":"components/motion/avatar-group.tsx","type":"registry:component","target":"@components/motion/avatar-group.tsx"},{"path":"components/motion/button/index.tsx","type":"registry:component","target":"@components/motion/button/index.tsx"},{"path":"components/motion/input.tsx","type":"registry:component","target":"@components/motion/input.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/popover-morph.tsx","type":"registry:component","target":"@components/motion/popover-morph.tsx"},{"path":"components/motion/tooltip.tsx","type":"registry:component","target":"@components/motion/tooltip.tsx"},{"path":"lib/hooks/use-hover-capable.ts","type":"registry:hook","target":"@lib/hooks/use-hover-capable.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":"components/motion/popover-position.ts","type":"registry:component","target":"@components/motion/popover-position.ts"},{"path":"lib/hooks/use-dismiss.ts","type":"registry:hook","target":"@lib/hooks/use-dismiss.ts"},{"path":"lib/hooks/use-hover-gesture.ts","type":"registry:hook","target":"@lib/hooks/use-hover-gesture.ts"},{"path":"lib/hooks/use-tap-gesture.ts","type":"registry:hook","target":"@lib/hooks/use-tap-gesture.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"components/motion/magnetic.tsx","type":"registry:component","target":"@components/motion/magnetic.tsx"}]},{"name":"team-section","type":"registry:block","title":"Team Section","description":"Team page section with member cards that stagger in on view and slide up a bio and links on hover or focus, department filter chips with a gliding pill and spring layout reflow, and a click that opens a focus-managed dialog with the member's full bio, location and links.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/team-section.tsx","type":"registry:component","target":"@components/motion/team-section.tsx"},{"path":"components/motion/dialog.tsx","type":"registry:component","target":"@components/motion/dialog.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"},{"path":"components/motion/button/index.tsx","type":"registry:component","target":"@components/motion/button/index.tsx"},{"path":"components/motion/input.tsx","type":"registry:component","target":"@components/motion/input.tsx"},{"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/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"components/motion/magnetic.tsx","type":"registry:component","target":"@components/motion/magnetic.tsx"}]},{"name":"content-section","type":"registry:block","title":"Content Section","description":"Long-form marketing content block in three variants: split copy beside media that stays pinned while paragraphs scroll, a stats layout whose callouts roll their numbers up on view, and a pull quote framed by large typographic quote marks, with paragraphs revealed as they scroll into view.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/content-section.tsx","type":"registry:component","target":"@components/motion/content-section.tsx"},{"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":"audit-trail","type":"registry:block","title":"Audit Trail","description":"Chronological activity log grouped by day with actor avatars, verb-plus-target summaries, relative times, severity and category badges, actor, action-type and search filters, entries that expand into a before/after field diff, new events sliding in at the top, and an export hook that receives the filtered rows.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/audit-trail.tsx","type":"registry:component","target":"@components/motion/audit-trail.tsx"},{"path":"components/motion/button/index.tsx","type":"registry:component","target":"@components/motion/button/index.tsx"},{"path":"components/motion/chart/shared.tsx","type":"registry:component","target":"@components/motion/chart/shared.tsx"},{"path":"components/motion/empty-state.tsx","type":"registry:component","target":"@components/motion/empty-state.tsx"},{"path":"components/motion/multi-select.tsx","type":"registry:component","target":"@components/motion/multi-select.tsx"},{"path":"components/motion/segmented-control.tsx","type":"registry:component","target":"@components/motion/segmented-control.tsx"},{"path":"components/motion/skeleton.tsx","type":"registry:component","target":"@components/motion/skeleton.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-dismiss.ts","type":"registry:hook","target":"@lib/hooks/use-dismiss.ts"},{"path":"lib/hooks/use-hover-capable.ts","type":"registry:hook","target":"@lib/hooks/use-hover-capable.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"components/motion/magnetic.tsx","type":"registry:component","target":"@components/motion/magnetic.tsx"}]},{"name":"approval-queue","type":"registry:block","title":"Approval Queue","description":"Review queue for pending expense, access, deploy and time-off requests with row and bulk selection, approve and reject that swipe rows out optimistically with an undo toast, a dialog that asks for a rejection reason, Pending/Approved/Rejected tabs whose counts roll, and j/k/x/a/r keyboard shortcuts.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/approval-queue.tsx","type":"registry:component","target":"@components/motion/approval-queue.tsx"},{"path":"components/motion/animated-toast-stack.tsx","type":"registry:component","target":"@components/motion/animated-toast-stack.tsx"},{"path":"components/motion/button/index.tsx","type":"registry:component","target":"@components/motion/button/index.tsx"},{"path":"components/motion/checkbox.tsx","type":"registry:component","target":"@components/motion/checkbox.tsx"},{"path":"components/motion/dialog.tsx","type":"registry:component","target":"@components/motion/dialog.tsx"},{"path":"components/motion/empty-state.tsx","type":"registry:component","target":"@components/motion/empty-state.tsx"},{"path":"components/motion/kbd.tsx","type":"registry:component","target":"@components/motion/kbd.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":"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/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"components/motion/input.tsx","type":"registry:component","target":"@components/motion/input.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":"log-explorer","type":"registry:block","title":"Log Explorer","description":"Log stream viewer with a volume histogram you click or drag across to narrow the time window, level filters, a text query with highlighted matches, a virtualized monospace table, live tail that follows new lines until you scroll up and then shows a Jump to latest pill, and a side panel with each line's structured fields as JSON.","author":"kara <ztzyrant@gmail.com>","dependencies":["@tanstack/react-virtual","clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/log-explorer.tsx","type":"registry:component","target":"@components/motion/log-explorer.tsx"},{"path":"components/motion/segmented-control.tsx","type":"registry:component","target":"@components/motion/segmented-control.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"performance-report","type":"registry:block","title":"Performance Report","description":"Dashboard report with a date range picker and previous-period compare switch, rolling KPI cards with delta badges, an area trend chart that adds the previous period as a muted series, a breakdown table with inline growing bars, and auto-generated highlights that stagger in, with skeletons holding the layout while a new range loads.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/performance-report.tsx","type":"registry:component","target":"@components/motion/performance-report.tsx"},{"path":"components/motion/calendar.tsx","type":"registry:component","target":"@components/motion/calendar.tsx"},{"path":"components/motion/chart/area-chart.tsx","type":"registry:component","target":"@components/motion/chart/area-chart.tsx"},{"path":"components/motion/chart/shared.tsx","type":"registry:component","target":"@components/motion/chart/shared.tsx"},{"path":"components/motion/date-range-picker.tsx","type":"registry:component","target":"@components/motion/date-range-picker.tsx"},{"path":"components/motion/skeleton.tsx","type":"registry:component","target":"@components/motion/skeleton.tsx"},{"path":"components/motion/stat-card.tsx","type":"registry:component","target":"@components/motion/stat-card.tsx"},{"path":"components/motion/switch.tsx","type":"registry:component","target":"@components/motion/switch.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/chart/cartesian.tsx","type":"registry:component","target":"@components/motion/chart/cartesian.tsx"},{"path":"components/motion/popover-morph.tsx","type":"registry:component","target":"@components/motion/popover-morph.tsx"},{"path":"components/motion/chart/sparkline.tsx","type":"registry:component","target":"@components/motion/chart/sparkline.tsx"},{"path":"components/motion/number-ticker.tsx","type":"registry:component","target":"@components/motion/number-ticker.tsx"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"components/motion/popover-position.ts","type":"registry:component","target":"@components/motion/popover-position.ts"}]},{"name":"cookie-consent","type":"registry:block","title":"Cookie Consent","description":"Cookie consent card that springs up after mount with Accept all, Reject non-essential and Customize, where Customize grows the card into Necessary (locked on), Analytics and Marketing switches with Save; the choice is reported through onConsentChange and can persist to localStorage, anchored bottom-left, bottom or bottom-right, fixed to the viewport or contained in a parent.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/cookie-consent.tsx","type":"registry:component","target":"@components/motion/cookie-consent.tsx"},{"path":"components/motion/button/index.tsx","type":"registry:component","target":"@components/motion/button/index.tsx"},{"path":"components/motion/switch.tsx","type":"registry:component","target":"@components/motion/switch.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/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"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":"navigation-menu","type":"registry:block","title":"Navigation Menu","description":"Site navbar with a logo slot, plain links and mega-menu panels: a hover pill glides between items, the dropdown viewport morphs its size to each panel while content slides in the direction you move, panels open on hover intent or click/Enter, close on Escape or outside click, support arrow-key navigation, and collapse below md into a hamburger sheet with accordion sections.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/navigation-menu.tsx","type":"registry:component","target":"@components/motion/navigation-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":"bento-grid","type":"registry:block","title":"Bento Grid","description":"Bento layout of feature tiles on a container-query grid that collapses to one column in narrow containers, with per-card column and row spans, icon, title, description and a visual slot that lifts and zooms on hover, a radial spotlight that follows the cursor across the border and surface, a CTA whose arrow nudges on hover, and cards that stagger in when scrolled into view.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/bento-grid.tsx","type":"registry:component","target":"@components/motion/bento-grid.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":"stat-card","type":"registry:block","title":"Stat Card","description":"KPI tiles whose headline numbers roll digit by digit to each new value, with Intl number, currency, percent and compact formatting, a delta badge with an up or down arrow toned by whether the move is good news, an inline sparkline that redraws when its data changes, a period caption, a skeleton loading state and a container-query StatGrid layout.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/stat-card.tsx","type":"registry:component","target":"@components/motion/stat-card.tsx"},{"path":"components/motion/chart/sparkline.tsx","type":"registry:component","target":"@components/motion/chart/sparkline.tsx"},{"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"},{"path":"components/motion/chart/shared.tsx","type":"registry:component","target":"@components/motion/chart/shared.tsx"}]},{"name":"notification-center","type":"registry:block","title":"Notification Center","description":"Bell trigger whose unread badge springs when the count rises, opening a panel that grows out of the bell with All/Unread tabs and a gliding indicator, Today/Earlier groups, relative times, unread dots, hover actions to mark read or archive that collapse rows out while the rest glide up, Mark all as read, an empty state, focus management with Escape, and a controlled or uncontrolled notifications list.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/notification-center.tsx","type":"registry:component","target":"@components/motion/notification-center.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/hooks/use-dismiss.ts","type":"registry:hook","target":"@lib/hooks/use-dismiss.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":"faq-section","type":"registry:block","title":"FAQ Section","description":"FAQ page section with an eyebrow, heading and description column beside an accordion that opens one or many answers with height-morphing panels and a rotating plus, an optional search that narrows questions with spring layout reflow and highlights matches, a Still have questions CTA slot, optional hash deep links, and a layout that splits into two columns based on its own container width.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/faq-section.tsx","type":"registry:component","target":"@components/motion/faq-section.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"testimonial-wall","type":"registry:block","title":"Testimonial Wall","description":"Testimonial wall of quote cards with names, roles, initials avatars and optional star ratings, laid out in masonry-like columns that scroll vertically in alternating directions behind fade masks, pause on hover or focus, fall back to a static masonry under reduced motion, offer a static grid variant, and pick their column count from the block's own container width.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/testimonial-wall.tsx","type":"registry:component","target":"@components/motion/testimonial-wall.tsx"},{"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":"hero-section","type":"registry:block","title":"Hero Section","description":"Landing hero with a New pill badge, a headline revealed word by word with a spring blur-in, supporting copy that follows, primary and secondary CTAs, an install command chip with an animated copy button, an optional media slot that tilts up into place on view, and a CSS-gradient grid background with sweeping beams, centered or left aligned.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/hero-section.tsx","type":"registry:component","target":"@components/motion/hero-section.tsx"},{"path":"components/motion/button/index.tsx","type":"registry:component","target":"@components/motion/button/index.tsx"},{"path":"components/motion/copy-button.tsx","type":"registry:component","target":"@components/motion/copy-button.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/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/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"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":"footer-section","type":"registry:block","title":"Footer Section","description":"Site footer with a brand column of logo, tagline and social icons that lift on hover, link columns that collapse into disclosures in narrow containers, a newsletter signup that validates email and runs idle, loading, success and error states from an onSubscribe promise, and a bottom bar with legal links and a theme toggle slot.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/footer-section.tsx","type":"registry:component","target":"@components/motion/footer-section.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/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":"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/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"components/motion/magnetic.tsx","type":"registry:component","target":"@components/motion/magnetic.tsx"}]},{"name":"event-calendar","type":"registry:block","title":"Event Calendar","description":"Month and week event calendar: month cells pack events into lanes so multi-day events become bars across the week row and overflowing days open a \"+N more\" list, while week view places timed events on an hour grid, side by side where they overlap, with a live now line and optional 15-minute drag to reschedule. Periods slide in from the direction you travel, the Month/Week switcher pill glides between views, and day cells support arrow-key navigation.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/event-calendar.tsx","type":"registry:component","target":"@components/motion/event-calendar.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"pricing-table","type":"registry:block","title":"Pricing Table","description":"Pricing block with a monthly/yearly toggle whose pill glides between options beside a Save 20% badge, prices that roll digit by digit to the new period, three plans with a highlighted Popular card, feature lists with check and cross rows, per-plan CTA buttons, Intl currency formatting and cards that stack based on their own container width.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/pricing-table.tsx","type":"registry:component","target":"@components/motion/pricing-table.tsx"},{"path":"components/motion/button/index.tsx","type":"registry:component","target":"@components/motion/button/index.tsx"},{"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"},{"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":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"components/motion/magnetic.tsx","type":"registry:component","target":"@components/motion/magnetic.tsx"}]},{"name":"kanban-board","type":"registry:block","title":"Kanban Board","description":"Task board whose cards drag within and across columns, opening a dashed drop slot where they will land, lighting up the column underneath and flying into place via shared layout. Space, arrows and Escape move cards from the keyboard with live announcements. Columns show count badges, cards carry tags, assignee initials and a priority dot, and on mobile the columns scroll horizontally with snap. Controlled/uncontrolled, reduced-motion safe.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/kanban-board.tsx","type":"registry:component","target":"@components/motion/kanban-board.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"infinite-masonry","type":"registry:block","title":"Infinite Masonry","description":"A masonry grid for feeds of unknown length: it measures each card's real height, renders only what is near the viewport with TanStack Virtual, picks a column count from the container width and fetches the next page before the reader runs out.","author":"kara <ztzyrant@gmail.com>","dependencies":["@tanstack/react-virtual","clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/infinite-masonry.tsx","type":"registry:component","target":"@components/motion/infinite-masonry.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"notification-stack","type":"registry:block","title":"Notification Stack","description":"Piles notifications into a compact deck and fans them out into a full list when someone hovers, focuses or taps it, with a count, a view-all action and an empty state.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/notification-stack.tsx","type":"registry:component","target":"@components/motion/notification-stack.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/hooks/use-dismiss.ts","type":"registry:hook","target":"@lib/hooks/use-dismiss.ts"},{"path":"lib/hooks/use-hover-gesture.ts","type":"registry:hook","target":"@lib/hooks/use-hover-gesture.ts"},{"path":"lib/hooks/use-tap-gesture.ts","type":"registry:hook","target":"@lib/hooks/use-tap-gesture.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"}]},{"name":"project-folder","type":"registry:block","title":"Project Folder","description":"A folder card for portfolios and file browsers: hovering or focusing fans out preview cards from inside, clicking grows it into a full overlay with managed focus and Escape to close, and closing plays the same path back into the folder.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/project-folder.tsx","type":"registry:component","target":"@components/motion/project-folder.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":"knockout-wheel","type":"registry:block","title":"Fixtures Knockout Wheel","description":"A circular take on the draw: the winner sits at the center, each round adds a ring farther out, and the competing teams line the edge. Rings spring in from the middle outward, hovering a team keeps it in focus while every other one dims, and each team shows a flag, logo or initials.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/knockout-wheel.tsx","type":"registry:component","target":"@components/motion/knockout-wheel.tsx"},{"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-dismiss.ts","type":"registry:hook","target":"@lib/hooks/use-dismiss.ts"},{"path":"lib/hooks/use-hover-capable.ts","type":"registry:hook","target":"@lib/hooks/use-hover-capable.ts"},{"path":"lib/hooks/use-hover-gesture.ts","type":"registry:hook","target":"@lib/hooks/use-hover-gesture.ts"},{"path":"lib/hooks/use-tap-gesture.ts","type":"registry:hook","target":"@lib/hooks/use-tap-gesture.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"}]},{"name":"knockout-bracket","type":"registry:block","title":"Fixtures Knockout Bracket","description":"Moves through the draw round by round. The first visible round sits on an even grid, later rounds center each match between the two that fed it, and cards, connector lines, headings and height all animate to each new layout. A separate third place match sits under the tree, and every label, date, crest and result chip comes from your data.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/knockout-bracket.tsx","type":"registry:component","target":"@components/motion/knockout-bracket.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"availability-scheduler","type":"registry:block","title":"Availability Scheduler","description":"Set weekly working hours: toggle each day on or off, add or remove time ranges that slide and blur in and out, choose times from a scrolling list in steps you set, and copy one day's hours onto other days.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/availability-scheduler/index.tsx","type":"registry:component","target":"@components/motion/availability-scheduler/index.tsx"},{"path":"components/motion/availability-scheduler/day-row.tsx","type":"registry:component","target":"@components/motion/availability-scheduler/day-row.tsx"},{"path":"components/motion/availability-scheduler/types.ts","type":"registry:component","target":"@components/motion/availability-scheduler/types.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"components/motion/availability-scheduler/copy-menu.tsx","type":"registry:component","target":"@components/motion/availability-scheduler/copy-menu.tsx"},{"path":"components/motion/availability-scheduler/icon-button.tsx","type":"registry:component","target":"@components/motion/availability-scheduler/icon-button.tsx"},{"path":"components/motion/availability-scheduler/time-select.tsx","type":"registry:component","target":"@components/motion/availability-scheduler/time-select.tsx"},{"path":"components/motion/switch.tsx","type":"registry:component","target":"@components/motion/switch.tsx"},{"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":"components/motion/checkbox.tsx","type":"registry:component","target":"@components/motion/checkbox.tsx"},{"path":"components/motion/popover-morph.tsx","type":"registry:component","target":"@components/motion/popover-morph.tsx"},{"path":"components/motion/select.tsx","type":"registry:component","target":"@components/motion/select.tsx"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"lib/hooks/use-dismiss.ts","type":"registry:hook","target":"@lib/hooks/use-dismiss.ts"},{"path":"lib/hooks/use-hover-gesture.ts","type":"registry:hook","target":"@lib/hooks/use-hover-gesture.ts"},{"path":"lib/hooks/use-tap-gesture.ts","type":"registry:hook","target":"@lib/hooks/use-tap-gesture.ts"},{"path":"components/motion/popover-position.ts","type":"registry:component","target":"@components/motion/popover-position.ts"}]},{"name":"swap","type":"registry:block","title":"Multi-chain Swap","description":"A crypto swap card for moving tokens between chains: pick source and destination token and network, reverse them with a rotating button, see the converted amount and a quote with rate, fee, slippage and time, and set a destination address.","author":"kara <ztzyrant@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":"An iPhone-like pill that expands into whichever live view you make active, springing its outline to fit each one and blurring between their contents; set the view to null and it folds back to the compact pill.","author":"kara <ztzyrant@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":"A Cmd or Ctrl+K launcher for your app: fuzzy search across labels and keywords, grouped results with hints and badges, arrow-key navigation with a springy highlight on the current row, and a frosted panel.","author":"kara <ztzyrant@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/hooks/use-touch-capable.ts","type":"registry:hook","target":"@lib/hooks/use-touch-capable.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"morphing-search","type":"registry:block","title":"Morphing Search","description":"A search box, or just an icon, that grows into a frosted results panel when clicked or opened with a keyboard shortcut, filtering items by title and keywords with arrow-key selection.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/morphing-search.tsx","type":"registry:component","target":"@components/motion/morphing-search.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":"A toolbar that shows just icons until hovered or focused, then widens into labeled buttons with badges and shortcut hints, while a shared highlight follows the current item.","author":"kara <ztzyrant@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/hooks/use-dismiss.ts","type":"registry:hook","target":"@lib/hooks/use-dismiss.ts"},{"path":"lib/hooks/use-hover-gesture.ts","type":"registry:hook","target":"@lib/hooks/use-hover-gesture.ts"},{"path":"lib/hooks/use-tap-gesture.ts","type":"registry:hook","target":"@lib/hooks/use-tap-gesture.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"}]},{"name":"overflow-actions","type":"registry:block","title":"Overflow Actions","description":"Keeps the main buttons visible in one joined pill and tucks the rest behind a toggle; pressing it springs the rail wider to show the extra actions, and it can close again after one is used.","author":"kara <ztzyrant@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":"A bar of icon tabs where the selected one widens to show its label in a pill while a panel above it resizes to fit, sliding its content left or right by the direction you moved; Escape or an outside click closes it.","author":"kara <ztzyrant@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":"morphing-tabs","type":"registry:block","title":"Morphing Tabs","description":"Tabs you can drag or move with the keyboard to reorder, where the selected tab stretches into the content panel itself, the active shape slides as tabs trade places, and an optional close button sits on every tab.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/morphing-tabs.tsx","type":"registry:component","target":"@components/motion/morphing-tabs.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"swipeable-list","type":"registry:block","title":"Swipeable List","description":"List rows for touch screens that slide sideways to uncover action buttons, with separate actions for each side and neutral, primary, success, warning or danger tones for things like archive or delete.","author":"kara <ztzyrant@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/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"attachment-upload","type":"registry:block","title":"File Upload Attachment Upload","description":"A dropzone for mixed attachments: file and image rows that stagger in, upload, done and failed states with retry and remove, image previews that expand smoothly, and audio with a waveform.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/attachment-upload.tsx","type":"registry:component","target":"@components/motion/attachment-upload.tsx"},{"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/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"lib/hooks/use-dismiss.ts","type":"registry:hook","target":"@lib/hooks/use-dismiss.ts"},{"path":"lib/hooks/use-hover-gesture.ts","type":"registry:hook","target":"@lib/hooks/use-hover-gesture.ts"},{"path":"lib/hooks/use-tap-gesture.ts","type":"registry:hook","target":"@lib/hooks/use-tap-gesture.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"}]},{"name":"file-upload","type":"registry:block","title":"File Upload Upload Queue","description":"Drop or browse files into a list where each row shows progress and status, with retry for failures and a button to take it out.","author":"kara <ztzyrant@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":"A trade ticket for prediction markets: switch between buy and sell, choose an outcome by price, type an amount that rolls digit by digit or bump it with quick chips, and see shares and payout before placing the trade.","author":"kara <ztzyrant@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/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"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":"A crypto wallet summary: switch accounts or search from panels that open out of their buttons, show a balance whose characters cascade in beside a change badge, hide it behind dots, copy the address, and act with Send, Deposit, Swap and Buy.","author":"kara <ztzyrant@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/utils.ts","type":"registry:component","target":"@components/motion/wallet-card/utils.ts"},{"path":"lib/hooks/use-dismiss.ts","type":"registry:hook","target":"@lib/hooks/use-dismiss.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":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"components/motion/magnetic.tsx","type":"registry:component","target":"@components/motion/magnetic.tsx"}]},{"name":"otp-input","type":"registry:block","title":"OTP Input","description":"A verification code field with one slot per digit: a focus ring that slides between slots, digits that roll into place, paste and SMS autofill support, a shake on wrong codes and a drawn check on success.","author":"kara <ztzyrant@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":"signup-form","type":"registry:block","title":"Sign Up Form","description":"A ready registration form with name, email, password, confirmation and terms: errors appear only after a field loses focus and clear once it is valid, plus a password strength bar, a show-password toggle and a submit button with loading, success and error states.","author":"kara <ztzyrant@gmail.com>","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/motion/signup-form.tsx","type":"registry:component","target":"@components/motion/signup-form.tsx"},{"path":"components/motion/button/index.tsx","type":"registry:component","target":"@components/motion/button/index.tsx"},{"path":"components/motion/checkbox.tsx","type":"registry:component","target":"@components/motion/checkbox.tsx"},{"path":"components/motion/input.tsx","type":"registry:component","target":"@components/motion/input.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/password-strength.ts","type":"registry:lib","target":"@lib/password-strength.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/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"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":"bloom-menu","type":"registry:block","title":"Bloom Menu","description":"A single button that opens into a grid of options by widening from its center like an iris, with items appearing in rings outward from the middle; it ships with Doc, Board, Table, Folder, Reminder and Link entries.","author":"kara <ztzyrant@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":"A small corner button that grows into a feedback box with sending, sent and retry states and an async submit handler; it can sit bottom right or bottom left and closes with Escape.","author":"kara <ztzyrant@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":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.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":"The 404 cycles through random characters before settling, and hovering splits it into offset color channels.","author":"kara <ztzyrant@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":"Every digit is pulled toward the pointer by the Magnetic wrapper, then settles back when it leaves.","author":"kara <ztzyrant@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 dim panel where a light that follows your cursor brings the error code up to full brightness.","author":"kara <ztzyrant@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":"An error card resting on a hidden pile that springs open into a fan when hovered.","author":"kara <ztzyrant@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 types out a cd into a missing path, prints a 404 and leaves a blinking cursor.","author":"kara <ztzyrant@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"}]}]}