Segment-Tabs im iOS-Stil
Eine hellgraue Spur, auf der eine weiße Pille mit leichtem Schatten zum gewählten Bereich gleitet.
Einstellungen
Code
import { useState } from "react";
import { AnimatePresence, motion } from "framer-motion";
const spring = { type: "spring" as const, stiffness: 300, damping: 30 };
const OPTIONS = ["Unterkünfte", "Erlebnisse", "Leistungen"];
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 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 Navigation
Alle ansehen: NavigationWofür du ihn nutzen kannst
Stell dir den Kopf einer Buchungsseite vor, die ihr Angebot in „Unterkünfte“, „Erlebnisse“ und „Services“ teilt. Genau dort passen diese Segment-Tabs im iOS-Stil: ein neutraler Wechsel zwischen zwei oder drei großen Bereichen, kein bunter Filter. Die weiße Pille gleitet mit sanfter Feder hinüber, ganz wie in iPhone-Apps.
Weil sie keine Akzentfarbe hat, fügt sie sich auch in volle Seiten ein, ohne deinen Haupt-Buttons Konkurrenz zu machen. Bleib bei höchstens drei Optionen und nimm Begriffe, nach denen Leute suchen würden, keine internen Namen.