Skip to content
ThorbisInterface Guidelines (opens in a new tab)

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
AdoptedDisclosureAvailable import: @/components/ui/accordion

A vertical set of headings that reveals bounded supporting content in place.

Live Thorbis specimenaccordion

Confirm the shutoff location and call the customer before entering the property.

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
AdoptedStatusAvailable import: @/components/ui/alert

Persistent inline feedback that explains a condition near the work it affects.

Live Thorbis specimenalert

Payment 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
AdoptedTransactionAvailable import: @/components/ui/alert-dialog

A blocking confirmation for a consequential action that requires an explicit choice.

Live Thorbis specimenalert-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
AdoptedMediaAvailable import: @/components/ui/aspect-ratio

A reserved media frame that prevents layout shift before content arrives.

Live Thorbis specimenaspect-ratio
Completion photo preview
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
AdoptedRecordAvailable import: @/components/ui/attachment

A file row that keeps identity, progress, state, and actions in one stable footprint.

Live Thorbis specimenattachment

water-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
AdoptedIdentityAvailable import: @/components/ui/avatar

A small person or organization mark with a deterministic text fallback.

Live Thorbis specimenavatar
TH
ThorbisSource identity stays readable without the image.
SMMDLGXL
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
AdoptedStatusAvailable import: @/components/ui/badge

Compact metadata that stays subordinate to the record or action it describes.

Live Thorbis specimenbadge
PendingDispatch3 photosPaidOverdue
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.
Open
AdoptedNavigationAvailable import: @/components/ui/breadcrumb

A compact ancestry trail for a durable place within a deeper hierarchy.

Live Thorbis specimenbreadcrumb
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
AdoptedConversationAvailable import: @/components/ui/bubble

A message unit that separates speaker, content, state, and supporting actions.

Live Thorbis specimenbubble
Jordan · technician10:42 AM
Customer is home. I’m starting the shutoff inspection.
Delivered
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
AdoptedActionAvailable import: @/components/ui/button

Commits, chips, quiet actions, and icon-only controls from one stateful primitive.

Live Thorbis specimenbutton
Input referenceUnavailable link
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
AdoptedActionAvailable import: @/components/ui/button-group

A compact neighborhood of peer actions with one shared geometric contract.

Live Thorbis specimenbutton-group
Estimate #1842
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
AdoptedDateAvailable import: @/components/ui/calendar

A month grid for choosing or inspecting dates with keyboard-safe navigation.

Live Thorbis specimencalendar
August 2026
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
AdoptedSurfaceAvailable import: @/components/ui/card

A quiet grouped surface for content that belongs together.

Live Thorbis specimencard
Today · 8:30

Water heater replacement

1427 Westover Rd · Richmond

Assigned to Jordan$1,840
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.
Open
AdoptedMediaAvailable import: @/components/ui/carousel

A controlled horizontal sequence that preserves position, controls, and the next-item cue.

Live Thorbis specimencarousel
Before
During
After
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
AdoptedEvidenceAvailable import: @/components/ui/chart

A quantitative view whose scale, units, comparison, and source remain explicit.

Live Thorbis specimenchart
Collected this week$12,480
Collected
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
AdoptedChoiceAvailable import: @/components/ui/checkbox

An independent binary choice with a persistent visible label and mixed-state support.

Live Thorbis specimencheckbox
Completion evidence

The interactive example is loading. If it remains unavailable, reload the page with JavaScript enabled.

Permit attachment is unavailable in this local example.

Review the choices before previewing. Confirmation is required.

This example changes only its local preview.

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
AdoptedDisclosureAvailable import: @/components/ui/collapsible

A single optional region controlled by one stable, stateful trigger.

Live Thorbis specimencollapsible
Additional job contextSecondary information remains available without blocking dispatch.
Gate code 1842 · Customer requested shoe covers · Water shutoff is in the garage.
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
AdoptedChoiceAvailable import: @/components/ui/combobox

A searchable selection field for a large or remotely loaded option set.

Live Thorbis specimencombobox
Technicians
Jordan Lee
Maya Chen
Riley Smith
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
AdoptedNavigationAvailable import: @/components/ui/command

A keyboard-first search and action surface for expert navigation.

Live Thorbis specimencommand
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
AdoptedMenuAvailable import: @/components/ui/context-menu

A secondary pointer menu for object-specific expert actions.

Live Thorbis specimencontext-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
AdoptedWorkbenchAvailable import: @/components/ui/data-table

A dense record surface with explicit columns, selection, sorting, and state.

Live Thorbis specimendata-table
Today’s route
JobTechnicianStatus
#1842 · TorresJordan LeeEn route
#1846 · PatelMaya ChenScheduled
2 of 18 jobs
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
AdoptedDateAvailable import: @/components/ui/date-picker

A labeled field plus calendar transaction for choosing a valid date or range.

Live Thorbis specimendate-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
AdoptedTransactionAvailable import: @/components/ui/dialog

A focused interruption with trapped focus, an explicit title, and a return path.

Live Thorbis specimendialog

24 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
AdoptedInternationalizationAvailable import: @/components/ui/direction

