import React, { DetailedHTMLProps, ButtonHTMLAttributes, ReactNode, forwardRef, Ref, } from "react"; import classNames from "./lib/classNames"; import Spinner from "./Spinner"; export interface CustomButtonProps { variant?: "default" | "primary" | "danger" | "warning" | "success"; size?: "default" | "small" | "large"; iconPosition?: "left" | "right"; shape?: "square" | "round"; loading?: boolean; icon?: ReactNode; block?: boolean; } export interface ButtonProps extends DetailedHTMLProps< ButtonHTMLAttributes, HTMLButtonElement >, CustomButtonProps {} export function getButtonStyles({ variant = "default", shape = "square", size = "default", block = false, }: CustomButtonProps) { const buttonStyles = { base: "leading-none inline-flex items-center justify-center border font-medium focus:outline-none focus:ring-2 focus:ring-offset-2 transition disabled:opacity-50 disabled:pointer-events-none", block: "w-full", size: { default: { base: "px-3.5 text-base h-[42px] space-x-2.5", shape: { square: "rounded-lg", round: "rounded-full", }, }, small: { base: "px-2.5 text-sm h-[35px] space-x-2", shape: { square: "rounded-md", round: "rounded-full", }, }, large: { base: "px-4 text-lg h-[50px] space-x-3", shape: { square: "rounded-lg", round: "rounded-full", }, }, }, variant: { default: "border-gray-300 shadow-sm text-gray-700 bg-white hover:bg-gray-50 focus:ring-gray-300", primary: "border-indigo-600 shadow-sm shadow-indigo-300 bg-indigo-600 text-white hover:bg-indigo-700 hover:border-indigo-700 focus:ring-indigo-400", danger: "border-red-600 shadow-sm shadow-red-300 bg-red-600 text-white hover:bg-red-700 hover:border-red-700 focus:ring-red-400", warning: "border-yellow-400 shadow-sm shadow-yellow-200 bg-yellow-400 hover:bg-yellow-500 hover:border-yellow-500 focus:ring-yellow-500", success: "border-green-600 shadow-sm shadow-green-300 bg-green-600 text-white hover:bg-green-700 hover:border-green-700 focus:ring-green-400", }, }; return classNames( buttonStyles.size[size].shape[shape], buttonStyles.variant[variant], buttonStyles.size[size].base, block && buttonStyles.block, buttonStyles.base ); } function Button( { iconPosition = "right", className, children, disabled, variant, loading, shape, block, size, icon, ...rest }: ButtonProps, ref: Ref ) { return ( ); } export default forwardRef(Button);