React Icon Component - Material UI - MUI

Skip to contentMaterial UIv7.3.6
  • Getting started
  • Components
    • All components
    • Inputs
      • Autocomplete
      • Button
      • Button Group
      • Checkbox
      • Floating Action Button
      • Number FieldNew
      • Radio Group
      • Rating
      • Select
      • Slider
      • Switch
      • Text Field
      • Transfer List
      • Toggle Button
    • Data display
      • Avatar
      • Badge
      • Chip
      • Divider
      • Icons
      • Material Icons
      • List
      • Table
      • Tooltip
      • Typography
    • Feedback
      • Alert
      • Backdrop
      • Dialog
      • Progress
      • Skeleton
      • Snackbar
    • Surfaces
      • Accordion
      • App Bar
      • Card
      • Paper
    • Navigation
      • Bottom Navigation
      • Breadcrumbs
      • Drawer
      • Link
      • Menu
      • Pagination
      • Speed Dial
      • Stepper
      • Tabs
    • Layout
      • Box
      • Container
      • Grid
      • GridLegacyDeprecated
      • Stack
      • Image List
    • Utils
      • Click-Away Listener
      • CSS Baseline
      • InitColorSchemeScript
      • Modal
      • No SSR
      • Popover
      • Popper
      • Portal
      • Textarea Autosize
      • Transitions
      • useMediaQuery
    • MUI X
      • Data Grid
      • Date and Time Pickers
      • Charts
      • Tree View
    • Lab
      • About the lab 🧪
      • Masonry
      • Timeline
  • Component API
  • Customization
  • How-to guides
  • Integrations
  • Experimental APIs
  • Migration
  • Discover more
  • Design resources
  • Template store
+ Icons

Guidance and suggestions for using icons with Material UI.

Material UI provides icon support in three ways:

  1. With Material Icons exported as React components (SVG icons).
  2. With the SvgIcon component, a React wrapper for custom SVG icons.
  3. With the Icon component, a React wrapper for custom font icons.

Material SVG icons

Google has created over 2,100 official Material icons, each in five different "themes" (see below). For each SVG icon, we export the respective React component from the @mui/icons-material package. You can search the full list of these icons.

Installation

Run one of the following commands to install it and save it to your package.json dependencies:

npmpnpmyarnnpm install @mui/icons-material

These components use the Material UI SvgIcon component to render the SVG path for each icon, and so have a peer-dependency on @mui/material.

If you aren't already using Material UI in your project, you can add it following the installation guide.

Usage

Import icons using one of these two options:

  • Option 1:

    import AccessAlarmIcon from '@mui/icons-material/AccessAlarm'; import ThreeDRotation from '@mui/icons-material/ThreeDRotation'; CopyCopied(or $keyC)
  • Option 2:

    import { AccessAlarm, ThreeDRotation } from '@mui/icons-material'; CopyCopied(or $keyC)

The safest for bundle size is Option 1, but some developers prefer Option 2. Make sure you read the minimizing bundle size guide before using the second approach.

Each Material icon also has a "theme": Filled (default), Outlined, Rounded, Two-tone, and Sharp. To import the icon component with a theme other than the default, append the theme name to the icon name. For example @mui/icons-material/Delete icon with:

  • Filled theme (default) is exported as @mui/icons-material/Delete,
  • Outlined theme is exported as @mui/icons-material/DeleteOutlined,
  • Rounded theme is exported as @mui/icons-material/DeleteRounded,
  • Twotone theme is exported as @mui/icons-material/DeleteTwoTone,
  • Sharp theme is exported as @mui/icons-material/DeleteSharp.

The Material Design guidelines name the icons using "snake_case" naming (for example delete_forever, add_a_photo), while @mui/icons-material exports the respective icons using "PascalCase" naming (for example DeleteForever, AddAPhoto). There are three exceptions to this naming rule: 3d_rotation exported as ThreeDRotation, 4k exported as FourK, and 360 exported as ThreeSixty.

Filled

Outlined

Rounded

Two Tone

Sharp

Edge-cases

SvgIcon

If you need a custom SVG icon (not available in the Material Icons) you can use the SvgIcon wrapper. This component extends the native <svg> element:

  • It comes with built-in accessibility.
  • SVG elements should be scaled for a 24x24px viewport so that the resulting icon can be used as is, or included as a child for other Material UI components that use icons. This can be customized with the viewBox attribute. To inherit the viewBox value from the original image, the inheritViewBox prop can be used.
  • By default, the component inherits the current color. Optionally, you can apply one of the theme colors using the color prop.
  • It supports <svg> element as a child so you can copy and paste your SVG directly to SvgIcon component.
