You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
2.1 KiB
93 lines
2.1 KiB
2 years ago
|
import { SvgIconComponent } from '@mui/icons-material';
|
||
|
import {
|
||
|
Box as MUIBox,
|
||
|
BoxProps as MUIBoxProps,
|
||
|
SvgIconProps,
|
||
|
} from '@mui/material';
|
||
|
import { createElement, FC } from 'react';
|
||
|
|
||
|
import { BLACK, BLUE } from '../lib/consts/DEFAULT_THEME';
|
||
|
|
||
|
import FlexBox, { FlexBoxProps } from './FlexBox';
|
||
|
|
||
|
type IconWithIndicatorOptionalPropsWithDefault = {
|
||
|
iconProps?: SvgIconProps;
|
||
|
indicatorProps?: FlexBoxProps;
|
||
|
};
|
||
|
|
||
|
type IconWithIndicatorOptionalProps = IconWithIndicatorOptionalPropsWithDefault;
|
||
|
|
||
|
type IconWithIndicatorProps = MUIBoxProps &
|
||
|
IconWithIndicatorOptionalProps & {
|
||
|
icon: SvgIconComponent;
|
||
|
};
|
||
|
|
||
|
const ICON_WITH_INDICATOR_DEFAULT_PROPS: Required<IconWithIndicatorOptionalPropsWithDefault> =
|
||
|
{
|
||
|
iconProps: {},
|
||
|
indicatorProps: {},
|
||
|
};
|
||
|
|
||
|
const IconWithIndicator: FC<IconWithIndicatorProps> = ({
|
||
|
icon,
|
||
|
iconProps: {
|
||
|
sx: iconSx,
|
||
|
|
||
|
...restIconProps
|
||
|
} = ICON_WITH_INDICATOR_DEFAULT_PROPS.iconProps,
|
||
|
indicatorProps: {
|
||
|
sx: indicatorSx,
|
||
|
|
||
|
...restIndicatorProps
|
||
|
} = ICON_WITH_INDICATOR_DEFAULT_PROPS.indicatorProps,
|
||
|
sx,
|
||
|
}) => {
|
||
|
const containerLength = '1.7em';
|
||
|
const indicatorLength = '24%';
|
||
|
const indicatorOffset = '.1rem';
|
||
|
|
||
|
return (
|
||
|
<MUIBox
|
||
|
sx={{
|
||
|
height: containerLength,
|
||
|
width: containerLength,
|
||
|
position: 'relative',
|
||
|
...sx,
|
||
|
}}
|
||
|
>
|
||
|
{createElement(icon, {
|
||
|
...restIconProps,
|
||
|
|
||
|
sx: { height: '100%', width: '100%', ...iconSx },
|
||
|
})}
|
||
|
{createElement(FlexBox, {
|
||
|
row: true,
|
||
|
|
||
|
...restIndicatorProps,
|
||
|
|
||
|
sx: {
|
||
|
backgroundColor: BLUE,
|
||
|
borderColor: BLACK,
|
||
|
borderRadius: '50%',
|
||
|
borderStyle: 'solid',
|
||
|
borderWidth: '.2rem',
|
||
|
bottom: indicatorOffset,
|
||
|
boxSizing: 'content-box',
|
||
|
height: 0,
|
||
|
justifyContent: 'center',
|
||
|
paddingBottom: indicatorLength,
|
||
|
position: 'absolute',
|
||
|
right: indicatorOffset,
|
||
|
width: indicatorLength,
|
||
|
|
||
|
...indicatorSx,
|
||
|
},
|
||
|
})}
|
||
|
</MUIBox>
|
||
|
);
|
||
|
};
|
||
|
|
||
|
IconWithIndicator.defaultProps = ICON_WITH_INDICATOR_DEFAULT_PROPS;
|
||
|
|
||
|
export default IconWithIndicator;
|