React + MotionChamps

Barre de recherche voyage

Destination, dates et voyageurs dans une barre arrondie ; la section touchée se détache en pastille.

Réglages

Code

import { useState } from "react";
import { motion } from "framer-motion";
import { CalendarDays, MapPin, Search, Users } from "lucide-react";

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

const items = [
  { Icon: MapPin, label: "Où", hint: "Rechercher une destination" },
  { Icon: CalendarDays, label: "Dates", hint: "Ajouter des dates" },
  { Icon: Users, label: "Voyageurs", hint: "Ajouter des voyageurs" },
] as const;

interface TravelSearchProps {
  color?: string;
  onSearch?: () => void;
}

export default function TravelSearch({ color = "#0071e3", onSearch }: TravelSearchProps) {
  const [active, setActive] = useState(0);

  return (
    <motion.div
      layout
      transition={spring}
      className="flex w-full max-w-[440px] flex-wrap items-center rounded-[28px] bg-white p-1.5 text-[#1d1d1f] shadow-[0_1px_2px_rgba(0,0,0,0.03),0_8px_28px_rgba(0,0,0,0.05)] dark:bg-[#1c1c1e] dark:text-[#f5f5f7]"
    >
      {items.map(({ Icon, label, hint }, i) => (
        <motion.button
          layout
          key={label}
          type="button"
          aria-pressed={active === i}
          onClick={() => setActive(i)}
          className={`flex min-w-28 flex-1 items-center gap-2 rounded-full px-4 py-3 text-left ${
            active === i
              ? "bg-[#f5f5f7] shadow-[0_1px_2px_rgba(0,0,0,0.03),0_8px_28px_rgba(0,0,0,0.05)] dark:bg-black"
              : ""
          }`}
        >
          <Icon className="h-4 w-4" />
          <span>
            <b className="block text-xs font-medium">{label}</b>
            <small className="block text-[11px] text-[#86868b]">{hint}</small>
          </span>
        </motion.button>
      ))}
      <button
        type="button"
        aria-label="Rechercher"
        onClick={onSearch}
        className="grid h-11 w-11 place-items-center rounded-full text-white"
        style={{ backgroundColor: color }}
      >
        <Search className="h-4 w-4" />
      </button>
    </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 Champs

Où l’utiliser

Tout le monde connaît cette barre : destination, dates et nombre de voyageurs côte à côte, puis un bouton rond. Elle convient à un site de locations de vacances, une petite chaîne d’hôtels, un camping ou une agence d’excursions. Si vous montez un site de réservation, cette barre de recherche de voyage vous évite de la maquetter.

Les champs sont des exemples : reliez chacun à votre propre calendrier ou sélecteur de voyageurs. Passez le bouton de recherche à la couleur de votre marque. Sur écran étroit, les sections passent à la ligne, vérifiez le rendu avec vos vrais libellés.