// Copyright 2024, Command Line Inc. // SPDX-License-Identifier: Apache-2.0 import clsx from "clsx"; import { forwardRef, memo, ReactNode, useImperativeHandle, useRef } from "react"; import "./button.scss"; interface ButtonProps extends React.ButtonHTMLAttributes { className?: string; children?: ReactNode; as?: keyof JSX.IntrinsicElements | React.ComponentType; } const Button = memo( forwardRef( ({ children, disabled, className = "", as: Component = "button", ...props }: ButtonProps, ref) => { const btnRef = useRef(null); useImperativeHandle(ref, () => btnRef.current as HTMLButtonElement); // 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 ( {children} ); } ) ); Button.displayName = "Button"; export { Button };