import clsx from 'clsx'; import React from 'react'; import type { ButtonHTMLAttributes, ReactNode } from 'react'; import styles from './Button.module.css'; export interface ButtonProps extends ButtonHTMLAttributes { variant?: 'primary' | 'secondary' | 'danger' | 'dangerSecondary' | 'ghost' | 'link'; size?: 'sm' | 'md' | 'lg'; loading?: boolean; icon?: ReactNode; fitContainer?: boolean; fitContent?: boolean; square?: boolean; children?: ReactNode; } const variantClassMap: Record = { primary: 'primary', secondary: 'secondary', danger: 'dangerPrimary', dangerSecondary: 'dangerSecondary', ghost: 'ghost', link: 'link', }; const sizeClassMap: Record = { sm: 'compact', md: undefined, lg: undefined, }; export const Button = React.forwardRef( ( { variant = 'primary', size = 'md', loading = false, icon, fitContainer = false, fitContent = false, square = false, children, className, disabled, type = 'button', onClick, ...props }, ref, ) => { const variantClass = variantClassMap[variant] ?? 'primary'; const sizeClass = sizeClassMap[size]; const handleClick = (event: React.MouseEvent) => { if (loading) { event.preventDefault(); return; } onClick?.(event); }; return ( ); }, ); Button.displayName = 'Button';