Demos
Default and Medium-sized icons (Responsive)
<Icon icon={Bell} title="Give Icons a Title, or ..." /> <Icon icon={BellMedium} aria-hidden /> <Bell title="I'm not responsive!" /> {/* <- Not responsive! */}
Icons with border
NB: Use it with caution. It should not be used where it can confuse users with being a clickable button.
<Flex.Horizontal align="center"> <Icon border={true} icon={Bell} /> <Icon border={true} icon={BellMedium} size="medium" /> <IconPrimary border={true} icon="information" /> <IconPrimary border={true} icon="information" size="medium" /> <Button icon={<IconPrimary icon="add" border />} text="Button" /> </Flex.Horizontal>
Filled icons
Use the fill prop on a single icon to fill it.
<Flex.Stack> <Flex.Horizontal align="center"> <Icon icon={Star} fill /> <Icon icon={Heart} fill /> <Avatar icon={<Icon icon={Star} fill />} size="small" hasLabel /> <Button icon={<Icon icon={Heart} fill />} title="Favorite" /> </Flex.Horizontal> </Flex.Stack>
Responsive to its inherited font-size
h1 with auto sized icon
<h1 className="dnb-h--xx-large"> h1 with auto sized <Icon icon={BellMedium} size="auto" aria-hidden />{' '} icon </h1>
Icon color variations
All of these methods will output the same color
<Icon icon={BellMedium} color="var(--color-fire-red)" title="CSS variable" /> <Icon icon={BellMedium} color="#DC2A2A" title="Hex" /> <Icon icon={BellMedium} color="rgb(220,42,42)" title="RGB" />
Icon size variations
The official supported sizes are default and medium.
NB: If you need to use the large, x-large or xx-large sizes, then you should use the *_medium version of the icon. Ensure you import the *_medium version of the icon.
<Icon icon={BellMedium} title="Beach" size="large" /> <Icon icon={BellMedium} title="Beach" size="x-large" /> <Icon icon={BellMedium} title="Beach" size="xx-large" />
Icon transition
Use Icon.transition() to animate between SVG icon states. Define named states and use Icon.transition.activate(element, state) to switch between them.
When icons have compatible path structures (same number and type of segments), the transition animates via CSS d property interpolation. This suits directional variants like arrow_down ↔ arrow_up or chevron_down ↔ chevron_up.
d path interpolation, so the icon transition will fall back to a simple crossfade.const directionIcon = Icon.transition({ down: arrow_down, up: arrow_up, left: arrow_left, right: arrow_right, }) const handleChange = (direction) => { const iconEl = document.querySelector( '[data-visual-test="icon-transition"] .dnb-icon' ) as HTMLElement if (iconEl) { Icon.transition.activate(iconEl, direction) } } render( <> <Flex.Horizontal align="center" gap="small"> <Icon icon={directionIcon} /> <Field.Selection variant="button" value="down" optionsLayout="horizontal" onChange={handleChange} > <Field.Option value="down" title="Down" /> <Field.Option value="up" title="Up" /> <Field.Option value="left" title="Left" /> <Field.Option value="right" title="Right" /> </Field.Selection> </Flex.Horizontal> {notSupported} </> )
Icon transition fallback
When icons have incompatible path structures (e.g. question ↔ close), Icon.transition() automatically falls back to a transform/opacity crossfade using stacked SVGs. The same Icon.transition.activate() API works for both modes.
const helpIcon = Icon.transition({ question, close, }) const handleChange = (state) => { const iconEl = document.querySelector( '[data-visual-test="icon-transition-fallback"] .dnb-icon' ) as HTMLElement if (iconEl) { Icon.transition.activate(iconEl, state) } } render( <Flex.Horizontal align="center" gap="small"> <Icon icon={helpIcon} /> <Field.Selection variant="button" value="question" optionsLayout="horizontal" onChange={handleChange} > <Field.Option value="question" title="Question" /> <Field.Option value="close" title="Close" /> </Field.Selection> </Flex.Horizontal> )