Spaces:
Sleeping
Sleeping
| import React from 'react'; | |
| export type ButtonVariant = 'primary' | 'secondary' | 'danger' | 'text'; | |
| export type ButtonSize = 'small' | 'medium' | 'large'; | |
| interface ButtonProps { | |
| children: React.ReactNode; | |
| onClick?: (e?: React.MouseEvent<HTMLButtonElement>) => void; | |
| variant?: ButtonVariant; | |
| size?: ButtonSize; | |
| disabled?: boolean; | |
| fullWidth?: boolean; | |
| className?: string; | |
| type?: 'button' | 'submit' | 'reset'; | |
| icon?: React.ReactNode; | |
| } | |
| const Button: React.FC<ButtonProps> = ({ | |
| children, | |
| onClick, | |
| variant = 'primary', | |
| size = 'medium', | |
| disabled = false, | |
| fullWidth = false, | |
| className = '', | |
| type = 'button', | |
| icon | |
| }) => { | |
| const getVariantClass = () => { | |
| switch (variant) { | |
| case 'primary': | |
| return 'ios-button-primary'; | |
| case 'secondary': | |
| return 'ios-button-secondary'; | |
| case 'danger': | |
| return 'ios-button-danger'; | |
| case 'text': | |
| return 'ios-button-text'; | |
| default: | |
| return 'ios-button-primary'; | |
| } | |
| }; | |
| const getSizeClass = () => { | |
| switch (size) { | |
| case 'small': | |
| return 'min-h-8 text-sm px-3'; | |
| case 'medium': | |
| return 'min-h-11 text-base px-4'; | |
| case 'large': | |
| return 'min-h-12 text-lg px-6'; | |
| default: | |
| return 'min-h-11 text-base px-4'; | |
| } | |
| }; | |
| return ( | |
| <button | |
| type={type} | |
| onClick={onClick} | |
| disabled={disabled} | |
| className={` | |
| ios-button ${getVariantClass()} ${getSizeClass()} | |
| ${fullWidth ? 'w-full' : ''} | |
| ${disabled ? 'opacity-50 cursor-not-allowed' : ''} | |
| ${className} | |
| `} | |
| > | |
| {icon && <span className="mr-2">{icon}</span>} | |
| {children} | |
| </button> | |
| ); | |
| }; | |
| export default Button; |