React + MotionOverlays

Kontextmenü

Ein kompaktes Milchglas-Menü, das aus einem „Mehr“-Button aufklappt, mit Aktionen wie Kopieren, Teilen und Löschen.

Einstellungen

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: "Kopieren" },
  { icon: Link2, label: "Link kopieren" },
  { icon: Share2, label: "Teilen" },
  { icon: Trash2, label: "Löschen" },
];

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="Weitere Aktionen"
        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 für KI

Füg ihn in ChatGPT, Claude oder Cursor ein und der Baustein wird mit diesen Einstellungen an dein Projekt angepasst, auch ohne React.

Mehr aus Overlays

Wofür du ihn nutzen kannst

Der Drei-Punkte-Button versteckt Aktionen, die nützlich, aber nicht ständig nötig sind: den Link zu einem Dokument kopieren, ein Foto aus der Galerie teilen, einen Entwurf im CMS löschen. Der weichgezeichnete Glashintergrund hält es leicht, wie die Menüs am Mac. Dieses Kontextmenü in React passt zu Dateilisten, Karten und Tabellenzeilen.

Setz zerstörerische Aktionen wie „Löschen“ ans Ende und färb sie ruhig rot. Erhöh die Unschärfe, wenn das Menü über unruhigen Bildern aufgeht, und senk sie über glatten Flächen. Mehr als sechs Einträge heißt meist, dass einige woanders hingehören.