| 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 } |
|
|