import { tv, cn } from "tailwind-variants";
import type { VariantProps } from "tailwind-variants";
import { Button as ButtonPrimitive } from "@base-ui/react/button";
import type { ComponentProps } from "react";
import { mergeBaseUIClassName } from "@kuzenbo/core/utils/merge-base-ui-class-name";
import { useComponentSize } from "@kuzenbo/core/provider";
import {
resolveFieldHeightClassBySize,
resolveFieldTextClassBySize,
} from "@kuzenbo/core/size";
const buttonVariants = tv({
base: cn(
"inline-flex items-center justify-center",
"rounded-[var(--kb-radius)]",
"font-medium transition-colors",
"focus-visible:outline-none focus-visible:ring-2",
"disabled:pointer-events-none disabled:opacity-50"
),
variants: {
variant: {
default: "bg-primary text-primary-foreground hover:bg-primary/90",
outline: "border border-border bg-background hover:bg-accent",
ghost: "hover:bg-accent hover:text-accent-foreground",
danger: "bg-danger text-danger-foreground hover:bg-danger/90",
},
size: {
sm: [
resolveFieldHeightClassBySize("sm"),
resolveFieldTextClassBySize("sm"),
"px-3",
],
md: [
resolveFieldHeightClassBySize("md"),
resolveFieldTextClassBySize("md"),
"px-4",
],
lg: [
resolveFieldHeightClassBySize("lg"),
resolveFieldTextClassBySize("lg"),
"px-5",
],
},
},
defaultVariants: {
variant: "default",
size: "md",
},
});
export type ButtonProps = ComponentProps<typeof ButtonPrimitive> &
VariantProps<typeof buttonVariants>;
export function Button({ variant, size, className, ...props }: ButtonProps) {
const resolvedSize = useComponentSize(size);
return (
<ButtonPrimitive
className={mergeBaseUIClassName(
buttonVariants({ variant, size: resolvedSize }),
className
)}
data-size={resolvedSize}
{...props}
/>
);
}