All files / frontend/src/components Button.tsx

100% Statements 36/36
100% Branches 5/5
100% Functions 0/0
100% Lines 36/36

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 531x 1x 1x                 1x 1x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x   11x 3x 3x 3x 3x 3x 3x 3x   3x 3x 3x   3x   8x   11x   11x 1x   1x   1x  
import React from 'react';
import classNames from 'classnames';
import './Button.css';
 
interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
    variant?: 'primary' | 'secondary' | 'accent' | 'success' | 'danger';
    size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
    isLoading?: boolean;
    children: React.ReactNode;
}
 
const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
    ({ variant = 'primary', size = 'md', isLoading = false, disabled, className, children, ...props }, ref) => {
        return (
            <button
                ref={ref}
                disabled={isLoading || disabled}
                className={classNames(
                    'btn',
                    `btn-${variant}`,
                    `btn-${size}`,
                    className
                )}
                aria-busy={isLoading}
                aria-disabled={isLoading || disabled}
                {...props}
            >
                {isLoading ? (
                    <span className="btn-loading-container">
                        <svg 
                            className="animate-spin btn-spinner" 
                            xmlns="http://www.w3.org/2000/svg" 
                            fill="none" 
                            viewBox="0 0 24 24"
                            aria-hidden="true"
                        >
                            <circle className="btn-spinner-circle" cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="4"></circle>
                            <path className="btn-spinner-path" fill="currentColor" 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"></path>
                        </svg>
                        Loading...
                    </span>
                ) : (
                    children
                )}
            </button>
        );
    }
);
 
Button.displayName = 'Button';
 
export default Button;