React + MotionBoutons

Bouton d’actions dépliable

Un seul bouton qui s’ouvre pour révéler quelques actions de plus, le plus se changeant en croix.

Réglages

Code

import { useState } from "react";
import { AnimatePresence, motion } from "framer-motion";
import { ChevronDown, Plus, Share2 } from "lucide-react";

interface ExpandingMenuButtonProps {
  text?: string;
}

export default function ExpandingMenuButton({
  text = "Actions",
}: ExpandingMenuButtonProps) {
  const [open, setOpen] = useState(false);

  return (
    <motion.div
      layout
      transition={{ type: "spring", stiffness: 300, damping: 30 }}
      className="overflow-hidden rounded-[26px] bg-white dark:bg-[#1c1c1e] p-1 text-[#1d1d1f] dark:text-[#f5f5f7] shadow-[0_1px_2px_rgba(0,0,0,0.03),0_8px_28px_rgba(0,0,0,0.05)]"
    >
      <button
        type="button"
        aria-expanded={open}
        onClick={() => setOpen((v) => !v)}
        className="flex h-12 items-center gap-2 rounded-full px-4 text-sm font-medium"
      >
        <Plus className={`h-4 w-4 transition-transform ${open ? "rotate-45" : ""}`} />
        {text}
        <ChevronDown className={`h-4 w-4 transition-transform ${open ? "rotate-180" : ""}`} />
      </button>
      <AnimatePresence>
        {open && (
          <motion.div
            initial={{ height: 0, opacity: 0 }}
            animate={{ height: "auto", opacity: 1 }}
            exit={{ height: 0, opacity: 0 }}
            className="flex gap-1 overflow-hidden px-1 pb-1"
          >
            <button
              type="button"
              className="rounded-full bg-black/5 px-4 py-2 text-sm dark:bg-white/10"
            >
              Enregistrer
            </button>
            <button
              type="button"
              className="flex items-center gap-1 rounded-full bg-black/5 px-4 py-2 text-sm dark:bg-white/10"
            >
              <Share2 className="h-4 w-4" /> Partager
            </button>
          </motion.div>
        )}
      </AnimatePresence>
    </motion.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 Boutons

Où l’utiliser

Toutes les actions ne méritent pas leur propre bouton. Celui-ci garde les options secondaires comme « Enregistrer » et « Partager » à l’abri jusqu’à ce qu’on les demande, ce qui est pratique sur une fiche recette, une page produit ou un document dans un espace client. Voyez-le comme un menu d’actions dépliable et compact en React.

Deux ou trois actions, c’est l’idéal ; au-delà, un vrai menu déroulant se parcourt plus facilement. Donnez au bouton un mot clair, comme « Options » ou « Plus », plutôt qu’une icône toute seule que personne ne comprend.