summaryrefslogtreecommitdiff
path: root/apps/web/src/components/editor/panels/panel-base-view.tsx
blob: eec063ec33597f1ae5849d30c41816efb98eb6af (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
import { ScrollArea } from "@/components/ui/scroll-area";
import { Separator } from "@/components/ui/separator";
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
import { cn } from "@/utils/ui";

interface PanelBaseViewProps {
	children?: React.ReactNode;
	defaultTab?: string;
	value?: string;
	onValueChange?: (value: string) => void;
	tabs?: {
		value: string;
		label: string;
		icon?: React.ReactNode;
		content: React.ReactNode;
	}[];
	className?: string;
	ref?: React.Ref<HTMLDivElement>;
}

function ViewContent({
	children,
	className,
}: {
	children: React.ReactNode;
	className?: string;
}) {
	return (
		<ScrollArea className="flex-1">
			<div className={cn("p-5", className)}>{children}</div>
		</ScrollArea>
	);
}

export function PanelBaseView({
	children,
	defaultTab,
	value,
	onValueChange,
	tabs,
	className = "",
	ref,
}: PanelBaseViewProps) {
	return (
		<div className={cn("flex h-full flex-col", className)} ref={ref}>
			{!tabs || tabs.length === 0 ? (
				<ViewContent className={className}>{children}</ViewContent>
			) : (
				<Tabs
					defaultValue={defaultTab}
					value={value}
					onValueChange={onValueChange}
					className="flex h-full flex-col"
				>
					<div className="bg-panel sticky top-0 z-10">
						<div className="px-3 pt-3 pb-0">
							<TabsList>
								{tabs.map((tab) => (
									<TabsTrigger key={tab.value} value={tab.value}>
										{tab.icon ? (
											<span className="mr-1 inline-flex items-center">
												{tab.icon}
											</span>
										) : null}
										{tab.label}
									</TabsTrigger>
								))}
							</TabsList>
						</div>
						<Separator className="mt-3" />
					</div>
					{tabs.map((tab) => (
						<TabsContent
							key={tab.value}
							value={tab.value}
							className="mt-0 flex min-h-0 flex-1 flex-col"
						>
							<ViewContent className={className}>{tab.content}</ViewContent>
						</TabsContent>
					))}
				</Tabs>
			)}
		</div>
	);
}