"use client"; import { useState, useRef, useEffect } from "react"; import { ReactNode } from "react"; type Action = { label: string; onClick: () => void; variant?: "default" | "danger" | "success"; disabled?: boolean; }; type AdminActionMenuProps = { actions: Action[]; triggerLabel?: string; className?: string; }; export default function AdminActionMenu({ actions, triggerLabel, className = "" }: AdminActionMenuProps) { const [open, setOpen] = useState(false); const menuRef = useRef(null); useEffect(() => { const handleClickOutside = (e: MouseEvent) => { if (menuRef.current && !menuRef.current.contains(e.target as Node)) { setOpen(false); } }; document.addEventListener("mousedown", handleClickOutside); return () => document.removeEventListener("mousedown", handleClickOutside); }, []); const handleAction = (action: Action) => { action.onClick(); setOpen(false); }; return (
{open && ( <>
setOpen(false)} />
{actions.map((action, i) => ( ))}
)}
); } // Simple inline action button type AdminActionButtonProps = { children: ReactNode; onClick: () => void; variant?: "default" | "primary" | "danger"; size?: "sm" | "md"; className?: string; }; export function AdminActionButton({ children, onClick, variant = "default", size = "sm", className = "" }: AdminActionButtonProps) { const baseClasses = "rounded-lg font-medium transition-colors"; const sizeClasses = size === "sm" ? "px-3 py-1.5 text-xs" : "px-4 py-2 text-sm"; const variantClasses = { default: "text-[var(--admin-text-secondary)] hover:text-[var(--admin-text-primary)] hover:bg-[var(--admin-bg-subtle)]", primary: "bg-[var(--admin-accent)] text-white hover:opacity-90", danger: "text-[var(--admin-danger)] hover:bg-[var(--admin-danger-light)]", }; return ( ); }