import React, { ReactElement } from 'react';
import css from '../../utils/css';
import { CommonProps } from '../common';
import {
IconWrapper,
SpinningIcon,
SpinningIconWrapper,
StyledIcon,
} from './StyledIcon';
import './style.css';
import IconList from './IconList';
type IconName = typeof IconList[number];
type IconIntent =
| 'inherit'
| 'text'
| 'subdued-text'
| 'disabled-text'
| 'primary'
| 'info'
| 'danger'
| 'warning'
| 'success'
| 'error';
interface IconProps extends CommonProps {
/**
* Icon name or a custom icon as a react element.
*/
icon: IconName | ReactElement;
/**
* Visual intent color to apply to icon, it will inherit from its parents' color by default.
*/
intent?:
| 'inherit'
| 'text'
| 'subdued-text'
| 'disabled-text'
| 'info'
| 'primary'
| 'danger'
| 'warning'
| 'success'
| 'error';
/**
* Icon size, it will inherit from its parents' font-size by default. If you use custom icon, inherit will be changed to medium size.
*/
size?: 'inherit' | 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge';
/**
* Rotate icon with animation.
*/
spin?: boolean;
}
const Icon = ({
icon,
size = 'inherit',
intent = 'inherit',
spin = false,
id,
className,
style,
sx = {},
'data-test-id': dataTestId,
}: IconProps): ReactElement => {
const isCustomIcon = React.isValidElement(icon);
const themeSize =
isCustomIcon === true && size === 'inherit' ? 'medium' : size;
const themeColor = intent;
// Custom icon
if (isCustomIcon) {
const WrapperComponent = spin === true ? SpinningIconWrapper : IconWrapper;
return (
{icon}
);
}
const IconComponent = spin === true ? SpinningIcon : StyledIcon;
return (
);
};
Icon.List = IconList;
export { IconProps, IconName, IconIntent };
export default Icon;