{"$schema":"https://ui.shadcn.com/schema/registry.json","name":"interior","homepage":"https://www.interior.dev","items":[{"name":"copy-button","type":"registry:ui","title":"Copy Button","description":"Copy to tick, width locked, reverts after 2s.","dependencies":["motion"],"categories":["action feedback"],"docs":"https://www.interior.dev/docs/copy-button","files":[{"path":"registry/interior/copy-button.tsx","type":"registry:ui","target":"components/interior/copy-button.tsx"}]},{"name":"loading-button","type":"registry:ui","title":"Loading Button","description":"Label to state without layout shift.","dependencies":["motion"],"categories":["action feedback"],"docs":"https://www.interior.dev/docs/loading-button","files":[{"path":"registry/interior/loading-button.tsx","type":"registry:ui","target":"components/interior/loading-button.tsx"}]},{"name":"hold-to-confirm","type":"registry:ui","title":"Hold to Confirm","description":"A guard rail in front of destructive actions.","dependencies":["motion"],"categories":["action feedback"],"docs":"https://www.interior.dev/docs/hold-to-confirm","files":[{"path":"registry/interior/hold-to-confirm.tsx","type":"registry:ui","target":"components/interior/hold-to-confirm.tsx"}]},{"name":"like-burst","type":"registry:ui","title":"Like Burst","description":"Optimistic like that survives rapid taps.","dependencies":["motion"],"categories":["action feedback"],"docs":"https://www.interior.dev/docs/like-burst","files":[{"path":"registry/interior/like-burst.tsx","type":"registry:ui","target":"components/interior/like-burst.tsx"}]},{"name":"ripple","type":"registry:ui","title":"Ripple","description":"Touch feedback from the pointer origin.","dependencies":["motion"],"categories":["action feedback"],"docs":"https://www.interior.dev/docs/ripple","files":[{"path":"registry/interior/ripple.tsx","type":"registry:ui","target":"components/interior/ripple.tsx"}]},{"name":"icon-morph","type":"registry:ui","title":"Icon Morph","description":"Play/pause, menu/close as one mechanism.","dependencies":["motion"],"categories":["action feedback"],"docs":"https://www.interior.dev/docs/icon-morph","files":[{"path":"registry/interior/icon-morph.tsx","type":"registry:ui","target":"components/interior/icon-morph.tsx"}]},{"name":"press-depth","type":"registry:ui","title":"Press Depth","description":"The feeling that the press landed.","dependencies":["motion"],"categories":["action feedback"],"docs":"https://www.interior.dev/docs/press-depth","files":[{"path":"registry/interior/press-depth.tsx","type":"registry:ui","target":"components/interior/press-depth.tsx"}]},{"name":"floating-label","type":"registry:ui","title":"Floating Label","description":"The label makes room instead of disappearing.","dependencies":["motion"],"categories":["input"],"docs":"https://www.interior.dev/docs/floating-label","files":[{"path":"registry/interior/floating-label.tsx","type":"registry:ui","target":"components/interior/floating-label.tsx"}]},{"name":"inline-validation","type":"registry:ui","title":"Inline Validation","description":"Error message that does not shove the form.","dependencies":["motion"],"categories":["input"],"docs":"https://www.interior.dev/docs/inline-validation","files":[{"path":"registry/interior/inline-validation.tsx","type":"registry:ui","target":"components/interior/inline-validation.tsx"}]},{"name":"password-strength","type":"registry:ui","title":"Password Strength","description":"Strength read segment by segment.","dependencies":["motion"],"categories":["input"],"docs":"https://www.interior.dev/docs/password-strength","files":[{"path":"registry/interior/password-strength.tsx","type":"registry:ui","target":"components/interior/password-strength.tsx"}]},{"name":"otp-input","type":"registry:ui","title":"OTP Input","description":"Auto advance, paste, error recovery.","dependencies":["motion"],"categories":["input"],"docs":"https://www.interior.dev/docs/otp-input","files":[{"path":"registry/interior/otp-input.tsx","type":"registry:ui","target":"components/interior/otp-input.tsx"}]},{"name":"tag-input","type":"registry:ui","title":"Tag Input","description":"Enter adds, backspace highlights then removes.","dependencies":["motion"],"categories":["input"],"docs":"https://www.interior.dev/docs/tag-input","files":[{"path":"registry/interior/tag-input.tsx","type":"registry:ui","target":"components/interior/tag-input.tsx"}]},{"name":"expanding-search","type":"registry:ui","title":"Expanding Search","description":"Icon to field with focus handled.","dependencies":["motion"],"categories":["input"],"docs":"https://www.interior.dev/docs/expanding-search","files":[{"path":"registry/interior/expanding-search.tsx","type":"registry:ui","target":"components/interior/expanding-search.tsx"}]},{"name":"skeleton-swap","type":"registry:ui","title":"Skeleton Swap","description":"Skeleton to content with zero layout shift.","dependencies":["motion"],"categories":["async"],"docs":"https://www.interior.dev/docs/skeleton-swap","files":[{"path":"registry/interior/skeleton-swap.tsx","type":"registry:ui","target":"components/interior/skeleton-swap.tsx"}]},{"name":"progress-bar","type":"registry:ui","title":"Progress Bar","description":"Indeterminate handing over to determinate.","dependencies":["motion"],"categories":["async"],"docs":"https://www.interior.dev/docs/progress-bar","files":[{"path":"registry/interior/progress-bar.tsx","type":"registry:ui","target":"components/interior/progress-bar.tsx"}]},{"name":"load-more","type":"registry:ui","title":"Load More","description":"Sentinel that loads before you hit the end.","dependencies":["motion"],"categories":["async"],"docs":"https://www.interior.dev/docs/load-more","files":[{"path":"registry/interior/load-more.tsx","type":"registry:ui","target":"components/interior/load-more.tsx"}]},{"name":"streaming-text","type":"registry:ui","title":"Streaming Text","description":"Token by token with a caret.","dependencies":["motion"],"categories":["async"],"docs":"https://www.interior.dev/docs/streaming-text","files":[{"path":"registry/interior/streaming-text.tsx","type":"registry:ui","target":"components/interior/streaming-text.tsx"}]},{"name":"task-steps","type":"registry:ui","title":"Task Steps","description":"The system narrates its work.","dependencies":["motion"],"categories":["async"],"docs":"https://www.interior.dev/docs/task-steps","files":[{"path":"registry/interior/task-steps.tsx","type":"registry:ui","target":"components/interior/task-steps.tsx"}]},{"name":"live-activity","type":"registry:ui","title":"Live Activity","description":"The system's ongoing work, worn as a small object.","dependencies":["motion"],"categories":["notification"],"docs":"https://www.interior.dev/docs/live-activity","files":[{"path":"registry/interior/live-activity.tsx","type":"registry:ui","target":"components/interior/live-activity.tsx"}]},{"name":"collapsible-banner","type":"registry:ui","title":"Collapsible Banner","description":"Folds to its title, or lets go entirely.","dependencies":["motion"],"categories":["notification"],"docs":"https://www.interior.dev/docs/collapsible-banner","files":[{"path":"registry/interior/collapsible-banner.tsx","type":"registry:ui","target":"components/interior/collapsible-banner.tsx"}]},{"name":"presence-avatars","type":"registry:ui","title":"Presence Avatars","description":"Join and leave as a layout change.","dependencies":["motion"],"categories":["notification"],"docs":"https://www.interior.dev/docs/presence-avatars","files":[{"path":"registry/interior/presence-avatars.tsx","type":"registry:ui","target":"components/interior/presence-avatars.tsx"}]},{"name":"typing-indicator","type":"registry:ui","title":"Typing Indicator","description":"Someone is writing.","dependencies":["motion"],"categories":["notification"],"docs":"https://www.interior.dev/docs/typing-indicator","files":[{"path":"registry/interior/typing-indicator.tsx","type":"registry:ui","target":"components/interior/typing-indicator.tsx"}]},{"name":"new-items-pill","type":"registry:ui","title":"New Items Pill","description":"New content without stealing your scroll.","dependencies":["motion"],"categories":["notification"],"docs":"https://www.interior.dev/docs/new-items-pill","files":[{"path":"registry/interior/new-items-pill.tsx","type":"registry:ui","target":"components/interior/new-items-pill.tsx"}]},{"name":"modal","type":"registry:ui","title":"Modal","description":"Backdrop, scroll lock, focus trap.","dependencies":["motion"],"categories":["overlay"],"docs":"https://www.interior.dev/docs/modal","files":[{"path":"registry/interior/modal.tsx","type":"registry:ui","target":"components/interior/modal.tsx"}]},{"name":"popover","type":"registry:ui","title":"Popover","description":"Knows its origin, flips on collision.","dependencies":["motion"],"categories":["overlay"],"docs":"https://www.interior.dev/docs/popover","files":[{"path":"registry/interior/popover.tsx","type":"registry:ui","target":"components/interior/popover.tsx"}]},{"name":"tooltip-group","type":"registry:ui","title":"Tooltip Group","description":"Delayed once, instant after that.","dependencies":["motion"],"categories":["overlay"],"docs":"https://www.interior.dev/docs/tooltip-group","files":[{"path":"registry/interior/tooltip-group.tsx","type":"registry:ui","target":"components/interior/tooltip-group.tsx"}]},{"name":"command-palette","type":"registry:ui","title":"Command Palette","description":"Results reorder as you type.","dependencies":["motion"],"categories":["overlay"],"docs":"https://www.interior.dev/docs/command-palette","files":[{"path":"registry/interior/command-palette.tsx","type":"registry:ui","target":"components/interior/command-palette.tsx"}]},{"name":"drawer","type":"registry:ui","title":"Drawer","description":"Side panel that keeps its place.","dependencies":["motion"],"categories":["overlay"],"docs":"https://www.interior.dev/docs/drawer","files":[{"path":"registry/interior/drawer.tsx","type":"registry:ui","target":"components/interior/drawer.tsx"}]},{"name":"context-menu","type":"registry:ui","title":"Context Menu","description":"Opens from the pointer, not the corner.","dependencies":["motion"],"categories":["overlay"],"docs":"https://www.interior.dev/docs/context-menu","files":[{"path":"registry/interior/context-menu.tsx","type":"registry:ui","target":"components/interior/context-menu.tsx"}]},{"name":"dropdown","type":"registry:ui","title":"Dropdown","description":"Active highlight travels between items.","dependencies":["motion"],"categories":["overlay"],"docs":"https://www.interior.dev/docs/dropdown","files":[{"path":"registry/interior/dropdown.tsx","type":"registry:ui","target":"components/interior/dropdown.tsx"}]},{"name":"tabs","type":"registry:ui","title":"Tabs","description":"One indicator shared across tabs.","dependencies":["motion"],"categories":["navigation"],"docs":"https://www.interior.dev/docs/tabs","files":[{"path":"registry/interior/tabs.tsx","type":"registry:ui","target":"components/interior/tabs.tsx"}]},{"name":"segmented-control","type":"registry:ui","title":"Segmented Control","description":"Thumb slides, label inverts through it.","dependencies":["motion"],"categories":["navigation"],"docs":"https://www.interior.dev/docs/segmented-control","files":[{"path":"registry/interior/segmented-control.tsx","type":"registry:ui","target":"components/interior/segmented-control.tsx"}]},{"name":"accordion","type":"registry:ui","title":"Accordion","description":"height auto, done correctly.","dependencies":["motion"],"categories":["navigation"],"docs":"https://www.interior.dev/docs/accordion","files":[{"path":"registry/interior/accordion.tsx","type":"registry:ui","target":"components/interior/accordion.tsx"}]},{"name":"wizard-steps","type":"registry:ui","title":"Wizard Steps","description":"Transition knows forward from back.","dependencies":["motion"],"categories":["navigation"],"docs":"https://www.interior.dev/docs/wizard-steps","files":[{"path":"registry/interior/wizard-steps.tsx","type":"registry:ui","target":"components/interior/wizard-steps.tsx"}]},{"name":"pagination","type":"registry:ui","title":"Pagination","description":"The window moves, the row does not.","dependencies":["motion"],"categories":["navigation"],"docs":"https://www.interior.dev/docs/pagination","files":[{"path":"registry/interior/pagination.tsx","type":"registry:ui","target":"components/interior/pagination.tsx"}]},{"name":"tree-view","type":"registry:ui","title":"Tree View","description":"Disclosure the arrow keys can walk.","dependencies":["motion"],"categories":["navigation"],"docs":"https://www.interior.dev/docs/tree-view","files":[{"path":"registry/interior/tree-view.tsx","type":"registry:ui","target":"components/interior/tree-view.tsx"}]},{"name":"sticky-header","type":"registry:ui","title":"Sticky Header","description":"Condenses as you go down.","dependencies":["motion"],"categories":["scroll"],"docs":"https://www.interior.dev/docs/sticky-header","files":[{"path":"registry/interior/sticky-header.tsx","type":"registry:ui","target":"components/interior/sticky-header.tsx"}]},{"name":"reading-progress","type":"registry:ui","title":"Reading Progress","description":"How much is left.","dependencies":["motion"],"categories":["scroll"],"docs":"https://www.interior.dev/docs/reading-progress","files":[{"path":"registry/interior/reading-progress.tsx","type":"registry:ui","target":"components/interior/reading-progress.tsx"}]},{"name":"scroll-spy","type":"registry:ui","title":"Scroll Spy","description":"The section you are actually in.","dependencies":["motion"],"categories":["scroll"],"docs":"https://www.interior.dev/docs/scroll-spy","files":[{"path":"registry/interior/scroll-spy.tsx","type":"registry:ui","target":"components/interior/scroll-spy.tsx"}]},{"name":"snap-carousel","type":"registry:ui","title":"Snap Carousel","description":"Momentum that lands on a slide.","dependencies":["motion"],"categories":["scroll"],"docs":"https://www.interior.dev/docs/snap-carousel","files":[{"path":"registry/interior/snap-carousel.tsx","type":"registry:ui","target":"components/interior/snap-carousel.tsx"}]},{"name":"hide-on-scroll","type":"registry:ui","title":"Hide on Scroll","description":"Toolbar yields to the content.","dependencies":["motion"],"categories":["scroll"],"docs":"https://www.interior.dev/docs/hide-on-scroll","files":[{"path":"registry/interior/hide-on-scroll.tsx","type":"registry:ui","target":"components/interior/hide-on-scroll.tsx"}]},{"name":"sortable-table","type":"registry:ui","title":"Sortable Table","description":"Rows travel to their new order.","dependencies":["motion"],"categories":["data"],"docs":"https://www.interior.dev/docs/sortable-table","files":[{"path":"registry/interior/sortable-table.tsx","type":"registry:ui","target":"components/interior/sortable-table.tsx"}]},{"name":"filter-grid","type":"registry:ui","title":"Filter Grid","description":"Filtering rearranges, it does not blink.","dependencies":["motion"],"categories":["data"],"docs":"https://www.interior.dev/docs/filter-grid","files":[{"path":"registry/interior/filter-grid.tsx","type":"registry:ui","target":"components/interior/filter-grid.tsx"}]},{"name":"value-flash","type":"registry:ui","title":"Value Flash","description":"Marks what just changed.","dependencies":["motion"],"categories":["data"],"docs":"https://www.interior.dev/docs/value-flash","files":[{"path":"registry/interior/value-flash.tsx","type":"registry:ui","target":"components/interior/value-flash.tsx"}]},{"name":"poll-results","type":"registry:ui","title":"Poll Results","description":"The winner lands last.","dependencies":["motion"],"categories":["data"],"docs":"https://www.interior.dev/docs/poll-results","files":[{"path":"registry/interior/poll-results.tsx","type":"registry:ui","target":"components/interior/poll-results.tsx"}]},{"name":"slider-detents","type":"registry:ui","title":"Slider Detents","description":"Stops you can feel.","dependencies":["motion"],"categories":["gesture"],"docs":"https://www.interior.dev/docs/slider-detents","files":[{"path":"registry/interior/slider-detents.tsx","type":"registry:ui","target":"components/interior/slider-detents.tsx"}]},{"name":"swipe-deck","type":"registry:ui","title":"Swipe Deck","description":"A stack you decide through.","dependencies":["motion"],"categories":["gesture"],"docs":"https://www.interior.dev/docs/swipe-deck","files":[{"path":"registry/interior/swipe-deck.tsx","type":"registry:ui","target":"components/interior/swipe-deck.tsx"}]},{"name":"reorder-list","type":"registry:ui","title":"Reorder List","description":"The gap the siblings open is the drop target.","dependencies":["motion"],"categories":["gesture"],"docs":"https://www.interior.dev/docs/reorder-list","files":[{"path":"registry/interior/reorder-list.tsx","type":"registry:ui","target":"components/interior/reorder-list.tsx"}]},{"name":"long-press","type":"registry:ui","title":"Long Press","description":"Intent confirmed by time, and cancelled by everything else.","dependencies":["motion"],"categories":["gesture"],"docs":"https://www.interior.dev/docs/long-press","files":[{"path":"registry/interior/long-press.tsx","type":"registry:ui","target":"components/interior/long-press.tsx"}]},{"name":"lightbox","type":"registry:ui","title":"Lightbox","description":"Zoom that returns where it started.","dependencies":["motion"],"categories":["gesture"],"docs":"https://www.interior.dev/docs/lightbox","files":[{"path":"registry/interior/lightbox.tsx","type":"registry:ui","target":"components/interior/lightbox.tsx"}]},{"name":"text-reveal","type":"registry:ui","title":"Text Reveal","description":"Words arrive in reading order.","dependencies":["motion"],"categories":["content"],"docs":"https://www.interior.dev/docs/text-reveal","files":[{"path":"registry/interior/text-reveal.tsx","type":"registry:ui","target":"components/interior/text-reveal.tsx"}]},{"name":"logo-marquee","type":"registry:ui","title":"Logo Marquee","description":"Stops when you look at it.","dependencies":["motion"],"categories":["content"],"docs":"https://www.interior.dev/docs/logo-marquee","files":[{"path":"registry/interior/logo-marquee.tsx","type":"registry:ui","target":"components/interior/logo-marquee.tsx"}]},{"name":"blur-up-image","type":"registry:ui","title":"Blur-up Image","description":"Placeholder resolves into the photo.","dependencies":["motion"],"categories":["content"],"docs":"https://www.interior.dev/docs/blur-up-image","files":[{"path":"registry/interior/blur-up-image.tsx","type":"registry:ui","target":"components/interior/blur-up-image.tsx"}]},{"name":"show-more","type":"registry:ui","title":"Show More","description":"Height animates, text does not reflow.","dependencies":["motion"],"categories":["content"],"docs":"https://www.interior.dev/docs/show-more","files":[{"path":"registry/interior/show-more.tsx","type":"registry:ui","target":"components/interior/show-more.tsx"}]}]}