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 conceptsBadge vs Chip vs Tag vs Pill
Data DisplaySmall labelled or numeric markers used to annotate, categorize, or represent input as compact tokens.
@/components/ui/badgedefaultsecondarydestructiveoutlinevariantclassNameasChildA static styled label with no built-in dismiss, count, or interactive behavior; use asChild to render it as a link or button.
@mui/material/ChipfilledoutlinedlabelcolorsizevariantonDeleteonClickiconavatarclickableMUI splits these: Chip (interactive, deletable via onDelete) for tokens, and a separate Badge that overlays a small count/dot on a child via badgeContent.
antddefaultbordered={false}preset colors (success, processing, error, warning)colorclosableborderedicononClosecloseIconAnt uses Tag for categorization labels (closable, colorable) and a separate Badge for count/dot markers that decorate another element.
@/components/ui/badgedefaultsecondarydestructiveoutlinevariantclassNameasChildA static styled label with no built-in dismiss, count, or interactive behavior; use asChild to render it as a link or button.
Avatar
Data DisplayA small graphic representing a user or entity, showing a photo, initials, or an icon fallback.
@/components/ui/avatarclassNameWraps Radix Avatar; composed of AvatarImage plus AvatarFallback (shown while the image loads or if it fails).
@mui/material/AvatarcircularroundedsquaresrcaltvariantchildrensizesFalls back to children (initials) or a generic icon when src is missing; AvatarGroup stacks and overflows multiple avatars.
antdcirclesquaresrciconsizeshapegapshape toggles circle/square, size accepts presets or a number, and Avatar.Group clusters multiple avatars with a maxCount overflow.
@/components/ui/avatarclassNameWraps Radix Avatar; composed of AvatarImage plus AvatarFallback (shown while the image loads or if it fails).
Inputs & Controls
8 conceptsButton variants (primary / filled / outlined / ghost / text / link)
Inputs & ControlsThe emphasis levels of an action button, from high-emphasis filled to low-emphasis text or link.
@/components/ui/buttondefaultsecondarydestructiveoutlineghostlinkvariantsizeasChilddisabledclassNameVariants are defined with class-variance-authority; use asChild to render an <a> or Next Link while keeping button styling; no built-in loading state.
@mui/material/ButtoncontainedoutlinedtextvariantcolorsizestartIconendIcondisabledhrefEmphasis is set by variant while intent (primary, error, etc.) is set by the separate color prop; loading is handled by a related LoadingButton / loading prop.
antdprimarydefaultdashedtextlinktypedangerghostloadingsizeiconblockdisabledtype sets style/emphasis, danger flags destructive actions, and loading shows a built-in spinner; ghost makes the background transparent for colored surfaces.
@/components/ui/buttondefaultsecondarydestructiveoutlineghostlinkvariantsizeasChilddisabledclassNameVariants 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 & ControlsA binary on/off control that applies its state immediately, styled as a sliding thumb in a track.
@/components/ui/switchcheckeddefaultCheckedonCheckedChangedisabledclassNameWraps Radix Switch; note that shadcn also has a separate Toggle component which is a pressable toggle button, not an on/off switch.
@mui/material/SwitchcheckeddefaultCheckedonChangecolorsizedisabledOften wrapped in FormControlLabel to attach a label; color and size follow the standard MUI theme props.
antdcheckeddefaultCheckedonChangeloadingsizedisabledcheckedChildrenunCheckedChildrenSupports inline text/icons via checkedChildren and unCheckedChildren and a built-in loading state; a 'small' size is available.
@/components/ui/switchcheckeddefaultCheckedonCheckedChangedisabledclassNameWraps Radix Switch; note that shadcn also has a separate Toggle component which is a pressable toggle button, not an on/off switch.
Checkbox
Inputs & ControlsA control for selecting one or more independent options, or marking a state to be confirmed later.
@/components/ui/checkboxcheckeddefaultCheckedonCheckedChangedisabledclassNameWraps Radix Checkbox; supports an 'indeterminate' checked value and is typically paired with the Label component.
@mui/material/CheckboxcheckeddefaultCheckedonChangeindeterminatecolorsizedisabledUsually wrapped in FormControlLabel and grouped in a FormGroup; the icon and checkedIcon props allow custom marks.
antdcheckeddefaultCheckedonChangeindeterminatedisabledCheckbox.Group manages a set of options and reports the checked values array; indeterminate is set explicitly on a parent checkbox.
@/components/ui/checkboxcheckeddefaultCheckedonCheckedChangedisabledclassNameWraps Radix Checkbox; supports an 'indeterminate' checked value and is typically paired with the Label component.
Radio / Radio Group
Inputs & ControlsA set of mutually-exclusive options where exactly one can be selected at a time.
@/components/ui/radio-groupvaluedefaultValueonValueChangedisabledWraps Radix RadioGroup; individual options are RadioGroupItem elements each paired with a Label.
@mui/material/RadioGroupvaluedefaultValueonChangerownameRadioGroup wraps individual Radio controls (each in a FormControlLabel); the row prop lays them out horizontally.
antddefaultbutton (optionType='button')valuedefaultValueonChangeoptionsoptionTypebuttonStyleblockRadio.Group can render as classic radios or as a segmented button bar via optionType='button' with buttonStyle.
@/components/ui/radio-groupvaluedefaultValueonValueChangedisabledWraps Radix RadioGroup; individual options are RadioGroupItem elements each paired with a Label.
Select / Dropdown (value selection) vs Menu (commands)
Inputs & ControlsA popup list that either sets a form value (select) or triggers commands/navigation (menu).
@/components/ui/selectvaluedefaultValueonValueChangedisabledSelect (Radix Select) is for choosing a value; a separate DropdownMenu component handles command/action menus, and NativeSelect wraps the OS control.
@mui/material/SelectfilledoutlinedstandardvalueonChangelabelmultiplerenderValueMenuPropsSelect renders MenuItem children and integrates with FormControl/InputLabel; a standalone Menu component (opened from an anchorEl) handles action menus.
antdoutlinedborderlessfilledvalueonChangeoptionsmodelabelInValueallowClearshowSearchSelect is the value-picker (mode='multiple'/'tags' for multi-select); a separate Dropdown component wraps a Menu for action/command lists.
@/components/ui/selectvaluedefaultValueonValueChangedisabledSelect (Radix Select) is for choosing a value; a separate DropdownMenu component handles command/action menus, and NativeSelect wraps the OS control.
Combobox / Autocomplete
Inputs & ControlsA text input combined with a filtered popup list, letting users type to narrow down and pick a value.
@/components/ui/commandopenonOpenChangevalueonSelectNot a single component but a recipe: a Popover containing the Command (cmdk) list with search input; you wire up the selected value yourself.
@mui/material/AutocompletefilledoutlinedstandardoptionsvalueonChangerenderInputmultiplefreeSologetOptionLabelRequires a renderInput returning a TextField; freeSolo allows arbitrary text and multiple turns selections into deletable chips.
antdoutlinedborderlessfilledoptionsvalueonChangeonSearchonSelectallowClearfilterOptionAutoComplete is essentially an enhanced Input with suggestions; for tagging/free-entry, Ant often steers you to Select with mode='tags' instead.
@/components/ui/commandopenonOpenChangevalueonSelectNot 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 & ControlsA control for choosing a numeric value (or a range) by dragging a handle along a track.
@/components/ui/slidervaluedefaultValueonValueChangeminmaxstepWraps Radix Slider; supply an array with two values in defaultValue/value to create a range (two-thumb) slider.
@mui/material/SlidervaluedefaultValueonChangeminmaxstepmarksvalueLabelDisplayPassing an array of values renders a range slider; marks add tick labels and valueLabelDisplay shows the current value tooltip.
antdvaluedefaultValueonChangeminmaxsteprangemarkstooltipSet range={true} for a two-handle range slider; marks place labeled ticks and vertical enables a vertical orientation.
@/components/ui/slidervaluedefaultValueonValueChangeminmaxstepWraps Radix Slider; supply an array with two values in defaultValue/value to create a range (two-thumb) slider.
Segmented control / Toggle button group
Inputs & ControlsA row of connected buttons for picking one (or several) mutually-related options in place.
@/components/ui/toggle-groupdefaultoutlinetypevaluedefaultValueonValueChangevariantsizeWraps Radix ToggleGroup; type='single' behaves like a segmented control while type='multiple' allows several pressed at once.
@mui/material/ToggleButtonGroupvalueonChangeexclusiveorientationsizecolorContains ToggleButton children; exclusive={true} makes it single-select (segmented-control-like), otherwise multiple can be selected.
antdvaluedefaultValueonChangeoptionssizeblockdisabledSegmented is single-select only (defined via options); for multi-select toggle behavior Ant uses Checkbox/Radio buttons instead.
@/components/ui/toggle-groupdefaultoutlinetypevaluedefaultValueonValueChangevariantsizeWraps Radix ToggleGroup; type='single' behaves like a segmented control while type='multiple' allows several pressed at once.
Overlays
3 conceptsTooltip vs Popover
OverlaysSmall floating overlays anchored to an element — one for brief hints, one for richer interactive content.
@/components/ui/tooltipopenonOpenChangesidealigndelayDurationTwo separate Radix-based components: Tooltip for hover hints (with TooltipProvider) and Popover for click-triggered interactive panels; HoverCard is a third hover-preview variant.
@mui/material/TooltiptitleplacementarrowopenanchorElanchorOriginTooltip takes text via the title prop and is hover/focus-driven; Popover is anchored to an anchorEl element and holds arbitrary interactive content.
antdtitlecontenttriggerplacementopenarrowTooltip uses title for simple text; Popover adds a title plus a content area that can hold action elements like links and buttons.
@/components/ui/tooltipopenonOpenChangesidealigndelayDurationTwo 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
OverlaysA window layered over the page that focuses the user on a task or message, usually blocking the background.
@/components/ui/dialogopenonOpenChangemodalWraps Radix Dialog (modal by default); a separate AlertDialog enforces an explicit confirm/cancel decision for destructive actions.
@mui/material/DialogopenonClosefullWidthmaxWidthfullScreenscrollComposed with DialogTitle, DialogContent, and DialogActions; modal by default, and fullScreen makes it cover the viewport on mobile.
antdopenonOkonCanceltitlefooterwidthconfirmLoadingNamed Modal, with built-in OK/Cancel footer; Modal.confirm() / Modal.info() offer imperative confirmation dialogs.
@/components/ui/dialogopenonOpenChangemodalWraps Radix Dialog (modal by default); a separate AlertDialog enforces an explicit confirm/cancel decision for destructive actions.
Drawer / Sheet / Side panel
OverlaysA panel that slides in from a screen edge to show navigation, details, or a secondary task.
@/components/ui/sheettoprightbottomleftopenonOpenChangesideSheet (Radix Dialog) is the edge panel with a side prop; the separate Drawer component (Vaul) is a drag-to-dismiss bottom sheet.
@mui/material/DrawertemporarypersistentpermanentopenonCloseanchorvariantanchor sets the edge (left/right/top/bottom) and variant controls whether it overlays (temporary) or docks alongside content (permanent); SwipeableDrawer adds touch gestures.
antdopenonCloseplacementtitlewidthheightmaskplacement chooses the edge (left/right/top/bottom); width or height sizes it and mask toggles the dimmed backdrop.
@/components/ui/sheettoprightbottomleftopenonOpenChangesideSheet (Radix Dialog) is the edge panel with a side prop; the separate Drawer component (Vaul) is a drag-to-dismiss bottom sheet.
Navigation
4 conceptsTabs
NavigationA set of labeled panels where only one panel is visible at a time, switched via a row of tab controls.
@/components/ui/tabsvaluedefaultValueonValueChangeorientationWraps Radix Tabs; composed of TabsList, TabsTrigger, and TabsContent, and supports vertical orientation.
@mui/material/TabsstandardscrollablefullWidthvalueonChangevariantorientationcenteredtextColorindicatorColorTabs contains Tab children; you manage the active panel manually, and variant='scrollable' handles overflow with scroll buttons.
antdlinecardeditable-cardactiveKeydefaultActiveKeyonChangeitemstypetabPositionsizePanels are defined via the items array; type='card'/'editable-card' changes the look and tabPosition can move the tab bar to any edge.
@/components/ui/tabsvaluedefaultValueonValueChangeorientationWraps Radix Tabs; composed of TabsList, TabsTrigger, and TabsContent, and supports vertical orientation.
Breadcrumb
NavigationA trail of links showing the current page's location within the site or app hierarchy.
@/components/ui/breadcrumbclassNameseparatorComposed of BreadcrumbList, BreadcrumbItem, BreadcrumbLink, BreadcrumbPage, and BreadcrumbSeparator; a BreadcrumbEllipsis collapses long trails.
@mui/material/BreadcrumbsseparatormaxItemsitemsBeforeCollapseitemsAfterCollapseWraps Link/Typography children; maxItems auto-collapses the middle of long trails behind an ellipsis.
antditemsseparatorparamsIn v5 the trail is defined via the items array (each with title/href); a custom separator string or node is supported.
@/components/ui/breadcrumbclassNameseparatorComposed of BreadcrumbList, BreadcrumbItem, BreadcrumbLink, BreadcrumbPage, and BreadcrumbSeparator; a BreadcrumbEllipsis collapses long trails.
Pagination
NavigationControls for moving through a large dataset split into discrete pages.
@/components/ui/paginationclassNameA presentational set of parts (PaginationContent, PaginationItem, PaginationLink, PaginationPrevious, PaginationNext, PaginationEllipsis); page state and logic are up to you.
@mui/material/PaginationtextoutlinedcountpageonChangevariantshapesiblingCountboundaryCountcount is the total pages; shape='rounded' and variant style the buttons, and TablePagination is a separate table-specific variant.
@/components/ui/paginationclassNameA presentational set of parts (PaginationContent, PaginationItem, PaginationLink, PaginationPrevious, PaginationNext, PaginationEllipsis); page state and logic are up to you.
Stepper
NavigationA component that guides users through an ordered, multi-step process and shows progress through it.
shadcn/ui does not ship a Stepper component; developers compose one from primitives or use a community add-on.
- Cart
- Address
- Pay
@mui/material/StepperhorizontalverticalactiveSteporientationalternativeLabelnonLinearStepper contains Step and StepLabel children; orientation switches horizontal/vertical and nonLinear lets users jump between steps.
antddefaultnavigationinlinedotcurrentitemsdirectionstatustypesizeonChangeNamed Steps and configured via the items array; direction sets horizontal/vertical and status marks a step as wait/process/finish/error.
shadcn/ui does not ship a Stepper component; developers compose one from primitives or use a community add-on.
Containers
2 conceptsAccordion / Collapse / Disclosure
ContainersVertically stacked sections that expand and collapse to show or hide their content.
@/components/ui/accordionsinglemultipletypecollapsiblevaluedefaultValueonValueChangeWraps Radix Accordion; type='single' vs 'multiple' controls how many panels open, and Collapsible is a separate single-section disclosure primitive.
@mui/material/AccordionexpandeddefaultExpandedonChangedisabledComposed of AccordionSummary and AccordionDetails; to enforce single-open behavior you control the expanded state yourself, and Collapse handles raw show/hide animation.
antddefaultborderless (bordered=false)ghostactiveKeydefaultActiveKeyonChangeaccordionitemsexpandIconPositionNamed Collapse; set accordion={true} for one-panel-at-a-time behavior, with panels supplied via the items array in v5.
@/components/ui/accordionsinglemultipletypecollapsiblevaluedefaultValueonValueChangeWraps Radix Accordion; type='single' vs 'multiple' controls how many panels open, and Collapsible is a separate single-section disclosure primitive.
Card
ContainersA contained surface that groups related content and actions about a single subject.
@/components/ui/cardclassNameComposed of CardHeader, CardTitle, CardDescription, CardContent, and CardFooter subcomponents; styling is via Tailwind classes.
@mui/material/CardelevationoutlinedvariantraisedelevationAssembled from CardHeader, CardMedia, CardContent, and CardActions; variant='outlined' swaps the shadow for a border and CardActionArea makes it clickable.
antddefaultborderless (bordered=false)titleextracoveractionshoverablesizeloadingConfigured largely through props (title, extra, cover, actions) rather than subcomponents, with a built-in loading skeleton state.
@/components/ui/cardclassNameComposed of CardHeader, CardTitle, CardDescription, CardContent, and CardFooter subcomponents; styling is via Tailwind classes.
Feedback
3 conceptsAlert / Banner (inline) vs Toast / Snackbar / Notification (transient)
FeedbackStatus messages that either sit inline in the layout or pop up briefly and then disappear.
sonnerdefaultsuccesserrorwarninginfotoast()durationdescriptionactionpositionThe recommended transient toast is Sonner (call toast()); inline messages use the Alert component (with AlertTitle/AlertDescription) which has default and destructive variants.
@mui/material/SnackbarfilledoutlinedstandardopenautoHideDurationanchorOriginonClosemessageSnackbar is the transient container positioned via anchorOrigin; nest an Alert (severity: success/info/warning/error) inside it for colored, iconed status messages.
antdsuccessinfowarningerrormessage.success()notification.open()typeshowIconclosabledurationplacementAnt separates three: lightweight message (one-line toast), richer notification (title + description in a corner), and inline Alert (type/showIcon/banner) that lives in the layout.
sonnerdefaultsuccesserrorwarninginfotoast()durationdescriptionactionpositionThe 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
FeedbackIndicators of ongoing work — determinate progress with a value, or an indeterminate looping spinner.
@/components/ui/progressvaluemaxclassNameProgress (Radix) is a determinate linear bar driven by value; shadcn also ships a dedicated indeterminate Spinner component.
@mui/material/CircularProgressdeterminateindeterminatevariantvaluecolorsizethicknessOne family in two shapes: CircularProgress (the spinner) and LinearProgress (the bar), each supporting determinate (with value) or indeterminate modes.
antdlinecircledashboardpercenttypestatusshowInfosizeProgress covers determinate bars and rings via type and percent; Spin is the separate indeterminate loading spinner that can wrap content.
@/components/ui/progressvaluemaxclassNameProgress (Radix) is a determinate linear bar driven by value; shadcn also ships a dedicated indeterminate Spinner component.
Skeleton
FeedbackGray placeholder shapes that mimic content layout while data is loading.
@/components/ui/skeletonclassNameA minimal animated placeholder div; you size and shape each skeleton yourself with Tailwind classes to match the real content.
@mui/material/SkeletontextcircularrectangularroundedvariantwidthheightanimationThe variant prop matches common shapes and animation can be 'pulse', 'wave', or false; it can infer size from a child element.
antdloadingactiveavatartitleparagraphroundA composite placeholder for text/avatar/paragraph; active enables the shimmer, and dedicated Skeleton.Button / Skeleton.Image variants exist.
@/components/ui/skeletonclassNameA minimal animated placeholder div; you size and shape each skeleton yourself with Tailwind classes to match the real content.