"use client"; import React, { Children, useState, type ReactNode } from "react"; import { cn } from "@/lib/utils"; import { Copy, Check, ChevronRight } from "lucide-react"; interface CodeShowcaseTab { label: string; icon: ReactNode; filename: string; } interface CodeShowcaseProps { tabs: CodeShowcaseTab[]; children: ReactNode; } /* Hide the entire fumadocs toolbar (icons + figcaption) and strip default spacing/rounding */ const codeOverrides = "[&_figure]:!m-0 [&_figure]:!border-0 [&_figure]:!rounded-none [&_figure>div:first-child]:!hidden [&_pre]:!rounded-none [&_pre]:!border-0"; export function CodeShowcase({ tabs, children }: CodeShowcaseProps) { const [activeIndex, setActiveIndex] = useState(0); const [copied, setCopied] = useState(false); const panels = Children.toArray(children); const handleCopy = () => { const codeEl = document.querySelector( `[data-code-panel="${activeIndex}"] pre code`, ); if (codeEl) { navigator.clipboard.writeText(codeEl.textContent || ""); setCopied(true); setTimeout(() => setCopied(false), 2000); } }; return (
{/* Desktop */}
{/* Title bar */}
{tabs[activeIndex]?.filename}
{/* Content */}
{/* Sidebar */}
{tabs.map((tab, i) => ( ))}
{/* Code panel */}
{panels.map((panel, i) => (
{panel}
))}
{/* Mobile */}
{/* Title bar */}
{tabs[activeIndex]?.filename}
{/* Tab bar */}
{tabs.map((tab, i) => ( ))}
{/* Code */}
{panels.map((panel, i) => (
{panel}
))}
); } export function CodePanel({ children }: { children: ReactNode }) { return <>{children}; }