in packages/dashboard-app/src/components/ui/terminal.tsx [25:84]
function Terminal({ title, tabNames, className, children }: TerminalProps) {
const [activeTab, setActiveTab] = useState(0);
const multipleTabs = tabNames?.length ? tabNames.length > 1 : false;
return (
<div
className={cn(
"place-self-center border rounded-lg border-zinc-800 w-full max-w-lg relative overflow-hidden select-none",
className,
)}
>
<div className="w-full h-auto rounded-lg flex flex-col bg-[#161A1D]">
<div
className={cn(
"flex flex-row items-center gap-1.5 p-2 bg-zinc-700 rounded-t relative",
title && "h-7",
)}
>
<div className="w-2.5 h-2.5 rounded-full bg-red-500" />
<div className="w-2.5 h-2.5 rounded-full bg-yellow-500" />
<div className="w-2.5 h-2.5 rounded-full bg-green-500" />
{title && (
<div className="absolute left-1/2 top-1/2 transform -translate-x-1/2 -translate-y-1/2">
<span className="text-xs text-zinc-200 font-mono cursor-default">
{title}
</span>
</div>
)}
</div>
{tabNames && (
<div
className="grid border-b-zinc-900 border-b-2 gap-0.5"
style={{
gridTemplateColumns: `repeat(${tabNames.length}, minmax(0, 1fr))`,
}}
>
{tabNames.map((name, index) => (
<div
key={`${name}-${index}`}
className={cn(
"text-zinc-400 text-center p-1 transition-colors font-mono cursor-default text-[0.675rem]",
multipleTabs &&
"hover:bg-zinc-800 hover:border-transparent cursor-pointer border-t border-zinc-950",
activeTab == index &&
"bg-zinc-700 hover:bg-zinc-700 border-transparent text-zinc-100",
)}
onClick={() => setActiveTab(index)}
>
{name}
</div>
))}
</div>
)}
<div className="p-2">
{Array.isArray(children) ? children[activeTab] : children}
</div>
</div>
</div>
);
}