Onglets segmentés iOS
Un rail gris clair sur lequel une pastille blanche à l’ombre légère glisse vers la section choisie.
Réglages
Code
import { useState } from "react";
import { AnimatePresence, motion } from "framer-motion";
const spring = { type: "spring" as const, stiffness: 300, damping: 30 };
const OPTIONS = ["Séjours", "Expériences", "Services"];
interface SegmentedControlProps {
count?: number;
}
export default function SegmentedControl({ count = 3 }: SegmentedControlProps) {
const options = OPTIONS.slice(0, count);
const [active, setActive] = useState(0);
return (
<div className="flex rounded-full bg-black/5 p-1 text-[#1d1d1f] dark:text-[#f5f5f7] dark:bg-white/10">
{options.map((option, i) => (
<button
key={option}
type="button"
aria-pressed={active === i}
onClick={() => setActive(i)}
className="relative rounded-full px-4 py-2 text-sm"
>
<AnimatePresence>
{active === i && (
<motion.span
layoutId="segmented-pill"
className="absolute inset-0 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)]"
transition={spring}
/>
)}
</AnimatePresence>
<span className="relative">{option}</span>
</button>
))}
</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 Navigation
Où l’utiliser
Imaginez l’en-tête d’un site de réservation qui sépare son offre en « Logements », « Expériences » et « Services ». C’est là que ces onglets segmentés façon iOS trouvent leur place : un passage neutre entre deux ou trois grandes sections, pas un filtre coloré. La pastille blanche glisse avec un ressort doux, comme dans les applications iPhone.
Sans couleur d’accent, elle s’intègre bien aux pages chargées sans concurrencer vos boutons principaux. Limitez-vous à trois options et choisissez des mots que les gens taperaient dans une recherche, pas des noms internes.