<SvgIcon> {/* credit: cog icon from https://heroicons.com */} <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth={1.5} stroke="currentColor" > <path strokeLinecap="round" strokeLinejoin="round" d="M4.5 12a7.5 7.5 0 0015 0m-15 0a7.5 7.5 0 1115 0m-15 0H3m16.5 0H21m-1.5 0H12m-8.457 3.077l1.41-.513m14.095-5.13l1.41-.513M5.106 17.785l1.15-.964m11.49-9.642l1.149-.964M7.501 19.795l.75-1.3m7.5-12.99l.75-1.3m-6.063 16.658l.26-1.477m2.605-14.772l.26-1.477m0 17.726l-.26-1.477M10.698 4.614l-.26-1.477M16.5 19.794l-.75-1.299M7.5 4.205L12 12m6.894 5.785l-1.149-.964M6.256 7.178l-1.15-.964m15.352 8.864l-1.41-.513M4.954 9.435l-1.41-.514M12.002 12l-3.75 6.495" /> </svg> </SvgIcon><SvgIcon> {/* credit: cog icon from https://heroicons.com */} <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth={1.5} stroke="currentColor" > <path strokeLinecap="round" strokeLinejoin="round" d="M4.5 12a7.5 7.5 0 0015 0m-15 0a7.5 7.5 0 1115 0m-15 0H3m16.5 0H21m-1.5 0H12m-8.457 3.077l1.41-.513m14.095-5.13l1.41-.513M5.106 17.785l1.15-.964m11.49-9.642l1.149-.964M7.501 19.795l.75-1.3m7.5-12.99l.75-1.3m-6.063 16.658l.26-1.477m2.605-14.772l.26-1.477m0 17.726l-.26-1.477M10.698 4.614l-.26-1.477M16.5 19.794l-.75-1.299M7.5 4.205L12 12m6.894 5.785l-1.149-.964M6.256 7.178l-1.15-.964m15.352 8.864l-1.41-.513M4.954 9.435l-1.41-.514M12.002 12l-3.75 6.495" /> </svg> </SvgIcon>Press Enter to start editing

Color

<HomeIcon /> <HomeIcon color="primary" /> <HomeIcon color="secondary" /> <HomeIcon color="success" /> <HomeIcon color="action" /> <HomeIcon color="disabled" /> <HomeIcon sx={{ color: pink[500] }} /><HomeIcon /> <HomeIcon color="primary" /> <HomeIcon color="secondary" /> <HomeIcon color="success" /> <HomeIcon color="action" /> <HomeIcon color="disabled" /> <HomeIcon sx={{ color: pink[500] }} />Press Enter to start editing

Size

<HomeIcon fontSize="small" /> <HomeIcon /> <HomeIcon fontSize="large" /> <HomeIcon sx={{ fontSize: 40 }} /><HomeIcon fontSize="small" /> <HomeIcon /> <HomeIcon fontSize="large" /> <HomeIcon sx={{ fontSize: 40 }} />Press Enter to start editing

Component prop

You can use the SvgIcon wrapper even if your icons are saved in the .svg format. svgr has loaders to import SVG files and use them as React components. For example, with webpack:

// webpack.config.js { test: /\.svg$/, use: ['@svgr/webpack'], } // --- import StarIcon from './star.svg'; <SvgIcon component={StarIcon} inheritViewBox /> CopyCopied(or $keyC)

It's also possible to use it with "url-loader" or "file-loader". This is the approach used by Create React App.

// webpack.config.js { test: /\.svg$/, use: ['@svgr/webpack', 'url-loader'], } // --- import { ReactComponent as StarIcon } from './star.svg'; <SvgIcon component={StarIcon} inheritViewBox /> CopyCopied(or $keyC)

createSvgIcon

The createSvgIcon utility component is used to create the Material Icons. It can be used to wrap an <svg> element or an SVG path which is passed as a child to the SvgIcon component.

