Invite Carousel
betaEvent invitations fanned out as tilted cards — the current one upright in front, its neighbours leaning behind — advancing on a timer or by hand.
- Display
- 2 files
- 1 npm package
- Accessibility notes
Loading the example…
pnpm dlx @dowel-ui/cli add invite-carouselnpm packages installed: class-variance-authority.
import { InviteCarousel } from "@/components/ui/invite-carousel";Default
Gallery
With Images
Manual
Controlled
Right To Left
<InviteCarousel>
| Prop | Type | Default |
|---|---|---|
events (required) | InviteCarouselEvent[] | — |
aspectRatioHeight as a multiple of width. | number | 1.5625 |
autoPlayAdvances on a timer (the source always did), with a stop/start control. | boolean | true |
cardClassName | string | — |
cardWidthAny CSS length, including | string | "15rem" |
defaultIndex | number | — |
indexControlled current card. | number | — |
intervalMilliseconds per card while playing. | number | 3000 |
labels | Partial<InviteCarouselLabels> | — |
onIndexChange | (index: number) => void | — |
showNavigation | boolean | true |
Plus every attribute of <section> except children.
Follows the APG carousel pattern: a section with aria-roledescription="carousel", each card a labelled group with aria-roledescription="slide", and only the current card exposed (the neighbours are aria-hidden and inert). Automatic rotation — on by default, as in the source — has a stop/start control first in the tab order, pauses on hover and focus, turns the live region off while rotating, and does not start by itself under reduced motion. Previous/next buttons are named, arrow keys (mirrored in RTL), Home and End work inside it, and the fan mirrors under dir="rtl". Background images are decorative unless `imageAlt` is given; participant avatars take their name as alt text.
8/8
checks passed
- Tested — passes
- axe assertion — passes
- Keyboard tested — does not apply
- Storybook examples — passes
- Accessibility documented — passes
- Semantic tokens only — passes
- Motion from tokens — passes
- className merged — passes
- Visible focus — does not apply
- No fixed widths — passes