| import { memo } from 'react'; | |
| import { classNames } from '~/utils/classNames'; | |
| type IconSize = 'sm' | 'md' | 'lg' | 'xl' | 'xxl'; | |
| interface BaseIconButtonProps { | |
| size?: IconSize; | |
| className?: string; | |
| iconClassName?: string; | |
| disabledClassName?: string; | |
| title?: string; | |
| disabled?: boolean; | |
| onClick?: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void; | |
| } | |
| type IconButtonWithoutChildrenProps = { | |
| icon: string; | |
| children?: undefined; | |
| } & BaseIconButtonProps; | |
| type IconButtonWithChildrenProps = { | |
| icon?: undefined; | |
| children: string | JSX.Element | JSX.Element[]; | |
| } & BaseIconButtonProps; | |
| type IconButtonProps = IconButtonWithoutChildrenProps | IconButtonWithChildrenProps; | |
| export const IconButton = memo( | |
| ({ | |
| icon, | |
| size = 'xl', | |
| className, | |
| iconClassName, | |
| disabledClassName, | |
| disabled = false, | |
| title, | |
| onClick, | |
| children, | |
| }: IconButtonProps) => { | |
| return ( | |
| <button | |
| className={classNames( | |
| 'flex items-center text-bolt-elements-item-contentDefault bg-transparent enabled:hover:text-bolt-elements-item-contentActive rounded-md p-1 enabled:hover:bg-bolt-elements-item-backgroundActive disabled:cursor-not-allowed', | |
| { | |
| [classNames('opacity-30', disabledClassName)]: disabled, | |
| }, | |
| className, | |
| )} | |
| title={title} | |
| disabled={disabled} | |
| onClick={(event) => { | |
| if (disabled) { | |
| return; | |
| } | |
| onClick?.(event); | |
| }} | |
| > | |
| {children ? children : <div className={classNames(icon, getIconSize(size), iconClassName)}></div>} | |
| </button> | |
| ); | |
| }, | |
| ); | |
| function getIconSize(size: IconSize) { | |
| if (size === 'sm') { | |
| return 'text-sm'; | |
| } else if (size === 'md') { | |
| return 'text-md'; | |
| } else if (size === 'lg') { | |
| return 'text-lg'; | |
| } else if (size === 'xl') { | |
| return 'text-xl'; | |
| } else { | |
| return 'text-2xl'; | |
| } | |
| } | |