const HomeIcon = createSvgIcon( <path d="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z" />, 'Home', ); // or with custom SVG const PlusIcon = createSvgIcon( <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth={1.5} stroke="currentColor" className="h-6 w-6" > <path strokeLinecap="round" strokeLinejoin="round" d="M12 4.5v15m7.5-7.5h-15" /> </svg>, 'Plus', ); CopyCopied(or $keyC) <HomeIcon /> <HomeIcon color="primary" /> <PlusIcon /> <PlusIcon color="secondary" /><HomeIcon /> <HomeIcon color="primary" /> <PlusIcon /> <PlusIcon color="secondary" />Press Enter to start editing

Font Awesome

If you find that there are layout issues when using FontAwesomeIcon from @fortawesome/react-fontawesome, you can try passing the Font Awesome SVG data directly to SvgIcon.

Below is a comparison of the FontAwesomeIcon component and a wrapped SvgIcon component.

ExampleExample<IconButton aria-label="Example"> <FontAwesomeIcon icon={faEllipsisV} /> </IconButton> <IconButton aria-label="Example"> <FontAwesomeSvgIcon icon={faEllipsisV} /> </IconButton> <Button variant="contained" startIcon={<FontAwesomeIcon icon={faInfo} />}> Example </Button> <Button variant="contained" startIcon={<FontAwesomeSvgIcon icon={faInfo} />}> Example </Button><IconButton aria-label="Example"> <FontAwesomeIcon icon={faEllipsisV} /> </IconButton> <IconButton aria-label="Example"> <FontAwesomeSvgIcon icon={faEllipsisV} /> </IconButton> <Button variant="contained" startIcon={<FontAwesomeIcon icon={faInfo} />}> Example </Button> <Button variant="contained" startIcon={<FontAwesomeSvgIcon icon={faInfo} />}> Example </Button>Press Enter to start editing

FontAwesomeIcon's fullWidth prop can also be used to approximate the correct dimensions, but it isn't perfect.

Other libraries

MDI

materialdesignicons.com provides over 2,000 icons. For the wanted icon, copy the SVG path they provide, and use it as the child of the SvgIcon component, or with createSvgIcon().

Note: mdi-material-ui has already wrapped each of these SVG icons with the SvgIcon component, so you don't have to do it yourself.

Icon (Font icons)

The Icon component will display an icon from any icon font that supports ligatures. As a prerequisite, you must include one, such as the Material Icons font in your project. To use an icon simply wrap the icon name (font ligature) with the Icon component, for example:

import Icon from '@mui/material/Icon'; <Icon>star</Icon>; CopyCopied(or $keyC)

By default, an Icon will inherit the current text color. Optionally, you can set the icon color using one of the theme color properties: primary, secondary, action, error & disabled.

Font Material Icons

Icon will by default set the correct base class name for the Material Icons font (filled variant). All you need to do is load the font, for instance, via Google Web Fonts:

<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons" /> CopyCopied(or $keyC) <Icon>add_circle</Icon> <Icon color="primary">add_circle</Icon> <Icon sx={{ color: green[500] }}>add_circle</Icon> <Icon fontSize="small">add_circle</Icon> <Icon sx={{ fontSize: 30 }}>add_circle</Icon><Icon>add_circle</Icon> <Icon color="primary">add_circle</Icon> <Icon sx={{ color: green[500] }}>add_circle</Icon> <Icon fontSize="small">add_circle</Icon> <Icon sx={{ fontSize: 30 }}>add_circle</Icon>Press Enter to start editing

Custom font

For other fonts, you can customize the baseline class name using the baseClassName prop. For instance, you can display two-tone icons with Material Design:

import Icon from '@mui/material/Icon'; <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Material+Icons+Two+Tone" // Import the two tones MD variant ^^^^^^^^ />; CopyCopied(or $keyC) <Icon sx={[isDarkMode && { filter: 'invert(1)' }]} baseClassName="material-icons-two-tone" > add_circle </Icon><Icon sx={[isDarkMode && { filter: 'invert(1)' }]} baseClassName="material-icons-two-tone" > add_circle </Icon>Press Enter to start editing

Global base class name

Modifying the baseClassName prop for each component usage is repetitive. You can change the default prop globally with the theme

