React + MotionMicrointeracciones

Valoración con estrellas

Cinco estrellas que se rellenan al pasar el ratón para previsualizar la nota y se quedan fijas al hacer clic.

Ajustes

Código

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

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

interface StarRatingProps {
  color?: string;
}

export default function StarRating({ color = "#c58b32" }: StarRatingProps) {
  const [rating, setRating] = useState(0);
  const [hover, setHover] = useState(0);

  return (
    <div className="flex gap-1">
      {[1, 2, 3, 4, 5].map((i) => (
        <motion.button
          key={i}
          type="button"
          aria-label={`${i} de 5 estrellas`}
          aria-pressed={rating === i}
          onMouseEnter={() => setHover(i)}
          onMouseLeave={() => setHover(0)}
          onClick={() => setRating(i)}
          whileHover={{ scale: 1.18, y: -2 }}
          transition={spring}
        >
          <Star
            className="h-8 w-8"
            stroke={color}
            fill={i <= (hover || rating) ? color : "transparent"}
          />
        </motion.button>
      ))}
    </div>
  );
}

Prompt para IA

Pégalo en ChatGPT, Claude o Cursor y adaptará el bloque a tu proyecto con estos ajustes, aunque no uses React.

Más en Microinteracciones

Dónde usarlo

Las estrellas siguen siendo la forma más rápida de pedir opinión. Al pasar el ratón se ve la nota antes de confirmarla, y cada estrella se eleva un poco. Úsala tras una entrega, al final de un curso, en una receta o en un formulario de reseñas. Poca gente se salta una valoración por estrellas que responde así de bien.

En el móvil no hay hover, así que la nota se fija directamente al tocar, y funciona bien. Muestra al lado la puntuación en palabras, como «4 de 5», y deja que la gente cambie de idea antes de enviar.