diff --git a/src/ui/Button.tsx b/src/ui/Button.tsx index 5fbf61890..412ac0688 100644 --- a/src/ui/Button.tsx +++ b/src/ui/Button.tsx @@ -30,10 +30,7 @@ type ButtonOwnProps = { type ButtonProps = ButtonOwnProps & - Omit< - React.ComponentPropsWithoutRef, - keyof ButtonOwnProps - > + Omit, keyof ButtonOwnProps> type ButtonComponent = ( props: ButtonProps, @@ -102,16 +99,22 @@ function getDefaultRounded(size: ButtonSize): ButtonRounded { return 'lg' } -export const Button: ButtonComponent = ({ - as, - children, - variant = 'primary', - color = 'blue', - size, - rounded, - className, - ...props -}) => { +type ButtonInnerProps = ButtonOwnProps & Record + +export const Button: ButtonComponent = React.forwardRef< + HTMLElement, + ButtonInnerProps +>(function Button(props, ref) { + const { + as, + children, + variant = 'primary', + color = 'blue', + size, + rounded, + className, + ...rest + } = props as ButtonOwnProps & Record const Component = as || 'button' const resolvedSize = size ?? getDefaultSize(variant) const resolvedRounded = rounded ?? getDefaultRounded(resolvedSize) @@ -126,6 +129,7 @@ export const Button: ButtonComponent = ({ return React.createElement( Component, { + ref, className: twMerge( baseStyles, variantStyles[variant], @@ -134,8 +138,8 @@ export const Button: ButtonComponent = ({ colorStyles, className, ), - ...props, + ...rest, }, children, ) -} +}) as unknown as ButtonComponent