|
import type { CSSProperties } from 'react' |
|
import React from 'react' |
|
import { type VariantProps, cva } from 'class-variance-authority' |
|
import classNames from '@/utils/classnames' |
|
|
|
enum ActionButtonState { |
|
Destructive = 'destructive', |
|
Active = 'active', |
|
Disabled = 'disabled', |
|
Default = '', |
|
} |
|
|
|
const actionButtonVariants = cva( |
|
'action-btn', |
|
{ |
|
variants: { |
|
size: { |
|
xs: 'action-btn-xs', |
|
m: 'action-btn-m', |
|
l: 'action-btn-l', |
|
xl: 'action-btn-xl', |
|
}, |
|
}, |
|
defaultVariants: { |
|
size: 'm', |
|
}, |
|
}, |
|
) |
|
|
|
export type ActionButtonProps = { |
|
size?: 'xs' | 'm' | 'l' | 'xl' |
|
state?: ActionButtonState |
|
styleCss?: CSSProperties |
|
} & React.ButtonHTMLAttributes<HTMLButtonElement> & VariantProps<typeof actionButtonVariants> |
|
|
|
function getActionButtonState(state: ActionButtonState) { |
|
switch (state) { |
|
case ActionButtonState.Destructive: |
|
return 'action-btn-destructive' |
|
case ActionButtonState.Active: |
|
return 'action-btn-active' |
|
case ActionButtonState.Disabled: |
|
return 'action-btn-disabled' |
|
default: |
|
return '' |
|
} |
|
} |
|
|
|
const ActionButton = React.forwardRef<HTMLButtonElement, ActionButtonProps>( |
|
({ className, size, state = ActionButtonState.Default, styleCss, children, ...props }, ref) => { |
|
return ( |
|
<button |
|
type='button' |
|
className={classNames( |
|
actionButtonVariants({ className, size }), |
|
getActionButtonState(state), |
|
)} |
|
ref={ref} |
|
style={styleCss} |
|
{...props} |
|
> |
|
{children} |
|
</button> |
|
) |
|
}, |
|
) |
|
ActionButton.displayName = 'ActionButton' |
|
|
|
export default ActionButton |
|
export { ActionButton, ActionButtonState, actionButtonVariants } |
|
|