// Copyright 2024, Command Line Inc. // SPDX-License-Identifier: Apache-2.0 import clsx from "clsx"; import { Children, forwardRef, memo, ReactNode, useImperativeHandle, useRef } from "react"; import "./button.less"; interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> { className?: string; children?: ReactNode; target?: string; source?: string; } const Button = memo( forwardRef<HTMLButtonElement, ButtonProps>( ({ children, disabled, source, className = "", ...props }: ButtonProps, ref) => { const btnRef = useRef<HTMLButtonElement>(null); useImperativeHandle(ref, () => btnRef.current as HTMLButtonElement); const childrenArray = Children.toArray(children); // Check if the className contains any of the categories: solid, outlined, or ghost const containsButtonCategory = /(solid|outline|ghost)/.test(className); // If no category is present, default to 'solid' const categoryClassName = containsButtonCategory ? className : `solid ${className}`; // Check if the className contains any of the color options: green, grey, red, or yellow const containsColor = /(green|grey|red|yellow)/.test(categoryClassName); // If no color is present, default to 'green' const finalClassName = containsColor ? categoryClassName : `green ${categoryClassName}`; return ( <button ref={btnRef} tabIndex={disabled ? -1 : 0} className={clsx("button", finalClassName)} disabled={disabled} {...props} > {childrenArray} </button> ); } ) ); export { Button };