Components
ShadCN owns the accessible source primitive. Thorbis owns the tokens, density, states, mobile behavior, recovery, and composition. The complete official directory is here, with adoption status stated plainly.
65 official components65 adopted · 0 specified
AdoptedThorbis wrapper and live specimen ship here.
SpecifiedThorbis contract exists; source adoption is still explicit work.
Accordion
Open@/components/ui/accordionA vertical set of headings that reveals bounded supporting content in place.
accordion- Use
- Use when several peer explanations are optional and their headings remain useful while collapsed.
- Avoid
- Do not hide required instructions, errors, or the primary path behind a disclosure.
Alert
Open@/components/ui/alertPersistent inline feedback that explains a condition near the work it affects.
alertPayment needs review
The card authorization succeeded, but settlement is still pending.
- Use
- Use for durable information, caution, success, or failure that remains until the condition changes.
- Avoid
- Do not use as decoration, duplicate a field error, or make color carry the meaning.
Alert Dialog
Open@/components/ui/alert-dialogA blocking confirmation for a consequential action that requires an explicit choice.
alert-dialog- Use
- Use before destructive or irreversible commits when the consequence cannot be inferred from the trigger.
- Avoid
- Do not interrupt routine, reversible work or replace a full workflow route.
Aspect Ratio
Open@/components/ui/aspect-ratioA reserved media frame that prevents layout shift before content arrives.
aspect-ratio- Use
- Use for images, maps, video, and previews whose geometry must remain stable while loading.
- Avoid
- Do not crop evidence or source material when the full frame is required.
Attachment
Open@/components/ui/attachmentA file row that keeps identity, progress, state, and actions in one stable footprint.
attachmentwater-heater-label.jpg
2.4 MB · uploaded just now
- Use
- Use when a record accepts uploads or exposes durable files with clear status and recovery.
- Avoid
- Do not hide file type, failed state, source, or the action required to recover.
Avatar
Open@/components/ui/avatarA small person or organization mark with a deterministic text fallback.
avatar- Use
- Use beside a name when identity helps scanning or attribution.
- Avoid
- Do not use an avatar as the only accessible name or allow a failed image to collapse the layout.
Badge
Open@/components/ui/badgeCompact metadata that stays subordinate to the record or action it describes.
badge- Use
- Use for state, category, and small counts when the text remains readable without color.
- Avoid
- Do not turn badges into primary actions or create a rainbow taxonomy.
Breadcrumb
Open@/components/ui/breadcrumbA compact ancestry trail for a durable place within a deeper hierarchy.
breadcrumb- Use
- Use when the parent path helps orientation and every ancestor is a real destination.
- Avoid
- Do not repeat top navigation or manufacture hierarchy for a shallow route.
Bubble
Open@/components/ui/bubbleA message unit that separates speaker, content, state, and supporting actions.
bubble- Use
- Use in chronological conversation where attribution and delivery state matter.
- Avoid
- Do not make long evidence, forms, or system records look like casual chat.
Button
Open@/components/ui/buttonCommits, chips, quiet actions, and icon-only controls from one stateful primitive.
button- Use
- Use the default ink button for a commit, chip for a reversible filter, ghost for quiet utility, and icon only when the mark is unambiguous.
- Avoid
- Do not make every action a pill, remove the word while busy, or invent page-local button colors.
Button Group
Open@/components/ui/button-groupA compact neighborhood of peer actions with one shared geometric contract.
button-group- Use
- Use for tightly related actions whose individual roles remain clear and whose hit areas never overlap.
- Avoid
- Do not force unrelated actions together or erase semantic prominence to make every button identical.
Calendar
Open@/components/ui/calendarA month grid for choosing or inspecting dates with keyboard-safe navigation.
calendar| Su | Mo | Tu | We | Th | Fr | Sa |
|---|---|---|---|---|---|---|
- Use
- Use when spatial date context materially improves the choice.
- Avoid
- Do not require a calendar for a known date that is faster to type.
Card
Open@/components/ui/cardA quiet grouped surface for content that belongs together.
cardWater heater replacement
1427 Westover Rd · Richmond
- Use
- Use when grouping materially improves comprehension and the card has a clear internal hierarchy.
- Avoid
- Do not wrap every section in a card or nest rounded surfaces without a spacing and radius relationship.
Carousel
Open@/components/ui/carouselA controlled horizontal sequence that preserves position, controls, and the next-item cue.
carousel- Use
- Use for a bounded visual sequence when order matters and all items remain reachable.
- Avoid
- Do not auto-advance important content or hide core navigation inside a slider.
Chart
Open@/components/ui/chartA quantitative view whose scale, units, comparison, and source remain explicit.
chart- Use
- Use only when shape or comparison is faster to read visually than in a compact table.
- Avoid
- Do not add decorative charts, misleading scales, gradients, or unlabeled color-only series.
Checkbox
Open@/components/ui/checkboxAn independent binary choice with a persistent visible label and mixed-state support.
checkbox- Use
- Use when several options may be selected or a single explicit agreement is required.
- Avoid
- Do not use for immediate on/off settings or make the label non-clickable.
Collapsible
Open@/components/ui/collapsibleA single optional region controlled by one stable, stateful trigger.
collapsible- Use
- Use for secondary detail that may stay closed without blocking the task.
- Avoid
- Do not collapse primary content, validation, or the only route to an action.
Combobox
Open@/components/ui/comboboxA searchable selection field for a large or remotely loaded option set.
combobox- Use
- Use when scanning a native select would be slow and typed filtering improves retrieval.
- Avoid
- Do not use for a handful of options or ship it without empty, loading, and no-result states.
Command
Open@/components/ui/commandA keyboard-first search and action surface for expert navigation.
command- Use
- Use when a large action set benefits from ranking, filtering, and a single predictable shortcut.
- Avoid
- Do not make command search the only way to reach a core destination.
Context Menu
Open@/components/ui/context-menuA secondary pointer menu for object-specific expert actions.
context-menu- Use
- Use as an acceleration layer when every critical action also has a visible path.
- Avoid
- Do not make right-click or long-press the only route to required work.
Data Table
Open@/components/ui/data-tableA dense record surface with explicit columns, selection, sorting, and state.
data-table| Job | Technician | Status |
|---|---|---|
| #1842 · Torres | Jordan Lee | En route |
| #1846 · Patel | Maya Chen | Scheduled |
- Use
- Use for comparison and repeated operations across many structured records.
- Avoid
- Do not use a table when content is unstructured or hide mobile access behind horizontal guesswork.
Date Picker
Open@/components/ui/date-pickerA labeled field plus calendar transaction for choosing a valid date or range.
date-picker- Use
- Use when constraints, ranges, or nearby dates make calendar context useful.
- Avoid
- Do not block typing, omit locale, or silently correct an invalid date.
Dialog
Open@/components/ui/dialogA focused interruption with trapped focus, an explicit title, and a return path.
dialog24 Example Street. Edit a local preview; nothing is saved or sent.
This example needs JavaScript. If the button stays disabled, reload the page.
Preview: routine. Note: none
- Use
- Use for consequential confirmation or a short task that must be completed before returning.
- Avoid
- Do not use for routine navigation, passive detail, or a workflow that needs its own URL.
Direction
Open@/components/ui/directionA document or subtree contract that keeps layout and directional marks correct in LTR and RTL.
direction- Use
- Use at the language boundary so spacing, order, and directional icons adapt together.
- Avoid
- Do not mirror logos, nondirectional marks, numbers, or media by assumption.
Drawer
Open@/components/ui/drawerA touch-oriented transient sheet for a short transaction, anchored to a viewport edge.
drawer- Use
- Use on compact screens when a brief modal task benefits from direct-manipulation dismissal.
- Avoid
- Do not turn a durable workflow into a desktop drawer or hide essential navigation in it.
Dropdown Menu
Open@/components/ui/dropdown-menuA trigger-owned list of immediate actions with complete keyboard behavior.
dropdown-menu- Use
- Use for secondary commands that belong to one object or control.
- Avoid
- Do not place forms, durable content, or the sole critical action inside a menu.
Empty
Open@/components/ui/emptyA truthful zero-result or zero-record state with the next useful action.
emptyNo matching jobs
No jobs match the current technician, status, and date filters.
- Use
- Use when a collection has nothing to show and distinguish first use from filtered or failed results.
- Avoid
- Do not blame the user, fill the void with illustration, or hide a recoverable error.
Field
Open@/components/ui/fieldThe canonical label, control, help, error, and required-state relationship.
field- Use
- Use around every form value so accessible naming and validation remain consistent.
- Avoid
- Do not substitute placeholder text for the label or separate the error from its control.
Form
Open@/components/ui/formA transaction scaffold that groups labeled fields, validation, section context, and commit actions.
form- Use
- Use for durable data entry where submit, error recovery, and keyboard order must remain explicit.
- Avoid
- Do not invent page-local field geometry, hide validation until the end, or use a form for immediate settings.
Hover Card
Open@/components/ui/hover-cardPointer and focus inspection for supplemental information about a referenced object.
hover-card- Use
- Use when a compact preview saves navigation and the same content is available on focus.
- Avoid
- Do not put actions, required information, or touch-only access inside hover.
Input
Open@/components/ui/inputA recessed well with a visible focus state and a mobile-safe text size.
input- Use
- Use for one-line text, URL, search, number, and credential entry with a visible label.
- Avoid
- Do not disable paste, hide the label in placeholder copy, or use less than 16px type on mobile.
Input Group
Open@/components/ui/input-groupA field and its tightly related prefix, suffix, or actions in one geometric neighborhood.
input-group- Use
- Use when adjacent content changes or acts on the same value and its reading order is unambiguous.
- Avoid
- Do not squeeze unrelated buttons into the field or let adornments obscure error and focus states.
Input OTP
Open@/components/ui/input-otpA segmented one-time-code field with one accessible value and paste support.
input-otp- Use
- Use for short verification codes when automatic fill and full-code paste are preserved.
- Avoid
- Do not create separate tab stops, block paste, or use it for passwords.
Item
Open@/components/ui/itemA reusable record row with identity, metadata, state, and trailing actions.
itemWater heater replacement
114 Oak Street · Today at 8:30
Estimate approved
$1,840 · Approved 12 minutes ago
- Use
- Use for scannable collections where a stable row grammar improves repeated reading.
- Avoid
- Do not turn every item into a card or make nested actions trigger the row.
Kbd
Open@/components/ui/kbdA compact visual token for a keyboard key or shortcut chord.
kbd- Use
- Use beside an available action to disclose an accelerator.
- Avoid
- Do not present a shortcut as the only path or imply a key that changes by platform.
Label
Open@/components/ui/labelA persistent accessible name tied to one control and its hit area.
labelThe label remains visible before, during, and after entry.
- Use
- Use on every field and control group with concise task language.
- Avoid
- Do not use placeholder, tooltip, or nearby prose as a substitute.
Marker
Open@/components/ui/markerA map location mark with selected, clustered, and accessible label states.
marker- Use
- Use when geographic position is part of the work and an equivalent list remains available.
- Avoid
- Do not encode status by color alone or make a tiny pin the only hit target.
Menubar
Open@/components/ui/menubarA desktop command hierarchy for dense application workflows.
menubar- Use
- Use only when expert work genuinely benefits from persistent, conventional command groups.
- Avoid
- Do not imitate desktop software on simple pages or use it as site navigation.
Message
Open@/components/ui/messageA complete conversational event with author, content, time, state, and actions.
message- Use
- Use when chronological communication is durable work rather than transient feedback.
- Avoid
- Do not collapse operational records or alerts into anonymous chat bubbles.
Message Scroller
Open@/components/ui/message-scrollerA conversation viewport that preserves reading position and announces new content without stealing it.
message-scroller- Use
- Use for live or long message history with explicit jump-to-latest behavior.
- Avoid
- Do not force-scroll while someone is reading or lose position as media loads.
Native Select
Open@/components/ui/native-selectThe platform selection control, dressed lightly while retaining native behavior.
native-select- Use
- Use first for a short stable option list, especially on mobile.
- Avoid
- Do not replace it with a custom popup unless search or rich options are truly needed.
Navigation Menu
Open@/components/ui/navigation-menuA disclosure-based set of site destinations with clear grouping and focus movement.
navigation-menu- Use
- Use for a modest hierarchy of durable routes that benefits from grouped preview.
- Avoid
- Do not build a mega-menu when direct links or search are clearer.
Pagination
Open@/components/ui/paginationStable navigation across ordered result pages with canonical URLs.
pagination- Use
- Use when result position and shareable page boundaries matter.
- Avoid
- Do not use unbounded page links, lose filters, or replace necessary virtualization.
Popover
Open@/components/ui/popoverA small anchored layer for secondary choices and short supporting content.
popover24 Example Street. Choose a technician for this local preview. Nothing is saved or sent.
This example needs JavaScript. If the button stays disabled, reload the page.
Preview technician: Maya Chen. Nothing is saved or sent.
- Use
- Use when the task is brief, contextual, and can close without losing work.
- Avoid
- Do not put a long workflow, essential information, or a second popover inside it.
Progress
Open@/components/ui/progressA determinate measure of completed work with a textual value or outcome.
progress- Use
- Use when the system knows total work and progress materially helps expectation.
- Avoid
- Do not fake precision, omit the meaning, or use a determinate bar for unknown duration.
Questionnaire
Open@/components/ui/questionnaireA structured sequence of questions with progress, validation, and resumable answers.
questionnaire- Use
- Use for guided intake where ordering and conditional follow-up reduce cognitive load.
- Avoid
- Do not split a small form into ceremony or lose answers between steps.
Radio Group
Open@/components/ui/radio-groupA visible mutually exclusive set with one shared question and keyboard movement.
radio-group- Use
- Use when all options should be compared before choosing one.
- Avoid
- Do not use for multi-select, immediate toggles, or long remote option lists.
Resizable
Open@/components/ui/resizableA bounded split layout whose user-controlled size persists without breaking either pane.
resizable- Use
- Use in expert workbenches when people need to balance adjacent durable regions.
- Avoid
- Do not make required content unreachable, overlap handles, or ship without keyboard resizing.
Scroll Area
Open@/components/ui/scroll-areaA bounded overflow region with native scrolling and a visible continuation cue.
scroll-area- Use
- Use only when a contained region must scroll independently from the route.
- Avoid
- Do not create nested scroll traps or hide content behind custom scrollbar styling.
Select
Open@/components/ui/selectA trigger-owned popup for choosing one value from a bounded option set.
select- Use
- Use when the list is concise, the current value matters, and native select is insufficient.
- Avoid
- Do not use for actions, multi-select, or options that require free-text search.
Separator
Open@/components/ui/separatorA structural boundary that uses the shared rim rather than decorative contrast.
separator- Use
- Use between adjacent regions when spacing alone does not explain the relationship.
- Avoid
- Do not add a rule after every row or use separators as decoration.
Sheet
Open@/components/ui/sheetAn edge-anchored modal surface for a short supporting task with explicit return.
sheet- Use
- Use when context should remain visible behind a compact transaction.
- Avoid
- Do not use as a permanent desktop page, nested route, or arbitrary right-hand container.
Sidebar
Open@/components/ui/sidebarThe long arm of the application shell: stable places, identity, and global utilities.
sidebar- Use
- Use only at the shell owner so pages cannot change its geometry or navigation contract.
- Avoid
- Do not make a page-local sidebar or put transient filters in global navigation.
Skeleton
Open@/components/ui/skeletonA quiet placeholder that reserves the exact shape of content still loading.
skeleton- Use
- Use when a response delay is perceptible and the final geometry is known.
- Avoid
- Do not animate excessively, invent fake content, or use a skeleton for an error.
Slider
Open@/components/ui/sliderA direct-manipulation control for an approximate value within a bounded range.
slider- Use
- Use when relative position matters more than exact entry and expose the current value.
- Avoid
- Do not use for precise money, dates, or values that are easier to type.
Spinner
Open@/components/ui/spinnerA small indeterminate activity mark that preserves the control or region footprint.
spinner- Use
- Use when work is underway but progress cannot be measured; keep the action word when present.
- Avoid
- Do not replace the whole interface, shift the label, or spin indefinitely without recovery.
Switch
Open@/components/ui/switchAn immediate on/off setting whose new state takes effect on activation.
switch- Use
- Use for reversible settings where the current state is more important than submitting a form.
- Avoid
- Do not use for one-time agreement, multi-option choice, or a destructive action.
Table
Open@/components/ui/tableSemantic rows and columns for exact comparison and accessible reading order.
table| Job | Customer | Status | Amount |
|---|---|---|---|
| #1842 · Water heater | Mike Reyes | Scheduled | $1,840 |
| #1846 · Main-line inspection | Owen Brooks | En route | $385 |
| #1851 · Kitchen leak | Rina Patel | Needs approval | $640 |
- Use
- Use when values share attributes and people need to compare them precisely.
- Avoid
- Do not use for layout, omit headers, or force a desktop-width grid onto mobile.
Tabs
Open@/components/ui/tabsPeer views of one local context with one selected panel and stable keyboard behavior.
tabs- Use
- Use for a small bounded set of parallel views that do not need separate navigation history.
- Avoid
- Do not hide sequential steps, mix actions with views, or create a long horizontal maze.
Textarea
Open@/components/ui/textareaA resizable multiline well for notes, descriptions, and durable free text.
textarea- Use
- Use when the expected answer needs sentences or line breaks, with a visible label and limits.
- Avoid
- Do not use for a one-line value or auto-grow without a practical maximum.
Toast
Open@/components/ui/toastA brief nonblocking acknowledgement for an outcome that needs no immediate action.
toast- Use
- Use after a reversible background action when inline state already records the durable result.
- Avoid
- Do not put errors, required decisions, or the only confirmation in a disappearing message.
Toggle
Open@/components/ui/toggleA compact pressed-state control for one reversible view or formatting option.
toggle- Use
- Use when the selected state is visible, immediate, and can be named accessibly.
- Avoid
- Do not use as a commit, hide state in color alone, or confuse it with a switch.
Toggle Group
Open@/components/ui/toggle-groupA compact peer set for one or several reversible view choices.
toggle-group- Use
- Use for bounded view modes or filters with short, mutually understandable labels.
- Avoid
- Do not put irreversible actions in a toggle group or let a long list become a horizontal tab maze.
Tooltip
Open@/components/ui/tooltipA short label or clarification that appears on hover and keyboard focus.
tooltip- Use
- Use to name an icon-only control or clarify unfamiliar compact notation.
- Avoid
- Do not hide required instructions, actions, rich content, or touch-only information inside it.
Typography
Open@/components/ui/typographyThe shared hierarchy, measure, wrapping, and numeric treatment for readable Thorbis content.
typographyWater heater replacement
Clear hierarchy keeps the next decision obvious.
Customer, location, scope, and price remain readable at the same calm measure.
- Use
- Use semantic elements first, then the published type roles and 65–75ch reading measure.
- Avoid
- Do not invent page-local scales, center reading copy, or use display styling as hierarchy everywhere.
Adopt a specified primitive by adding the ShadCN source, dressing it with shared Thorbis tokens, documenting every state here, and adding the rule that prevents misuse.Official ShadCN directory
Applied bookmark research
Reviewed 2026-09-06. These examples reinforce the existing owners; they do not introduce another visual style or claim the product behavior is implemented. Read the 26-source review and access limits.
Make invalid combinations difficult to express
Independent loading, success, and error flags can contradict each other; presentation and business logic become tangled as a component grows.
Choose an explicit state model and a semantic composition API. Reuse the approved primitives, keep domain operations outside them, and locate loading boundaries according to the work they protect. Documentation names which variants actually ship.
Thorbis example. A payment dialog composes an approved trigger, content, fields, and actions around a domain-owned operation. The button receives one coherent request state, not several competing booleans and a private set of colors.
Verify. Exercise each valid state and transition, keyboard and focus behavior, controlled and uncontrolled contracts where supported, server-rendered output, and slow or missing data. Check provenance and license before source adoption.
Do not import. No arbitrary color escape hatch, duplicate component kit, unregistered dependency, or migration from Astro merely because a source uses RSC.
Open the composition skill · Evidence: React handbook; components.build; Component Architecture for React Server Components; shadcncraft
A control keeps its meaning through every state
A button that changes width, a field that loses input, or a dialog that loses focus breaks the task even when the resting design looks precise.
Review the approved primitive as a sequence: resting, focused, activated, pending, resolved, and recovered. Keep the action label and footprint stable, associate errors with their fields, and preserve a visible keyboard path.
Thorbis example. Save estimate remains Save estimate while its state mark changes. A validation error keeps the entered values, explains the repair beside the field, and moves focus only when the interaction calls for it.
Verify. Test Tab, Shift-Tab, Enter, Escape where applicable, paste, invalid input, rapid activation, and a slow response. Repeat at 390px, in both themes, with zoom and reduced motion.
Do not import. No hand-built duplicate primitive, hidden label, disabled browser zoom, or borrowed shadow-only outer edge that violates D-017.
Open the ui skill · Evidence: Web Interface Guidelines; Invisible Details; components.build; Details that make interfaces feel better