motion-layout-id

ui

  • Tailwind
  • React
  • Next
  • Motion
  • Gsap

src

TSX
"use client"

import { useState } from "react";
import { motion, AnimatePresence } from "motion/react";

export default function Page() {

    const [ selected, setSelected ] = useState<number>(0);

    const items = [
        "Tailwind",
        "React",
        "Next",
        "Motion",
        "Gsap",
    ];

    return (
        <div className="bg-black py-32 px-5">
            <ul className="flex flex-col md:flex-row justify-center gap-5">
                {
                    items.map((item, index) => (
                        <li className="p-5 text-2xl text-yellow-400 cursor-pointer relative"
                            onClick={ () => setSelected(index) }
                            key={ index }>
                            { item }
                            <AnimatePresence>
                                {
                                    selected === index && (
                                        <motion.span className="absolute bottom-0 left-1/2 -translate-x-1/2
                                                                w-full h-1
                                                                bg-yellow-400"
                                                     layoutId="underline"/>
                                    )
                                }
                            </AnimatePresence>
                        </li>
                    ))
                }
            </ul>
        </div>
    )
}

video