Sabil UI

Search documentation

Search for a command to run...

Components

Button

Displays a button or a component that looks like a button.

Installation#

  1. Install the dependencies

    npm install class-variance-authority cn radix-ui
  2. Copy the source into your project

    components/ui/button.tsx
    import * as React from "react"import { cva, type VariantProps } from "class-variance-authority"import { cn } from "cn"import { Slot } from "radix-ui"const buttonVariants = cva(  "group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium tracking-[-0.01em] whitespace-nowrap transition-[transform,opacity,background-color,box-shadow,color] duration-150 ease-out outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:scale-[0.97] disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",  {    variants: {      variant: {        default:          "bg-primary bg-clip-border text-primary-foreground surface-primary hover:brightness-[1.06]",        outline:          "bg-clip-border text-foreground surface-raised hover:[--raised:color-mix(in_oklab,var(--background),var(--foreground)_4%)] aria-expanded:[--raised:color-mix(in_oklab,var(--background),var(--foreground)_4%)] dark:hover:[--raised:color-mix(in_oklab,var(--muted),white_6%)]",        secondary:          "bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",        ghost:          "hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",        destructive:          "bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",        link: "text-primary underline-offset-4 hover:underline",      },      size: {        default:          "h-10 gap-2 px-4 pb-0.5 has-data-[icon=inline-end]:pr-3.5 has-data-[icon=inline-start]:pl-3.5",        xs: "h-7 gap-1 rounded-md px-2.5 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2 [&_svg:not([class*='size-'])]:size-3",        sm: "h-8 gap-1.5 rounded-md px-3 text-[13px] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-2.5 has-data-[icon=inline-start]:pl-2.5 [&_svg:not([class*='size-'])]:size-3.5",        lg: "h-11 gap-2 px-5 pb-0.5 has-data-[icon=inline-end]:pr-4 has-data-[icon=inline-start]:pl-4",        icon: "size-10",        "icon-xs":          "size-7 rounded-md in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3",        "icon-sm":          "size-8 rounded-md in-data-[slot=button-group]:rounded-lg",        "icon-lg": "size-11",      },    },    defaultVariants: {      variant: "default",      size: "default",    },  })function Button({  className,  variant = "default",  size = "default",  asChild = false,  ...props}: React.ComponentProps<"button"> &  VariantProps<typeof buttonVariants> & {    asChild?: boolean  }) {  const Comp = asChild ? Slot.Root : "button"  return (    <Comp      data-slot="button"      data-variant={variant}      data-size={size}      className={cn(buttonVariants({ variant, size, className }))}      {...props}    />  )}export { Button, buttonVariants }
    
  3. Make sure the foundation is in place

    Components read their colors, radius and surfaces from the tokens in app/globals.css. See Theming.

Usage#

import { Button } from "@/components/ui/button"

Examples#

Callout

A primary and a secondary action side by side, in a tinted banner.

A new model is available.

Aschild

Default

Destructive

Ghost

Icon

Outline

Rounded

Secondary

Size

Spinner

With Icon