Material Design Icons can be used in React with a custom component or with the one provided in this module.
npm install @mdi/react --save-dev
The example below uses the @mdi/js package which contains all the MDI icon's path data.
import React, { Component } from 'react';
import Icon from '@mdi/react';
import { mdiAccount } from '@mdi/js';
class App extends Component {
render() {
return (
<Icon path={mdiAccount}
size={1}
horizontal
vertical
rotate={90}
color="red"/>
);
}
} To layer <Icons/> nest them inside of the <Stack/> component.
import React, { Component } from 'react';
import Icon, { Stack } from '@mdi/react';
import { mdiAccount, mdiBlockHelper } from '@mdi/js';
class App extends Component {
render() {
return (
<Stack color="#444">
<Icon path={mdiAccount}/>
<Icon path={mdiBlockHelper}
color="red"/>
</Stack>
);
}
} | Prop | PropTypes | Default | Details |
|---|---|---|---|
| path | string | required | SVG path data. Usually from @mdi/js |
| size | number, string | null |
{size * 1.5}rem, 1em, 48px |
| horizontal | bool | false |
Flip Horizontal |
| vertical | bool | false |
Flip Vertical |
| rotate | number | 0 |
degrees 0 to 360 |
| color | string | null |
rgb() / rgba() / #000 |
| spin | bool, number | false |
true = 2s, -2 counterclockwise, {spin}s |
Note: Additional props will be applied to the
<svg>element.
All props below will override the nested <Icon/>'s default prop values.
| Prop | PropTypes | Default | Details |
|---|---|---|---|
| size | number, string, null | null |
{size * 1.5}rem |
| horizontal | bool, null | null |
Flip Horizontal |
| vertical | bool, null | null |
Flip Vertical |
| rotate | number, null | null |
degrees 0 to 360 |
| color | string, null | null |
rgb() / rgba() / #000 |
| spin | bool, number, null | null |
true = 2s, -2 counterclockwise, {spin}s |
Note: Additional props on
<Stack>will apply to the<svg>element. Only in a<Stack>will addional props to the<Icon>component apply to the nested<path>elements.
Applying a className attribute is usually the easiest solution. The example below demonstrates using SCSS to style the icons.
In most cases it may be a good idea to set a base size. Assuming a 16px base font-size in most themes applying 1.5rem will make the icon a 24px.
svg {
width: 1.5rem;
}For more specific styling apply classes. To make selection of layers easier use the nth-child selector.
// For <Icon className="custom-class" />
svg.custom-class {
path {
fill: blue;
}
}
// For <Stack className="custom-class">
svg.custom-class {
// First layer (behind)
path:nth-child(1) {
fill: blue;
}
// Second layer (infront)
path:nth-child(2) {
fill: red;
}
}To develop clone the repo and run npm install.
src/Icon.tsx- Icon Componenttests/Icon.spec.tsx- Unit tests
src/Stack.tsx- Stack Componenttests/Stack.spec.tsx- Unit tests
Commands:
npm run start- Watch for file changesnpm run build- Build Icon.jsnpm run test- Run unit tests
Note: This project is setup to use the Mocha Sidebar extension which makes it easier to view the tests.
- JavaScript/Typescript: MaterialDesign-JS
- Vue: MaterialDesign-Vue
- Webfont: MaterialDesign-Webfont