parent
bc91fcd88b
commit
3f68c241c7
1 changed files with 92 additions and 0 deletions
@ -0,0 +1,92 @@ |
||||
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; |
Loading…
Reference in new issue