const theme = createTheme({ components: { MuiIcon: { defaultProps: { // Replace the `material-icons` default value. baseClassName: 'material-icons-two-tone', }, }, }, }); CopyCopied(or $keyC)

Then, you can use the two-tone font directly:

<Icon>add_circle</Icon> CopyCopied(or $keyC)

Font Awesome

Font Awesome can be used with the Icon component as follows:

<Icon baseClassName="fas" className="fa-plus-circle" /> <Icon baseClassName="fas" className="fa-plus-circle" color="primary" /> <Icon baseClassName="fas" className="fa-plus-circle" sx={{ color: green[500] }} /> <Icon baseClassName="fas" className="fa-plus-circle" fontSize="small" /> <Icon baseClassName="fas" className="fa-plus-circle" sx={{ fontSize: 30 }} /><Icon baseClassName="fas" className="fa-plus-circle" /> <Icon baseClassName="fas" className="fa-plus-circle" color="primary" /> <Icon baseClassName="fas" className="fa-plus-circle" sx={{ color: green[500] }} /> <Icon baseClassName="fas" className="fa-plus-circle" fontSize="small" /> <Icon baseClassName="fas" className="fa-plus-circle" sx={{ fontSize: 30 }} />Press Enter to start editing

Note that the Font Awesome icons weren't designed like the Material Icons (compare the two previous demos). The fa icons are cropped to use all the space available. You can adjust for this with a global override:

const theme = createTheme({ components: { MuiIcon: { styleOverrides: { root: { // Match 24px = 3 * 2 + 1.125 * 16 boxSizing: 'content-box', padding: 3, fontSize: '1.125rem', }, }, }, }, }); CopyCopied(or $keyC) Call meCall me<ThemeProvider theme={theme}> <Chip icon={<MdPhone />} label="Call me" /> <Chip icon={<Icon className="fas fa-phone-alt" />} label="Call me" /> </ThemeProvider><ThemeProvider theme={theme}> <Chip icon={<MdPhone />} label="Call me" /> <Chip icon={<Icon className="fas fa-phone-alt" />} label="Call me" /> </ThemeProvider>Press Enter to start editing

Font vs. SVGs: Which approach to use?

Both approaches work fine, however, there are some subtle differences, especially in terms of performance and rendering quality. Whenever possible SVG is preferred as it allows code splitting, supports more icons, and renders faster and better.

For more details, take a look at why GitHub migrated from font icons to SVG icons.

Accessibility

Icons can convey all sorts of meaningful information, so it's important to ensure they are accessible where appropriate. There are two use cases you'll want to consider:

  • Decorative icons that are only being used for visual or branding reinforcement. If they were removed from the page, users would still understand and be able to use your page.
  • Semantic icons are ones that you're using to convey meaning, rather than just pure decoration. This includes icons without text next to them that are used as interactive controls — buttons, form elements, toggles, etc.

Decorative icons

If your icons are purely decorative, you're already done! The aria-hidden=true attribute is added so that your icons are properly accessible (invisible).

Semantic icons

Semantic SVG icons

You should include the titleAccess prop with a meaningful value. The role="img" attribute and the <title> element are added so that your icons are correctly accessible.

In the case of focusable interactive elements, for example when used with an icon button, you can use the aria-label prop:

import IconButton from '@mui/material/IconButton'; import SvgIcon from '@mui/material/SvgIcon'; // ... <IconButton aria-label="delete"> <SvgIcon> <path d="M20 12l-1.41-1.41L13 16.17V4h-2v12.17l-5.58-5.59L4 12l8 8 8-8z" /> </SvgIcon> </IconButton>; CopyCopied(or $keyC)

Semantic font icons

You need to provide a text alternative that is only visible to assistive technologies.

import Box from '@mui/material/Box'; import Icon from '@mui/material/Icon'; import { visuallyHidden } from '@mui/utils'; // ... <Icon>add_circle</Icon> <Box component="span" sx={visuallyHidden}>Create a user</Box> CopyCopied(or $keyC)

Reference

  • https://www.tpgi.com/using-aria-enhance-svg-accessibility/

API

See the documentation below for a complete reference to all of the props and classes available to the components mentioned here.

  • <Icon />
  • <SvgIcon />

Contents

  • Material SVG icons
    • Installation
    • Usage
  • SvgIcon
    • Color
    • Size
    • Component prop
    • createSvgIcon
    • Font Awesome
    • Other libraries
  • Icon (Font icons)
    • Font Material Icons
    • Custom font
    • Font Awesome
  • Font vs. SVGs: Which approach to use?
  • Accessibility
    • Decorative icons
    • Semantic icons
  • API
doitBecome a Diamond sponsorMUI stands in solidarity with Ukraine.Search…

Tag » Color Material Ui Icons