{ "$schema": "https://ui.shadcn.com/schema/registry.json", "name": "gear5-ui", "homepage": "https://gear5-ui.vercel.app", "items": [ { "name": "cn", "type": "registry:lib", "title": "cn", "description": "Zero-dependency class name joiner.", "tier": "xs", "files": [ { "path": "registry/gear5/lib/cn.ts", "type": "registry:lib" } ] }, { "name": "use-network", "type": "registry:hook", "title": "useNetwork", "description": "Observe online state, Save-Data, and connection quality without hydration mismatches.", "tier": "sm", "files": [ { "path": "registry/gear5/lib/use-network.ts", "type": "registry:hook" } ] }, { "name": "locale", "type": "registry:lib", "title": "Locale facts", "description": "Writing direction, calendar, numbering system, and first day of week for any BCP 47 tag.", "tier": "sm", "files": [ { "path": "registry/gear5/lib/locale.ts", "type": "registry:lib" } ] }, { "name": "use-locale", "type": "registry:hook", "title": "LocaleProvider / useLocale", "description": "Share resolved locale facts through a subtree.", "tier": "sm", "registryDependencies": [ "locale" ], "files": [ { "path": "registry/gear5/lib/use-locale.tsx", "type": "registry:hook" } ] }, { "name": "announce", "type": "registry:lib", "title": "announce", "description": "Shared ARIA live regions that screen readers actually read.", "tier": "sm", "files": [ { "path": "registry/gear5/lib/announce.ts", "type": "registry:lib" } ] }, { "name": "format", "type": "registry:lib", "title": "Intl formatters", "description": "Memoised Intl formatters plus relative-time formatting.", "tier": "sm", "files": [ { "path": "registry/gear5/lib/format.ts", "type": "registry:lib" } ] }, { "name": "draft-storage", "type": "registry:lib", "title": "Draft storage", "description": "Persist in-progress form input, excluding credentials and payment fields.", "tier": "sm", "files": [ { "path": "registry/gear5/lib/draft-storage.ts", "type": "registry:lib" } ] }, { "name": "sanitize", "type": "registry:lib", "title": "sanitizeHref", "description": "Neutralise javascript: and other executable URL schemes before they reach an href or src.", "tier": "xs", "files": [ { "path": "registry/gear5/lib/sanitize.ts", "type": "registry:lib" } ] }, { "name": "async-boundary", "type": "registry:ui", "title": "AsyncBoundary", "description": "Loading, error, empty, and offline states — announced, focus-managed, and shift-free.", "category": "Feedback & status", "tier": "lg", "registryDependencies": [ "cn", "announce", "use-network", "use-locale" ], "files": [ { "path": "registry/gear5/ui/async-boundary.tsx", "type": "registry:ui" } ] }, { "name": "connection-status", "type": "registry:ui", "title": "ConnectionStatus", "description": "A live banner for offline, restored, and constrained connections.", "category": "Feedback & status", "tier": "md", "registryDependencies": [ "cn", "use-network", "use-locale" ], "files": [ { "path": "registry/gear5/ui/connection-status.tsx", "type": "registry:ui" } ] }, { "name": "adaptive-image", "type": "registry:ui", "title": "AdaptiveImage", "description": "An image that defers its own download on Save-Data and 2G-class connections.", "category": "Media & layout", "tier": "md", "registryDependencies": [ "cn", "use-network", "use-locale" ], "files": [ { "path": "registry/gear5/ui/adaptive-image.tsx", "type": "registry:ui" } ] }, { "name": "field", "type": "registry:ui", "title": "Field", "description": "A text field with label, description, and error wired to assistive technology.", "category": "Forms & input", "tier": "sm", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/field.tsx", "type": "registry:ui" } ] }, { "name": "resilient-form", "type": "registry:ui", "title": "ResilientForm", "description": "A form that keeps drafts, explains uncertain submissions, and gives errors a focusable summary.", "category": "Forms & input", "tier": "lg", "registryDependencies": [ "cn", "announce", "draft-storage", "use-network", "use-locale" ], "files": [ { "path": "registry/gear5/ui/resilient-form.tsx", "type": "registry:ui" } ] }, { "name": "error-boundary", "type": "registry:ui", "title": "ErrorBoundary", "description": "Contains a render crash to its own subtree instead of the whole page, with a focusable, announced fallback.", "category": "Feedback & status", "tier": "md", "registryDependencies": [ "cn", "announce" ], "files": [ { "path": "registry/gear5/ui/error-boundary.tsx", "type": "registry:ui" } ] }, { "name": "visually-hidden", "type": "registry:ui", "title": "VisuallyHidden", "description": "Content for assistive technology only, removed from the visual layout without leaving the accessibility tree.", "category": "Accessibility & preferences", "tier": "xs", "files": [ { "path": "registry/gear5/ui/visually-hidden.tsx", "type": "registry:ui" } ] }, { "name": "kbd", "type": "registry:ui", "title": "Kbd", "description": "A single keyboard key, styled and marked up as one.", "category": "Accessibility & preferences", "tier": "xs", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/kbd.tsx", "type": "registry:ui" } ] }, { "name": "divider", "type": "registry:ui", "title": "Divider", "description": "A horizontal or vertical rule, with an optional inline label.", "category": "Media & layout", "tier": "sm", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/divider.tsx", "type": "registry:ui" } ] }, { "name": "use-focus-trap", "type": "registry:hook", "title": "useFocusTrap", "description": "Traps Tab/Shift+Tab inside a container and restores focus on exit — what makes a modal actually modal for keyboard users.", "tier": "sm", "files": [ { "path": "registry/gear5/lib/use-focus-trap.ts", "type": "registry:hook" } ] }, { "name": "badge", "type": "registry:ui", "title": "Badge", "description": "A small status label where color never carries meaning alone.", "category": "Feedback & status", "tier": "sm", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/badge.tsx", "type": "registry:ui" } ] }, { "name": "status-dot", "type": "registry:ui", "title": "StatusDot", "description": "A coloured status indicator with an always-present text label.", "category": "Feedback & status", "tier": "sm", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/status-dot.tsx", "type": "registry:ui" } ] }, { "name": "avatar", "type": "registry:ui", "title": "Avatar", "description": "A person's picture, or script-aware initials when there is none.", "category": "Data display", "tier": "sm", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/avatar.tsx", "type": "registry:ui" } ] }, { "name": "avatar-group", "type": "registry:ui", "title": "AvatarGroup", "description": "An overlapping avatar stack with an accessible overflow indicator.", "category": "Data display", "tier": "md", "registryDependencies": [ "cn", "avatar" ], "files": [ { "path": "registry/gear5/ui/avatar-group.tsx", "type": "registry:ui" } ] }, { "name": "chip", "type": "registry:ui", "title": "Chip", "description": "A dismissible tag with a real accessible name for its remove action.", "category": "Data display", "tier": "sm", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/chip.tsx", "type": "registry:ui" } ] }, { "name": "card", "type": "registry:ui", "title": "Card", "description": "A bordered content container with header, title, and description parts.", "category": "Data display", "tier": "sm", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/card.tsx", "type": "registry:ui" } ] }, { "name": "container", "type": "registry:ui", "title": "Container", "description": "A centred, max-width content column.", "category": "Media & layout", "tier": "xs", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/container.tsx", "type": "registry:ui" } ] }, { "name": "alert", "type": "registry:ui", "title": "Alert", "description": "A static in-flow message, polite or assertive by tone.", "category": "Feedback & status", "tier": "sm", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/alert.tsx", "type": "registry:ui" } ] }, { "name": "progress-bar", "type": "registry:ui", "title": "ProgressBar", "description": "A determinate or indeterminate progress bar with a real accessible value.", "category": "Feedback & status", "tier": "sm", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/progress-bar.tsx", "type": "registry:ui" } ] }, { "name": "spinner", "type": "registry:ui", "title": "Spinner", "description": "A loading indicator announced once via role=status.", "category": "Feedback & status", "tier": "sm", "registryDependencies": [ "cn", "visually-hidden" ], "files": [ { "path": "registry/gear5/ui/spinner.tsx", "type": "registry:ui" } ] }, { "name": "skeleton", "type": "registry:ui", "title": "Skeleton", "description": "A placeholder shape that reserves space for content that has not arrived yet.", "category": "Feedback & status", "tier": "xs", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/skeleton.tsx", "type": "registry:ui" } ] }, { "name": "relative-time", "type": "registry:ui", "title": "RelativeTime", "description": "Live, localised relative time (\"3 days ago\") with the exact timestamp always available.", "category": "Internationalisation", "tier": "md", "registryDependencies": [ "format", "locale", "use-locale" ], "files": [ { "path": "registry/gear5/ui/relative-time.tsx", "type": "registry:ui" } ] }, { "name": "plural-text", "type": "registry:ui", "title": "PluralText", "description": "Grammatically correct plural forms via Intl.PluralRules, not an English if/else.", "category": "Internationalisation", "tier": "sm", "registryDependencies": [ "use-locale" ], "files": [ { "path": "registry/gear5/ui/plural-text.tsx", "type": "registry:ui" } ] }, { "name": "list-text", "type": "registry:ui", "title": "ListText", "description": "\"A, B, and C\" formatted correctly for the current locale via Intl.ListFormat.", "category": "Internationalisation", "tier": "md", "registryDependencies": [ "format", "use-locale" ], "files": [ { "path": "registry/gear5/ui/list-text.tsx", "type": "registry:ui" } ] }, { "name": "currency-text", "type": "registry:ui", "title": "CurrencyText", "description": "Locale- and currency-correct money formatting via Intl.NumberFormat.", "category": "Internationalisation", "tier": "md", "registryDependencies": [ "format", "use-locale" ], "files": [ { "path": "registry/gear5/ui/currency-text.tsx", "type": "registry:ui" } ] }, { "name": "empty-state", "type": "registry:ui", "title": "EmptyState", "description": "A placeholder for a list, table, or panel with nothing in it yet.", "category": "Feedback & status", "tier": "sm", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/empty-state.tsx", "type": "registry:ui" } ] }, { "name": "tooltip", "type": "registry:ui", "title": "Tooltip", "description": "A hover/focus label bound with aria-describedby, keyboard accessible.", "category": "Overlays", "tier": "sm", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/tooltip.tsx", "type": "registry:ui" } ] }, { "name": "switch", "type": "registry:ui", "title": "Switch", "description": "A binary toggle built on role=switch, not a disguised checkbox.", "category": "Forms & input", "tier": "sm", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/switch.tsx", "type": "registry:ui" } ] }, { "name": "checkbox", "type": "registry:ui", "title": "Checkbox", "description": "A checkbox with a real, clickable, bound label.", "category": "Forms & input", "tier": "sm", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/checkbox.tsx", "type": "registry:ui" } ] }, { "name": "radio-group", "type": "registry:ui", "title": "RadioGroup", "description": "A fieldset/legend group of real radio inputs.", "category": "Forms & input", "tier": "sm", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/radio-group.tsx", "type": "registry:ui" } ] }, { "name": "slider", "type": "registry:ui", "title": "Slider", "description": "A native range input with an RTL-correct thumb direction.", "category": "Forms & input", "tier": "md", "registryDependencies": [ "cn", "use-locale" ], "files": [ { "path": "registry/gear5/ui/slider.tsx", "type": "registry:ui" } ] }, { "name": "rating", "type": "registry:ui", "title": "Rating", "description": "A star rating, read-only or editable, announced as one value.", "category": "Forms & input", "tier": "sm", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/rating.tsx", "type": "registry:ui" } ] }, { "name": "accordion", "type": "registry:ui", "title": "Accordion", "description": "Collapsible sections built on the WAI-ARIA Accordion pattern.", "category": "Data display", "tier": "md", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/accordion.tsx", "type": "registry:ui" } ] }, { "name": "tabs", "type": "registry:ui", "title": "Tabs", "description": "Keyboard-navigable tabs whose arrow-key direction flips correctly under RTL.", "category": "Navigation", "tier": "md", "registryDependencies": [ "cn", "use-locale" ], "files": [ { "path": "registry/gear5/ui/tabs.tsx", "type": "registry:ui" } ] }, { "name": "breadcrumb", "type": "registry:ui", "title": "Breadcrumb", "description": "A landmark trail with the current page marked aria-current.", "category": "Navigation", "tier": "sm", "registryDependencies": [ "sanitize", "cn" ], "files": [ { "path": "registry/gear5/ui/breadcrumb.tsx", "type": "registry:ui" } ] }, { "name": "pagination", "type": "registry:ui", "title": "Pagination", "description": "Page controls with locale-correct numerals.", "category": "Navigation", "tier": "md", "registryDependencies": [ "cn", "use-locale" ], "files": [ { "path": "registry/gear5/ui/pagination.tsx", "type": "registry:ui" } ] }, { "name": "stepper", "type": "registry:ui", "title": "Stepper", "description": "A wizard's progress, with each step's status in its accessible name.", "category": "Navigation", "tier": "sm", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/stepper.tsx", "type": "registry:ui" } ] }, { "name": "copy-button", "type": "registry:ui", "title": "CopyButton", "description": "Copies to the clipboard and announces success.", "category": "Media & layout", "tier": "sm", "registryDependencies": [ "announce", "cn" ], "files": [ { "path": "registry/gear5/ui/copy-button.tsx", "type": "registry:ui" } ] }, { "name": "share-button", "type": "registry:ui", "title": "ShareButton", "description": "Web Share API with a plain-link fallback.", "category": "Media & layout", "tier": "sm", "registryDependencies": [ "sanitize", "cn" ], "files": [ { "path": "registry/gear5/ui/share-button.tsx", "type": "registry:ui" } ] }, { "name": "portal", "type": "registry:ui", "title": "Portal", "description": "Renders children into document.body, deferred to a client-only mount.", "category": "Overlays", "tier": "xs", "files": [ { "path": "registry/gear5/ui/portal.tsx", "type": "registry:ui" } ], "registryDependencies": [ "use-hydrated" ] }, { "name": "dialog", "type": "registry:ui", "title": "Dialog", "description": "A modal with a focus trap, Escape to close, and focus returned on exit.", "category": "Overlays", "tier": "lg", "registryDependencies": [ "use-focus-trap", "cn", "use-locale", "portal" ], "files": [ { "path": "registry/gear5/ui/dialog.tsx", "type": "registry:ui" } ] }, { "name": "drawer", "type": "registry:ui", "title": "Drawer", "description": "A modal panel anchored to a screen edge, using logical start/end sides.", "category": "Overlays", "tier": "lg", "registryDependencies": [ "use-focus-trap", "cn", "use-locale", "portal" ], "files": [ { "path": "registry/gear5/ui/drawer.tsx", "type": "registry:ui" } ] }, { "name": "toast", "type": "registry:ui", "title": "ToastProvider / useToast", "description": "A toast queue with correctly-timed live regions.", "category": "Feedback & status", "tier": "lg", "registryDependencies": [ "cn", "portal" ], "files": [ { "path": "registry/gear5/ui/toast.tsx", "type": "registry:ui" } ] }, { "name": "popover", "type": "registry:ui", "title": "Popover", "description": "A disclosure panel that closes on outside click and Escape.", "category": "Overlays", "tier": "md", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/popover.tsx", "type": "registry:ui" } ] }, { "name": "menu", "type": "registry:ui", "title": "Menu", "description": "A dropdown menu following the WAI-ARIA Menu Button pattern.", "category": "Overlays", "tier": "md", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/menu.tsx", "type": "registry:ui" } ] }, { "name": "theme-toggle", "type": "registry:ui", "title": "ThemeToggle", "description": "A light/dark/system toggle that persists its choice.", "category": "Accessibility & preferences", "tier": "sm", "registryDependencies": [ "cn", "use-stored-value" ], "files": [ { "path": "registry/gear5/ui/theme-toggle.tsx", "type": "registry:ui" } ] }, { "name": "locale-switcher", "type": "registry:ui", "title": "LocaleSwitcher", "description": "A native, per-option lang-tagged language switcher.", "category": "Internationalisation", "tier": "sm", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/locale-switcher.tsx", "type": "registry:ui" } ] }, { "name": "back-to-top", "type": "registry:ui", "title": "BackToTop", "description": "Appears after scrolling a screenful; honours reduced motion.", "category": "Navigation", "tier": "sm", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/back-to-top.tsx", "type": "registry:ui" } ] }, { "name": "scroll-progress", "type": "registry:ui", "title": "ScrollProgress", "description": "A reading-progress bar with a real accessible value.", "category": "Navigation", "tier": "sm", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/scroll-progress.tsx", "type": "registry:ui" } ] }, { "name": "timeline", "type": "registry:ui", "title": "Timeline", "description": "A vertical event sequence marked up as a real ordered list.", "category": "Data display", "tier": "sm", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/timeline.tsx", "type": "registry:ui" } ] }, { "name": "stat-card", "type": "registry:ui", "title": "StatCard", "description": "A single KPI figure with an optional trend line.", "category": "Data display", "tier": "sm", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/stat-card.tsx", "type": "registry:ui" } ] }, { "name": "search-field", "type": "registry:ui", "title": "SearchField", "description": "A search input with a clear button that returns focus correctly.", "category": "Forms & input", "tier": "sm", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/search-field.tsx", "type": "registry:ui" } ] }, { "name": "tag-input", "type": "registry:ui", "title": "TagInput", "description": "A free-text tag list that announces additions and removals.", "category": "Forms & input", "tier": "md", "registryDependencies": [ "announce", "cn", "chip" ], "files": [ { "path": "registry/gear5/ui/tag-input.tsx", "type": "registry:ui" } ] }, { "name": "password-field", "type": "registry:ui", "title": "PasswordField", "description": "A password field with an accessible visibility toggle and strength meter.", "category": "Forms & input", "tier": "md", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/password-field.tsx", "type": "registry:ui" } ] }, { "name": "otp-input", "type": "registry:ui", "title": "OtpInput", "description": "One-time-code entry wired for platform SMS autofill.", "category": "Forms & input", "tier": "md", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/otp-input.tsx", "type": "registry:ui" } ] }, { "name": "number-field", "type": "registry:ui", "title": "NumberField", "description": "A numeric field with increment/decrement buttons for motor-impaired users.", "category": "Forms & input", "tier": "md", "registryDependencies": [ "cn", "use-locale" ], "files": [ { "path": "registry/gear5/ui/number-field.tsx", "type": "registry:ui" } ] }, { "name": "honeypot-field", "type": "registry:ui", "title": "HoneypotField", "description": "A bot trap invisible to real users without trapping keyboard or screen reader users.", "category": "Forms & input", "tier": "sm", "registryDependencies": [ "visually-hidden" ], "files": [ { "path": "registry/gear5/ui/honeypot-field.tsx", "type": "registry:ui" } ] }, { "name": "consent-banner", "type": "registry:ui", "title": "ConsentBanner", "description": "A cookie banner where decline is exactly as easy to press as accept.", "category": "Accessibility & preferences", "tier": "md", "registryDependencies": [ "cn", "use-stored-value" ], "files": [ { "path": "registry/gear5/ui/consent-banner.tsx", "type": "registry:ui" } ] }, { "name": "reduced-motion-toggle", "type": "registry:ui", "title": "ReducedMotionToggle", "description": "An in-page opt-in to reduced motion, for people who never touch OS settings.", "category": "Accessibility & preferences", "tier": "sm", "registryDependencies": [ "switch", "use-stored-value" ], "files": [ { "path": "registry/gear5/ui/reduced-motion-toggle.tsx", "type": "registry:ui" } ] }, { "name": "data-saver-toggle", "type": "registry:ui", "title": "DataSaverToggle", "description": "A manual override for the library's constrained-connection behaviour.", "category": "Accessibility & preferences", "tier": "sm", "registryDependencies": [ "switch", "use-stored-value" ], "files": [ { "path": "registry/gear5/ui/data-saver-toggle.tsx", "type": "registry:ui" } ] }, { "name": "accessibility-menu", "type": "registry:ui", "title": "AccessibilityMenu", "description": "One panel for larger text and higher contrast.", "category": "Accessibility & preferences", "tier": "md", "registryDependencies": [ "popover", "switch", "use-stored-value" ], "files": [ { "path": "registry/gear5/ui/accessibility-menu.tsx", "type": "registry:ui" } ] }, { "name": "table-of-contents", "type": "registry:ui", "title": "TableOfContents", "description": "A jump-list that tracks the visible heading via IntersectionObserver.", "category": "Navigation", "tier": "sm", "registryDependencies": [ "sanitize", "cn" ], "files": [ { "path": "registry/gear5/ui/table-of-contents.tsx", "type": "registry:ui" } ] }, { "name": "code-block", "type": "registry:ui", "title": "CodeBlock", "description": "A code sample, always left-to-right regardless of page direction, with copy.", "category": "Data display", "tier": "md", "registryDependencies": [ "copy-button", "cn" ], "files": [ { "path": "registry/gear5/ui/code-block.tsx", "type": "registry:ui" } ] }, { "name": "quote-block", "type": "registry:ui", "title": "QuoteBlock", "description": "A real blockquote/cite pair, not a styled div.", "category": "Data display", "tier": "sm", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/quote-block.tsx", "type": "registry:ui" } ] }, { "name": "select", "type": "registry:ui", "title": "Select", "description": "A native select — fully accessible, in every language, at zero extra bytes.", "category": "Forms & input", "tier": "sm", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/select.tsx", "type": "registry:ui" } ] }, { "name": "virtual-list", "type": "registry:ui", "title": "VirtualList", "description": "Renders only visible rows plus overscan, for smooth scrolling on low-end devices.", "category": "Data display", "tier": "md", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/virtual-list.tsx", "type": "registry:ui" } ] }, { "name": "table", "type": "registry:ui", "title": "Table", "description": "A real, sortable table screen readers can navigate by row and column.", "category": "Data display", "tier": "md", "registryDependencies": [ "cn", "use-locale" ], "files": [ { "path": "registry/gear5/ui/table.tsx", "type": "registry:ui" } ] }, { "name": "keyboard-shortcuts-help", "type": "registry:ui", "title": "KeyboardShortcutsHelp", "description": "A shortcut reference dialog inheriting the focus trap every overlay gets.", "category": "Navigation", "tier": "md", "registryDependencies": [ "dialog", "kbd" ], "files": [ { "path": "registry/gear5/ui/keyboard-shortcuts-help.tsx", "type": "registry:ui" } ] }, { "name": "command-palette", "type": "registry:ui", "title": "CommandPalette", "description": "A keyboard-first fuzzy launcher following the ARIA combobox pattern.", "category": "Navigation", "tier": "lg", "registryDependencies": [ "use-focus-trap", "cn", "portal" ], "files": [ { "path": "registry/gear5/ui/command-palette.tsx", "type": "registry:ui" } ] }, { "name": "file-upload", "type": "registry:ui", "title": "FileUpload", "description": "A drag-and-drop zone that is a real keyboard-activatable button first.", "category": "Forms & input", "tier": "md", "registryDependencies": [ "announce", "cn" ], "files": [ { "path": "registry/gear5/ui/file-upload.tsx", "type": "registry:ui" } ] }, { "name": "infinite-scroll", "type": "registry:ui", "title": "InfiniteScroll", "description": "Loads more content near the viewport, and refuses to on constrained connections.", "category": "Data display", "tier": "md", "registryDependencies": [ "use-network", "spinner" ], "files": [ { "path": "registry/gear5/ui/infinite-scroll.tsx", "type": "registry:ui" } ] }, { "name": "lazy-mount", "type": "registry:ui", "title": "LazyMount", "description": "Defers mounting expensive children until visible, sooner on good connections.", "category": "Media & layout", "tier": "sm", "registryDependencies": [ "use-network" ], "files": [ { "path": "registry/gear5/ui/lazy-mount.tsx", "type": "registry:ui" } ] }, { "name": "context-menu", "type": "registry:ui", "title": "ContextMenu", "description": "A right-click menu also reachable via the keyboard Menu key.", "category": "Overlays", "tier": "md", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/context-menu.tsx", "type": "registry:ui" } ] }, { "name": "navbar", "type": "registry:ui", "title": "Navbar", "description": "A labelled nav landmark with the current page marked aria-current.", "category": "Navigation", "tier": "sm", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/navbar.tsx", "type": "registry:ui" } ] }, { "name": "footer", "type": "registry:ui", "title": "Footer", "description": "A simple site footer with locale-aware link list.", "category": "Navigation", "tier": "sm", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/footer.tsx", "type": "registry:ui" } ] }, { "name": "sidebar", "type": "registry:ui", "title": "Sidebar", "description": "A landmark navigation column with a logical-side active indicator.", "category": "Navigation", "tier": "sm", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/sidebar.tsx", "type": "registry:ui" } ] }, { "name": "directional-icon", "type": "registry:ui", "title": "DirectionalIcon", "description": "Mirrors a directional icon (arrows, chevrons) under RTL.", "category": "Internationalisation", "tier": "xs", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/directional-icon.tsx", "type": "registry:ui" } ] }, { "name": "masonry-grid", "type": "registry:ui", "title": "MasonryGrid", "description": "A zero-JS masonry layout via CSS columns.", "category": "Data display", "tier": "xs", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/masonry-grid.tsx", "type": "registry:ui" } ] }, { "name": "calendar", "type": "registry:ui", "title": "Calendar", "description": "A month grid in the reader's own calendar system and week start.", "category": "Forms & input", "tier": "lg", "registryDependencies": [ "locale", "use-locale", "cn" ], "files": [ { "path": "registry/gear5/ui/calendar.tsx", "type": "registry:ui" } ] }, { "name": "time-field", "type": "registry:ui", "title": "TimeField", "description": "A native time input matching the platform's own 12/24-hour convention.", "category": "Forms & input", "tier": "md", "registryDependencies": [ "use-locale" ], "files": [ { "path": "registry/gear5/ui/time-field.tsx", "type": "registry:ui" } ] }, { "name": "combobox", "type": "registry:ui", "title": "Combobox", "description": "A searchable single-select following the ARIA combobox pattern.", "category": "Forms & input", "tier": "md", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/combobox.tsx", "type": "registry:ui" } ] }, { "name": "multi-select", "type": "registry:ui", "title": "MultiSelect", "description": "A real multi-select control rendered as removable chips plus toggle buttons.", "category": "Forms & input", "tier": "md", "registryDependencies": [ "cn", "chip" ], "files": [ { "path": "registry/gear5/ui/multi-select.tsx", "type": "registry:ui" } ] }, { "name": "disclosure", "type": "registry:ui", "title": "Disclosure", "description": "A single collapsible section.", "category": "Data display", "tier": "sm", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/disclosure.tsx", "type": "registry:ui" } ] }, { "name": "print-button", "type": "registry:ui", "title": "PrintButton", "description": "A button that prints the page.", "category": "Media & layout", "tier": "sm", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/print-button.tsx", "type": "registry:ui" } ] }, { "name": "countdown", "type": "registry:ui", "title": "Countdown", "description": "A live countdown with locale-correct digits.", "category": "Feedback & status", "tier": "sm", "registryDependencies": [ "use-locale" ], "files": [ { "path": "registry/gear5/ui/countdown.tsx", "type": "registry:ui" } ] }, { "name": "unit-text", "type": "registry:ui", "title": "UnitText", "description": "Locale-correct unit formatting (distance, data, temperature) via Intl.NumberFormat.", "category": "Internationalisation", "tier": "md", "registryDependencies": [ "format", "use-locale" ], "files": [ { "path": "registry/gear5/ui/unit-text.tsx", "type": "registry:ui" } ] }, { "name": "live-region", "type": "registry:ui", "title": "LiveRegion", "description": "A declarative live region for components that track their own message as state.", "category": "Feedback & status", "tier": "sm", "registryDependencies": [ "visually-hidden" ], "files": [ { "path": "registry/gear5/ui/live-region.tsx", "type": "registry:ui" } ] }, { "name": "skip-link", "type": "registry:ui", "title": "SkipLink", "description": "The page's first focusable element, visible only once focused.", "category": "Navigation", "tier": "sm", "registryDependencies": [ "sanitize", "cn" ], "files": [ { "path": "registry/gear5/ui/skip-link.tsx", "type": "registry:ui" } ] }, { "name": "use-stored-value", "type": "registry:hook", "title": "useStoredValue", "description": "A localStorage-backed string via useSyncExternalStore, with no wasted render correcting a server-rendered default.", "tier": "sm", "files": [ { "path": "registry/gear5/lib/use-stored-value.ts", "type": "registry:hook" } ] }, { "name": "use-hydrated", "type": "registry:hook", "title": "useHydrated", "description": "True once the client has taken over from server-rendered markup — the useSyncExternalStore replacement for the useEffect 'mounted' idiom.", "tier": "xs", "files": [ { "path": "registry/gear5/lib/use-hydrated.ts", "type": "registry:hook" } ] }, { "name": "compact-number", "type": "registry:ui", "title": "CompactNumber", "description": "A large number shortened the way the reader's locale shortens it — 1.2K, 1.2万, 12 lakh.", "category": "Internationalisation", "tier": "md", "registryDependencies": [ "format", "use-locale" ], "files": [ { "path": "registry/gear5/ui/compact-number.tsx", "type": "registry:ui" } ] }, { "name": "bytes-text", "type": "registry:ui", "title": "BytesText", "description": "A file size with a translated, locale-positioned unit, in decimal or binary.", "category": "Internationalisation", "tier": "md", "registryDependencies": [ "format", "use-locale" ], "files": [ { "path": "registry/gear5/ui/bytes-text.tsx", "type": "registry:ui" } ] }, { "name": "ordinal-text", "type": "registry:ui", "title": "OrdinalText", "description": "An ordinal via Intl.PluralRules — correct at 11th, and silent where suffixes do not apply.", "category": "Internationalisation", "tier": "sm", "registryDependencies": [ "use-locale" ], "files": [ { "path": "registry/gear5/ui/ordinal-text.tsx", "type": "registry:ui" } ] }, { "name": "read-time", "type": "registry:ui", "title": "ReadTime", "description": "Estimated reading time, in the locale's own digits and word order.", "category": "Internationalisation", "tier": "sm", "registryDependencies": [ "format", "use-locale" ], "files": [ { "path": "registry/gear5/ui/read-time.tsx", "type": "registry:ui" } ] }, { "name": "name-fields", "type": "registry:ui", "title": "NameFields", "description": "Given and family name inputs, ordered the way the reader's locale orders them.", "category": "Forms & input", "tier": "md", "registryDependencies": [ "cn", "field", "use-locale" ], "files": [ { "path": "registry/gear5/ui/name-fields.tsx", "type": "registry:ui" } ] }, { "name": "address-fields", "type": "registry:ui", "title": "AddressFields", "description": "An address form whose field order and required fields follow the country being addressed.", "category": "Forms & input", "tier": "md", "registryDependencies": [ "cn", "field", "use-locale" ], "files": [ { "path": "registry/gear5/ui/address-fields.tsx", "type": "registry:ui" } ] }, { "name": "segmented-control", "type": "registry:ui", "title": "SegmentedControl", "description": "A real radiogroup with roving tabindex and direction-aware arrow keys.", "category": "Forms & input", "tier": "md", "registryDependencies": [ "cn", "use-locale" ], "files": [ { "path": "registry/gear5/ui/segmented-control.tsx", "type": "registry:ui" } ] }, { "name": "save-status", "type": "registry:ui", "title": "SaveStatus", "description": "The autosave indicator, announced — and distinguishing 'failed' from 'offline'.", "category": "Feedback & status", "tier": "md", "registryDependencies": [ "cn", "announce", "use-locale", "use-network" ], "files": [ { "path": "registry/gear5/ui/save-status.tsx", "type": "registry:ui" } ] }, { "name": "retry-button", "type": "registry:ui", "title": "RetryButton", "description": "A retry control with visible exponential backoff that stays disabled while offline.", "category": "Feedback & status", "tier": "md", "registryDependencies": [ "cn", "announce", "use-locale", "use-network" ], "files": [ { "path": "registry/gear5/ui/retry-button.tsx", "type": "registry:ui" } ] }, { "name": "text-size-control", "type": "registry:ui", "title": "TextSizeControl", "description": "In-page text scaling for low-vision readers, persisted and announced.", "category": "Accessibility & preferences", "tier": "lg", "registryDependencies": [ "cn", "announce", "segmented-control", "use-stored-value" ], "files": [ { "path": "registry/gear5/ui/text-size-control.tsx", "type": "registry:ui" } ] }, { "name": "tree-view", "type": "registry:ui", "title": "TreeView", "description": "A disclosure tree following the ARIA tree pattern, with one tab stop and RTL-aware arrows.", "category": "Data display", "tier": "lg", "registryDependencies": [ "cn", "use-locale" ], "files": [ { "path": "registry/gear5/ui/tree-view.tsx", "type": "registry:ui" } ] }, { "name": "bidi-text", "type": "registry:ui", "title": "BidiText", "description": "Isolates user-controlled text so a mixed-direction sentence does not reorder around it.", "category": "Internationalisation", "tier": "xs", "registryDependencies": [], "files": [ { "path": "registry/gear5/ui/bidi-text.tsx", "type": "registry:ui" } ] }, { "name": "truncate-text", "type": "registry:ui", "title": "TruncateText", "description": "Truncation that counts user-perceived characters, so emoji and Devanagari clusters are never split.", "category": "Internationalisation", "tier": "sm", "registryDependencies": [ "use-locale" ], "files": [ { "path": "registry/gear5/ui/truncate-text.tsx", "type": "registry:ui" } ] }, { "name": "date-range-text", "type": "registry:ui", "title": "DateRangeText", "description": "A date range formatted as one range, collapsing shared parts in the locale's own calendar.", "category": "Internationalisation", "tier": "sm", "registryDependencies": [ "locale", "use-locale" ], "files": [ { "path": "registry/gear5/ui/date-range-text.tsx", "type": "registry:ui" } ] }, { "name": "character-counter", "type": "registry:ui", "title": "CharacterCounter", "description": "A character counter that counts graphemes, so one emoji costs one, not eleven.", "category": "Forms & input", "tier": "md", "registryDependencies": [ "cn", "format", "use-locale" ], "files": [ { "path": "registry/gear5/ui/character-counter.tsx", "type": "registry:ui" } ] }, { "name": "currency-field", "type": "registry:ui", "title": "CurrencyField", "description": "A money input that parses the locale's own separators, so \"1.234,56\" means what a German user meant.", "category": "Forms & input", "tier": "lg", "registryDependencies": [ "cn", "format", "use-locale" ], "files": [ { "path": "registry/gear5/ui/currency-field.tsx", "type": "registry:ui" } ] }, { "name": "unit-field", "type": "registry:ui", "title": "UnitField", "description": "A measurement input shown in the reader's units and always stored in metric.", "category": "Forms & input", "tier": "md", "registryDependencies": [ "cn", "use-locale" ], "files": [ { "path": "registry/gear5/ui/unit-field.tsx", "type": "registry:ui" } ] }, { "name": "timezone-select", "type": "registry:ui", "title": "TimezoneSelect", "description": "A timezone picker labelled in the reader's language and ordered by current offset.", "category": "Forms & input", "tier": "md", "registryDependencies": [ "cn", "use-locale" ], "files": [ { "path": "registry/gear5/ui/timezone-select.tsx", "type": "registry:ui" } ] }, { "name": "heading-level", "type": "registry:ui", "title": "Heading", "description": "Headings that know their own level, so a reusable component never breaks the page outline.", "category": "Accessibility & preferences", "tier": "sm", "registryDependencies": [ "cn" ], "files": [ { "path": "registry/gear5/ui/heading-level.tsx", "type": "registry:ui" } ] }, { "name": "landmark-nav", "type": "registry:ui", "title": "LandmarkNav", "description": "Skip links for every landmark, giving sighted keyboard users the rotor screen readers already have.", "category": "Navigation", "tier": "md", "registryDependencies": [ "cn", "use-locale" ], "files": [ { "path": "registry/gear5/ui/landmark-nav.tsx", "type": "registry:ui" } ] }, { "name": "error-summary", "type": "registry:ui", "title": "ErrorSummary", "description": "The focusable list of what went wrong, at the top of a form — usable with any form library.", "category": "Forms & input", "tier": "md", "registryDependencies": [ "cn", "use-locale" ], "files": [ { "path": "registry/gear5/ui/error-summary.tsx", "type": "registry:ui" } ] }, { "name": "sortable-table", "type": "registry:ui", "title": "SortableTable", "description": "A table that sorts text with Intl.Collator, so accents and non-Latin scripts file correctly.", "category": "Data display", "tier": "lg", "registryDependencies": [ "cn", "announce", "use-locale" ], "files": [ { "path": "registry/gear5/ui/sortable-table.tsx", "type": "registry:ui" } ] }, { "name": "stale-data-notice", "type": "registry:ui", "title": "StaleDataNotice", "description": "Tells the reader how old the data is, and says it differently when offline explains why.", "category": "Feedback & status", "tier": "md", "registryDependencies": [ "cn", "format", "use-locale", "use-network", "use-hydrated" ], "files": [ { "path": "registry/gear5/ui/stale-data-notice.tsx", "type": "registry:ui" } ] }, { "name": "password-strength", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Forms & input", "title": "PasswordStrength", "description": "Visual password strength meter with labelled feedback.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/password-strength.tsx", "type": "registry:ui" } ] }, { "name": "phone-number-field", "registryDependencies": ["cn","use-locale"], "type": "registry:ui", "category": "Forms & input", "title": "PhoneNumberField", "description": "Phone input with country code selector and locale-aware formatting.", "tier": "md", "files": [ { "path": "registry/gear5/ui/phone-number-field.tsx", "type": "registry:ui" } ] }, { "name": "credit-card-field", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Forms & input", "title": "CreditCardField", "description": "Credit card number, expiry, and CVC inputs with auto-advance.", "tier": "md", "files": [ { "path": "registry/gear5/ui/credit-card-field.tsx", "type": "registry:ui" } ] }, { "name": "pin-input", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Forms & input", "title": "PinInput", "description": "Separate digit fields for PIN entry with auto-focus forwarding.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/pin-input.tsx", "type": "registry:ui" } ] }, { "name": "color-picker", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Forms & input", "title": "ColorPicker", "description": "HSL/RGB color picker with accessible contrast preview.", "tier": "md", "files": [ { "path": "registry/gear5/ui/color-picker.tsx", "type": "registry:ui" } ] }, { "name": "date-range-picker", "registryDependencies": ["cn","use-locale"], "type": "registry:ui", "category": "Forms & input", "title": "DateRangePicker", "description": "Dual-calendar date range selection with locale-aware formatting.", "tier": "lg", "files": [ { "path": "registry/gear5/ui/date-range-picker.tsx", "type": "registry:ui" } ] }, { "name": "country-picker", "registryDependencies": ["cn","use-locale"], "type": "registry:ui", "category": "Forms & input", "title": "CountryPicker", "description": "Searchable country selector with flag icons and locale names.", "tier": "lg", "files": [ { "path": "registry/gear5/ui/country-picker.tsx", "type": "registry:ui" } ] }, { "name": "signature-pad", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Forms & input", "title": "SignaturePad", "description": "Canvas-based signature capture with undo and clear.", "tier": "md", "files": [ { "path": "registry/gear5/ui/signature-pad.tsx", "type": "registry:ui" } ] }, { "name": "rating-input", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Forms & input", "title": "RatingInput", "description": "Editable star rating with keyboard support and live value.", "tier": "md", "files": [ { "path": "registry/gear5/ui/rating-input.tsx", "type": "registry:ui" } ] }, { "name": "slider-range", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Forms & input", "title": "SliderRange", "description": "Dual-thumb range slider with locale-formatted values.", "tier": "md", "files": [ { "path": "registry/gear5/ui/slider-range.tsx", "type": "registry:ui" } ] }, { "name": "file-size-upload", "registryDependencies": ["announce","cn","progress-bar"], "type": "registry:ui", "category": "Forms & input", "title": "FileSizeUpload", "description": "File upload with size limits and human-readable size display.", "tier": "md", "files": [ { "path": "registry/gear5/ui/file-size-upload.tsx", "type": "registry:ui" } ] }, { "name": "multi-step-form", "registryDependencies": ["announce","cn"], "type": "registry:ui", "category": "Forms & input", "title": "MultiStepForm", "description": "Wizard form with step validation, draft saving, and progress.", "tier": "lg", "files": [ { "path": "registry/gear5/ui/multi-step-form.tsx", "type": "registry:ui" } ] }, { "name": "json-editor", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Forms & input", "title": "JsonEditor", "description": "Syntax-highlighted JSON editor with validation feedback.", "tier": "md", "files": [ { "path": "registry/gear5/ui/json-editor.tsx", "type": "registry:ui" } ] }, { "name": "markdown-editor", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Forms & input", "title": "MarkdownEditor", "description": "Split-pane markdown editor with live preview.", "tier": "md", "files": [ { "path": "registry/gear5/ui/markdown-editor.tsx", "type": "registry:ui" } ] }, { "name": "tags-input", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Forms & input", "title": "TagsInput", "description": "Tag entry with autocomplete suggestions and duplicate prevention.", "tier": "md", "files": [ { "path": "registry/gear5/ui/tags-input.tsx", "type": "registry:ui" } ] }, { "name": "otp-timer", "registryDependencies": ["announce","cn"], "type": "registry:ui", "category": "Forms & input", "title": "OtpTimer", "description": "Countdown timer for OTP resend with accessible remaining time.", "tier": "md", "files": [ { "path": "registry/gear5/ui/otp-timer.tsx", "type": "registry:ui" } ] }, { "name": "search-autocomplete", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Forms & input", "title": "SearchAutocomplete", "description": "Search input with async autocomplete dropdown results.", "tier": "md", "files": [ { "path": "registry/gear5/ui/search-autocomplete.tsx", "type": "registry:ui" } ] }, { "name": "quantity-input", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Forms & input", "title": "QuantityInput", "description": "Numeric quantity with increment, decrement, and manual entry.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/quantity-input.tsx", "type": "registry:ui" } ] }, { "name": "toggle-group", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Forms & input", "title": "ToggleGroup", "description": "A group of toggle buttons with single or multi-select mode.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/toggle-group.tsx", "type": "registry:ui" } ] }, { "name": "code-input", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Forms & input", "title": "CodeInput", "description": "Monospace input for code snippets with tab indentation support.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/code-input.tsx", "type": "registry:ui" } ] }, { "name": "url-input", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Forms & input", "title": "UrlInput", "description": "URL input with protocol prefix and validation feedback.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/url-input.tsx", "type": "registry:ui" } ] }, { "name": "email-chips", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Forms & input", "title": "EmailChips", "description": "Email address entry rendered as removable chips with validation.", "tier": "md", "files": [ { "path": "registry/gear5/ui/email-chips.tsx", "type": "registry:ui" } ] }, { "name": "range-calendar", "registryDependencies": ["cn","use-locale"], "type": "registry:ui", "category": "Forms & input", "title": "RangeCalendar", "description": "Multi-month calendar for selecting date ranges.", "tier": "lg", "files": [ { "path": "registry/gear5/ui/range-calendar.tsx", "type": "registry:ui" } ] }, { "name": "time-range", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Forms & input", "title": "TimeRange", "description": "Start and end time selection with overlap prevention.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/time-range.tsx", "type": "registry:ui" } ] }, { "name": "currency-input", "registryDependencies": ["cn","use-locale"], "type": "registry:ui", "category": "Forms & input", "title": "CurrencyInput", "description": "Numeric input with currency symbol and locale formatting.", "tier": "md", "files": [ { "path": "registry/gear5/ui/currency-input.tsx", "type": "registry:ui" } ] }, { "name": "bottom-nav", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Navigation", "title": "BottomNav", "description": "Mobile bottom navigation bar with active indicator.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/bottom-nav.tsx", "type": "registry:ui" } ] }, { "name": "mega-menu", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Navigation", "title": "MegaMenu", "description": "Full-width dropdown menu with nested link sections.", "tier": "lg", "files": [ { "path": "registry/gear5/ui/mega-menu.tsx", "type": "registry:ui" } ] }, { "name": "tabs-vertical", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Navigation", "title": "TabsVertical", "description": "Vertical tab list with arrow-key navigation.", "tier": "md", "files": [ { "path": "registry/gear5/ui/tabs-vertical.tsx", "type": "registry:ui" } ] }, { "name": "tree-nav", "registryDependencies": ["cn","use-locale"], "type": "registry:ui", "category": "Navigation", "title": "TreeNav", "description": "Hierarchical navigation with expandable tree branches.", "tier": "md", "files": [ { "path": "registry/gear5/ui/tree-nav.tsx", "type": "registry:ui" } ] }, { "name": "filter-bar", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Navigation", "title": "FilterBar", "description": "Horizontal filter chips with active count and clear all.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/filter-bar.tsx", "type": "registry:ui" } ] }, { "name": "anchor-nav", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Navigation", "title": "AnchorNav", "description": "In-page anchor links with scroll-spy active state.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/anchor-nav.tsx", "type": "registry:ui" } ] }, { "name": "page-header", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Navigation", "title": "PageHeader", "description": "Page title with optional subtitle, breadcrumbs, and actions.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/page-header.tsx", "type": "registry:ui" } ] }, { "name": "app-shell", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Navigation", "title": "AppShell", "description": "Responsive app layout with sidebar, header, and main content areas.", "tier": "md", "files": [ { "path": "registry/gear5/ui/app-shell.tsx", "type": "registry:ui" } ] }, { "name": "drawer-nav", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Navigation", "title": "DrawerNav", "description": "Slide-out navigation drawer with focus trap and backdrop.", "tier": "lg", "files": [ { "path": "registry/gear5/ui/drawer-nav.tsx", "type": "registry:ui" } ] }, { "name": "command-bar", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Navigation", "title": "CommandBar", "description": "Persistent top bar with quick actions and search.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/command-bar.tsx", "type": "registry:ui" } ] }, { "name": "floating-nav", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Navigation", "title": "FloatingNav", "description": "Floating action navigation that appears on scroll.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/floating-nav.tsx", "type": "registry:ui" } ] }, { "name": "step-indicator", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Navigation", "title": "StepIndicator", "description": "Linear step progress with current, completed, and pending states.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/step-indicator.tsx", "type": "registry:ui" } ] }, { "name": "category-tabs", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Navigation", "title": "CategoryTabs", "description": "Scrollable category tabs with overflow indicators.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/category-tabs.tsx", "type": "registry:ui" } ] }, { "name": "data-grid", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Data display", "title": "DataGrid", "description": "Full-featured data grid with sorting, filtering, and pagination.", "tier": "lg", "files": [ { "path": "registry/gear5/ui/data-grid.tsx", "type": "registry:ui" } ] }, { "name": "kanban-board", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Data display", "title": "KanbanBoard", "description": "Drag-and-drop kanban board with accessible column management.", "tier": "lg", "files": [ { "path": "registry/gear5/ui/kanban-board.tsx", "type": "registry:ui" } ] }, { "name": "calendar-view", "registryDependencies": ["cn","use-locale"], "type": "registry:ui", "category": "Data display", "title": "CalendarView", "description": "Month, week, and day calendar views for event display.", "tier": "lg", "files": [ { "path": "registry/gear5/ui/calendar-view.tsx", "type": "registry:ui" } ] }, { "name": "timeline-advanced", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Data display", "title": "TimelineAdvanced", "description": "Interactive timeline with expandable events and filtering.", "tier": "md", "files": [ { "path": "registry/gear5/ui/timeline-advanced.tsx", "type": "registry:ui" } ] }, { "name": "org-chart", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Data display", "title": "OrgChart", "description": "Hierarchical organization chart with collapsible branches.", "tier": "md", "files": [ { "path": "registry/gear5/ui/org-chart.tsx", "type": "registry:ui" } ] }, { "name": "sparkline", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Data display", "title": "Sparkline", "description": "Inline mini chart for trend visualization.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/sparkline.tsx", "type": "registry:ui" } ] }, { "name": "metric-card", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Data display", "title": "MetricCard", "description": "KPI display card with value, label, and trend indicator.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/metric-card.tsx", "type": "registry:ui" } ] }, { "name": "comparison-table", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Data display", "title": "ComparisonTable", "description": "Side-by-side feature comparison with highlighted differences.", "tier": "md", "files": [ { "path": "registry/gear5/ui/comparison-table.tsx", "type": "registry:ui" } ] }, { "name": "faq-accordion", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Data display", "title": "FaqAccordion", "description": "Expandable FAQ list with search and category filtering.", "tier": "md", "files": [ { "path": "registry/gear5/ui/faq-accordion.tsx", "type": "registry:ui" } ] }, { "name": "changelog-view", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Data display", "title": "ChangelogView", "description": "Versioned changelog with date grouping and category tags.", "tier": "md", "files": [ { "path": "registry/gear5/ui/changelog-view.tsx", "type": "registry:ui" } ] }, { "name": "activity-feed", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Data display", "title": "ActivityFeed", "description": "Chronological activity stream with relative timestamps.", "tier": "md", "files": [ { "path": "registry/gear5/ui/activity-feed.tsx", "type": "registry:ui" } ] }, { "name": "leaderboard", "registryDependencies": ["cn"], "type": "registry:ui", "category": "Data display", "title": "Leaderboard", "description": "Ranked list with position, score, and avatar display.", "tier": "md", "files": [ { "path": "registry/gear5/ui/leaderboard.tsx", "type": "registry:ui" } ] }, { "name": "snackbar", "type": "registry:ui", "category": "Feedback & status", "title": "Snackbar", "description": "Temporary bottom notification with action button and auto-dismiss.", "tier": "md", "files": [ { "path": "registry/gear5/ui/snackbar.tsx", "type": "registry:ui" } ] }, { "name": "inline-alert", "type": "registry:ui", "category": "Feedback & status", "title": "InlineAlert", "description": "Contextual message embedded within content flow.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/inline-alert.tsx", "type": "registry:ui" } ] }, { "name": "banner", "type": "registry:ui", "category": "Feedback & status", "title": "Banner", "description": "Site-wide announcement banner with dismiss and persist.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/banner.tsx", "type": "registry:ui" } ] }, { "name": "loading-skeleton", "type": "registry:ui", "category": "Feedback & status", "title": "LoadingSkeleton", "description": "Animated placeholder shapes for content loading states.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/loading-skeleton.tsx", "type": "registry:ui" } ] }, { "name": "progress-circular", "type": "registry:ui", "category": "Feedback & status", "title": "ProgressCircular", "description": "Circular progress indicator with accessible value.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/progress-circular.tsx", "type": "registry:ui" } ] }, { "name": "status-badge", "type": "registry:ui", "category": "Feedback & status", "title": "StatusBadge", "description": "Small coloured status indicator with text label.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/status-badge.tsx", "type": "registry:ui" } ] }, { "name": "online-indicator", "type": "registry:ui", "category": "Feedback & status", "title": "OnlineIndicator", "description": "Pulsing dot showing online presence status.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/online-indicator.tsx", "type": "registry:ui" } ] }, { "name": "typing-indicator", "type": "registry:ui", "category": "Feedback & status", "title": "TypingIndicator", "description": "Animated dots indicating someone is typing.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/typing-indicator.tsx", "type": "registry:ui" } ] }, { "name": "notification-bell", "type": "registry:ui", "category": "Feedback & status", "title": "NotificationBell", "description": "Bell icon with unread count badge and dropdown panel.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/notification-bell.tsx", "type": "registry:ui" } ] }, { "name": "unread-dot", "type": "registry:ui", "category": "Feedback & status", "title": "UnreadDot", "description": "Small dot indicator for unread items.", "tier": "xs", "files": [ { "path": "registry/gear5/ui/unread-dot.tsx", "type": "registry:ui" } ] }, { "name": "error-page", "type": "registry:ui", "category": "Feedback & status", "title": "ErrorPage", "description": "Full-page error display with retry action and home link.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/error-page.tsx", "type": "registry:ui" } ] }, { "name": "maintenance-banner", "type": "registry:ui", "category": "Feedback & status", "title": "MaintenanceBanner", "description": "Scheduled maintenance notice with countdown timer.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/maintenance-banner.tsx", "type": "registry:ui" } ] }, { "name": "rate-limit-notice", "type": "registry:ui", "category": "Feedback & status", "title": "RateLimitNotice", "description": "Warning when API rate limit is approaching or exceeded.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/rate-limit-notice.tsx", "type": "registry:ui" } ] }, { "name": "cooldown-timer", "type": "registry:ui", "category": "Feedback & status", "title": "CooldownTimer", "description": "Countdown until an action becomes available again.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/cooldown-timer.tsx", "type": "registry:ui" } ] }, { "name": "audio-player", "type": "registry:ui", "category": "Media & layout", "title": "AudioPlayer", "description": "Audio playback controls with waveform visualization.", "tier": "lg", "files": [ { "path": "registry/gear5/ui/audio-player.tsx", "type": "registry:ui" } ] }, { "name": "video-player", "type": "registry:ui", "category": "Media & layout", "title": "VideoPlayer", "description": "Video player with custom controls and subtitle support.", "tier": "lg", "files": [ { "path": "registry/gear5/ui/video-player.tsx", "type": "registry:ui" } ] }, { "name": "image-gallery", "type": "registry:ui", "category": "Media & layout", "title": "ImageGallery", "description": "Lightbox gallery with keyboard navigation and zoom.", "tier": "lg", "files": [ { "path": "registry/gear5/ui/image-gallery.tsx", "type": "registry:ui" } ] }, { "name": "carousel", "type": "registry:ui", "category": "Media & layout", "title": "Carousel", "description": "Swipeable content carousel with auto-play and indicators.", "tier": "lg", "files": [ { "path": "registry/gear5/ui/carousel.tsx", "type": "registry:ui" } ] }, { "name": "before-after", "type": "registry:ui", "category": "Media & layout", "title": "BeforeAfter", "description": "Draggable slider comparing two images side by side.", "tier": "md", "files": [ { "path": "registry/gear5/ui/before-after.tsx", "type": "registry:ui" } ] }, { "name": "qr-code", "type": "registry:ui", "category": "Media & layout", "title": "QrCode", "description": "QR code generator with download and copy options.", "tier": "md", "files": [ { "path": "registry/gear5/ui/qr-code.tsx", "type": "registry:ui" } ] }, { "name": "icon-grid", "type": "registry:ui", "category": "Media & layout", "title": "IconGrid", "description": "Selectable icon grid with search and category filtering.", "tier": "md", "files": [ { "path": "registry/gear5/ui/icon-grid.tsx", "type": "registry:ui" } ] }, { "name": "emoji-picker", "type": "registry:ui", "category": "Media & layout", "title": "EmojiPicker", "description": "Categorised emoji picker with search and skin tone selection.", "tier": "lg", "files": [ { "path": "registry/gear5/ui/emoji-picker.tsx", "type": "registry:ui" } ] }, { "name": "color-swatch", "type": "registry:ui", "category": "Media & layout", "title": "ColorSwatch", "description": "Selectable colour swatch with accessible name and value.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/color-swatch.tsx", "type": "registry:ui" } ] }, { "name": "font-preview", "type": "registry:ui", "category": "Media & layout", "title": "FontPreview", "description": "Typeface preview with size and weight controls.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/font-preview.tsx", "type": "registry:ui" } ] }, { "name": "video-embed", "type": "registry:ui", "category": "Media & layout", "title": "VideoEmbed", "description": "Lazy-loaded video embed with privacy-friendly placeholder.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/video-embed.tsx", "type": "registry:ui" } ] }, { "name": "responsive-grid", "type": "registry:ui", "category": "Media & layout", "title": "ResponsiveGrid", "description": "CSS grid that adapts columns based on container width.", "tier": "xs", "files": [ { "path": "registry/gear5/ui/responsive-grid.tsx", "type": "registry:ui" } ] }, { "name": "masonry-layout", "type": "registry:ui", "category": "Media & layout", "title": "MasonryLayout", "description": "Variable-height masonry grid with load-more support.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/masonry-layout.tsx", "type": "registry:ui" } ] }, { "name": "stack-layout", "type": "registry:ui", "category": "Media & layout", "title": "StackLayout", "description": "Vertical or horizontal stacking with consistent spacing.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/stack-layout.tsx", "type": "registry:ui" } ] }, { "name": "aspect-ratio", "type": "registry:ui", "category": "Media & layout", "title": "AspectRatio", "description": "Container that maintains a fixed aspect ratio.", "tier": "xs", "files": [ { "path": "registry/gear5/ui/aspect-ratio.tsx", "type": "registry:ui" } ] }, { "name": "clamp-text", "type": "registry:ui", "category": "Media & layout", "title": "ClampText", "description": "Multi-line text truncation with expand toggle.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/clamp-text.tsx", "type": "registry:ui" } ] }, { "name": "sticky-header", "type": "registry:ui", "category": "Navigation", "title": "StickyHeader", "description": "Header that pins to top on scroll with shrink animation.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/sticky-header.tsx", "type": "registry:ui" } ] }, { "name": "scroll-spy", "type": "registry:ui", "category": "Navigation", "title": "ScrollSpy", "description": "Tracks visible section and highlights corresponding nav link.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/scroll-spy.tsx", "type": "registry:ui" } ] }, { "name": "infinite-list", "type": "registry:ui", "category": "Media & layout", "title": "InfiniteList", "description": "Auto-loading list that fetches more items near the bottom.", "tier": "md", "files": [ { "path": "registry/gear5/ui/infinite-list.tsx", "type": "registry:ui" } ] }, { "name": "virtual-grid", "type": "registry:ui", "category": "Media & layout", "title": "VirtualGrid", "description": "Windowed grid for rendering thousands of items efficiently.", "tier": "md", "files": [ { "path": "registry/gear5/ui/virtual-grid.tsx", "type": "registry:ui" } ] }, { "name": "responsive-container", "type": "registry:ui", "category": "Media & layout", "title": "ResponsiveContainer", "description": "Container that adapts layout based on breakpoint.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/responsive-container.tsx", "type": "registry:ui" } ] }, { "name": "card-group", "type": "registry:ui", "category": "Media & layout", "title": "CardGroup", "description": "Grid of cards with consistent spacing and alignment.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/card-group.tsx", "type": "registry:ui" } ] }, { "name": "split-pane", "type": "registry:ui", "category": "Media & layout", "title": "SplitPane", "description": "Resizable two-panel layout with draggable divider.", "tier": "md", "files": [ { "path": "registry/gear5/ui/split-pane.tsx", "type": "registry:ui" } ] }, { "name": "accordion-nested", "type": "registry:ui", "category": "Media & layout", "title": "AccordionNested", "description": "Accordion supporting multiple levels of nested sections.", "tier": "md", "files": [ { "path": "registry/gear5/ui/accordion-nested.tsx", "type": "registry:ui" } ] }, { "name": "collapsible-panel", "type": "registry:ui", "category": "Media & layout", "title": "CollapsiblePanel", "description": "Single collapsible content panel with smooth animation.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/collapsible-panel.tsx", "type": "registry:ui" } ] }, { "name": "scroll-to-top", "type": "registry:ui", "category": "Navigation", "title": "ScrollToTop", "description": "Button that scrolls to page top with reduced motion support.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/scroll-to-top.tsx", "type": "registry:ui" } ] }, { "name": "aspect-card", "type": "registry:ui", "category": "Media & layout", "title": "AspectCard", "description": "Card that maintains a fixed aspect ratio for media content.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/aspect-card.tsx", "type": "registry:ui" } ] }, { "name": "stat-grid", "type": "registry:ui", "category": "Data display", "title": "StatGrid", "description": "Grid layout for displaying multiple KPI metrics.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/stat-grid.tsx", "type": "registry:ui" } ] }, { "name": "featured-card", "type": "registry:ui", "category": "Media & layout", "title": "FeaturedCard", "description": "Highlighted card with image, title, and description.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/featured-card.tsx", "type": "registry:ui" } ] }, { "name": "pricing-card", "type": "registry:ui", "category": "Media & layout", "title": "PricingCard", "description": "Pricing tier display with features list and CTA button.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/pricing-card.tsx", "type": "registry:ui" } ] }, { "name": "testimonial-card", "type": "registry:ui", "category": "Media & layout", "title": "TestimonialCard", "description": "Customer quote with avatar, name, and role.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/testimonial-card.tsx", "type": "registry:ui" } ] }, { "name": "scorecard", "type": "registry:ui", "category": "Data display", "title": "Scorecard", "description": "Game or assessment score display with breakdown.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/scorecard.tsx", "type": "registry:ui" } ] }, { "name": "hero-section", "type": "registry:ui", "category": "Media & layout", "title": "HeroSection", "description": "Full-width hero with heading, subtext, and call-to-action.", "tier": "md", "files": [ { "path": "registry/gear5/ui/hero-section.tsx", "type": "registry:ui" } ] }, { "name": "cta-band", "type": "registry:ui", "category": "Media & layout", "title": "CtaBand", "description": "Call-to-action banner with heading and action button.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/cta-band.tsx", "type": "registry:ui" } ] }, { "name": "divider-section", "type": "registry:ui", "category": "Media & layout", "title": "DividerSection", "description": "Content section with decorative divider between segments.", "tier": "sm", "files": [ { "path": "registry/gear5/ui/divider-section.tsx", "type": "registry:ui" } ] }, { "name": "container-narrow", "type": "registry:ui", "category": "Media & layout", "title": "ContainerNarrow", "description": "Narrow-centred content column for reading-focused layouts.", "tier": "xs", "files": [ { "path": "registry/gear5/ui/container-narrow.tsx", "type": "registry:ui" } ] } ] }