T2 EducaçãoMidas

Carousel

Carrossel com arraste, setas e teclado (embla). Itens de qualquer tamanho (basis-*), espaçamento ajustável, orientação horizontal ou vertical, plugins e API para ler o slide atual.

Código-fonte

Exemplos

Interaja com o componente e copie o código de cada exemplo.

Básico

Arraste, use as setas ou o teclado.

1
2
3
4
5

Tamanhos dos itens

1
2
3
4
5

Espaçamento

1
2
3
4
5

Vertical

1
2
3
4
5

API

Lendo o slide atual com setApi.

1
2
3
4
5

Slide 0 de 0

import {
  Carousel,
  type CarouselApi,
  CarouselContent,
  CarouselItem,
  CarouselNext,
  CarouselPrevious,
} from "@t2-educacao/midas";

Uso

<Carousel className="mx-12 max-w-xs">
  <CarouselContent>
    {[1, 2, 3, 4, 5].map((n) => (
      <CarouselItem key={n}>
        <Card>
          <CardContent className="flex aspect-square items-center justify-center">
            <span className="text-3xl font-semibold">{n}</span>
          </CardContent>
        </Card>
      </CarouselItem>
    ))}
  </CarouselContent>
  <CarouselPrevious />
  <CarouselNext />
</Carousel>

As setas ficam fora do carrossel (48px para cada lado): deixe margem lateral (mx-12) ou reposicione com className.

Componentes

ComponenteO que é
CarouselRaiz. Props abaixo
CarouselContentA trilha dos slides
CarouselItemUm slide. Por padrão ocupa 100% (basis-full)
CarouselPrevious / CarouselNextSetas redondas de 28px (outline). Desabilitam nas pontas
useCarousel()Hook para criar controles próprios dentro do Carousel
PropTipoPadrãoDescrição
orientation"horizontal" | "vertical""horizontal"Direção
optsCarouselOptionsOpções do Embla (loop, align...)
pluginsCarouselPluginPlugins do Embla (ex.: autoplay)
setApi(api: CarouselApi) => voidRecebe a API para controlar e ler o estado

Exemplos

Tamanho dos itens

<CarouselItem className="basis-1/3">...</CarouselItem>

Espaçamento

O espaço padrão é 16px. Para mudar, ajuste o -ml do conteúdo e o pl dos itens juntos:

<CarouselContent className="-ms-2">
  <CarouselItem className="basis-1/3 ps-2">...</CarouselItem>
</CarouselContent>

Vertical

<Carousel orientation="vertical" className="my-12 w-full max-w-xs">
  <CarouselContent className="h-48">
    <CarouselItem className="basis-1/2">...</CarouselItem>
  </CarouselContent>
  <CarouselPrevious />
  <CarouselNext />
</Carousel>

API: "Slide 1 de 5"

const [api, setApi] = useState<CarouselApi>();
const [atual, setAtual] = useState(0);
const [total, setTotal] = useState(0);

useEffect(() => {
  if (!api) return;
  setTotal(api.scrollSnapList().length);
  setAtual(api.selectedScrollSnap() + 1);
  api.on("select", () => setAtual(api.selectedScrollSnap() + 1));
}, [api]);

<Carousel setApi={setApi}>...</Carousel>
<p className="text-sm text-muted-foreground">Slide {atual} de {total}</p>

Acessibilidade

  • A raiz é uma região (role="region", "carrossel"): dê um aria-label.
  • Setas do teclado navegam quando o foco está no carrossel.
  • Evite autoplay; se usar, ofereça pausa.

On this page