type ButtonVariant = | 'primary' | 'secondary' | 'ghost' | 'danger' | 'gradient' | 'outline'; type ButtonProps = Omit & { variant?: ButtonVariant; loading?: boolean; }; /** * Tailwind-styled button component independent from wp-admin styles. * * @param {ButtonProps} props Component props. * @return {JSX.Element} Rendered button element. */ const Button = ( props: ButtonProps ) => { const { variant = 'primary', loading = false, disabled, className, children, type = 'button', ...rest } = props; const isDisabled = disabled || loading; const baseClasses = 'inline-flex items-center justify-center gap-2 rounded-md border px-4 py-2 text-sm font-medium shadow-sm transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-white whitespace-nowrap align-middle'; let variantClasses = ''; if ( 'primary' === variant ) { variantClasses = 'border-transparent bg-sky-600 text-white hover:bg-sky-500 focus:ring-sky-500'; } else if ( 'secondary' === variant ) { variantClasses = 'border-slate-400 bg-white text-slate-700 hover:bg-slate-50 hover:border-slate-500 focus:ring-sky-500'; } else if ( 'outline' === variant ) { variantClasses = 'border-sky-600 bg-transparent text-sky-600 hover:bg-sky-50 focus:ring-sky-500'; } else if ( 'danger' === variant ) { variantClasses = 'border-red-200 bg-white text-red-600 hover:bg-red-50 hover:border-red-300 focus:ring-red-500'; } else { variantClasses = 'border-transparent bg-transparent text-slate-600 hover:bg-slate-100 hover:text-slate-900 focus:ring-sky-500'; } if ( 'gradient' === variant ) { return ( ); } const disabledClasses = isDisabled ? 'cursor-not-allowed opacity-60' : ''; return ( ); }; export default Button;