Badge
Badge generates a small badge to the top-right of its child(ren).
<Badge>
...
</Badge>
Color
Size
🛒
<Badge>
<Typography fontSize="xl">🛒</Typography>
</Badge>
🛍
4🔔
❕<Badge badgeContent={4}>
<Typography fontSize="xl">🛍</Typography>
</Badge>
<Badge badgeContent="❕">
<Typography fontSize="xl">🔔</Typography>
</Badge>
The badge hides automatically when badgeContent
is zero. You can override this with the showZero
prop.
🛍
0
🛍
12<Badge badgeContent={12} invisible={invisible}>
<Typography fontSize="xl">🛍</Typography>
</Badge>
<Switch
startDecorator="invisible"
checked={invisible}
onChange={(event) => setInvisible(event.target.checked)}
variant={invisible ? 'solid' : 'outlined'}
sx={{ '--Switch-track-width': '40px' }}
/>
9999+999+
<Badge badgeContent={99}>
<MailIcon />
</Badge>
<Badge badgeContent={100} badgeInset="0 -6px 0 0">
<MailIcon />
</Badge>
<Badge badgeContent={1000} max={999} badgeInset="0 -12px 0 0">
<MailIcon />
</Badge>
Inset
Use badgeInset
prop to control the position of the badge. The value can be a string that match the CSS inset syntax.
<Badge badgeInset="14%" color="danger">
<Avatar src="/static/images/avatar/1.jpg" />
</Badge>
<Badge
anchorOrigin={{
vertical: 'top',
horizontal: 'right',
}}
>
Accessibility
You can't rely on the content of the badge to be announced correctly.
You should provide a full description, for instance, with aria-label
:
<IconButton color="neutral" aria-label={notificationsLabel(100)}>
<Badge badgeContent={100} badgeInset="-20%">
<MailIcon />
</Badge>
</IconButton>
Unstyled
The component also comes with an unstyled version. It's ideal for doing heavy customizations and minimizing bundle size.