gaialive's picture
Upload 106 files
759768a verified
import React from 'react';
import './Button.css';
const Button = ({
children,
variant = 'primary',
size = 'md',
disabled = false,
loading = false,
icon = null,
onClick,
className = '',
type = 'button',
...props
}) => {
const baseClasses = 'terra-button';
const variantClasses = `terra-button--${variant}`;
const sizeClasses = `terra-button--${size}`;
const stateClasses = [
disabled && 'terra-button--disabled',
loading && 'terra-button--loading'
].filter(Boolean).join(' ');
const buttonClasses = [
baseClasses,
variantClasses,
sizeClasses,
stateClasses,
className
].filter(Boolean).join(' ');
return (
<button
type={type}
className={buttonClasses}
disabled={disabled || loading}
onClick={onClick}
{...props}
>
{loading && (
<span className="terra-button__spinner">
<svg className="animate-spin" width="16" height="16" viewBox="0 0 24 24" fill="none">
<circle cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="4" strokeOpacity="0.3"/>
<path d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" fill="currentColor"/>
</svg>
</span>
)}
{icon && !loading && (
<span className="terra-button__icon">
{icon}
</span>
)}
<span className="terra-button__text">
{children}
</span>
</button>
);
};
export default Button;