1 estrella en GitHub = 1 componente nuevo.

Dar una estrella
Formulariosinputrating

Star Rating

Selector interactivo de puntuación mediante estrellas para encuestas y opiniones.

Vista Previa en Vivo

Uso

Copia y pega este código directamente en tu componente React:

tsx
import { RatingStars } from 'react-component-kit-ui/forms';

<RatingStars name="quality" initialValue={4} />

Instalación Manual

Si no estás usando el paquete npm, crea un archivo nuevo y pega el siguiente código: src/components/RatingStars.tsx + RatingStars.css:

RatingStars.tsx
'use client';

import './RatingStars.css';

/**
 * RatingStars — A classic star-rating input for user reviews and feedback.
 * 
 * @param {string} name - HTML name for form submission. Default is "rating".
 * @param {number} maxRating - Maximum number of stars. Default is 5.
 * @param {string} idPrefix - Prefix used to generate unique IDs for radio buttons.
 * @param {number} initialValue - Currently selected rating.
 */
export interface RatingStarsProps {
  name?: string;
  maxRating?: number;
  idPrefix?: string;
  initialValue?: number;
}

export function RatingStars({ name = "rating", maxRating = 5, idPrefix = "star", initialValue = 0 }: RatingStarsProps) {
  return (
    <>
      <div className="rating-stars" data-rating-group data-rk-fddc65="">
        {Array.from({ length: maxRating }).map((_, i) => {
          const val = maxRating - i;
          return (
            <>
              <input type="radio" name={name} id={`${idPrefix}-${val}`} defaultValue={val} defaultChecked={initialValue === val} className="rating-stars__input" data-rk-fddc65="" />
              <label htmlFor={`${idPrefix}-${val}`} className="rating-stars__star" aria-label={`${val} stars`} data-rk-fddc65="">
                <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" data-rk-fddc65="">
                  <polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2" data-rk-fddc65=""></polygon>
                </svg>
              </label>
            </>
          );
        })}
      </div>
    </>
  );
}

export default RatingStars;
RatingStars.css
/* RatingStars — ported from astro-component-kit (forms/RatingStars.astro) */

.rating-stars:where([data-rk-fddc65]) { display: flex; flex-direction: row-reverse; gap: 4px; width: fit-content; }

.rating-stars__input:where([data-rk-fddc65]) { display: none; }

.rating-stars__star:where([data-rk-fddc65]) { 
  width: 32px; height: 32px; 
  cursor: pointer; transition: all 0.2s ease; 
  color: var(--c-border, #334155);
}

.rating-stars__star:where([data-rk-fddc65]) svg:where([data-rk-fddc65]) { width: 100%; height: 100%; fill: transparent; transition: all 0.2s; }

/* Hover and check logic using sibling selectors (requires row-reverse) */
.rating-stars__star:hover:where([data-rk-fddc65]), 
.rating-stars__star:hover:where([data-rk-fddc65]) ~ .rating-stars__star:where([data-rk-fddc65]),
.rating-stars__input:checked:where([data-rk-fddc65]) ~ .rating-stars__star:where([data-rk-fddc65]) { 
  color: #fbbf24; 
}

.rating-stars__star:hover:where([data-rk-fddc65]) svg:where([data-rk-fddc65]), 
.rating-stars__star:hover:where([data-rk-fddc65]) ~ .rating-stars__star:where([data-rk-fddc65]) svg:where([data-rk-fddc65]),
.rating-stars__input:checked:where([data-rk-fddc65]) ~ .rating-stars__star:where([data-rk-fddc65]) svg:where([data-rk-fddc65]) { 
  fill: #fbbf24;
  filter: drop-shadow(0 0 5px rgba(251, 191, 36, 0.4));
}

.rating-stars__star:active:where([data-rk-fddc65]) { transform: scale(0.9); }

Información Rápida

Categoría
Formularios
Nombre de archivo
RatingStars.tsx
Dependencias
Ninguna — React + CSS puro
Etiquetas
inputrating