A document or subtree contract that keeps layout and directional marks correct in LTR and RTL.

Live Thorbis specimendirection
Direction boundarySpacing and order adapt together at the language edge.
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
AdoptedTransactionAvailable import: @/components/ui/drawer

A touch-oriented transient sheet for a short transaction, anchored to a viewport edge.

Live Thorbis specimendrawer
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.
Open
AdoptedMenuAvailable import: @/components/ui/dropdown-menu

A trigger-owned list of immediate actions with complete keyboard behavior.

Live Thorbis specimendropdown-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
AdoptedStateAvailable import: @/components/ui/empty

A truthful zero-result or zero-record state with the next useful action.

Live Thorbis specimenempty

No 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
AdoptedFieldAvailable import: @/components/ui/field

The canonical label, control, help, error, and required-state relationship.

Live Thorbis specimenfield
Preview a receipt

Use a sample email. This example only changes its local preview.

This preview needs JavaScript. If the fields stay disabled, reload the page.

A receipt destination for this preview. Nothing is emailed.

Read-only values remain selectable and appear in form data.

Phone editing is unavailable in this example. Disabled values are omitted from form data.

Nothing has been saved or sent.

Inspect the email field

The diagram compares heights, enlarged to fit. Values come from the actual input above and update when it resizes.

Live measurements become available when the example loads.

Field supplies layout. Its caller connects htmlFor, IDs, aria-describedby and aria-invalid. Input keeps native input attributes and its ref points to the input.

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
AdoptedTransactionAvailable import: @/components/ui/form

A transaction scaffold that groups labeled fields, validation, section context, and commit actions.

Live Thorbis specimenform

Preview a job

Local example. Your entry stays in this page and is not saved.

This preview needs JavaScript. If the fields stay disabled, reload the page.

Use a sample address to try the form.

Suite, apartment, or unit if needed.

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
AdoptedInspectionAvailable import: @/components/ui/hover-card

Pointer and focus inspection for supplemental information about a referenced object.

Live Thorbis specimenhover-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
AdoptedFieldAvailable import: @/components/ui/input

A recessed well with a visible focus state and a mobile-safe text size.

Live Thorbis specimeninput
Preview a receipt

Use a sample email. This example only changes its local preview.

This preview needs JavaScript. If the fields stay disabled, reload the page.

A receipt destination for this preview. Nothing is emailed.

Read-only values remain selectable and appear in form data.

Phone editing is unavailable in this example. Disabled values are omitted from form data.

Nothing has been saved or sent.

Inspect the email field

The diagram compares heights, enlarged to fit. Values come from the actual input above and update when it resizes.

Live measurements become available when the example loads.

Field supplies layout. Its caller connects htmlFor, IDs, aria-describedby and aria-invalid. Input keeps native input attributes and its ref points to the 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
AdoptedFieldAvailable import: @/components/ui/input-group

A field and its tightly related prefix, suffix, or actions in one geometric neighborhood.

Live Thorbis specimeninput-group
One value, shared geometry, role-owned prominence. Mobile and coarse pointers use touch sizing in every density.
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
AdoptedFieldAvailable import: @/components/ui/input-otp

A segmented one-time-code field with one accessible value and paste support.

Live Thorbis specimeninput-otp
1
8
4
2
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
AdoptedRecordAvailable import: @/components/ui/item

A reusable record row with identity, metadata, state, and trailing actions.

Live Thorbis specimenitem

Water 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
AdoptedInstructionAvailable import: @/components/ui/kbd

A compact visual token for a keyboard key or shortcut chord.

Live Thorbis specimenkbd
Open command⌘K
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
AdoptedFieldAvailable import: @/components/ui/label

A persistent accessible name tied to one control and its hit area.

Live Thorbis specimenlabel

The 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
AdoptedMapAvailable import: @/components/ui/marker

A map location mark with selected, clustered, and accessible label states.

Live Thorbis specimenmarker
1427 Westover Rd · current stop
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.
Open
AdoptedMenuAvailable import: @/components/ui/menubar

A desktop command hierarchy for dense application workflows.

Live Thorbis specimenmenubar
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
AdoptedConversationAvailable import: @/components/ui/message

A complete conversational event with author, content, time, state, and actions.

Live Thorbis specimenmessage
Dispatch9:18 AM
Route changed for #1842. Customer was notified.
System 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
AdoptedConversationAvailable import: @/components/ui/message-scroller

A conversation viewport that preserves reading position and announces new content without stealing it.

Live Thorbis specimenmessage-scroller
Good morning. What is the arrival window?
We’ll arrive between 10 and 11.
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
AdoptedChoiceAvailable import: @/components/ui/native-select

The platform selection control, dressed lightly while retaining native behavior.

Live Thorbis specimennative-select

The interactive example is loading. If it remains unavailable, reload the page with JavaScript enabled.

A disabled field explains why it is unavailable and is omitted from form data.

This example changes only its local preview.

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.
Open
AdoptedNavigationAvailable import: @/components/ui/navigation-menu

A disclosure-based set of site destinations with clear grouping and focus movement.

