React + MotionOverlays

Menu contextuel

Un menu compact en verre dépoli qui s’ouvre depuis un bouton « plus », avec copier, partager et supprimer.

Réglages

20px

Code

import { useState } from "react";
import { AnimatePresence, motion } from "framer-motion";
import { ChevronRight, Copy, Link2, MoreHorizontal, Share2, Trash2 } from "lucide-react";

const spring = { type: "spring" as const, stiffness: 300, damping: 30 };

const ITEMS = [
  { icon: Copy, label: "Copier" },
  { icon: Link2, label: "Copier le lien" },
  { icon: Share2, label: "Partager" },
  { icon: Trash2, label: "Supprimer" },
];

interface ContextMenuProps {
  blur?: number;
}

export default function ContextMenu({ blur = 20 }: ContextMenuProps) {
  const [open, setOpen] = useState(false);

  return (
    <div className="relative text-[#1d1d1f] dark:text-[#f5f5f7]">
      <button
        type="button"
        aria-label="Plus d’actions"
        aria-expanded={open}
        onClick={() => setOpen((o) => !o)}
        className="grid h-12 w-12 place-items-center rounded-full bg-white dark:bg-[#1c1c1e] shadow-[0_1px_2px_rgba(0,0,0,0.03),0_8px_28px_rgba(0,0,0,0.05)]"
      >
        <MoreHorizontal />
      </button>
      <AnimatePresence>
        {open && (
          <motion.div
            initial={{ opacity: 0, scale: 0.9, y: -6 }}
            animate={{ opacity: 1, scale: 1, y: 0 }}
            exit={{ opacity: 0, scale: 0.9 }}
            transition={spring}
            className="absolute left-1/2 top-14 z-10 w-48 -translate-x-1/2 rounded-2xl border border-black/10 bg-white/70 p-1.5 shadow-[0_4px_12px_rgba(0,0,0,0.04),0_24px_60px_rgba(0,0,0,0.1)] dark:border-white/10 dark:bg-black/70"
            style={{ backdropFilter: `blur(${blur}px)` }}
          >
            {ITEMS.map(({ icon: Icon, label }) => (
              <button
                key={label}
                type="button"
                className="flex w-full items-center gap-2 rounded-xl px-3 py-2 text-sm hover:bg-black/5 dark:hover:bg-white/10"
              >
                <Icon className="h-4 w-4" />
                {label}
                <ChevronRight className="ml-auto h-3 w-3" />
              </button>
            ))}
          </motion.div>
        )}
      </AnimatePresence>
    </div>
  );
}

Prompt pour l’IA

Collez-le dans ChatGPT, Claude ou Cursor : le bloc sera adapté à votre projet avec ces réglages, même sans React.

Plus dans Overlays

Où l’utiliser

Le bouton à trois points cache des actions utiles mais pas permanentes : copier le lien d’un document, partager une photo d’une galerie, supprimer un brouillon dans un CMS. Le fond en verre flouté le garde léger, comme sur Mac. Ce menu contextuel en React va bien aux listes de fichiers, aux cartes et aux tableaux.

Placez les actions destructives comme « Supprimer » en dernier et pensez à les colorer en rouge. Augmentez le flou si le menu s’ouvre sur des images chargées, baissez-le sur un fond uni. Plus de six entrées, c’est souvent trop.