Skip to content

Slider Nuevo

Control deslizante accesible para seleccionar un valor dentro de un rango. Implementa el patrón WAI-ARIA Slider con teclado completo, arrastre, orientación vertical y label/output integrados.

Demostración

Sin estilos (solo base.css)

Con estilos personalizados

html
<hp-slider
  class="my-slider"
  value="60"
  min="0"
  max="100"
  label="Volumen"
  show-value
  value-suffix="%"
></hp-slider>
css
.my-slider {
  display: flex;
  flex-direction: column;
  gap: 0.375rem;
  touch-action: none;
  user-select: none;
}

.my-slider [data-hp-slider-header] {
  display: flex;
  justify-content: space-between;
  font-size: 0.875rem;
  font-weight: 500;
}

.my-slider [data-hp-slider-rail] {
  position: relative;
  height: 20px;
}

.my-slider [data-hp-slider-track] {
  position: absolute;
  left: 0;
  right: 0;
  top: 50%;
  transform: translateY(-50%);
  height: 6px;
  background: #e2e8f0;
  border-radius: 9999px;
  cursor: pointer;
}

.my-slider [data-hp-slider-range] {
  position: absolute;
  left: 0;
  top: 0;
  bottom: 0;
  width: var(--hp-slider-percentage, 0%);
  background: #0369a1;
  border-radius: inherit;
}

.my-slider [data-hp-slider-thumb] {
  position: absolute;
  top: 50%;
  left: var(--hp-slider-percentage, 0%);
  transform: translate(-50%, -50%);
  width: 18px;
  height: 18px;
  background: #0369a1;
  border: 2px solid #fff;
  border-radius: 50%;
  cursor: grab;
  z-index: 1;
}

.my-slider[data-disabled] {
  opacity: 0.45;
  pointer-events: none;
}

Instalación

bash
pnpm add @headless-primitives/slider
bash
npm install @headless-primitives/slider
bash
yarn add @headless-primitives/slider
bash
bun add @headless-primitives/slider

Features

  • ⌨️ Flechas, Home, End, PageUp/PageDown para control preciso.
  • ♿️ role="slider", aria-valuenow, aria-valuetext, aria-labelledby automáticos.
  • 🎨 Sin estilos visuales (Headless) — genera la estructura interna (track, range, thumb).
  • 📐 Orientación configurable (horizontal / vertical).
  • 🏷️ Label y output integrados opcionales (label, show-value, value-suffix).

Anatomía

html
<hp-slider value="50" min="0" max="100">
  <!-- Generado automáticamente: -->
  <!-- [data-hp-slider-header] → [data-hp-slider-label] + [data-hp-slider-output] -->
  <!-- [data-hp-slider-rail] → [data-hp-slider-track] → [data-hp-slider-range] -->
  <!--                        → [data-hp-slider-thumb] -->
</hp-slider>

API Reference

hp-slider

Atributos / Propiedades

Atributo / PropiedadTipoPor DefectoDescripción
valuenumber0Valor actual.
minnumber0Valor mínimo.
maxnumber100Valor máximo.
stepnumber1Incremento por paso.
orientation"horizontal" | "vertical""horizontal"Orientación del slider.
disabledbooleanfalseDeshabilita el slider.
labelstring""Texto del label integrado.
show-valuebooleanfalseMuestra el valor actual.
value-suffixstring""Sufijo del valor (ej: %, °C).

Propiedades de solo lectura

PropiedadTipoDescripción
percentagenumberValor como porcentaje (0–100).

Eventos

EventoDetalleDescripción
hp-input{ value: number }Emitido continuamente mientras se arrastra.
hp-change{ value: number }Emitido al soltar el thumb o usar teclado.

Variables CSS

VariableDescripción
--hp-slider-percentagePorcentaje actual del fill.

Elementos internos generados

SelectorDescripción
[data-hp-slider-header]Fila con label + output.
[data-hp-slider-label]<span> con texto del label.
[data-hp-slider-output]<output> con valor + sufijo.
[data-hp-slider-rail]Container de track y thumb.
[data-hp-slider-track]Track de fondo.
[data-hp-slider-range]Porción activa (fill).
[data-hp-slider-thumb]Thumb con role="slider".

Atributos ARIA gestionados automáticamente (en el thumb)

  • role="slider" — Siempre presente.
  • aria-valuemin, aria-valuemax, aria-valuenow — Sincronizados.
  • aria-valuetext — Incluye value-suffix.
  • aria-orientation — Sincronizado con orientation.
  • aria-labelledby — Apunta al label cuando existe.

Accesibilidad

Adhiere al patrón WAI-ARIA APG para Slider.

TeclaAcción
ArrowRight / ArrowUpAumenta en step.
ArrowLeft / ArrowDownDisminuye en step.
HomeSalta al valor mínimo.
EndSalta al valor máximo.
PageUpAumenta en step × 10.
PageDownDisminuye en step × 10.

Lanzado bajo la MIT License.