Button

Accessible React button with variants, sizes, and full keyboard support — install from the VLLNT UI registry with the shadcn CLI.

Report a bug

The Button is the primary interactive control in VLLNT UI — an accessible, keyboard-navigable React component with variants (primary, secondary, outline, ghost, destructive, link) and sizes. It ships as a machine-readable registry entry, so you install the source directly into your app and own it.

Preview

Switch between light and dark to inspect the embedded Storybook preview.

Installation

Add Button to your project with the shadcn CLI. The source lands in your codebase, ready to adapt:

pnpm dlx shadcn@latest add https://ui.vllnt.ai/r/button.json

Source

import { Slot } from "@radix-ui/react-slot"; import { cva, type VariantProps } from "class-variance-authority"; import { cn } from "../../lib/utils"; const buttonVariants = cva( "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", { defaultVariants: { size: "default", variant: "default", }, variants: { size: { default: "h-10 px-4 py-2", icon: "size-10", lg: "h-11 rounded-md px-8", sm: "h-9 rounded-md px-3", }, variant: { default: "bg-primary text-primary-foreground hover:bg-primary/90", destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90", ghost: "hover:bg-accent hover:text-accent-foreground", link: "text-primary underline-offset-4 hover:underline", outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground", secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80", }, }, }, ); export type ButtonProps = { asChild?: boolean; } & React.ButtonHTMLAttributes<HTMLButtonElement> & VariantProps<typeof buttonVariants>; const Button = ({ asChild = false, className, ref: reference, size, variant, ...props }: ButtonProps & { ref?: React.Ref<HTMLButtonElement> }) => { const Comp = asChild ? Slot : "button"; return ( <Comp className={cn(buttonVariants({ className, size, variant }))} ref={reference} {...props} /> ); }; Button.displayName = "Button"; export { Button, buttonVariants };

Stories

Explore every variant and state in the interactive Storybook:

Preview

Switch between light and dark to inspect the embedded Storybook preview.

Dependencies

  • @vllnt/ui@^0.3.0