"use client"; import Link from "next/link"; import { ChevronDown } from "lucide-react"; import { useEffect, useRef, useState } from "react"; import type { ReferenceVersion } from "@/lib/reference-items"; export type { ReferenceVersion }; export type ReferenceVersionOption = { version: ReferenceVersion; href: string; }; // The selector now switches between SDKs, not just React versions. Labels // are user-facing; keep them in sync with REFERENCE_VERSIONS. const VERSION_LABELS: Record = { v2: "React v2", v1: "React v1", core: "Core (TypeScript)", }; export function ReferenceVersionSelector({ activeVersion, options, }: { activeVersion: ReferenceVersion; options: ReferenceVersionOption[]; }) { const [open, setOpen] = useState(false); const panelRef = useRef(null); const buttonRef = useRef(null); useEffect(() => { if (!open) return; const handleClick = (event: MouseEvent) => { const target = event.target instanceof Node ? event.target : null; if (!target) return; if ( panelRef.current?.contains(target) || buttonRef.current?.contains(target) ) { return; } setOpen(false); }; const handleKey = (event: KeyboardEvent) => { if (event.key === "Escape") setOpen(false); }; document.addEventListener("mousedown", handleClick); document.addEventListener("keydown", handleKey); return () => { document.removeEventListener("mousedown", handleClick); document.removeEventListener("keydown", handleKey); }; }, [open]); return (
{open && (
{options.map(({ version, href }) => { const active = version === activeVersion; return ( setOpen(false)} className={[ "shell-docs-radius-control flex w-full items-center gap-2 px-2 py-1.5 text-[13px] transition-colors", active ? "bg-[var(--accent-dim)] text-[var(--accent)]" : "text-[var(--text-secondary)] hover:bg-[var(--bg-elevated)] hover:text-[var(--text)]", ].join(" ")} > {VERSION_LABELS[version]} ); })}
)}
); }