@grafana/ui
Version:
Grafana Components Library
1 lines • 5.44 kB
Source Map (JSON)
{"version":3,"file":"Icon.mjs","sources":["../../../../src/components/Icon/Icon.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport * as React from 'react';\nimport SVG from 'react-inlinesvg';\n\nimport { GrafanaTheme2, isIconName } from '@grafana/data';\n\nimport { useStyles2 } from '../../themes/ThemeContext';\nimport { IconName, IconType, IconSize } from '../../types/icon';\nimport { spin } from '../../utils/keyframes';\n\nimport { getIconRoot, getIconSubDir, getSvgSize } from './utils';\n\nexport interface IconProps extends Omit<React.SVGProps<SVGElement>, 'onLoad' | 'onError' | 'ref'> {\n name: IconName;\n size?: IconSize;\n type?: IconType;\n /**\n * Give your icon a semantic meaning. The icon will be hidden from screen readers, unless this prop or an aria-label is provided.\n */\n title?: string;\n}\n\nconst getIconStyles = (theme: GrafanaTheme2) => {\n return {\n icon: css({\n display: 'inline-block',\n fill: 'currentColor',\n flexShrink: 0,\n label: 'Icon',\n // line-height: 0; is needed for correct icon alignment in Safari\n lineHeight: 0,\n verticalAlign: 'middle',\n }),\n orange: css({\n fill: theme.v1.palette.orange,\n }),\n spin: css({\n [theme.transitions.handleMotion('no-preference', 'reduce')]: {\n animation: `${spin} 2s infinite linear`,\n },\n }),\n };\n};\n\nexport const Icon = React.forwardRef<SVGElement, IconProps>(\n ({ size = 'md', type = 'default', name, className, style, title = '', ...rest }, ref) => {\n const styles = useStyles2(getIconStyles);\n\n if (!isIconName(name)) {\n console.warn('Icon component passed an invalid icon name', name);\n }\n\n // handle the deprecated 'fa fa-spinner'\n const iconName: IconName = name === 'fa fa-spinner' ? 'spinner' : name;\n\n const iconRoot = getIconRoot();\n const svgSize = getSvgSize(size);\n const svgHgt = svgSize;\n const svgWid = name.startsWith('gf-bar-align') ? 16 : name.startsWith('gf-interp') ? 30 : svgSize;\n const subDir = getIconSubDir(iconName, type);\n const svgPath = `${iconRoot}${subDir}/${iconName}.svg`;\n\n const composedClassName = cx(\n styles.icon,\n className,\n type === 'mono' ? { [styles.orange]: name === 'favorite' } : '',\n {\n [styles.spin]: iconName === 'spinner',\n }\n );\n\n return (\n <SVG\n aria-hidden={\n rest.tabIndex === undefined &&\n !title &&\n !rest['aria-label'] &&\n !rest['aria-labelledby'] &&\n !rest['aria-describedby']\n }\n innerRef={ref}\n src={svgPath}\n width={svgWid}\n height={svgHgt}\n title={title}\n className={composedClassName}\n style={style}\n // render an empty div with the correct dimensions while loading\n // this prevents content layout shift whilst the icon asynchronously loads\n // which happens even if the icon is in the cache(!)\n loader={\n <div\n className={cx(\n css({\n width: svgWid,\n height: svgHgt,\n }),\n composedClassName\n )}\n />\n }\n {...rest}\n />\n );\n }\n);\n\nIcon.displayName = 'Icon';\n"],"names":[],"mappings":"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"}