import { AriaAttributes, ComponentType, MouseEventHandler, PropsWithChildren, ReactNode, } from 'react'; import clsx from 'clsx'; import { AutomationTestingProps } from '@/types'; import { Icon } from '@@/Icon'; import './Button.css'; type Type = 'submit' | 'button' | 'reset'; type Color = | 'default' | 'primary' | 'secondary' | 'danger' | 'link' | 'light' | 'dangerlight' | 'warninglight' | 'warning' | 'none'; type Size = 'xsmall' | 'small' | 'medium' | 'large'; export interface Props extends AriaAttributes, AutomationTestingProps { icon?: ReactNode | ComponentType; color?: Color; size?: Size; disabled?: boolean; title?: string; className?: string; type?: Type; as?: ComponentType | string; onClick?: MouseEventHandler; props?: TasProps; } export function Button({ type = 'button', color = 'primary', size = 'small', disabled = false, className, onClick, title, icon, children, as = 'button', props, ...ariaProps }: PropsWithChildren>) { const Component = as as 'button'; return ( { if (!disabled) { onClick?.(e); } }} title={title} // eslint-disable-next-line react/jsx-props-no-spreading {...ariaProps} // eslint-disable-next-line react/jsx-props-no-spreading {...props} > {icon && } {children} ); } function getIconSize(size: Size) { switch (size) { case 'xsmall': return 'xs'; case 'medium': return 'md'; case 'large': return 'lg'; case 'small': default: return 'sm'; } } function sizeClass(size?: Size) { switch (size) { case 'large': return 'btn-lg'; case 'medium': return 'btn-md'; case 'xsmall': return 'btn-xs'; default: return 'btn-sm'; } }