Designpedia
All terms
Live across three libraries

The same component,
three design systems.

Designers argue endlessly about whether something is a badge, a chip, a tag, or a pill. Here are 22 component families rendered live in three real libraries — shadcn/ui, MUI (Google's Material Design, in React) and Ant Design — so you can see the naming, the props, and the actual pixels side by side.

Note: the live shadcn/ui previews use its newer Base UI–based style; the component names and props shown match the standard Radix distribution you'll find in most docs.

Data Display

2 concepts

Badge vs Chip vs Tag vs Pill

Data Display

Small labelled or numeric markers used to annotate, categorize, or represent input as compact tokens.

The difference: These four names look alike but mean different things. A badge is a tiny status or count marker (e.g. an unread number) usually attached to another element like an icon. A chip is a compact, often interactive element that represents a discrete piece of input, an attribute, or a filter, and is frequently deletable or selectable. A tag is a label used to categorize or add metadata (like keywords on an article). A pill is not a semantic component at all — it just describes the fully-rounded capsule shape, which any of the above can adopt. Confusingly, the same visual capsule can be called a badge, chip, or tag depending on the library and its intent.
shadcn/uiRadix + Tailwind
DefaultSecondaryOutlineError
Badge@/components/ui/badge
variantsdefaultsecondarydestructiveoutline
propsvariantclassNameasChild

A static styled label with no built-in dismiss, count, or interactive behavior; use asChild to render it as a link or button.

Related termsBadgeChipTagPill

Avatar

Data Display

A small graphic representing a user or entity, showing a photo, initials, or an icon fallback.

The difference: An avatar is a compact visual identity marker — typically a circle or rounded square containing a profile photo, the user's initials, or a fallback icon when no image is available. It is purely representational; combining several into an overlapping cluster (an avatar group) shows multiple participants. Do not confuse it with a badge, though avatars are often decorated with a small status badge.
shadcn/uiRadix + Tailwind
ABCDEF
Avatar@/components/ui/avatar
propsclassName

Wraps Radix Avatar; composed of AvatarImage plus AvatarFallback (shown while the image loads or if it fails).

Inputs & Controls

8 concepts

Button variants (primary / filled / outlined / ghost / text / link)

Inputs & Controls

The emphasis levels of an action button, from high-emphasis filled to low-emphasis text or link.

The difference: Every library offers a spectrum of button emphasis but names the levels differently. High emphasis is called 'default'/'primary'/'contained'; medium emphasis with just a border is 'outline'/'outlined'/'dashed'; and the lowest emphasis with no fill or border is 'ghost'/'text'/'link'. A 'link'-style button looks like a hyperlink but behaves like a button. Note that MUI's variant names (contained/outlined/text) describe appearance, while Ant's type names (primary/default/dashed/text/link) mix appearance and intent, and destructive intent is a separate flag rather than a variant.
shadcn/uiRadix + Tailwind
Button@/components/ui/button
variantsdefaultsecondarydestructiveoutlineghostlink
propsvariantsizeasChilddisabledclassName

Variants are defined with class-variance-authority; use asChild to render an <a> or Next Link while keeping button styling; no built-in loading state.

Switch / Toggle

Inputs & Controls

A binary on/off control that applies its state immediately, styled as a sliding thumb in a track.

The difference: A switch (or toggle) represents an immediate binary choice — flipping it takes effect at once, without a separate submit step. That is what distinguishes it from a checkbox, which typically marks a selection to be confirmed later on submit. Watch the naming collision: 'toggle' can also mean a toggle button (a pressable button that stays pressed) rather than an on/off switch, so libraries disambiguate with names like 'Switch' vs 'Toggle'.
shadcn/uiRadix + Tailwind
Switch@/components/ui/switch
propscheckeddefaultCheckedonCheckedChangedisabledclassName

Wraps Radix Switch; note that shadcn also has a separate Toggle component which is a pressable toggle button, not an on/off switch.

Checkbox

Inputs & Controls

A control for selecting one or more independent options, or marking a state to be confirmed later.

The difference: A checkbox lets a user pick any number of independent options (including none), unlike a radio group where choices are mutually exclusive. Checkboxes usually mark a selection that is applied on submit, contrasting with a switch that takes effect immediately. All three libraries support an indeterminate state for 'partially selected' parent checkboxes.
shadcn/uiRadix + Tailwind
Checkbox@/components/ui/checkbox
propscheckeddefaultCheckedonCheckedChangedisabledclassName

Wraps Radix Checkbox; supports an 'indeterminate' checked value and is typically paired with the Label component.

Radio / Radio Group

Inputs & Controls

A set of mutually-exclusive options where exactly one can be selected at a time.

The difference: A radio button is meant to be used in a group where only one option can be chosen — selecting one deselects the others. This mutual exclusivity is the key difference from a checkbox group, where multiple selections are allowed. Radio groups are usually preferred over a dropdown when there are only a handful of options that benefit from being all visible at once.
shadcn/uiRadix + Tailwind
RadioGroup@/components/ui/radio-group
propsvaluedefaultValueonValueChangedisabled

Wraps Radix RadioGroup; individual options are RadioGroupItem elements each paired with a Label.

Select / Dropdown (value selection) vs Menu (commands)

Inputs & Controls

A popup list that either sets a form value (select) or triggers commands/navigation (menu).

The difference: These two are easy to confuse because both open a floating list, but their purpose differs. A select (or dropdown for value selection) is a form control: it holds a value, that value persists, and it submits with the form. A menu is a list of commands or navigation targets that fire an action when clicked and do not hold a persistent 'selected value'. Using a menu where a select is needed (or vice versa) is a common accessibility and semantics mistake.
shadcn/uiRadix + Tailwind
Select / DropdownMenu@/components/ui/select
propsvaluedefaultValueonValueChangedisabled

Select (Radix Select) is for choosing a value; a separate DropdownMenu component handles command/action menus, and NativeSelect wraps the OS control.

Combobox / Autocomplete

Inputs & Controls

A text input combined with a filtered popup list, letting users type to narrow down and pick a value.

The difference: A combobox merges a text field with a listbox: the user can type to filter options and then select one. 'Autocomplete' is the common name when the emphasis is on suggesting completions as you type. The distinction from a plain Select is the free-text filtering; some comboboxes also allow entering values not in the list ('tags'/'freeSolo' mode). shadcn has no single 'Combobox' primitive — it is a documented pattern composed from Popover plus the Command palette component.
shadcn/uiRadix + Tailwind
Combobox (Popover + Command)@/components/ui/command
propsopenonOpenChangevalueonSelect

Not a single component but a recipe: a Popover containing the Command (cmdk) list with search input; you wire up the selected value yourself.

Slider

Inputs & Controls

A control for choosing a numeric value (or a range) by dragging a handle along a track.

The difference: A slider lets users pick a value within a continuous or stepped range by dragging. A single-thumb slider selects one value; a range slider uses two thumbs to select a span (min and max). Sliders suit values where the relative position matters more than an exact number (volume, brightness); for precise numbers a stepper/number input is often better.
shadcn/uiRadix + Tailwind
Slider@/components/ui/slider
propsvaluedefaultValueonValueChangeminmaxstep

Wraps Radix Slider; supply an array with two values in defaultValue/value to create a range (two-thumb) slider.

Segmented control / Toggle button group

Inputs & Controls

A row of connected buttons for picking one (or several) mutually-related options in place.

The difference: A segmented control is a linear set of connected segments where selecting one switches a view or setting immediately — think of it as radio buttons styled as a button bar. A toggle button group generalizes this: it can be single-select (like a segmented control) or multi-select (each button toggles independently). It differs from tabs because it typically switches a mode/filter rather than revealing a full tabbed content panel, and from a plain radio group by its compact button styling.
shadcn/uiRadix + Tailwind
ToggleGroup@/components/ui/toggle-group
variantsdefaultoutline
propstypevaluedefaultValueonValueChangevariantsize

Wraps Radix ToggleGroup; type='single' behaves like a segmented control while type='multiple' allows several pressed at once.

Overlays

3 concepts

Tooltip vs Popover

Overlays

Small floating overlays anchored to an element — one for brief hints, one for richer interactive content.

The difference: A tooltip is a small, non-interactive text hint that appears on hover or focus to explain an element; you cannot click inside it and it disappears when you move away. A popover is a richer floating panel that can contain interactive content — links, buttons, forms — and is typically opened by a click and dismissed deliberately. The rule of thumb: if the user needs to interact with the floating content, it's a popover, not a tooltip.
shadcn/uiRadix + Tailwind
Tooltip / Popover@/components/ui/tooltip
propsopenonOpenChangesidealigndelayDuration

Two separate Radix-based components: Tooltip for hover hints (with TooltipProvider) and Popover for click-triggered interactive panels; HoverCard is a third hover-preview variant.

Dialog / Modal

Overlays

A window layered over the page that focuses the user on a task or message, usually blocking the background.

The difference: A dialog is a focused window layered over content. 'Modal' describes a dialog that blocks interaction with the rest of the page until dismissed — so 'modal dialog' is the precise term, while 'modal' alone is really an adjective. A confirmation/alert dialog is a specialized modal that interrupts with a message and requires a response. Non-modal dialogs (which let you keep using the page) also exist but are less common.
shadcn/uiRadix + Tailwind
Dialog@/components/ui/dialog
propsopenonOpenChangemodal

Wraps Radix Dialog (modal by default); a separate AlertDialog enforces an explicit confirm/cancel decision for destructive actions.

Drawer / Sheet / Side panel

Overlays

A panel that slides in from a screen edge to show navigation, details, or a secondary task.

The difference: A drawer (also called a sheet or side panel) slides in from an edge of the screen while keeping the user in context. Panels sliding from the left/right are side sheets or navigation drawers; one sliding up from the bottom is a bottom sheet. The naming varies wildly: shadcn calls the edge panel 'Sheet' and reserves 'Drawer' for a bottom-sheet-style component, whereas MUI and Ant both call the edge panel 'Drawer'.
shadcn/uiRadix + Tailwind
Sheet / Drawer@/components/ui/sheet
variantstoprightbottomleft
propsopenonOpenChangeside

Sheet (Radix Dialog) is the edge panel with a side prop; the separate Drawer component (Vaul) is a drag-to-dismiss bottom sheet.

Navigation

4 concepts

Tabs

Navigation

A set of labeled panels where only one panel is visible at a time, switched via a row of tab controls.

The difference: Tabs organize content into mutually-exclusive panels shown one at a time under a row of clickable labels. They differ from an accordion (which stacks collapsible sections vertically and can show several at once) and from a segmented control (which switches a view or filter but isn't a full tabbed-panel pattern). Tabs are for peer sections of related content, not for navigation between unrelated pages.
shadcn/uiRadix + Tailwind
Account settings
Tabs@/components/ui/tabs
propsvaluedefaultValueonValueChangeorientation

Wraps Radix Tabs; composed of TabsList, TabsTrigger, and TabsContent, and supports vertical orientation.

Pagination

Navigation

Controls for moving through a large dataset split into discrete pages.

The difference: Pagination breaks a long list or result set into numbered pages with previous/next controls, so users can jump to a specific page. It contrasts with infinite scroll (which loads more automatically) and with a stepper (which walks through an ordered process, not data pages). Good pagination shows the current page, total pages, and often lets the user change page size.
shadcn/uiRadix + Tailwind
Pagination@/components/ui/pagination
propsclassName

A presentational set of parts (PaginationContent, PaginationItem, PaginationLink, PaginationPrevious, PaginationNext, PaginationEllipsis); page state and logic are up to you.

Related termsPaginationCarousel

Stepper

Navigation

A component that guides users through an ordered, multi-step process and shows progress through it.

The difference: A stepper displays the sequence of steps in a multi-stage task (like a checkout or setup wizard) and highlights the current, completed, and upcoming steps. Note the naming trap: 'stepper' can also mean a small numeric increment/decrement input (a 'stepper input'), which is a totally different control. Here we mean the wizard-style progress stepper. shadcn has no dedicated stepper component — it must be built by hand.
shadcn/uiRadix + Tailwind
No direct equivalentin this library

shadcn/ui does not ship a Stepper component; developers compose one from primitives or use a community add-on.

Containers

2 concepts

Accordion / Collapse / Disclosure

Containers

Vertically stacked sections that expand and collapse to show or hide their content.

The difference: An accordion is a set of stacked headers that expand to reveal content; 'collapse' is the same idea and 'disclosure' is the accessibility term for a single expand/collapse widget. The classic 'accordion' behavior allows only one section open at a time, whereas a general collapsible group may allow several open at once. A single collapsible section (one header, one panel) is a disclosure, not really an accordion.
shadcn/uiRadix + Tailwind

Accordion@/components/ui/accordion
variantssinglemultiple
propstypecollapsiblevaluedefaultValueonValueChange

Wraps Radix Accordion; type='single' vs 'multiple' controls how many panels open, and Collapsible is a separate single-section disclosure primitive.

Card

Containers

A contained surface that groups related content and actions about a single subject.

The difference: A card is a bounded surface (usually with a subtle border or shadow) that groups content and actions about one subject, acting as an entry point to more detail. It differs from a plain panel or container by its self-contained, object-representing intent — a card typically stands for one 'thing' (a product, an article, a person). Overusing cards for everything dilutes the pattern.
shadcn/uiRadix + Tailwind
Card title
A self-contained surface.
Body content
Card@/components/ui/card
propsclassName

Composed of CardHeader, CardTitle, CardDescription, CardContent, and CardFooter subcomponents; styling is via Tailwind classes.

Feedback

3 concepts

Alert / Banner (inline) vs Toast / Snackbar / Notification (transient)

Feedback

Status messages that either sit inline in the layout or pop up briefly and then disappear.

The difference: The key split is persistent-inline versus transient-overlay. An alert or banner is a message embedded in the page layout that stays until dismissed or the condition clears. A toast, snackbar, or notification is a transient popup that appears (often in a corner), lingers briefly, and auto-dismisses. Within the transient family, a snackbar is usually a single low-emphasis line at the bottom, while a 'notification' is richer with a title and description. Naming differs: shadcn/Sonner and Ant say 'toast'/'notification', MUI says 'Snackbar'.
shadcn/uiRadix + Tailwind
Sonner / Alertsonner
variantsdefaultsuccesserrorwarninginfo
propstoast()durationdescriptionactionposition

The recommended transient toast is Sonner (call toast()); inline messages use the Alert component (with AlertTitle/AlertDescription) which has default and destructive variants.

Progress (linear/circular) vs Spinner

Feedback

Indicators of ongoing work — determinate progress with a value, or an indeterminate looping spinner.

The difference: A progress indicator can be determinate (it shows how far along a task is, via a value from 0–100, as a bar or ring) or indeterminate (it just shows that something is happening). A spinner is specifically the indeterminate, looping circular form used when the duration is unknown. Rule of thumb: if you can measure completion, use a determinate progress bar; if you can't, a spinner (or indeterminate progress) is appropriate.
shadcn/uiRadix + Tailwind
x
Progress / Spinner@/components/ui/progress
propsvaluemaxclassName

Progress (Radix) is a determinate linear bar driven by value; shadcn also ships a dedicated indeterminate Spinner component.

Skeleton

Feedback

Gray placeholder shapes that mimic content layout while data is loading.

The difference: A skeleton screen shows grey placeholder blocks in the shape of the upcoming content while it loads, reducing perceived wait time and layout shift versus a bare spinner. It differs from a spinner or progress bar by previewing the actual structure of the page rather than just signaling activity. Skeletons are best for content-heavy views (cards, lists, tables) where the final layout is predictable.
shadcn/uiRadix + Tailwind
Skeleton@/components/ui/skeleton
propsclassName

A minimal animated placeholder div; you size and shape each skeleton yourself with Tailwind classes to match the real content.