{"$schema":"https://ui.shadcn.com/schema/registry.json","name":"ui-lab","homepage":"https://lab.xevrion.dev/","items":[{"name":"odometer","type":"registry:component","title":"Odometer","description":"Rolls forward like a mechanical counter and wraps from 999 back to 000.","categories":["data"],"files":[{"path":"components/odometer.tsx","type":"registry:component"}]},{"name":"hold-to-delete","type":"registry:component","title":"Hold to delete","description":"Fills slowly while you commit to it, snaps back the moment you let go.","categories":["buttons"],"files":[{"path":"components/hold-to-delete.tsx","type":"registry:component"}]},{"name":"segmented-control","type":"registry:component","title":"Segmented control","description":"The pill stretches toward your pick like an inchworm, recoloring each label as its edge crosses.","categories":["navigation"],"files":[{"path":"components/segmented-control.tsx","type":"registry:component"}]},{"name":"tilt-card","type":"registry:component","title":"Tilt card","description":"Leans toward your cursor with a glare that follows the light.","categories":["cards"],"files":[{"path":"components/tilt-card.tsx","type":"registry:component"}]},{"name":"dock","type":"registry:component","title":"Dock","description":"Icons swell as your cursor nears them, and launch with a macOS-style bounce.","categories":["navigation"],"files":[{"path":"components/dock.tsx","type":"registry:component"}]},{"name":"sheet","type":"registry:component","title":"Sheet","description":"Drag it down or flick it away; pull it up and it pushes back.","categories":["feedback"],"files":[{"path":"components/sheet.tsx","type":"registry:component"}]},{"name":"toast-stack","type":"registry:component","title":"Toast stack","description":"Stacks with depth, fans out on hover, and each toast's edge drains as its timer.","categories":["feedback"],"files":[{"path":"components/toast-stack.tsx","type":"registry:component"}]},{"name":"elastic-slider","type":"registry:component","title":"Elastic slider","description":"Stretches like rubber when you drag past the end, then springs back.","categories":["inputs"],"files":[{"path":"components/elastic-slider.tsx","type":"registry:component"}]},{"name":"magnetic-button","type":"registry:component","title":"Magnetic button","description":"Stretches toward your cursor like soft rubber on a magnet, then wobbles home.","categories":["buttons"],"files":[{"path":"components/magnetic-button.tsx","type":"registry:component"}]},{"name":"text-scramble","type":"registry:component","title":"Text scramble","description":"Hover a word and a block cursor reads it in, one letter at a time.","categories":["text"],"files":[{"path":"components/text-scramble.tsx","type":"registry:component"}]},{"name":"swipe-deck","type":"registry:component","title":"Swipe deck","description":"Fling a card away and the rest of the deck steps forward.","categories":["cards"],"files":[{"path":"components/swipe-deck.tsx","type":"registry:component"}]},{"name":"scroll-reveal","type":"registry:component","title":"Scroll reveal","description":"Words light up one by one as you scroll through them.","categories":["text"],"files":[{"path":"components/scroll-reveal.tsx","type":"registry:component"}]},{"name":"copy-button","type":"registry:component","title":"Copy button","description":"The two pages merge into one before a check draws itself in.","categories":["buttons"],"files":[{"path":"components/copy-button.tsx","type":"registry:component"}]},{"name":"expanding-search","type":"registry:component","title":"Expanding search","description":"Opens from a circle into a search field, and closes faster than it opens.","categories":["inputs"],"files":[{"path":"components/expanding-search.tsx","type":"registry:component"}]},{"name":"accordion","type":"registry:component","title":"Accordion","description":"Answers unfold from under their question like a folded flap, and the row you clicked never moves.","categories":["navigation"],"files":[{"path":"components/accordion.tsx","type":"registry:component"}]},{"name":"expanding-card","type":"registry:component","title":"Expanding card","description":"Grows from its slot into a detail view and folds back when you are done.","categories":["cards"],"files":[{"path":"components/expanding-card.tsx","type":"registry:component"}]},{"name":"otp-input","type":"registry:component","title":"OTP input","description":"Six slots mirror one real input, so paste and SMS autofill just work.","categories":["inputs"],"files":[{"path":"components/otp-input.tsx","type":"registry:component"}]},{"name":"toggle-switch","type":"registry:component","title":"Toggle switch","description":"Leans into the move when pressed, then springs across and squashes on landing.","categories":["buttons"],"files":[{"path":"components/toggle-switch.tsx","type":"registry:component"}]},{"name":"command-palette","type":"registry:component","title":"Command palette","description":"Opens on ⌘K and filters commands as you type.","categories":["navigation"],"files":[{"path":"components/command-palette.tsx","type":"registry:component"}]},{"name":"marquee","type":"registry:component","title":"Marquee","description":"Drifts endlessly past a reading lens, and brakes gently when you hover.","categories":["text"],"files":[{"path":"components/marquee.tsx","type":"registry:component"}]},{"name":"reorder-list","type":"registry:component","title":"Reorder list","description":"Picks rows up by the handle and slides the rest out of the way.","categories":["cards"],"files":[{"path":"components/reorder-list.tsx","type":"registry:component"}]},{"name":"compare-slider","type":"registry:component","title":"Compare slider","description":"Drag the line to see what polish actually changes.","categories":["cards"],"files":[{"path":"components/compare-slider.tsx","type":"registry:component"}]},{"name":"multi-step-form","type":"registry:component","title":"Multi-step form","description":"Slides between steps while the card grows around each one.","categories":["inputs"],"files":[{"path":"components/multi-step-form.tsx","type":"registry:component"}]},{"name":"upload-button","type":"registry:component","title":"Upload button","description":"Shrinks into a progress ring, fills, then checks off.","categories":["buttons"],"files":[{"path":"components/upload-button.tsx","type":"registry:component"}]},{"name":"tooltip-group","type":"registry:component","title":"Tooltip group","description":"One tooltip slides from button to button and reshapes around each label.","categories":["feedback"],"files":[{"path":"components/tooltip-group.tsx","type":"registry:component"}]},{"name":"dropdown-menu","type":"registry:component","title":"Dropdown menu","description":"Grows out of its trigger, and press, drag, release picks an item like a native menu.","categories":["navigation"],"files":[{"path":"components/dropdown-menu.tsx","type":"registry:component"}]},{"name":"dynamic-island","type":"registry:component","title":"Dynamic island","description":"Morphs between live states with a springy, Apple-style bounce.","categories":["feedback"],"files":[{"path":"components/dynamic-island.tsx","type":"registry:component"}]},{"name":"scrub-input","type":"registry:component","title":"Scrub input","description":"Drag the label and a tape measure runs under the needle, or just type.","categories":["inputs"],"files":[{"path":"components/scrub-input.tsx","type":"registry:component"}]},{"name":"star-rating","type":"registry:component","title":"Star rating","description":"Hover to preview, click to commit with a little pop.","categories":["inputs"],"files":[{"path":"components/star-rating.tsx","type":"registry:component"}]},{"name":"like-button","type":"registry:component","title":"Like button","description":"Pops, bursts and rolls the count when you like.","categories":["buttons"],"files":[{"path":"components/like-button.tsx","type":"registry:component"}]},{"name":"sliding-tabs","type":"registry:component","title":"Sliding tabs","description":"An underline stretches toward the tab you pick while a soft pill follows your pointer.","categories":["navigation"],"files":[{"path":"components/sliding-tabs.tsx","type":"registry:component"}]},{"name":"page-dots","type":"registry:component","title":"Page dots","description":"A pill that inches between pages like a worm and counts down to the next.","categories":["navigation"],"files":[{"path":"components/page-dots.tsx","type":"registry:component"}]},{"name":"collapsible-sidebar","type":"registry:component","title":"Collapsible sidebar","description":"Folds down to an icon rail, with labels that step aside before it closes.","categories":["navigation"],"files":[{"path":"components/collapsible-sidebar.tsx","type":"registry:component"}]},{"name":"snap-carousel","type":"registry:component","title":"Snap carousel","description":"Snaps cards to center, drags with the mouse, and each card acts out its motion principle.","categories":["cards"],"files":[{"path":"components/snap-carousel.tsx","type":"registry:component"}]},{"name":"skeleton-loader","type":"registry:component","title":"Skeleton loader","description":"Holds the exact shape of what is coming, so nothing jumps.","categories":["feedback"],"files":[{"path":"components/skeleton-loader.tsx","type":"registry:component"}]},{"name":"context-menu","type":"registry:component","title":"Context menu","description":"Opens at your cursor and grows from it.","categories":["navigation"],"files":[{"path":"components/context-menu.tsx","type":"registry:component"}]},{"name":"notification-bell","type":"registry:component","title":"Notification bell","description":"Rings when something new arrives, and the badge rolls up with each one.","categories":["feedback"],"files":[{"path":"components/notification-bell.tsx","type":"registry:component"}]},{"name":"avatar-stack","type":"registry:component","title":"Avatar stack","description":"Fans open when you reach for it, with a name above each face.","categories":["cards"],"files":[{"path":"components/avatar-stack.tsx","type":"registry:component"}]},{"name":"morphing-button","type":"registry:component","title":"Morphing button","description":"Shrinks into a spinner while it saves, then answers with a check or a shake.","categories":["buttons"],"files":[{"path":"components/morphing-button.tsx","type":"registry:component"}]},{"name":"kanban-board","type":"registry:component","title":"Kanban board","description":"Lift a card and the others slide aside to make room for it.","categories":["data"],"files":[{"path":"components/kanban-board.tsx","type":"registry:component"}]},{"name":"color-swatches","type":"registry:component","title":"Color swatches","description":"The ring glides to the color you pick and the color floods the preview from that side.","categories":["inputs"],"files":[{"path":"components/color-swatches.tsx","type":"registry:component"}]},{"name":"mini-calendar","type":"registry:component","title":"Mini calendar","description":"Months slide past in the direction you travel.","categories":["inputs"],"files":[{"path":"components/mini-calendar.tsx","type":"registry:component"}]},{"name":"floating-label","type":"registry:component","title":"Floating label","description":"The label peels up letter by letter, and never covers what you wrote.","categories":["inputs"],"files":[{"path":"components/floating-label.tsx","type":"registry:component"}]},{"name":"password-field","type":"registry:component","title":"Password field","description":"Reveals the password with a wave of dots turning into letters; the meter fills as it gets stronger.","categories":["inputs"],"files":[{"path":"components/password-field.tsx","type":"registry:component"}]},{"name":"filter-list","type":"registry:component","title":"Filter list","description":"Rows fade out of the way while the rest slide up to close the gap.","categories":["data"],"files":[{"path":"components/filter-list.tsx","type":"registry:component"}]},{"name":"gauge","type":"registry:component","title":"Gauge","description":"Ticks light up as the value sweeps in, and a peak marker holds where it was before falling.","categories":["data"],"files":[{"path":"components/gauge.tsx","type":"registry:component"}]},{"name":"sparkline","type":"registry:component","title":"Sparkline","description":"Draws itself in, then scrubs to the nearest point under your cursor.","categories":["data"],"files":[{"path":"components/sparkline.tsx","type":"registry:component"}]},{"name":"bar-chart","type":"registry:component","title":"Bar chart","description":"Grows its bars from the baseline and springs them between two weeks.","categories":["data"],"files":[{"path":"components/bar-chart.tsx","type":"registry:component"}]},{"name":"stacked-drawer","type":"registry:component","title":"Stacked drawer","description":"Stacks iOS sheets that push the page back and drag down to dismiss.","categories":["feedback"],"files":[{"path":"components/stacked-drawer.tsx","type":"registry:component"}]},{"name":"confetti-button","type":"registry:component","title":"Confetti button","description":"A click pops confetti; hold it and the fuse burns until the whole thing blows.","categories":["buttons"],"files":[{"path":"components/confetti-button.tsx","type":"registry:component"}]},{"name":"typewriter","type":"registry:component","title":"Typewriter","description":"Types, pauses and rewrites the last word with a human rhythm.","categories":["text"],"files":[{"path":"components/typewriter.tsx","type":"registry:component"}]},{"name":"tag-input","type":"registry:component","title":"Tag input","description":"Your typed words stay put while a chip forms around them.","categories":["inputs"],"files":[{"path":"components/tag-input.tsx","type":"registry:component"}]},{"name":"range-slider","type":"registry:component","title":"Range slider","description":"Two thumbs that glide, stop at each other, and show their value as you drag.","categories":["inputs"],"files":[{"path":"components/range-slider.tsx","type":"registry:component"}]},{"name":"number-stepper","type":"registry:component","title":"Number stepper","description":"Rolls each digit the way the count moves, and speeds up the longer you hold.","categories":["inputs"],"files":[{"path":"components/number-stepper.tsx","type":"registry:component"}]},{"name":"select-menu","type":"registry:component","title":"Select menu","description":"Opens with your current choice sitting exactly on the button, macOS style.","categories":["inputs"],"files":[{"path":"components/select-menu.tsx","type":"registry:component"}]},{"name":"undo-toast","type":"registry:component","title":"Undo toast","description":"Deletes instantly and gives you five seconds to change your mind.","categories":["feedback"],"files":[{"path":"components/undo-toast.tsx","type":"registry:component"}]},{"name":"file-dropzone","type":"registry:component","title":"File dropzone","description":"Its dashed edge marches when a file enters the window and seals solid when it is overhead.","categories":["inputs"],"files":[{"path":"components/file-dropzone.tsx","type":"registry:component"}]},{"name":"chat-thread","type":"registry:component","title":"Chat thread","description":"Replies arrive after a beat of typing, and the thread follows only if you are.","categories":["cards"],"files":[{"path":"components/chat-thread.tsx","type":"registry:component"}]},{"name":"loader-set","type":"registry:component","title":"Loader set","description":"Four loaders that each know how to finish: leapfrog dots, an inchworm bar, a ring that closes into a check.","categories":["feedback"],"files":[{"path":"components/loader-set.tsx","type":"registry:component"}]},{"name":"wheel-picker","type":"registry:component","title":"Wheel picker","description":"Spins through the hours on a curved drum, just like iOS.","categories":["inputs"],"files":[{"path":"components/wheel-picker.tsx","type":"registry:component"}]},{"name":"slide-to-confirm","type":"registry:component","title":"Slide to confirm","description":"Drag the knob all the way across to confirm.","categories":["buttons"],"files":[{"path":"components/slide-to-confirm.tsx","type":"registry:component"}]},{"name":"pull-to-refresh","type":"registry:component","title":"Pull to refresh","description":"Pull the feed down and new posts slide in at the top.","categories":["feedback"],"files":[{"path":"components/pull-to-refresh.tsx","type":"registry:component"}]},{"name":"hover-card","type":"registry:component","title":"Hover card","description":"One card travels between names as you hover them.","categories":["feedback"],"files":[{"path":"components/hover-card.tsx","type":"registry:component"}]},{"name":"tree-view","type":"registry:component","title":"Tree view","description":"Folders unfold in place while the selection glides to the file you pick.","categories":["navigation"],"files":[{"path":"components/tree-view.tsx","type":"registry:component"}]},{"name":"pricing-toggle","type":"registry:component","title":"Pricing toggle","description":"Each digit rolls to its new price on its own, and new digits grow in.","categories":["inputs"],"files":[{"path":"components/pricing-toggle.tsx","type":"registry:component"}]},{"name":"reading-progress","type":"registry:component","title":"Reading progress","description":"A progress bar fills as you read while the time left counts down.","categories":["feedback"],"files":[{"path":"components/reading-progress.tsx","type":"registry:component"}]},{"name":"code-block","type":"registry:component","title":"Code block","description":"Switch files with a sliding underline and copy with one click.","categories":["cards"],"files":[{"path":"components/code-block.tsx","type":"registry:component"}]},{"name":"wave-text","type":"registry:component","title":"Wave text","description":"Letters rise in a wave that follows your cursor.","categories":["text"],"files":[{"path":"components/wave-text.tsx","type":"registry:component"}]},{"name":"dot-grid","type":"registry:component","title":"Dot grid","description":"Dots swell and part around your cursor, and a click sends a shockwave.","categories":["playground"],"files":[{"path":"components/dot-grid.tsx","type":"registry:component"}]},{"name":"spotlight-card","type":"registry:component","title":"Spotlight card","description":"The cursor is a lamp: cards catch its glow and their icons cast shadows away from it.","categories":["cards"],"files":[{"path":"components/spotlight-card.tsx","type":"registry:component"}]},{"name":"story-progress","type":"registry:component","title":"Story progress","description":"Tap through stories, hold to pause.","categories":["feedback"],"files":[{"path":"components/story-progress.tsx","type":"registry:component"}]},{"name":"data-table","type":"registry:component","title":"Data table","description":"Sorts, selects and bulk-acts on rows without losing its place.","categories":["data"],"files":[{"path":"components/data-table.tsx","type":"registry:component"}]},{"name":"combobox","type":"registry:component","title":"Combobox","description":"The person you pick flies out of the list and into the field.","categories":["inputs"],"files":[{"path":"components/combobox.tsx","type":"registry:component"}]},{"name":"date-range-picker","type":"registry:component","title":"Date range picker","description":"Paints the range as you hover, then commits it on the second click.","categories":["inputs"],"files":[{"path":"components/date-range-picker.tsx","type":"registry:component"}]},{"name":"inline-edit","type":"registry:component","title":"Inline edit","description":"Edits your name and bio in place without moving a pixel.","categories":["inputs"],"files":[{"path":"components/inline-edit.tsx","type":"registry:component"}]},{"name":"dialog","type":"registry:component","title":"Dialog","description":"Opens a modal over the page, with a confirmation that stacks on top of it.","categories":["feedback"],"files":[{"path":"components/dialog.tsx","type":"registry:component"}]},{"name":"pagination","type":"registry:component","title":"Pagination","description":"Numbers roll in place like an odometer; the one you click never moves.","categories":["navigation"],"files":[{"path":"components/pagination.tsx","type":"registry:component"}]},{"name":"announcement-banner","type":"registry:component","title":"Announcement banner","description":"Dismissing folds the bar away and the page slides up to fill the gap.","categories":["feedback"],"files":[{"path":"components/announcement-banner.tsx","type":"registry:component"}]},{"name":"shortcut-sheet","type":"registry:component","title":"Shortcut sheet","description":"Press ? anywhere to see every shortcut, then press one to watch it light up.","categories":["navigation"],"files":[{"path":"components/shortcut-sheet.tsx","type":"registry:component"}]},{"name":"spring-playground","type":"registry:component","title":"Spring playground","description":"Tune a spring and watch its overshoot and settle, plotted live.","categories":["playground"],"files":[{"path":"components/spring-playground.tsx","type":"registry:component"}]},{"name":"easing-editor","type":"registry:component","title":"Easing editor","description":"Drag a cubic-bezier into shape and see it move.","categories":["playground"],"files":[{"path":"components/easing-editor.tsx","type":"registry:component"}]},{"name":"stagger-visualizer","type":"registry:component","title":"Stagger visualizer","description":"Shows what per-item delay actually does to a list entrance.","categories":["playground"],"files":[{"path":"components/stagger-visualizer.tsx","type":"registry:component"}]},{"name":"onboarding-checklist","type":"registry:component","title":"Onboarding checklist","description":"A setup checklist that counts up as you go and celebrates the finish.","categories":["feedback"],"files":[{"path":"components/onboarding-checklist.tsx","type":"registry:component"}]},{"name":"flip-card","type":"registry:component","title":"Flip card","description":"Turns over in 3D to show what is on the back.","categories":["cards"],"files":[{"path":"components/flip-card.tsx","type":"registry:component"}]},{"name":"icon-morph","type":"registry:component","title":"Icon morph","description":"Icons reshape themselves between states instead of swapping.","categories":["buttons"],"files":[{"path":"components/icon-morph.tsx","type":"registry:component"}]},{"name":"sticky-stack","type":"registry:component","title":"Sticky stack","description":"Cards pile up and sink back as you scroll.","categories":["cards"],"files":[{"path":"components/sticky-stack.tsx","type":"registry:component"}]},{"name":"infinite-canvas","type":"registry:component","title":"Infinite canvas","description":"Pan, pinch and zoom around a board of notes.","categories":["playground"],"files":[{"path":"components/infinite-canvas.tsx","type":"registry:component"}]},{"name":"drag-select","type":"registry:component","title":"Drag select","description":"Draw a box across files to select them, like the desktop.","categories":["cards"],"files":[{"path":"components/drag-select.tsx","type":"registry:component"}]},{"name":"sortable-grid","type":"registry:component","title":"Sortable grid","description":"Drag an app tile and the others slide out of its way.","categories":["cards"],"files":[{"path":"components/sortable-grid.tsx","type":"registry:component"}]},{"name":"magnet-lines","type":"registry:component","title":"Magnet lines","description":"Lines turn toward your cursor like iron filings near a magnet.","categories":["playground"],"files":[{"path":"components/magnet-lines.tsx","type":"registry:component"}]},{"name":"morphing-nav","type":"registry:component","title":"Morphing nav","description":"One dropdown panel reshapes and slides as you move between menu items.","categories":["navigation"],"files":[{"path":"components/morphing-nav.tsx","type":"registry:component"}]},{"name":"color-picker","type":"registry:component","title":"Color picker","description":"Drag a color out of the square, then fine-tune hue and opacity.","categories":["inputs"],"files":[{"path":"components/color-picker.tsx","type":"registry:component"}]},{"name":"card-input","type":"registry:component","title":"Card input","description":"Formats as you type, spots the card brand, and flips to show the CVC.","categories":["inputs"],"files":[{"path":"components/card-input.tsx","type":"registry:component"}]},{"name":"radio-cards","type":"registry:component","title":"Radio cards","description":"The selection ring glides to the plan you pick.","categories":["inputs"],"files":[{"path":"components/radio-cards.tsx","type":"registry:component"}]},{"name":"checkbox-group","type":"registry:component","title":"Checkbox group","description":"Check marks draw themselves in, and Shift-click fills a range.","categories":["inputs"],"files":[{"path":"components/checkbox-group.tsx","type":"registry:component"}]},{"name":"progress-stepper","type":"registry:component","title":"Progress stepper","description":"Fills the line toward the next step and unfills it in reverse.","categories":["feedback"],"files":[{"path":"components/progress-stepper.tsx","type":"registry:component"}]},{"name":"promise-toast","type":"registry:component","title":"Promise toast","description":"One toast that morphs from saving to saved, or to an error with retry.","categories":["feedback"],"files":[{"path":"components/promise-toast.tsx","type":"registry:component"}]},{"name":"confirm-popover","type":"registry:component","title":"Confirm popover","description":"Asks before deleting, from a popover that grows out of the button.","categories":["feedback"],"files":[{"path":"components/confirm-popover.tsx","type":"registry:component"}]},{"name":"activity-timeline","type":"registry:component","title":"Activity timeline","description":"New events slide in at the top as the line grows to meet them.","categories":["data"],"files":[{"path":"components/activity-timeline.tsx","type":"registry:component"}]},{"name":"breadcrumbs","type":"registry:component","title":"Breadcrumbs","description":"Folds the middle of a deep path into a menu when space runs out.","categories":["navigation"],"files":[{"path":"components/breadcrumbs.tsx","type":"registry:component"}]},{"name":"overflow-tabs","type":"registry:component","title":"Overflow tabs","description":"Scrolls a long row of tabs, fading whichever edge still hides more.","categories":["navigation"],"files":[{"path":"components/overflow-tabs.tsx","type":"registry:component"}]},{"name":"tab-bar","type":"registry:component","title":"Tab bar","description":"A phone tab bar whose pill slides over and fills in the icon it lands on.","categories":["navigation"],"files":[{"path":"components/tab-bar.tsx","type":"registry:component"}]},{"name":"selection-toolbar","type":"registry:component","title":"Selection toolbar","description":"A formatting toolbar that grows out of whatever text you select.","categories":["feedback"],"files":[{"path":"components/selection-toolbar.tsx","type":"registry:component"}]},{"name":"carousel-3d","type":"registry:component","title":"Carousel 3d","description":"Spin a ring of cards and flick it to land on the one you were aiming for.","categories":["cards"],"files":[{"path":"components/carousel-3d.tsx","type":"registry:component"}]},{"name":"lens-reveal","type":"registry:component","title":"Lens reveal","description":"A lens follows your cursor and shows the specs hidden under a card.","categories":["cards"],"files":[{"path":"components/lens-reveal.tsx","type":"registry:component"}]},{"name":"elastic-string","type":"registry:component","title":"Elastic string","description":"Pull a string and let go to watch it ring back to rest.","categories":["playground"],"files":[{"path":"components/elastic-string.tsx","type":"registry:component"}]},{"name":"particle-text","type":"registry:component","title":"Particle text","description":"A word made of dots that part around your cursor and burst when clicked.","categories":["text"],"files":[{"path":"components/particle-text.tsx","type":"registry:component"}]},{"name":"theme-toggle","type":"registry:component","title":"Theme toggle","description":"A sun that folds its rays away and turns into a crescent moon.","categories":["buttons"],"files":[{"path":"components/theme-toggle.tsx","type":"registry:component"}]},{"name":"bookmark-button","type":"registry:component","title":"Bookmark button","description":"Fills from the bottom up and lands with a small squash.","categories":["buttons"],"files":[{"path":"components/bookmark-button.tsx","type":"registry:component"}]},{"name":"send-button","type":"registry:component","title":"Send button","description":"The plane takes off along a curve, and a check lands in its place.","categories":["buttons"],"files":[{"path":"components/send-button.tsx","type":"registry:component"}]},{"name":"download-button","type":"registry:component","title":"Download button","description":"The arrow drops into the tray while the button fills with progress.","categories":["buttons"],"files":[{"path":"components/download-button.tsx","type":"registry:component"}]},{"name":"contribution-heatmap","type":"registry:component","title":"Contribution heatmap","description":"A year of activity at a glance, sweeping in week by week.","categories":["data"],"files":[{"path":"components/contribution-heatmap.tsx","type":"registry:component"}]},{"name":"donut-chart","type":"registry:component","title":"Donut chart","description":"Draws itself in, then lifts whichever slice you point at.","categories":["data"],"files":[{"path":"components/donut-chart.tsx","type":"registry:component"}]},{"name":"stat-counter","type":"registry:component","title":"Stat counter","description":"Numbers count up to their value; scrub a sparkline and the figure rolls back through its history.","categories":["data"],"files":[{"path":"components/stat-counter.tsx","type":"registry:component"}]},{"name":"leaderboard","type":"registry:component","title":"Leaderboard","description":"Players glide past each other to their new ranks.","categories":["data"],"files":[{"path":"components/leaderboard.tsx","type":"registry:component"}]},{"name":"rotary-dial","type":"registry:component","title":"Rotary dial","description":"Drag a hole to the finger stop and each digit lands as the disc unwinds.","categories":["objects"],"files":[{"path":"components/rotary-dial.tsx","type":"registry:component"}]},{"name":"tape-measure","type":"registry:component","title":"Tape measure","description":"Pull the blade out to measure; release the lock and it reels itself back in.","categories":["objects"],"files":[{"path":"components/tape-measure.tsx","type":"registry:component"}]},{"name":"pull-cord-switch","type":"registry:component","title":"Pull cord switch","description":"Pull the ball chain to switch the site's lights; light pours from the bulb as a cone.","categories":["objects"],"files":[{"path":"components/pull-cord-switch.tsx","type":"registry:component"}]},{"name":"combination-lock","type":"registry:component","title":"Combination lock","description":"Spin right, left, right to fill each number, then turn the handle to open.","categories":["objects"],"files":[{"path":"components/combination-lock.tsx","type":"registry:component"}]},{"name":"rubber-stamp","type":"registry:component","title":"Rubber stamp","description":"Stamps a document approved or rejected, with ink that looks pressed in.","categories":["objects"],"files":[{"path":"components/rubber-stamp.tsx","type":"registry:component"}]},{"name":"sticky-note-peel","type":"registry:component","title":"Sticky note peel","description":"Peel the top reminder off by its corner to mark it done.","categories":["objects"],"files":[{"path":"components/sticky-note-peel.tsx","type":"registry:component"}]},{"name":"receipt-printer","type":"registry:component","title":"Receipt printer","description":"Feeds a receipt out of the slot line by line; twist it against the cutter to tear it off.","categories":["objects"],"files":[{"path":"components/receipt-printer.tsx","type":"registry:component"}]},{"name":"tear-off-calendar","type":"registry:component","title":"Tear off calendar","description":"Tear a day off to move forward, pull one back to go back.","categories":["objects"],"files":[{"path":"components/tear-off-calendar.tsx","type":"registry:component"}]},{"name":"balance-scale","type":"registry:component","title":"Balance scale","description":"Weighs your pros against your cons on a balance that tips and slowly settles.","categories":["objects"],"files":[{"path":"components/balance-scale.tsx","type":"registry:component"}]},{"name":"tally-counter","type":"registry:component","title":"Tally counter","description":"Counts in hand-drawn tally marks, one pen stroke at a time.","categories":["objects"],"files":[{"path":"components/tally-counter.tsx","type":"registry:component"}]},{"name":"ink-well","type":"registry:component","title":"Ink well","description":"Drains a glass inkwell as you spend your character limit.","categories":["objects"],"files":[{"path":"components/ink-well.tsx","type":"registry:component"}]},{"name":"typing-seismograph","type":"registry:component","title":"Typing seismograph","description":"Records the rhythm of your typing on a scrolling seismograph.","categories":["objects"],"files":[{"path":"components/typing-seismograph.tsx","type":"registry:component"}]},{"name":"envelope-send","type":"registry:component","title":"Envelope send","description":"Folds your note into an envelope, seals it and sends it off.","categories":["objects"],"files":[{"path":"components/envelope-send.tsx","type":"registry:component"}]},{"name":"paper-shredder","type":"registry:component","title":"Paper shredder","description":"Drag a file into the shredder and it comes out in strips.","categories":["objects"],"files":[{"path":"components/paper-shredder.tsx","type":"registry:component"}]},{"name":"tip-jar","type":"registry:component","title":"Tip jar","description":"Coins drop into a glass jar and pile up as the total counts.","categories":["objects"],"files":[{"path":"components/tip-jar.tsx","type":"registry:component"}]},{"name":"zipper-reveal","type":"registry:component","title":"Zipper reveal","description":"Unzip the pouch to reveal the code inside.","categories":["objects"],"files":[{"path":"components/zipper-reveal.tsx","type":"registry:component"}]},{"name":"cassette-scrubber","type":"registry:component","title":"Cassette scrubber","description":"Scrub audio by dragging the tape, with reels that spin like the real thing.","categories":["objects"],"files":[{"path":"components/cassette-scrubber.tsx","type":"registry:component"}]},{"name":"bubble-wrap","type":"registry:component","title":"Bubble wrap","description":"Pop every bubble to clear the list, one click or one long swipe.","categories":["objects"],"files":[{"path":"components/bubble-wrap.tsx","type":"registry:component"}]},{"name":"sundial-picker","type":"registry:component","title":"Sundial picker","description":"Pick a time by dragging the sun across the sky.","categories":["objects"],"files":[{"path":"components/sundial-picker.tsx","type":"registry:component"}]},{"name":"folded-map","type":"registry:component","title":"Folded map","description":"An itinerary that unfolds panel by panel like a paper road map, recentring as it opens.","categories":["objects"],"files":[{"path":"components/folded-map.tsx","type":"registry:component"}]},{"name":"scroll-spine","type":"registry:component","title":"Scroll spine","description":"Maps the article as a spine of bands, each as long as its section, filling in as you read.","categories":["navigation"],"files":[{"path":"components/scroll-spine.tsx","type":"registry:component"}]},{"name":"availability-badge","type":"registry:component","title":"Availability badge","description":"Shows when the owner is working, and when that overlaps with your day.","categories":["feedback"],"files":[{"path":"components/availability-badge.tsx","type":"registry:component"}]},{"name":"sidenotes","type":"registry:component","title":"Sidenotes","description":"Slides footnotes into the margin beside their sentence, and folds them inline on narrow screens.","categories":["text"],"files":[{"path":"components/sidenotes.tsx","type":"registry:component"}]},{"name":"footer-signature","type":"registry:component","title":"Footer signature","description":"Signs the footer by hand when it scrolls into view, slowing through every loop.","categories":["cards"],"files":[{"path":"components/footer-signature.tsx","type":"registry:component"}]},{"name":"changelog-stack","type":"registry:component","title":"Changelog stack","description":"Files each release card behind the stack like a hand riffling index cards.","categories":["data"],"files":[{"path":"components/changelog-stack.tsx","type":"registry:component"}]},{"name":"pricing-calculator","type":"registry:component","title":"Pricing calculator","description":"Itemizes your bill like an invoice and upgrades the plan the moment your team crosses a seat threshold.","categories":["data"],"files":[{"path":"components/pricing-calculator.tsx","type":"registry:component"}]},{"name":"feature-spotlight","type":"registry:component","title":"Feature spotlight","description":"A camera zooms into the part of the product screenshot each feature describes as you scroll past it.","categories":["cards"],"files":[{"path":"components/feature-spotlight.tsx","type":"registry:component"}]},{"name":"testimonial-highlight","type":"registry:component","title":"Testimonial highlight","description":"Swipes a highlighter across the line that sold the customer, one line at a time.","categories":["cards"],"files":[{"path":"components/testimonial-highlight.tsx","type":"registry:component"}]},{"name":"waitlist-join","type":"registry:component","title":"Waitlist join","description":"Drops your face into a real queue and rolls out your place in line.","categories":["inputs"],"files":[{"path":"components/waitlist-join.tsx","type":"registry:component"}]},{"name":"cookie-consent","type":"registry:component","title":"Cookie consent","description":"Bakes a bite back into the cookie for every category you allow.","categories":["feedback"],"files":[{"path":"components/cookie-consent.tsx","type":"registry:component"}]},{"name":"email-typo-fix","type":"registry:component","title":"Email typo fix","description":"Catches gmial.com and fixes it by moving only the letters that were wrong.","categories":["inputs"],"files":[{"path":"components/email-typo-fix.tsx","type":"registry:component"}]},{"name":"coupon-code","type":"registry:component","title":"Coupon code","description":"Stamps your promo code onto the order and strikes out the price it beat.","categories":["inputs"],"files":[{"path":"components/coupon-code.tsx","type":"registry:component"}]},{"name":"code-morph","type":"registry:component","title":"Code morph","description":"Glides every surviving token to its new spot as a tutorial moves to the next step.","categories":["cards"],"files":[{"path":"components/code-morph.tsx","type":"registry:component"}]},{"name":"image-hotspots","type":"registry:component","title":"Image hotspots","description":"Draws a leader line to one label card that travels between a watch's features, never covering the product.","categories":["cards"],"files":[{"path":"components/image-hotspots.tsx","type":"registry:component"}]},{"name":"quote-share","type":"registry:component","title":"Quote share","description":"Lifts the words you select out of the paragraph and into a shareable quote card.","categories":["text"],"files":[{"path":"components/quote-share.tsx","type":"registry:component"}]},{"name":"waveform-player","type":"registry:component","title":"Waveform player","description":"Inks in a podcast's waveform, with chapter markers and a ghost playhead.","categories":["cards"],"files":[{"path":"components/waveform-player.tsx","type":"registry:component"}]},{"name":"size-picker","type":"registry:component","title":"Size picker","description":"Pulls a tee over a body outline so you see the fit before you pick the size.","categories":["inputs"],"files":[{"path":"components/size-picker.tsx","type":"registry:component"}]},{"name":"order-tracker","type":"registry:component","title":"Order tracker","description":"Drives a parcel across a street map to your door and stamps each stop as it arrives.","categories":["data"],"files":[{"path":"components/order-tracker.tsx","type":"registry:component"}]},{"name":"gift-wrap","type":"registry:component","title":"Gift wrap","description":"Folds kraft paper over the cart item, ties a ribbon and bow, and asks who it's for.","categories":["cards"],"files":[{"path":"components/gift-wrap.tsx","type":"registry:component"}]},{"name":"store-hours","type":"registry:component","title":"Store hours","description":"Draws the week's hours on a 24-hour scale and can redraw them in your own time zone.","categories":["data"],"files":[{"path":"components/store-hours.tsx","type":"registry:component"}]},{"name":"word-rotator","type":"registry:component","title":"Word rotator","description":"Keeps the letters two words share and glides them into place as the rest trade out.","categories":["text"],"files":[{"path":"components/word-rotator.tsx","type":"registry:component"}]},{"name":"keycap-hint","type":"registry:component","title":"Keycap hint","description":"Keycaps that sink when you press the real keys.","categories":["navigation"],"files":[{"path":"components/keycap-hint.tsx","type":"registry:component"}]},{"name":"caps-lock-warning","type":"registry:component","title":"Caps lock warning","description":"A small caps lock key with its light on slides into the field when caps is on.","categories":["inputs"],"files":[{"path":"components/caps-lock-warning.tsx","type":"registry:component"}]},{"name":"eye-toggle","type":"registry:component","title":"Eye toggle","description":"The eye shuts when your password is hidden and watches while you type.","categories":["inputs"],"files":[{"path":"components/eye-toggle.tsx","type":"registry:component"}]},{"name":"relative-time","type":"registry:component","title":"Relative time","description":"Says \"4 min ago\" and changes only at the moment the words would change.","categories":["text"],"files":[{"path":"components/relative-time.tsx","type":"registry:component"}]},{"name":"copy-email","type":"registry:component","title":"Copy email","description":"Click the address and its letters flip, one by one, into \"Copied to clipboard\".","categories":["text"],"files":[{"path":"components/copy-email.tsx","type":"registry:component"}]},{"name":"directional-underline","type":"registry:component","title":"Directional underline","description":"The underline comes in from the side your cursor entered and leaves toward the side it left.","categories":["text"],"files":[{"path":"components/directional-underline.tsx","type":"registry:component"}]},{"name":"hover-preview-link","type":"registry:component","title":"Hover preview link","description":"Hover a link to get a preview card that trails your cursor and leans as it moves.","categories":["text"],"files":[{"path":"components/hover-preview-link.tsx","type":"registry:component"}]},{"name":"scribble-checkbox","type":"registry:component","title":"Scribble checkbox","description":"Checks itself off with a quick pen stroke and strikes the words through.","categories":["inputs"],"files":[{"path":"components/scribble-checkbox.tsx","type":"registry:component"}]},{"name":"focus-paragraph","type":"registry:component","title":"Focus paragraph","description":"Brings the sentence you're reading forward and lets the rest step back.","categories":["text"],"files":[{"path":"components/focus-paragraph.tsx","type":"registry:component"}]},{"name":"text-progress","type":"registry:component","title":"Text progress","description":"Fills the label itself with ink as the upload runs.","categories":["text"],"files":[{"path":"components/text-progress.tsx","type":"registry:component"}]},{"name":"spoiler-text","type":"registry:component","title":"Spoiler text","description":"Hides a spoiler under shimmering grain that blows away from your click.","categories":["text"],"files":[{"path":"components/spoiler-text.tsx","type":"registry:component"}]},{"name":"badge-counter","type":"registry:component","title":"Badge counter","description":"Rolls its digits the way the count moved and bumps each time it changes.","categories":["feedback"],"files":[{"path":"components/badge-counter.tsx","type":"registry:component"}]},{"name":"star-button","type":"registry:component","title":"Star button","description":"Spins once and throws off tiny sparks when starred, then rolls the count.","categories":["buttons"],"files":[{"path":"components/star-button.tsx","type":"registry:component"}]},{"name":"follow-button","type":"registry:component","title":"Follow button","description":"Turns its plus into a check as you follow, and warns before you unfollow.","categories":["buttons"],"files":[{"path":"components/follow-button.tsx","type":"registry:component"}]},{"name":"live-indicator","type":"registry:component","title":"Live indicator","description":"Breathes while live, lets the viewer count drift, and blinks hollow while reconnecting.","categories":["feedback"],"files":[{"path":"components/live-indicator.tsx","type":"registry:component"}]},{"name":"mini-clock","type":"registry:component","title":"Mini clock","description":"A tiny analog clock that sweeps in its city's time and turns dark after sundown.","categories":["data"],"files":[{"path":"components/mini-clock.tsx","type":"registry:component"}]},{"name":"pixel-loader","type":"registry:component","title":"Pixel loader","description":"A tiny pixel grid that cycles spiral, snake, pulse and checker, then draws a check when done.","categories":["feedback"],"files":[{"path":"components/pixel-loader.tsx","type":"registry:component"}]},{"name":"greeting","type":"registry:component","title":"Greeting","description":"Greets by time of day, with a sun or moon that rises into place along an arc.","categories":["text"],"files":[{"path":"components/greeting.tsx","type":"registry:component"}]},{"name":"arrow-callout","type":"registry:component","title":"Arrow callout","description":"A handwritten note whose arrow draws itself to whatever it points at.","categories":["cards"],"files":[{"path":"components/arrow-callout.tsx","type":"registry:component"}]},{"name":"voice-orb","type":"registry:component","title":"Voice orb","description":"A glassy orb of drifting mist that listens to your real mic, thinks in a slow swirl and breathes as it speaks.","categories":["cards"],"files":[{"path":"components/voice-orb.tsx","type":"registry:component"}]},{"name":"call-widget","type":"registry:component","title":"Call widget","description":"Accept turns into hang-up as the call controls unfold out of it, one by one.","categories":["feedback"],"files":[{"path":"components/call-widget.tsx","type":"registry:component"}]},{"name":"logo-orbit","type":"registry:component","title":"Logo orbit","description":"Logos orbit a heading on tilted rings, passing behind it, and brake to a stop when you point.","categories":["cards"],"files":[{"path":"components/logo-orbit.tsx","type":"registry:component"}]},{"name":"now-playing","type":"registry:component","title":"Now playing","description":"A listening-to pill whose record slides out from behind the cover and spins while it plays.","categories":["cards"],"files":[{"path":"components/now-playing.tsx","type":"registry:component"}]},{"name":"uptime-bar","type":"registry:component","title":"Uptime bar","description":"Point at any day and the row's own caption tells you what happened.","categories":["data"],"files":[{"path":"components/uptime-bar.tsx","type":"registry:component"}]},{"name":"helpful-prompt","type":"registry:component","title":"Helpful prompt","description":"Asks if the page helped, and on a no opens into a field right where the question was.","categories":["feedback"],"files":[{"path":"components/helpful-prompt.tsx","type":"registry:component"}]},{"name":"back-to-top","type":"registry:component","title":"Back to top","description":"Fills its ring as you read, and when you press it the arrow lifts off while the page glides back up.","categories":["navigation"],"files":[{"path":"components/back-to-top.tsx","type":"registry:component"}]},{"name":"share-button","type":"registry:component","title":"Share button","description":"Opens in place into copy, X and email, and the link turns into a check when it is copied.","categories":["buttons"],"files":[{"path":"components/share-button.tsx","type":"registry:component"}]},{"name":"autosave-status","type":"registry:component","title":"Autosave status","description":"A dot for unsaved changes splits into three while saving, then gathers into a check.","categories":["feedback"],"files":[{"path":"components/autosave-status.tsx","type":"registry:component"}]},{"name":"reactions","type":"registry:component","title":"Reactions","description":"Tap a reaction to add yours, or pick one and watch it fly into its pill as the count rolls.","categories":["cards"],"files":[{"path":"components/reactions.tsx","type":"registry:component"}]},{"name":"shortcut-recorder","type":"registry:component","title":"Shortcut recorder","description":"Press keys to set a shortcut: keycaps appear as you hold them, and it tells you when a combo is taken.","categories":["inputs"],"files":[{"path":"components/shortcut-recorder.tsx","type":"registry:component"}]},{"name":"storage-meter","type":"registry:component","title":"Storage meter","description":"Point at any slice to read its size, then clear the cache and watch the total count down.","categories":["data"],"files":[{"path":"components/storage-meter.tsx","type":"registry:component"}]},{"name":"status-picker","type":"registry:component","title":"Status picker","description":"Pick a status and the badge on your avatar turns into its shape: a dot, a moon, a stop sign or a ring.","categories":["inputs"],"files":[{"path":"components/status-picker.tsx","type":"registry:component"}]},{"name":"mood-slider","type":"registry:component","title":"Mood slider","description":"The thumb is a face that frowns, grins and leans into the drag as you rate your day.","categories":["inputs"],"files":[{"path":"components/mood-slider.tsx","type":"registry:component"}]},{"name":"signature-pad","type":"registry:component","title":"Signature pad","description":"Ink that swells where you slow down, and wipes away the way you wrote it.","categories":["inputs"],"files":[{"path":"components/signature-pad.tsx","type":"registry:component"}]},{"name":"card-number-reveal","type":"registry:component","title":"Card number reveal","description":"Rolls the hidden digits in when you press the eye, then hides them again when the ring runs out.","categories":["data"],"files":[{"path":"components/card-number-reveal.tsx","type":"registry:component"}]},{"name":"sidebar-highlight","type":"registry:component","title":"Sidebar highlight","description":"A dot travels to whatever you pick and takes on its section colour, which then wipes across the label.","categories":["navigation"],"files":[{"path":"components/sidebar-highlight.tsx","type":"registry:component"}]},{"name":"payment-card","type":"registry:component","title":"Payment card","description":"Floods with the card network's colours from the corner the moment the first digits give it away.","categories":["inputs"],"files":[{"path":"components/payment-card.tsx","type":"registry:component"}]},{"name":"sidebar-submenu","type":"registry:component","title":"Sidebar sub-menu","description":"Opens one section at a time and lights the branch from the title down to the item you are on.","categories":["navigation"],"files":[{"path":"components/sidebar-submenu.tsx","type":"registry:component"}]},{"name":"floating-action-menu","type":"registry:component","title":"Floating action menu","description":"The plus folds away and its actions unfold upward out of the spot it sat in, over a frosted screen.","categories":["buttons"],"files":[{"path":"components/floating-action-menu.tsx","type":"registry:component"}]},{"name":"push-lock-button","type":"registry:component","title":"Push-lock button","description":"Bottoms out while you hold it, catches halfway when you let go and lights the lamp, and springs back on the next press.","categories":["buttons"],"files":[{"path":"components/push-lock-button.tsx","type":"registry:component"}]},{"name":"qr-reveal","type":"registry:component","title":"QR reveal","description":"The code leaves the button as a cloud of ink dust that billows up and settles, grain by grain, into a QR you can scan.","categories":["cards"],"files":[{"path":"components/qr-reveal.tsx","type":"registry:component"}]},{"name":"wallet-cards","type":"registry:component","title":"Wallet cards","description":"Tap the cards peeking out of the home screen and the front one lifts into a carousel as the page changes around it; close it and it drops back into the stack.","categories":["cards"],"files":[{"path":"components/wallet-cards.tsx","type":"registry:component"}]},{"name":"clock-field","type":"registry:component","title":"Clock field","description":"A field of clocks whose hands turn as one, melting between a wave, a vortex, rings and a funnel; they look at your pointer, and a click sends a ripple through them.","categories":["playground"],"files":[{"path":"components/clock-field.tsx","type":"registry:component"}]},{"name":"x-walkers","type":"registry:component","title":"X walkers","description":"X marks crawl across a field of dots, reaching their arms to the next dot and dragging themselves over; they keep away from your pointer, and a click sets down a new one.","categories":["playground"],"files":[{"path":"components/x-walkers.tsx","type":"registry:component"}]},{"name":"glass-lens","type":"registry:component","title":"Glass lens","description":"A ball of glass rides over the words and magnifies whatever it passes; press and the whole paragraph shivers and flushes indigo.","categories":["text"],"files":[{"path":"components/glass-lens.tsx","type":"registry:component"}]},{"name":"orbit-gallery","type":"registry:component","title":"Orbit gallery","description":"Small photographs turn slowly round a name; hover one and the ring stops and makes room, click it and it grows into the middle while the rest bloom outward.","categories":["cards"],"files":[{"path":"components/orbit-gallery.tsx","type":"registry:component"}]},{"name":"binary-year","type":"registry:component","title":"Binary year","description":"A year written in binary; reach for it and a wave runs in from the right, the leading digits fade to zeros and the year you know types itself in.","categories":["text"],"files":[{"path":"components/binary-year.tsx","type":"registry:component"}]},{"name":"gooey-menu","type":"registry:component","title":"Gooey menu","description":"One small button that opens three ways, all made of the same liquid: a menu that pulls free, a button that swells into one, and a dial that bubbles out.","categories":["buttons"],"files":[{"path":"components/gooey-menu.tsx","type":"registry:component"}]}]}