Sabil UI

Search documentation

Search for a command to run...

Components

Button Group

A container that groups related buttons together with consistent styling.

Installation#

  1. Install the dependencies

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

    components/ui/button-group.tsx
    import { cva, type VariantProps } from "class-variance-authority"import { cn } from "cn"import { Slot } from "radix-ui"import { Separator } from "@/components/ui/separator"const buttonGroupVariants = cva(  "group/button-group flex w-fit items-stretch *:focus-visible:relative *:focus-visible:z-10 has-[>[data-slot=button-group]]:gap-2 has-[select[aria-hidden=true]:last-child]:[&>[data-slot=select-trigger]:last-of-type]:rounded-r-lg [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1",  {    variants: {      orientation: {        horizontal:          "[&>*:not(:first-child)]:rounded-l-none [&>*:not(:first-child)]:border-l-0 [&>*:not(:last-child)]:rounded-r-none [&>[data-slot]:not(:has(~[data-slot]))]:rounded-r-lg!",        vertical:          "flex-col [&>*:not(:first-child)]:rounded-t-none [&>*:not(:first-child)]:border-t-0 [&>*:not(:last-child)]:rounded-b-none [&>[data-slot]:not(:has(~[data-slot]))]:rounded-b-lg!",      },    },    defaultVariants: {      orientation: "horizontal",    },  })function ButtonGroup({  className,  orientation,  ...props}: React.ComponentProps<"div"> & VariantProps<typeof buttonGroupVariants>) {  return (    <div      role="group"      data-slot="button-group"      data-orientation={orientation}      className={cn(buttonGroupVariants({ orientation }), className)}      {...props}    />  )}function ButtonGroupText({  className,  asChild = false,  ...props}: React.ComponentProps<"div"> & {  asChild?: boolean}) {  const Comp = asChild ? Slot.Root : "div"  return (    <Comp      className={cn(        "flex items-center gap-2 rounded-lg border bg-muted px-2.5 text-sm font-medium [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4",        className      )}      {...props}    />  )}function ButtonGroupSeparator({  className,  orientation = "vertical",  ...props}: React.ComponentProps<typeof Separator>) {  return (    <Separator      data-slot="button-group-separator"      orientation={orientation}      className={cn(        "relative self-stretch bg-input data-horizontal:mx-px data-horizontal:w-auto data-vertical:my-px data-vertical:h-auto",        className      )}      {...props}    />  )}export {  ButtonGroup,  ButtonGroupSeparator,  ButtonGroupText,  buttonGroupVariants,}
  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 { ButtonGroup, ButtonGroupSeparator, ButtonGroupText } from "@/components/ui/button-group"

Examples#

Dropdown

Input

Input Group

Nested

Orientation

Popover

Select

Separator

Size

Split