import clsx from 'clsx'
import { IconButtonifierProps } from '@dao-dao/types/components/IconButtonifier'
// Get props that should pass through the IconButtonifier, such as native props.
// Disable button if disabled or loading.
export const getPassthroughProps =
({
variant: _variant,
size: _size,
circular: _circular,
noRounding: _noRounding,
Icon: _Icon,
focused: _focused,
className: _className,
iconClassName: _iconClassName,
confirm: _confirm,
disabled,
loading,
...props
}: P) => ({
...props,
disabled: disabled || loading,
})
export const getIconButtonifiedClassNames = ({
variant = 'primary',
size = 'default',
circular,
noRounding,
disabled,
loading,
focused,
className,
}: Omit) =>
clsx(
// Put transparent rings so it animates when a ring appears.
'flex shrink-0 items-center justify-center ring-1 ring-inset ring-transparent transition-all',
focused && '!ring-2 !ring-border-interactive-focus',
// Rounding.
{
'rounded-full': circular,
'rounded-md': !circular && !noRounding,
},
// No cursor pointer if disabled.
disabled && 'cursor-default',
// Pulse if loading.
loading && 'animate-pulse',
// Sizes.
{
'h-5 w-5': size === 'xs',
'h-6 w-6': size === 'sm',
'h-8 w-8': size === 'default',
// Icon size changes.
'h-10 w-10': size === 'lg' || size === 'xl',
},
// Primary variant
variant === 'primary' && {
// Default
'bg-background-button text-icon-button-primary hover:bg-background-button-hover active:bg-background-button-pressed':
!disabled,
// Disabled
'bg-background-button-disabled text-icon-button-disabled': disabled,
},
// Inverted primary variant
variant === 'primary_inverted' && {
// Default
'bg-icon-button-primary text-background-button hover:bg-text-button-disabled active:bg-icon-button-disabled':
!disabled,
// Disabled
'bg-icon-button-disabled text-background-button-disabled': disabled,
},
// Secondary variant
variant === 'secondary' && {
// Default
'bg-background-primary text-icon-primary hover:bg-background-interactive-hover active:bg-background-interactive-pressed':
!disabled,
// Disabled
'bg-background-button-disabled text-icon-interactive-disabled': disabled,
},
// Ghost variant
variant === 'ghost' && {
// Default
'bg-transparent text-icon-secondary hover:bg-background-interactive-hover active:bg-background-interactive-pressed':
!disabled,
// Disabled
'text-icon-interactive-disabled': disabled,
},
// Highlight variant
variant === 'highlight' && {
'bg-transparent text-icon-primary !h-auto !w-auto !p-1': true,
// Default
'opacity-70 hover:opacity-100 active:opacity-90': !disabled && !focused,
'opacity-90': !disabled && focused,
// Disabled
'opacity-50': disabled,
},
// Brand variant
variant === 'brand' && {
// Default
'text-text-interactive-active hover:bg-background-button-active hover:text-text-button-primary active:bg-text-interactive-active active:text-text-button-primary':
!disabled,
// Disabled
'bg-background-interactive-active text-text-button-primary': disabled,
},
// None variant
variant === 'none' && {
'p-0': true,
// Default
'bg-transparent text-icon-primary transition-opacity hover:opacity-80 active:opacity-70':
!disabled,
// Disabled
'text-icon-interactive-disabled': disabled,
},
className
)
export const IconButtonifiedChildren = ({
Icon,
iconClassName,
size,
children,
}: Pick<
IconButtonifierProps,
'Icon' | 'iconClassName' | 'size' | 'children'
>) => (
<>
{children}
>
)