UNPKG

@mui/material

Version:

Material UI is an open-source React component library that implements Google's Material Design. It's comprehensive and can be used in production out of the box.

759 lines (646 loc) • 21.1 kB
--- productId: material-ui title: React Chip component components: Chip githubLabel: 'scope: chip' materialDesign: https://m2.material.io/components/chips githubSource: packages/mui-material/src/Chip --- # Chip Chips are compact elements that represent an input, attribute, or action. Chips allow users to enter information, make selections, filter content, or trigger actions. While included here as a standalone component, the most common use will be in some form of input, so some of the behavior demonstrated here is not shown in context. ## Basic chip The `Chip` component supports outlined and filled styling. ```tsx import Chip from '@mui/material/Chip'; import Stack from '@mui/material/Stack'; export default function BasicChips() { return ( <Stack direction="row" spacing={1}> <Chip label="Chip Filled" /> <Chip label="Chip Outlined" variant="outlined" /> </Stack> ); } ``` ## Chip actions You can use the following actions. - Chips with the `onClick` prop defined change appearance on focus, hover, and click. - Chips with the `onDelete` prop defined will display a delete icon which changes appearance on hover. ### Clickable ```tsx import Chip from '@mui/material/Chip'; import Stack from '@mui/material/Stack'; export default function ClickableChips() { const handleClick = () => { console.info('You clicked the Chip.'); }; return ( <Stack direction="row" spacing={1}> <Chip label="Clickable" onClick={handleClick} /> <Chip label="Clickable" variant="outlined" onClick={handleClick} /> </Stack> ); } ``` ### Deletable ```tsx import Chip from '@mui/material/Chip'; import Stack from '@mui/material/Stack'; export default function DeletableChips() { const handleDelete = () => { console.info('You clicked the delete icon.'); }; return ( <Stack direction="row" spacing={1}> <Chip label="Deletable" onDelete={handleDelete} /> <Chip label="Deletable" variant="outlined" onDelete={handleDelete} /> </Stack> ); } ``` ### Clickable and deletable ```tsx import Chip from '@mui/material/Chip'; import Stack from '@mui/material/Stack'; export default function ClickableAndDeletableChips() { const handleClick = () => { console.info('You clicked the Chip.'); }; const handleDelete = () => { console.info('You clicked the delete icon.'); }; return ( <Stack direction="row" spacing={1}> <Chip label="Clickable Deletable" onClick={handleClick} onDelete={handleDelete} /> <Chip label="Clickable Deletable" variant="outlined" onClick={handleClick} onDelete={handleDelete} /> </Stack> ); } ``` ### Clickable link ```tsx import Chip from '@mui/material/Chip'; import Stack from '@mui/material/Stack'; export default function ClickableLinkChips() { return ( <Stack direction="row" spacing={1}> <Chip label="Clickable Link" component="a" href="#basic-chip" clickable /> <Chip label="Clickable Link" component="a" href="#basic-chip" variant="outlined" clickable /> </Stack> ); } ``` ### Custom delete icon ```tsx import Chip from '@mui/material/Chip'; import Stack from '@mui/material/Stack'; import DoneIcon from '@mui/icons-material/Done'; import DeleteIcon from '@mui/icons-material/Delete'; export default function CustomDeleteIconChips() { const handleClick = () => { console.info('You clicked the Chip.'); }; const handleDelete = () => { console.info('You clicked the delete icon.'); }; return ( <Stack direction="row" spacing={1}> <Chip label="Custom delete icon" onClick={handleClick} onDelete={handleDelete} deleteIcon={<DoneIcon />} /> <Chip label="Custom delete icon" onClick={handleClick} onDelete={handleDelete} deleteIcon={<DeleteIcon />} variant="outlined" /> </Stack> ); } ``` ## Chip adornments You can add ornaments to the beginning of the component. Use the `avatar` prop to add an avatar or use the `icon` prop to add an icon. ### Avatar chip ```tsx import Avatar from '@mui/material/Avatar'; import Chip from '@mui/material/Chip'; import Stack from '@mui/material/Stack'; export default function AvatarChips() { return ( <Stack direction="row" spacing={1}> <Chip avatar={<Avatar>M</Avatar>} label="Avatar" /> <Chip avatar={<Avatar alt="Natacha" src="/static/images/avatar/1.jpg" />} label="Avatar" variant="outlined" /> </Stack> ); } ``` ### Icon chip ```tsx import Chip from '@mui/material/Chip'; import Stack from '@mui/material/Stack'; import FaceIcon from '@mui/icons-material/Face'; export default function IconChips() { return ( <Stack direction="row" spacing={1}> <Chip icon={<FaceIcon />} label="With Icon" /> <Chip icon={<FaceIcon />} label="With Icon" variant="outlined" /> </Stack> ); } ``` ## Color chip You can use the `color` prop to define a color from theme palette. ```tsx import Chip from '@mui/material/Chip'; import Stack from '@mui/material/Stack'; export default function ColorChips() { return ( <Stack spacing={1} sx={{ alignItems: 'center' }}> <Stack direction="row" spacing={1}> <Chip label="primary" color="primary" /> <Chip label="success" color="success" /> </Stack> <Stack direction="row" spacing={1}> <Chip label="primary" color="primary" variant="outlined" /> <Chip label="success" color="success" variant="outlined" /> </Stack> </Stack> ); } ``` ## Sizes chip You can use the `size` prop to define a small Chip. ```tsx import Chip from '@mui/material/Chip'; import Stack from '@mui/material/Stack'; export default function SizesChips() { return ( <Stack direction="row" spacing={1}> <Chip label="Small" size="small" /> <Chip label="Small" size="small" variant="outlined" /> </Stack> ); } ``` ## Multiline chip By default, Chips displays labels only in a single line. To have them support multiline content, use the `sx` prop to add `height:auto` to the Chip component, and `whiteSpace: normal` to the `label` styles. ```tsx import Chip from '@mui/material/Chip'; import Box from '@mui/material/Box'; export default function MultilineChips() { return ( <Box sx={{ width: 100 }}> <Chip sx={{ height: 'auto', '& .MuiChip-label': { display: 'block', whiteSpace: 'normal', }, }} label="This is a chip that has multiple lines." /> </Box> ); } ``` ## Chip array An example of rendering multiple chips from an array of values. Deleting a chip removes it from the array. Note that since no `onClick` prop is defined, the `Chip` can be focused, but does not gain depth while clicked or touched. ```tsx import * as React from 'react'; import { styled } from '@mui/material/styles'; import Chip from '@mui/material/Chip'; import Paper from '@mui/material/Paper'; import TagFacesIcon from '@mui/icons-material/TagFaces'; interface ChipData { key: number; label: string; } const ListItem = styled('li')(({ theme }) => ({ margin: theme.spacing(0.5), })); export default function ChipsArray() { const [chipData, setChipData] = React.useState<readonly ChipData[]>([ { key: 0, label: 'Angular' }, { key: 1, label: 'jQuery' }, { key: 2, label: 'Polymer' }, { key: 3, label: 'React' }, { key: 4, label: 'Vue.js' }, ]); const handleDelete = (chipToDelete: ChipData) => () => { setChipData((chips) => chips.filter((chip) => chip.key !== chipToDelete.key)); }; return ( <Paper sx={{ display: 'flex', justifyContent: 'center', flexWrap: 'wrap', listStyle: 'none', p: 0.5, m: 0, }} component="ul" > {chipData.map((data) => { let icon; if (data.label === 'React') { icon = <TagFacesIcon />; } return ( <ListItem key={data.key}> <Chip icon={icon} label={data.label} onDelete={data.label === 'React' ? undefined : handleDelete(data)} /> </ListItem> ); })} </Paper> ); } ``` ## Chip playground ```jsx import * as React from 'react'; import Grid from '@mui/material/Grid'; import FormControl from '@mui/material/FormControl'; import FormLabel from '@mui/material/FormLabel'; import FormControlLabel from '@mui/material/FormControlLabel'; import RadioGroup from '@mui/material/RadioGroup'; import Radio from '@mui/material/Radio'; import Avatar from '@mui/material/Avatar'; import Chip from '@mui/material/Chip'; import FaceIcon from '@mui/icons-material/Face'; import DoneIcon from '@mui/icons-material/Done'; import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; function ChipsPlayground() { const [state, setState] = React.useState({ color: 'default', onDelete: 'none', avatar: 'none', icon: 'none', variant: 'filled', size: 'medium', }); const { color, onDelete, avatar, icon, variant, size } = state; const handleChange = (event) => { setState({ ...state, [event.target.name]: event.target.value, }); }; const handleDeleteExample = () => { console.info('You clicked the delete icon.'); }; const colorToCode = color !== 'default' ? `color="${color}" ` : ''; const sizeToCode = size === 'small' ? `size="small" ` : ''; const variantToCode = variant !== 'filled' ? `variant="${variant}" ` : ''; let onDeleteToCode; switch (onDelete) { case 'none': onDeleteToCode = ''; break; case 'custom': onDeleteToCode = 'deleteIcon={<DoneIcon />} onDelete={handleDelete} '; break; default: onDeleteToCode = 'onDelete={handleDelete} '; break; } let iconToCode; let iconToPlayground; switch (icon) { case 'none': iconToCode = ''; break; default: iconToCode = 'icon={<FaceIcon />} '; iconToPlayground = <FaceIcon />; break; } let avatarToCode; let avatarToPlayground; switch (avatar) { case 'none': avatarToCode = ''; break; case 'img': avatarToCode = 'avatar={<Avatar src="/static/images/avatar/1.jpg" />} '; avatarToPlayground = <Avatar src="/static/images/avatar/1.jpg" />; break; case 'letter': avatarToCode = 'avatar={<Avatar>F</Avatar>} '; avatarToPlayground = <Avatar>F</Avatar>; break; default: break; } if (avatar !== 'none') { iconToCode = ''; iconToPlayground = null; } const jsx = ` <Chip ${variantToCode}${colorToCode}${sizeToCode}${onDeleteToCode}${avatarToCode}${iconToCode}/> `; return ( <Grid container sx={{ flexGrow: 1 }}> <Grid size={12}> <Grid container sx={{ justifyContent: 'center', alignItems: 'center' }}> <Grid sx={(theme) => ({ height: theme.spacing(10) })}> <Chip label="Chip Component" color={color} deleteIcon={onDelete === 'custom' ? <DoneIcon /> : undefined} onDelete={onDelete !== 'none' ? handleDeleteExample : undefined} avatar={avatarToPlayground} icon={iconToPlayground} variant={variant} size={size} /> </Grid> </Grid> </Grid> <Grid size={12}> <Grid container spacing={3}> <Grid size={{ xs: 12, md: 6, }} > <FormControl component="fieldset"> <FormLabel>variant</FormLabel> <RadioGroup row name="variant" aria-label="variant" value={variant} onChange={handleChange} > <FormControlLabel value="filled" control={<Radio />} label="filled" /> <FormControlLabel value="outlined" control={<Radio />} label="outlined" /> </RadioGroup> </FormControl> </Grid> <Grid size={{ xs: 12, md: 6, }} > <FormControl component="fieldset"> <FormLabel>color</FormLabel> <RadioGroup row name="color" aria-label="color" value={color} onChange={handleChange} > <FormControlLabel value="default" control={<Radio />} label="default" /> <FormControlLabel value="primary" control={<Radio />} label="primary" /> <FormControlLabel value="secondary" control={<Radio />} label="secondary" /> <FormControlLabel value="error" control={<Radio />} label="error" /> <FormControlLabel value="info" control={<Radio />} label="info" /> <FormControlLabel value="success" control={<Radio />} label="success" /> <FormControlLabel value="warning" control={<Radio />} label="warning" /> </RadioGroup> </FormControl> </Grid> <Grid size={{ xs: 12, md: 6, }} > <FormControl component="fieldset"> <FormLabel>size</FormLabel> <RadioGroup row name="size" aria-label="size" value={size} onChange={handleChange} > <FormControlLabel value="medium" control={<Radio />} label="medium" /> <FormControlLabel value="small" control={<Radio />} label="small" /> </RadioGroup> </FormControl> </Grid> <Grid size={{ xs: 12, md: 6, }} > <FormControl component="fieldset"> <FormLabel>icon</FormLabel> <RadioGroup row name="icon" aria-label="icon" value={icon} onChange={handleChange} > <FormControlLabel value="none" control={<Radio />} label="none" /> <FormControlLabel value="icon" control={<Radio />} label="icon" /> </RadioGroup> </FormControl> </Grid> <Grid size={{ xs: 12, md: 6, }} > <FormControl component="fieldset"> <FormLabel>avatar</FormLabel> <RadioGroup row name="avatar" aria-label="avatar" value={avatar} onChange={handleChange} > <FormControlLabel value="none" control={<Radio />} label="none" /> <FormControlLabel value="letter" control={<Radio />} label="letter" /> <FormControlLabel value="img" control={<Radio />} label="img" /> </RadioGroup> </FormControl> </Grid> <Grid size={{ xs: 12, md: 6, }} > <FormControl component="fieldset"> <FormLabel>onDelete</FormLabel> <RadioGroup row name="onDelete" aria-label="on delete" value={onDelete} onChange={handleChange} > <FormControlLabel value="none" control={<Radio />} label="none" /> <FormControlLabel value="default" control={<Radio />} label="default" /> <FormControlLabel value="custom" control={<Radio />} label="custom" /> </RadioGroup> </FormControl> </Grid> </Grid> </Grid> <Grid size={12}> <HighlightedCode code={jsx} language="jsx" /> </Grid> </Grid> ); } export default ChipsPlayground; ``` ## Accessibility If the Chip is deletable or clickable then it is a button in tab order. When the Chip is focused (for example when tabbing) releasing (`keyup` event) `Backspace` or `Delete` will call the `onDelete` handler while releasing `Escape` will blur the Chip. # Chip API ## Demos For examples and details on the usage of this React component, visit the component demo pages: - [Chip](https://mui.com/material-ui/react-chip/) ## Import ```jsx import Chip from '@mui/material/Chip'; // or import { Chip } from '@mui/material'; ``` ## Props | Name | Type | Default | Required | Description | |------|------|---------|----------|-------------| | avatar | `element` | - | No | | | children | `unsupportedProp` | - | No | | | classes | `object` | - | No | Override or extend the styles applied to the component. | | clickable | `bool` | - | No | | | color | `'default' \| 'primary' \| 'secondary' \| 'error' \| 'info' \| 'success' \| 'warning' \| string` | `'default'` | No | | | component | `elementType` | - | No | | | deleteIcon | `element` | - | No | | | disabled | `bool` | `false` | No | | | icon | `element` | - | No | | | label | `node` | - | No | | | nativeButton | `bool` | - | No | | | onDelete | `func` | - | No | | | size | `'medium' \| 'small' \| string` | `'medium'` | No | | | skipFocusWhenDisabled | `bool` | `false` | No | | | slotProps | `{ label?: func \| object, root?: func \| object }` | `{}` | No | | | slots | `{ label?: elementType, root?: elementType }` | `{}` | No | | | sx | `Array<func \| object \| bool> \| func \| object` | - | No | The system prop that allows defining system overrides as well as additional CSS styles. | | variant | `'filled' \| 'outlined' \| string` | `'filled'` | No | | > **Note**: The `ref` is forwarded to the root element (HTMLDivElement). > Any other props supplied will be provided to the root element (native element). ## Theme default props You can use `MuiChip` to change the default props of this component with the theme. ## Slots | Name | Default | Class | Description | |------|---------|-------|-------------| | root | `div` | `.MuiChip-root` | The component that renders the root. | | label | `span` | `.MuiChip-label` | The component that renders the label. | ## CSS ### Rule name | Global class | Rule name | Description | |--------------|-----------|-------------| | - | avatar | Styles applied to the avatar element. | | - | clickable | Styles applied to the root element if `onClick` is defined or `clickable={true}`. | | - | colorDefault | Styles applied to the root element if `color="default"`. | | - | colorError | Styles applied to the root element if `color="error"`. | | - | colorInfo | Styles applied to the root element if `color="info"`. | | - | colorPrimary | Styles applied to the root element if `color="primary"`. | | - | colorSecondary | Styles applied to the root element if `color="secondary"`. | | - | colorSuccess | Styles applied to the root element if `color="success"`. | | - | colorWarning | Styles applied to the root element if `color="warning"`. | | - | deletable | Styles applied to the root element if `onDelete` is defined. | | - | deleteIcon | Styles applied to the deleteIcon element. | | `.Mui-disabled` | - | State class applied to the root element if `disabled={true}`. | | - | filled | Styles applied to the root element if `variant="filled"`. | | `.Mui-focusVisible` | - | State class applied to the root element if keyboard focused. | | - | icon | Styles applied to the icon element. | | - | outlined | Styles applied to the root element if `variant="outlined"`. | | - | sizeMedium | Styles applied to the root element if `size="medium"`. | | - | sizeSmall | Styles applied to the root element if `size="small"`. | ## Source code If you did not find the information on this page, consider having a look at the implementation of the component for more detail. - [/packages/mui-material/src/Chip/Chip.js](https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/src/Chip/Chip.js)