summaryrefslogtreecommitdiff
path: root/apps/web/src/components/ui/split-button.tsx
blob: dfc4cdfe83e0121856409b542c6afaa855628692 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import { Button, type ButtonProps } from "@/components/ui/button";
import { Separator } from "@/components/ui/separator";
import { type ReactNode, forwardRef } from "react";
import { cn } from "@/utils/ui";

interface SplitButtonProps {
	children: ReactNode;
	className?: string;
}

interface SplitButtonSideProps extends Omit<ButtonProps, "variant" | "size"> {
	children: ReactNode;
}

const SplitButton = forwardRef<HTMLDivElement, SplitButtonProps>(
	({ children, className, ...props }, ref) => {
		return (
			<div
				ref={ref}
				className={cn(
					"border-input bg-accent inline-flex h-7 overflow-hidden rounded-lg border",
					className,
				)}
				{...props}
			>
				{children}
			</div>
		);
	},
);
SplitButton.displayName = "SplitButton";

const SplitButtonSide = forwardRef<
	HTMLButtonElement,
	SplitButtonSideProps & { paddingClass: string }
>(({ children, className, paddingClass, onClick, ...props }, ref) => {
	return (
		<Button
			ref={ref}
			variant="text"
			className={cn(
				"bg-accent disabled:text-muted-foreground h-full gap-0 rounded-none border-0 font-normal !opacity-100",
				onClick
					? "hover:bg-foreground/10 cursor-pointer hover:opacity-100"
					: "cursor-default select-text",
				paddingClass,
				className,
			)}
			onClick={onClick}
			{...props}
		>
			{typeof children === "string" ? (
				<span className="cursor-text font-normal">{children}</span>
			) : (
				children
			)}
		</Button>
	);
});
SplitButtonSide.displayName = "SplitButtonSide";

const SplitButtonLeft = forwardRef<HTMLButtonElement, SplitButtonSideProps>(
	({ ...props }, ref) => {
		return <SplitButtonSide ref={ref} paddingClass="pl-3 pr-2" {...props} />;
	},
);
SplitButtonLeft.displayName = "SplitButtonLeft";

const SplitButtonRight = forwardRef<HTMLButtonElement, SplitButtonSideProps>(
	({ ...props }, ref) => {
		return <SplitButtonSide ref={ref} paddingClass="pl-2 pr-3" {...props} />;
	},
);
SplitButtonRight.displayName = "SplitButtonRight";

const SplitButtonSeparator = forwardRef<HTMLDivElement, { className?: string }>(
	({ className, ...props }, ref) => {
		return (
			<Separator
				ref={ref}
				orientation="vertical"
				className={cn("bg-foreground/15 h-full", className)}
				{...props}
			/>
		);
	},
);
SplitButtonSeparator.displayName = "SplitButtonSeparator";

export { SplitButton, SplitButtonLeft, SplitButtonRight, SplitButtonSeparator };