"use client"; import { useEffect, useRef, useState, type ReactNode } from "react"; /** A vertical "⋮" trigger that opens a small popup menu. Closes on outside click, Escape, or any * click inside the popup (so menu items don't each need to manage it). Children are the items — * use . */ export function KebabMenu({ label = "Actions", children }: { label?: string; children: ReactNode }) { const [open, setOpen] = useState(false); const ref = useRef(null); useEffect(() => { if (!open) return; function onDoc(e: MouseEvent) { if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false); } function onKey(e: KeyboardEvent) { if (e.key === "Escape") setOpen(false); } document.addEventListener("mousedown", onDoc); document.addEventListener("keydown", onKey); return () => { document.removeEventListener("mousedown", onDoc); document.removeEventListener("keydown", onKey); }; }, [open]); return (
{open ? (
setOpen(false)}> {children}
) : null}
); }