Live Thorbis specimennavigation-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
AdoptedNavigationAvailable import: @/components/ui/pagination

Stable navigation across ordered result pages with canonical URLs.

Live Thorbis specimenpagination
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
AdoptedChoiceAvailable import: @/components/ui/popover

A small anchored layer for secondary choices and short supporting content.

Live Thorbis specimenpopover

24 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
AdoptedStatusAvailable import: @/components/ui/progress

A determinate measure of completed work with a textual value or outcome.

Live Thorbis specimenprogress
Importing customers680 of 1,000 records
68%
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
AdoptedGuidedAvailable import: @/components/ui/questionnaire

A structured sequence of questions with progress, validation, and resumable answers.

Live Thorbis specimenquestionnaire
1 · Contact
2 · Scope
3 · Review
Who should we contact?
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
AdoptedChoiceAvailable import: @/components/ui/radio-group

A visible mutually exclusive set with one shared question and keyboard movement.

Live Thorbis specimenradio-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
AdoptedWorkbenchAvailable import: @/components/ui/resizable

A bounded split layout whose user-controlled size persists without breaking either pane.

Live Thorbis specimenresizable
Route list
Job detail
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
AdoptedViewportAvailable import: @/components/ui/scroll-area

A bounded overflow region with native scrolling and a visible continuation cue.

Live Thorbis specimenscroll-area

#1842 · Water heater replacement

Today · 8:30

#1846 · Main-line inspection

Today · 10:00

#1851 · Kitchen leak diagnosis

Tomorrow · 9:00

#1858 · Sewer camera follow-up

Tomorrow · 11:30

#1860 · PRV replacement

Friday · 1:00

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
AdoptedChoiceAvailable import: @/components/ui/select

A trigger-owned popup for choosing one value from a bounded option set.

Live Thorbis specimenselect

The interactive example is loading. If it remains unavailable, reload the page with JavaScript enabled.

An empty option set stays unavailable and explains why.

This example changes only its local preview.

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
AdoptedStructureAvailable import: @/components/ui/separator

A structural boundary that uses the shared rim rather than decorative contrast.

Live Thorbis specimenseparator
Estimate
Invoice
Paid
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
AdoptedTransactionAvailable import: @/components/ui/sheet

An edge-anchored modal surface for a short supporting task with explicit return.

Live Thorbis specimensheet
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.
Open
AdoptedShellAvailable import: @/components/ui/sidebar

The long arm of the application shell: stable places, identity, and global utilities.

Live Thorbis specimensidebar
Shell-owned navigation
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
AdoptedStateAvailable import: @/components/ui/skeleton

A quiet placeholder that reserves the exact shape of content still loading.

Live Thorbis specimenskeleton
Loading jobs
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
AdoptedChoiceAvailable import: @/components/ui/slider

A direct-manipulation control for an approximate value within a bounded range.

Live Thorbis specimenslider
Dispatch radius25 miles
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
AdoptedStateAvailable import: @/components/ui/spinner

A small indeterminate activity mark that preserves the control or region footprint.

Live Thorbis specimenspinner
Refreshing jobs
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
AdoptedChoiceAvailable import: @/components/ui/switch

An immediate on/off setting whose new state takes effect on activation.

Live Thorbis specimenswitch
Send one day before the appointment.
Dispatch can still override with permission.
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
AdoptedEvidenceAvailable import: @/components/ui/table

Semantic rows and columns for exact comparison and accessible reading order.

Live Thorbis specimentable
Today’s scheduled work
JobCustomerStatusAmount
#1842 · Water heaterMike ReyesScheduled$1,840
#1846 · Main-line inspectionOwen BrooksEn route$385
#1851 · Kitchen leakRina PatelNeeds 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
AdoptedNavigationAvailable import: @/components/ui/tabs

Peer views of one local context with one selected panel and stable keyboard behavior.

Live Thorbis specimentabs
Mike Reyes3 locations · 8 completed jobs · $12,480 lifetime value
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
AdoptedFieldAvailable import: @/components/ui/textarea

A resizable multiline well for notes, descriptions, and durable free text.

Live Thorbis specimentextarea
Job notesShared field, help, focus, and resize behavior.
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
AdoptedStatusAvailable import: @/components/ui/toast

A brief nonblocking acknowledgement for an outcome that needs no immediate action.

Live Thorbis specimentoast
    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
    AdoptedChoiceAvailable import: @/components/ui/toggle

    A compact pressed-state control for one reversible view or formatting option.

    Live Thorbis specimentoggle
    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
    AdoptedChoiceAvailable import: @/components/ui/toggle-group

    A compact peer set for one or several reversible view choices.

    Live Thorbis specimentoggle-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
    AdoptedInstructionAvailable import: @/components/ui/tooltip

    A short label or clarification that appears on hover and keyboard focus.

    Live Thorbis specimentooltip
    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
    AdoptedContentAvailable import: @/components/ui/typography

    The shared hierarchy, measure, wrapping, and numeric treatment for readable Thorbis content.

    Live Thorbis specimentypography

    Water 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

    Loading search…

    Loading search. You can close this message and keep reading.