React + MotionMicro-interactions

Accordéon fluide

Une question qui s’ouvre en douceur pour dévoiler sa réponse, avec une flèche qui pivote en se dépliant.

Réglages

Code

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

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

interface AccordionProps {
  title?: string;
}

export default function Accordion({ title = "Que comprend la réservation ?" }: AccordionProps) {
  const [open, setOpen] = useState(false);

  return (
    <div className="w-72 overflow-hidden rounded-[22px] bg-white dark:bg-[#1c1c1e] 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((o) => !o)}
        className="flex w-full items-center justify-between p-5 text-left text-sm font-medium"
      >
        {title}
        <motion.span animate={{ rotate: open ? 180 : 0 }} transition={spring}>
          <ChevronDown className="h-4 w-4" />
        </motion.span>
      </button>
      <AnimatePresence initial={false}>
        {open && (
          <motion.div
            initial={{ height: 0, opacity: 0 }}
            animate={{ height: "auto", opacity: 1 }}
            exit={{ height: 0, opacity: 0 }}
            transition={spring}
            className="overflow-hidden"
          >
            <p className="border-t border-black/10 px-5 py-4 text-sm text-[#86868b] dark:border-white/10">
              Tout le nécessaire est inclus. Vous pouvez modifier cette réponse depuis les commandes.
            </p>
          </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 Micro-interactions

Où l’utiliser

Les accordéons rendent une FAQ ou une fiche produit faciles à parcourir : on lit les questions et on n’ouvre que ce qui intéresse. Utilisez-le pour « Que comprend la réservation ? » sur un site d’hôtel, la livraison et les retours d’une boutique en ligne ou le programme d’une formation. La hauteur s’anime sans à-coup, et cet accordéon en React reste posé.

Formulez chaque question comme un client la poserait, pas comme un intitulé du genre « Conditions ». Gardez des réponses courtes. Si presque tout le monde a besoin de tout lire, affichez directement le texte : le cacher ajoute des clics.