UNPKG

@grafana/ui

Version:
1 lines 5.38 kB
{"version":3,"file":"Spinner.mjs","sources":["../../../../src/components/Spinner/Spinner.tsx"],"sourcesContent":["import { cx, css } from '@emotion/css';\nimport * as React from 'react';\nimport SVG from 'react-inlinesvg';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { useStyles2 } from '../../themes';\nimport { IconSize, isIconSize } from '../../types';\nimport { t } from '../../utils/i18n';\nimport { spin } from '../../utils/keyframes';\nimport { Icon } from '../Icon/Icon';\nimport { getIconRoot, getIconSubDir } from '../Icon/utils';\n\nexport interface Props {\n className?: string;\n style?: React.CSSProperties;\n iconClassName?: string;\n inline?: boolean;\n size?: IconSize;\n}\n\n/**\n * @deprecated\n * use a predefined size, e.g. 'md' or 'lg' instead\n */\ninterface PropsWithDeprecatedSize extends Omit<Props, 'size'> {\n size?: number | string;\n}\n\n/**\n * @public\n */\nexport const Spinner = ({\n className,\n inline = false,\n iconClassName,\n style,\n size = 'md',\n}: Props | PropsWithDeprecatedSize) => {\n const styles = useStyles2(getStyles);\n\n const deprecatedStyles = useStyles2(getDeprecatedStyles, size);\n const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n const iconName = prefersReducedMotion ? 'hourglass' : 'spinner';\n\n // this entire if statement is handling the deprecated size prop\n // TODO remove once we fully remove the deprecated type\n if (typeof size !== 'string' || !isIconSize(size)) {\n const iconRoot = getIconRoot();\n const subDir = getIconSubDir(iconName, 'default');\n const svgPath = `${iconRoot}${subDir}/${iconName}.svg`;\n return (\n <div\n data-testid=\"Spinner\"\n style={style}\n className={cx(\n {\n [styles.inline]: inline,\n },\n deprecatedStyles.wrapper,\n className\n )}\n >\n <SVG\n src={svgPath}\n width={size}\n height={size}\n className={cx(styles.spin, deprecatedStyles.icon, className)}\n style={style}\n />\n </div>\n );\n }\n\n return (\n <div\n data-testid=\"Spinner\"\n style={style}\n className={cx(\n {\n [styles.inline]: inline,\n },\n className\n )}\n >\n <Icon\n className={cx(styles.spin, iconClassName)}\n name={iconName}\n size={size}\n aria-label={t('grafana-ui.spinner.aria-label', 'Loading')}\n />\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n inline: css({\n display: 'inline-block',\n }),\n spin: css({\n [theme.transitions.handleMotion('no-preference')]: {\n animation: `${spin} 2s infinite linear`,\n },\n }),\n});\n\n// TODO remove once we fully remove the deprecated type\nconst getDeprecatedStyles = (theme: GrafanaTheme2, size: number | string) => ({\n wrapper: css({\n fontSize: typeof size === 'string' ? size : `${size}px`,\n }),\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});\n"],"names":[],"mappings":"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"}