vaiperui

componentes / carousel

Carousel

Slides con flechas, indicadores, teclado, autoplay opcional y loop.

Cómo usar

Cada hijo es un slide. Es una `region` con `aria-roledescription="carousel"`; los slides son `group`s y los que no se ven quedan ocultos para tecnologías de apoyo y sin foco. ←/→/Home/End navegan. El `autoplay` se pausa con el ratón y el foco y nunca corre con `prefers-reduced-motion`. `index` puede ser controlado; `slidesPerView` muestra varios slides a la vez.

preview
Slide 1
Carousel.tsx
import { Carousel } from "vaiperui";
<Carousel aria-label="Slides destacados" loop autoplay={4000}>
<img src="/photos/1.jpg" alt="One" />
<img src="/photos/2.jpg" alt="Two" />
<img src="/photos/3.jpg" alt="Three" />
</Carousel>

Varios a la vez

preview
Slide 1
Slide 2
slidesPerView={2}
a-la-vez.tsx
<Carousel aria-label="..." slidesPerView={2}>...</Carousel>

Autoplay y loop

Se pausa con ratón y foco; no corre con prefers-reduced-motion.

preview
Slide 1
autoplay={3000}
autoplay.tsx
<Carousel aria-label="..." loop autoplay={3000}>...</Carousel>

Controlado

preview
Slide: 1
Slide 1
index
controlado.tsx
const [index, setIndex] = useState(0);
<Carousel aria-label="..." index={index} onIndexChange={setIndex}>...</Carousel>

Colores

preview
Slide 1
primary
Slide 1
success
Slide 1
warning
Slide 1
danger
colores.tsx
<Carousel variantColor="primary" ...>
<Carousel variantColor="success" ...>
<Carousel variantColor="warning" ...>
<Carousel variantColor="danger" ...>

Color personalizado

preview
Slide 1
Rosa
color-personalizado.tsx
<Carousel customColor="#db2777" ...>

Props

PropValoresPredeterminadoDescripción
childrenReactNode—Un slide por hijo
aria-labelstring—Nombre accesible del carrusel
index / defaultIndexnumber0Primer slide visible controlado / inicial
onIndexChange(index: number) => voidningunoLlamado cuando cambia la posición
slidesPerViewnumber1Slides visibles a la vez
loopbooleanfalseVolver del final al inicio
autoplayboolean | numberfalseAvanza cada N ms (true = 5000). Se pausa con ratón/foco
showArrows / showDotsbooleantrueMostrar las flechas / indicadores
previousLabel / nextLabelstringPrevious slide / Next slideNombres accesibles de las flechas
dotLabel(index) => stringGo to slide NNombre accesible de cada indicador
slideLabel(index, total) => stringN of totalNombre accesible de cada slide
variantColorprimary | success | warning | dangerprimaryColor de acento (botón play, progreso, indicadores)
customColorstring | { light, dark }ningunoCualquier color CSS (o un par por tema). Reemplaza a variantColor
sizesm | md | lgmdTamaño de los controles y del texto
radiusnone | sm | md | lg | fulllgRedondeo de las esquinas
animationnone | smooth | fast | bouncesmoothTransición de los controles

Accesibilidad

  • La raíz es una `<section>` con `aria-roledescription="carousel"` y el `aria-label` que pasas.
  • Cada slide es un `role="group"` con `aria-roledescription="slide"` y un nombre de `slideLabel` (por defecto `1 of 5`).
  • Los slides fuera de vista quedan `aria-hidden` e `inert`, así que su contenido no se lee ni se enfoca.
  • Las flechas son botones nombrados por `previousLabel` / `nextLabel` (deshabilitadas en los extremos salvo con `loop`), y los puntos son botones nombrados por `dotLabel` con `aria-current="true"` en el actual.
  • El autoplay se pausa mientras el puntero está sobre el carrusel o el foco está dentro, y no corre con `prefers-reduced-motion: reduce`; la transición entre slides también se elimina.
  • El área de slides es `aria-live="off"` mientras corre el autoplay y `polite` en otro caso, así que los cambios manuales se anuncian.

Teclado

TeclaAcción
ArrowLeft / ArrowRightSlide anterior / siguiente (da la vuelta con `loop`)
Home / EndPrimer / último slide
TabRecorre flechas, puntos y contenido enfocable de los slides visibles

Ten en cuenta

  • El autoplay no tiene botón de pausa; hover o foco lo pausan. Prefiere sin autoplay, o un intervalo largo, para contenido que hay que leer.
  • El texto alternativo de las imágenes y las etiquetas (`aria-label`, `slideLabel`, `dotLabel`, flechas) en el idioma de la página son responsabilidad de tu app.