Carousel
ImplementedSingle-slide featured-events hero carousel. State-based slide switching (React state, not native scroll) with prev/next buttons and a WAI-ARIA tablist dot pagination — roving tabindex, ArrowLeft/ArrowRight (wrapping), Home/End, polite aria-live announcements. EN-default authored strings, FR via locale='fr'. No storefront consumer since the 2026-10-27 homepage rebuild (the lane shipped its own HeroShowcase instead) — kept as a DS organism.
components/organisms/carousel/Carousel.tsxCarrousel héros une-diapositive — boutons précédent/suivant, pagination par points en tablist WAI-ARIA (roving tabindex, ← / → / Home / Fin), annonces aria-live polies. Changement de diapositive par état React (pas de défilement natif — voir EventsRow pour le rail multi-cartes).
Carousel
Organism — Storefront family (Family 8)
Carrousel plein-largeur affichant une diapositive à la fois. Boutons de navigation latéraux, points de pagination en bas en role='tablist' (seul le point actif reçoit le focus par Tab ; ← / → avec boucle, Home / Fin). Chaque changement est annoncé par une région aria-live polie. Le texte alternatif de l'image est obligatoire pour chaque diapositive (WCAG 1.1.1). Aucun lecture automatique (autoplay).
À la une
Festival Jazz Montréal 2026
Du 24 juin au 5 juillet — Place des Festivals
This component supports light and dark mode.
Props
slides*CarouselSlide[]Diapositives — { id, title, subtitle?, imageUrl, imageAlt, href? }. Rendu en lien plein cadre avec légende sur dégradé.
heightnumber320Hauteur en pixels de la scène (section entière).
showDotsbooleantrueAfficher la pagination par points. Points ET flèches n’apparaissent qu’à partir de 2 diapositives.
classNamestringClasses CSS additionnelles ajoutées au conteneur section.
ariaLabelstringÉtiquette accessible prioritaire — remplace le libellé par défaut (« Carrousel événementiel » en fr, "Featured events carousel" en en).
locale'en' | 'fr'enLocalise les chaînes authored du carrousel (libellé, sourcil « Featured »/« À la une », précédent/suivant, pagination, « Aller à la diapositive N », « diapositive N sur M », annonce live). Défaut EN, FR via locale='fr'. Les données title/subtitle restent au niveau du site appelant.
Props
Carousel
slidesCarouselSlide[]—Slides — { id, title, subtitle?, imageUrl, imageAlt, href? }. Full-bleed link slide with gradient-scrim caption.
heightnumber320Stage height in pixels, applied to the section wrapper.
showDotsbooleantrueShow the dot pagination row. Dots and arrows only render with 2+ slides.
classNamestring—Additional CSS classes appended to the section wrapper.
ariaLabelstring—Overrides the default carousel label ('Featured events carousel' EN / 'Carrousel événementiel' FR). Always wins over the locale default.
locale'en' | 'fr''en'Localizes the strings Carousel authors (label, eyebrow, prev/next, pagination, 'Go to slide N', 'slide N of M', live announcement). EN default, FR opt-in; slide title/subtitle data stays call-site-owned.
variant'default' | 'flat''default'ADR-057 (HV2 / R3). 'flat' drops the rounded frame, the border and the uppercase eyebrow, and swaps the gradient scrim for a flat overlay scrim (editorial homepage). Additive: omitting it — or any unknown value — renders the historical component. Focus rings, tap targets and a11y contract are identical in both variants.
<Carousel />Accessibility
ARIA
3 rulesKeyboard
1 rulevalidation
1 ruleUsage
Import
import { Carousel } from "@epasslive/design-system"Example 1
<Carousel slides={slides} />Example 2
<Carousel slides={slides} locale="fr" height={320} />Anti-patterns
— Do not fetch data directly in organisms
— Avoid tight coupling to specific data sources
— Do not use for multi-card rails — EventsRow is the scroll-snap sibling