React + MotionChamps

Champ à label flottant

Le libellé se trouve dans le champ et remonte sur la bordure dès que vous cliquez ou commencez à écrire.

Réglages

48px

Code

import { useState } from "react";
import { motion } from "framer-motion";

interface FloatingLabelInputProps {
  color?: string;
  size?: number;
  label?: string;
  type?: string;
  value?: string;
  defaultValue?: string;
  onChange?: (value: string) => void;
}

export default function FloatingLabelInput({
  color = "#0071e3",
  size = 48,
  label = "E-mail",
  type = "text",
  value,
  defaultValue = "",
  onChange,
}: FloatingLabelInputProps) {
  const [internal, setInternal] = useState(defaultValue);
  const [focused, setFocused] = useState(false);
  const current = value ?? internal;
  const up = focused || current.length > 0;

  return (
    <div className="relative w-64">
      <input
        type={type}
        aria-label={label}
        value={current}
        onChange={(e) => {
          if (value === undefined) setInternal(e.target.value);
          onChange?.(e.target.value);
        }}
        onFocus={() => setFocused(true)}
        onBlur={() => setFocused(false)}
        className="w-full rounded-[14px] border bg-white px-3 outline-none transition-colors dark:bg-[#1c1c1e]"
        style={{
          height: size,
          fontSize: size / 3.2,
          borderColor: focused ? color : "oklch(1 0 0 / 14%)",
          boxShadow: focused ? `0 0 0 3px ${color}22` : "none",
        }}
      />
      <motion.label
        className={`pointer-events-none absolute left-3 px-1 ${up ? "bg-white dark:bg-[#1c1c1e]" : "bg-transparent"}`}
        animate={{
          top: up ? -8 : size / 2 - size / 6.4,
          fontSize: up ? 11 : size / 3.2,
          color: up ? color : "oklch(0.62 0.015 260)",
        }}
        transition={{ duration: 0.16 }}
      >
        {label}
      </motion.label>
    </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

Les labels flottants font gagner de la place sans perdre le contexte : l’indication reste visible après la saisie, contrairement à un placeholder. Ils vont bien dans une inscription ou une connexion, le tunnel de commande d’une boutique ou la prise de rendez-vous d’un cabinet. Petit détail, mais un champ à label flottant rend un formulaire plus soigné.

Gardez des libellés courts pour qu’ils tiennent une fois réduits : « E-mail » plutôt que « Votre adresse e-mail ». Alignez la hauteur sur celle de vos boutons et choisissez une couleur de focus qui se distingue bien de la bordure.