Button.tsx (1054B)
1 import classNames from '@/lib/classnames' 2 import { HTMLAttributes, InputHTMLAttributes } from 'react' 3 import styles from './Button.module.css' 4 5 export interface CommonButtonProps { 6 color?: 'primary' | 'secondary' | 'tertiary' | 'error' 7 disabled?: boolean 8 } 9 10 export type ButtonProps = HTMLAttributes<HTMLButtonElement> & CommonButtonProps 11 export type SubmitButtonProps = InputHTMLAttributes<HTMLInputElement> & CommonButtonProps 12 13 export function Button (props: ButtonProps) { 14 return ButtonImpl('button', props) 15 } 16 17 export function SubmitButton (props: SubmitButtonProps) { 18 return ButtonImpl('input', props, { 19 type: 'submit', 20 }) 21 } 22 23 function ButtonImpl<T extends CommonButtonProps> (Tag: any, props: T, additionalProps: Partial<T> = {}) { 24 const { color, disabled, ...restProps } = props 25 26 return ( 27 <Tag 28 {...classNames( 29 styles.button, 30 color ? `is-${props.color}` : null, 31 disabled ? styles['is-disabled'] : null, 32 )} 33 disabled={disabled} 34 {...restProps} 35 {...additionalProps} 36 /> 37 ) 38 }