import { useState } from "react"; import { Check, Globe } from "lucide-react"; import { LANGUAGES, type LangCode } from "../i18n"; import { PopoverItem, PopoverSurface } from "./ui/AnchoredPopover"; import { useAnchoredPopover } from "./ui/anchoredPopoverHooks"; // Compact language picker (globe + current code). Presentational: the parent decides what // changing the language does (set it; persist server-side when signed in). // // Two variants, now one implementation on the R8 popover platform: "header" opens below the pill // (used on the landing page and the setup wizard) and "rail" is an icon-only button in the left // nav's bottom cluster whose menu opens to the RIGHT, bottom-aligned. Both used to hand-roll their // own anchoring, and the header one also opened on hover — dropped on purpose: the platform focuses // the first item when a menu opens, so a hover-open would yank focus off whatever the user was doing. export default function LanguageSwitcher({ value, onChange, align = "right", variant = "header", }: { value: LangCode; onChange: (code: LangCode) => void; align?: "left" | "right"; variant?: "header" | "rail"; }) { const [open, setOpen] = useState(false); const currentIdx = Math.max( 0, LANGUAGES.findIndex((l) => l.code === value), ); const current = LANGUAGES.find((l) => l.code === value) ?? LANGUAGES[0]; const rail = variant === "rail"; const pop = useAnchoredPopover({ open, onOpenChange: setOpen, placement: rail ? "right-end" : align === "right" ? "bottom-end" : "bottom-start", offset: rail ? 8 : 4, // Single choice: opening lands on the language already in use. selectedIndex: currentIdx, }); return ( <> {LANGUAGES.map((l) => ( { onChange(l.code); setOpen(false); }} label={l.label} className="w-full flex items-center justify-between gap-2 text-sm px-2 py-2 rounded-lg text-muted outline-hidden transition hover:text-fg" > {l.label} {l.code === value && } ))} ); }