import { AnchorHTMLAttributes, ButtonHTMLAttributes, ReactNode } from 'react'; import { type VariantProps } from 'tailwind-variants'; import { ResponsiveVariants } from '../../types/responsive-variants.types.js'; import { IconProps } from '../icon/index.js'; import { styles } from './button.styles.js'; type Variants = VariantProps; export type ButtonRef = HTMLButtonElement & HTMLAnchorElement & HTMLSpanElement & HTMLDivElement; export type ButtonProps = { /** * Fit button width to its parent width. * @default false */ block?: ResponsiveVariants; /** * Badge body content */ children?: ReactNode; /** * Places an icon within the button, after the button’s text */ iconAfter?: (props: IconProps) => JSX.Element; /** * Places an icon within the button, before the button’s text */ iconBefore?: (props: IconProps) => JSX.Element; /** * The color for the icon. * * Defaults to the current text color. */ iconColor?: IconProps['color']; /** * The look of the icon * @default filled */ iconLook?: IconProps['look']; /** * The size of the icon * * Defaults to system size depending on size of the button */ iconSize?: IconProps['size']; /** * When true, children will use flex justify-between * @default false */ justify?: ResponsiveVariants; /** * Button look * @default hero */ look?: ResponsiveVariants; /** * Removes horizontal padding from the 'link' look button * @default false */ removeLinkPadding?: boolean; /** * Size of the button * @default medium */ size?: ResponsiveVariants; /** * Removes background colour and adjusts text colour. */ soft?: ResponsiveVariants; /** * Tag to render * @default button */ tag?: keyof Pick; } & ButtonHTMLAttributes & AnchorHTMLAttributes;