| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- import { mergeProps } from '@base-ui/react/merge-props';
- import { useRender } from '@base-ui/react/use-render';
- import { cva, type VariantProps } from 'class-variance-authority';
- 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-lg flex w-fit items-stretch *:focus-visible:relative *:focus-visible:z-10 [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1",
- {
- variants: {
- orientation: {
- horizontal:
- '[&>[data-slot]:not(:has(~[data-slot]))]:rounded-r-lg! *:data-slot:rounded-r-none [&>[data-slot]~[data-slot]]:rounded-l-none [&>[data-slot]~[data-slot]]:border-l-0',
- vertical:
- '[&>[data-slot]:not(:has(~[data-slot]))]:rounded-b-lg! flex-col *:data-slot:rounded-b-none [&>[data-slot]~[data-slot]]:rounded-t-none [&>[data-slot]~[data-slot]]:border-t-0',
- },
- },
- 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,
- render,
- ...props
- }: useRender.ComponentProps<'div'>) {
- return useRender({
- defaultTagName: 'div',
- props: mergeProps<'div'>(
- {
- className: cn(
- "bg-muted gap-2 rounded-lg border px-2.5 text-sm font-medium [&_svg:not([class*='size-'])]:size-4 flex items-center [&_svg]:pointer-events-none",
- className,
- ),
- },
- props,
- ),
- render,
- state: {
- slot: 'button-group-text',
- },
- });
- }
- 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-horizontal:mx-px data-horizontal:w-auto data-vertical:my-px data-vertical:h-auto',
- className,
- )}
- {...props}
- />
- );
- }
- export {
- ButtonGroup,
- ButtonGroupSeparator,
- ButtonGroupText,
- buttonGroupVariants,
- };
|