import React, {forwardRef, ButtonHTMLAttributes, AnchorHTMLAttributes} from 'react'
import {styled} from '@karma.run/react'
import {IconElement, Icon} from '../data/icon'
import {cssRuleWithTheme, themeMiddleware, Theme} from '../style/themeContext'
import {
TransitionDuration,
FontSize,
MarginProps,
FlexChildProps,
extractStyleProps,
BorderWidth
} from '../style/helpers'
export type IconButtonVariant = 'default' | 'light' | 'large'
interface IconButtonStyleProps extends MarginProps, FlexChildProps {
active?: boolean
disabled?: boolean
variant: IconButtonVariant
theme: Theme
}
const IconButtonStyle = cssRuleWithTheme(
({theme, active, disabled, variant, ...props}) => ({
_className: process.env.NODE_ENV !== 'production' ? 'IconButton' : undefined,
display: 'flex',
flexShrink: 0,
flexGrow: 0,
alignItems: 'center',
justifyContent: 'center',
padding: 0,
width: variant === 'large' ? 40 : 26,
height: variant === 'large' ? 40 : 26,
fontSize: variant === 'large' ? FontSize.Heading2 : FontSize.Large,
lineHeight: 1,
borderRadius: '100%',
backgroundColor: variant === 'light' ? 'transparent' : theme.colors.white,
borderStyle: variant === 'default' ? 'solid' : 'none',
borderWidth: BorderWidth.Small,
borderColor: theme.colors.grayLight,
fill: disabled
? theme.colors.grayLight
: variant === 'large'
? theme.colors.action
: theme.colors.grayDark,
transitionProperty: 'background-color, border-color, fill',
transitionDuration: TransitionDuration.Fast,
transitionTimingFunction: 'ease',
cursor: 'pointer',
pointerEvents: disabled ? 'none' : undefined,
...props,
':hover': {
borderColor: theme.colors.action,
backgroundColor: theme.colors.light
},
':active': {
borderColor: theme.colors.action,
backgroundColor: theme.colors.grayLight,
fill: theme.colors.action
},
':focus': {
outline: 'none',
borderColor: theme.colors.action
},
...(active
? {
borderColor: theme.colors.action,
backgroundColor: theme.colors.grayLight,
fill: theme.colors.action
}
: {})
})
)
const IconButtonElement = styled('button', IconButtonStyle, themeMiddleware)
const LinkIconButtonElement = styled('a', IconButtonStyle, themeMiddleware)
export interface BaseIconButtonProps extends MarginProps, FlexChildProps {
active?: boolean
icon: IconElement
variant?: IconButtonVariant
disabled?: boolean
}
export type IconButtonProps = BaseIconButtonProps & ButtonHTMLAttributes
export type LinkIconButtonProps = BaseIconButtonProps & AnchorHTMLAttributes
export const IconButton = forwardRef(function IconButton(
{icon, variant = 'default', active, disabled, ...props},
ref
) {
const [marginProps, elementProps] = extractStyleProps(props)
return (
)
})
export const LinkIconButton = forwardRef(
function LinkIconButton({icon, variant = 'default', active, disabled, ...props}, ref) {
const [marginProps, elementProps] = extractStyleProps(props)
return (
)
}
)