Files
d1a2f309-b9fe-4acd-a8cc-cf0…/research/replit/button-group.md
2026-04-28 15:30:34 +03:00

2.2 KiB

import { Slot } from "@radix-ui/react-slot" import { cva, type VariantProps } from "class-variance-authority"

import { cn } from "@/lib/utils" import { Separator } from "@/components/ui/separator"

const buttonGroupVariants = cva( "flex w-fit items-stretch has-[>[data-slot=button-group]]:gap-2 [&>]:focus-visible:relative [&>]:focus-visible:z-10 has-[select[aria-hidden=true]:last-child]:[&>[data-slot=select-trigger]:last-of-type]:rounded-r-md [&>[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", vertical: "flex-col [&>:not(:first-child)]:rounded-t-none [&>:not(:first-child)]:border-t-0 [&>:not(:last-child)]:rounded-b-none", }, }, defaultVariants: { orientation: "horizontal", }, } )

function ButtonGroup({ className, orientation, ...props }: React.ComponentProps<"div"> & VariantProps) { 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 : "div"

return ( <Comp className={cn( "bg-muted shadow-xs flex items-center gap-2 rounded-md border px-4 text-sm font-medium [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none", className )} {...props} /> ) }

function ButtonGroupSeparator({ className, orientation = "vertical", ...props }: React.ComponentProps) { return ( <Separator data-slot="button-group-separator" orientation={orientation} className={cn( "bg-input relative !m-0 self-stretch data-[orientation=vertical]:h-auto", className )} {...props} /> ) }

export { ButtonGroup, ButtonGroupSeparator, ButtonGroupText, buttonGroupVariants, }