Makuco UI
ComponentesNavigation

Carousel

Exibe conteúdo em slides navegáveis com suporte a swipe, autoplay e indicadores de posição usando `mk-carousel` e `mk-carousel-item`.

Componente Experimental

Este componente é experimental — não possui design aprovado no Figma. A API pode mudar entre versões.

O mk-carousel exibe conteúdo em slides navegáveis com botões de seta, indicadores de posição (dots) e suporte a swipe touch. Cada slide deve ser envolvido por mk-carousel-item, que fornece semântica de acessibilidade ao item.

Padrão

import { MkCarousel, MkCarouselItem } from '@db1/makuco-ui-react';

<MkCarousel>
  <MkCarouselItem label="Slide 1">Conteúdo 1</MkCarouselItem>
  <MkCarouselItem label="Slide 2">Conteúdo 2</MkCarouselItem>
  <MkCarouselItem label="Slide 3">Conteúdo 3</MkCarouselItem>
</MkCarousel>
<mk-carousel>
  <mk-carousel-item label="Slide 1">Conteúdo 1</mk-carousel-item>
  <mk-carousel-item label="Slide 2">Conteúdo 2</mk-carousel-item>
  <mk-carousel-item label="Slide 3">Conteúdo 3</mk-carousel-item>
</mk-carousel>

Múltiplos slides visíveis

A prop slidesPerView define quantos slides aparecem ao mesmo tempo. Os indicadores de posição ajustam-se automaticamente ao número de posições navegáveis.

import { MkCarousel, MkCarouselItem } from '@db1/makuco-ui-react';

<MkCarousel slidesPerView={3}>
  <MkCarouselItem label="Slide 1">Conteúdo 1</MkCarouselItem>
  <MkCarouselItem label="Slide 2">Conteúdo 2</MkCarouselItem>
  <MkCarouselItem label="Slide 3">Conteúdo 3</MkCarouselItem>
  <MkCarouselItem label="Slide 4">Conteúdo 4</MkCarouselItem>
  <MkCarouselItem label="Slide 5">Conteúdo 5</MkCarouselItem>
</MkCarousel>
<mk-carousel slides-per-view="3">
  <mk-carousel-item label="Slide 1">Conteúdo 1</mk-carousel-item>
  <mk-carousel-item label="Slide 2">Conteúdo 2</mk-carousel-item>
  <mk-carousel-item label="Slide 3">Conteúdo 3</mk-carousel-item>
  <mk-carousel-item label="Slide 4">Conteúdo 4</mk-carousel-item>
  <mk-carousel-item label="Slide 5">Conteúdo 5</mk-carousel-item>
</mk-carousel>

Autoplay

Com autoplay, o carousel avança automaticamente no intervalo definido por autoplayInterval (padrão: 3000 ms). Um botão de pausa é exibido automaticamente para cumprir o requisito WCAG 2.2.2. O avanço é suspenso enquanto o foco estiver dentro do componente.

import { MkCarousel, MkCarouselItem } from '@db1/makuco-ui-react';

<MkCarousel autoplay autoplayInterval={2500}>
  <MkCarouselItem label="Slide 1">Conteúdo 1</MkCarouselItem>
  <MkCarouselItem label="Slide 2">Conteúdo 2</MkCarouselItem>
  <MkCarouselItem label="Slide 3">Conteúdo 3</MkCarouselItem>
</MkCarousel>
<mk-carousel autoplay autoplay-interval="2500">
  <mk-carousel-item label="Slide 1">Conteúdo 1</mk-carousel-item>
  <mk-carousel-item label="Slide 2">Conteúdo 2</mk-carousel-item>
  <mk-carousel-item label="Slide 3">Conteúdo 3</mk-carousel-item>
</mk-carousel>

Sem loop

Com loop={false}, a navegação para ao atingir o primeiro ou o último slide. Os botões de seta ficam desabilitados nesses limites.

import { MkCarousel, MkCarouselItem } from '@db1/makuco-ui-react';

<MkCarousel loop={false}>
  <MkCarouselItem label="Slide 1">Conteúdo 1</MkCarouselItem>
  <MkCarouselItem label="Slide 2">Conteúdo 2</MkCarouselItem>
  <MkCarouselItem label="Slide 3">Conteúdo 3</MkCarouselItem>
</MkCarousel>
<mk-carousel [loop]="false">
  <mk-carousel-item label="Slide 1">Conteúdo 1</mk-carousel-item>
  <mk-carousel-item label="Slide 2">Conteúdo 2</mk-carousel-item>
  <mk-carousel-item label="Slide 3">Conteúdo 3</mk-carousel-item>
</mk-carousel>
PropTipoPadrãoDescrição
slidesPerViewnumber1Número de slides visíveis ao mesmo tempo.
autoplaybooleanfalseAtiva o avanço automático entre slides.
autoplayIntervalnumber3000Intervalo em milissegundos entre avanços automáticos. Requer autoplay.
loopbooleantrueQuando true, a navegação faz loop ao atingir o primeiro ou último slide.
activeIndexnumber0Índice do slide ativo (base zero). Pode ser controlado externamente.
localestringTag de locale BCP 47 para os rótulos ARIA (ex.: "en", "es", "pt-BR"). Recai para lang do ancestral ou pt-BR.
PropTipoPadrãoDescrição
labelstringRótulo acessível do slide, anunciado por leitores de tela. Sempre recomendado.

Eventos

EventoComponentePayloadDescrição
mkSlideChangemk-carousel{ index: number }Emitido quando o slide ativo muda. index é o índice base zero do novo slide.

Slots

ComponenteSlotDescrição
mk-carousel(default)Filhos diretos são os slides. Use sempre mk-carousel-item como wrapper.
mk-carousel-item(default)Conteúdo do slide.

Acessibilidade

  • O contêiner tem role="region" e aria-roledescription="carousel".
  • Cada mk-carousel-item recebe automaticamente role="group" e aria-roledescription="slide". Forneça sempre a prop label para descrição pelo leitor de tela.
  • Os botões de navegação ficam desabilitados ao atingir os limites quando loop={false}.
  • Os indicadores de posição (dots) formam uma role="tablist", com cada dot como role="tab" e aria-selected.
  • Com autoplay ativo, o avanço é pausado ao receber foco dentro do componente (WCAG 2.2.2). O botão de pausa/reprodução permanece sempre visível.
  • Navegação por swipe touch funciona nativamente.
  • Os rótulos ARIA dos botões e dots são traduzíveis via prop locale (pt, es, en).

On this page