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