vaiperui

componentes / carousel

Carousel

Slides com setas, indicadores, teclado, autoplay opcional e loop.

Como usar

Cada filho é um slide. É uma `region` com `aria-roledescription="carousel"`; os slides são `group`s e os fora da vista ficam ocultos para tecnologias assistivas e sem foco. ←/→/Home/End navegam. O `autoplay` pausa com o mouse e o foco e nunca roda com `prefers-reduced-motion`. `index` pode ser controlado; `slidesPerView` mostra vários slides de uma vez.

preview
Slide 1
Carousel.tsx
import { Carousel } from "vaiperui";
<Carousel aria-label="Slides em destaque" 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>

Vários por vez

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

Autoplay e loop

Pausa com mouse e foco; não roda com 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>

Cores

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

Cor personalizada

preview
Slide 1
Rosa
cor-personalizada.tsx
<Carousel customColor="#db2777" ...>

Props

PropValoresPadrãoDescrição
childrenReactNode—Um slide por filho
aria-labelstring—Nome acessível do carrossel
index / defaultIndexnumber0Primeiro slide visível controlado / inicial
onIndexChange(index: number) => voidnenhumChamado quando a posição muda
slidesPerViewnumber1Slides visíveis ao mesmo tempo
loopbooleanfalseVoltar do fim ao início
autoplayboolean | numberfalseAvança a cada N ms (true = 5000). Pausa com mouse/foco
showArrows / showDotsbooleantrueMostrar as setas / indicadores
previousLabel / nextLabelstringPrevious slide / Next slideNomes acessíveis das setas
dotLabel(index) => stringGo to slide NNome acessível de cada indicador
slideLabel(index, total) => stringN of totalNome acessível de cada slide
variantColorprimary | success | warning | dangerprimaryCor de destaque (botão play, progresso, indicadores)
customColorstring | { light, dark }nenhumQualquer cor CSS (ou um par por tema). Substitui o variantColor
sizesm | md | lgmdTamanho dos controles e do texto
radiusnone | sm | md | lg | fulllgArredondamento dos cantos
animationnone | smooth | fast | bouncesmoothTransição dos controles

Acessibilidade

  • A raiz é uma `<section>` com `aria-roledescription="carousel"` e o `aria-label` que você passa.
  • Cada slide é um `role="group"` com `aria-roledescription="slide"` e um nome vindo de `slideLabel` (padrão `1 of 5`).
  • Slides fora de vista ficam `aria-hidden` e `inert`, então seu conteúdo não é lido nem focável.
  • As setas são botões nomeados por `previousLabel` / `nextLabel` (desabilitados nas pontas, exceto com `loop`), e os pontos são botões nomeados por `dotLabel` com `aria-current="true"` no atual.
  • O autoplay pausa enquanto o ponteiro está sobre o carrossel ou o foco está dentro dele, e não roda sob `prefers-reduced-motion: reduce`; a transição entre slides também é removida.
  • A área dos slides é `aria-live="off"` enquanto o autoplay roda e `polite` caso contrário, então trocas manuais são anunciadas.

Teclado

TeclaAção
ArrowLeft / ArrowRightSlide anterior / próximo (dá a volta com `loop`)
Home / EndPrimeiro / último slide
TabPercorre setas, pontos e conteúdo focável dos slides visíveis

Tenha em mente

  • O autoplay não tem botão de pausa; hover ou foco o pausam. Prefira sem autoplay, ou um intervalo longo, para conteúdo que precisa ser lido.
  • O texto alternativo das imagens e os rótulos (`aria-label`, `slideLabel`, `dotLabel`, setas) no idioma da página são responsabilidade do seu app.