sigilUI

Carousel

An accessible Embla-powered slider with keyboard support, optional 3D tilt, and dot pagination.

@sigil-ui/componentsReact

Preview

Live preview Interactive

Import

import {
  Carousel,
  CarouselContent,
  CarouselItem,
  CarouselPrevious,
  CarouselNext,
  CarouselDots,
} from "@sigil-ui/components";

Usage

<Carousel className="w-full max-w-md mx-auto">
    <CarouselContent>
      <CarouselItem>
        <div className="flex aspect-[16/9] items-center justify-center rounded-[var(--s-radius-md,8px)] bg-[var(--s-surface)] border border-[style:var(--s-border-style,solid)] border-[color:var(--s-border)] text-[var(--s-text)]">
          <div className="text-center">
            <div className="font-[family-name:var(--s-font-mono)] text-[10px] uppercase tracking-[0.12em] text-[var(--s-text-muted)] mb-2">Slide 01</div>
            <div className="font-[family-name:var(--s-font-display)] text-3xl font-bold tracking-tight">Sigil tokens</div>
          </div>
        </div>
      </CarouselItem>
      <CarouselItem>
        <div className="flex aspect-[16/9] items-center justify-center rounded-[var(--s-radius-md,8px)] bg-[var(--s-surface-elevated,var(--s-surface))] border border-[style:var(--s-border-style,solid)] border-[color:var(--s-border)] text-[var(--s-text)]">
          <div className="text-center">
            <div className="font-[family-name:var(--s-font-mono)] text-[10px] uppercase tracking-[0.12em] text-[var(--s-text-muted)] mb-2">Slide 02</div>
            <div className="font-[family-name:var(--s-font-display)] text-3xl font-bold tracking-tight">46 presets</div>
          </div>
        </div>
      </CarouselItem>
      <CarouselItem>
        <div className="flex aspect-[16/9] items-center justify-center rounded-[var(--s-radius-md,8px)] bg-[var(--s-primary)]/10 border border-[style:var(--s-border-style,solid)] border-[color:var(--s-primary)] text-[var(--s-primary)]">
          <div className="text-center">
            <div className="font-[family-name:var(--s-font-mono)] text-[10px] uppercase tracking-[0.12em] mb-2">Slide 03</div>
            <div className="font-[family-name:var(--s-font-display)] text-3xl font-bold tracking-tight">350+ components</div>
          </div>
        </div>
      </CarouselItem>
    </CarouselContent>
    <CarouselPrevious />
    <CarouselNext />
    <CarouselDots />
  </Carousel>

Sub-components

  • <CarouselContent> — overflow viewport
  • <CarouselItem> — individual slide (full-basis by default)
  • <CarouselPrevious> / <CarouselNext> — nav buttons (rendered inside the slide by default)
  • <CarouselDots> — pagination dots, hidden when there's only one slide

Props

PropTypeDefaultDescription
orientation"horizontal" | "vertical""horizontal"Slide axis.
optsEmblaOptionsType—Options forwarded to useEmblaCarousel.
tiltbooleanfalseEnables 3D tilt perspective on slides.

CarouselPrevious / CarouselNext

PropTypeDefaultDescription
placement"inside" | "outside""inside"Where the button sits relative to the slide rail.

Keyboard

  • ← / → move horizontal carousels.
  • ↑ / ↓ move vertical carousels.

Token integration

CSS VariablePurpose
--s-card-radius / --s-radius-mdViewport corner radius
--s-surfaceNav button background
--s-surface-elevatedNav button hover background
--s-border / --s-border-styleNav button border
--s-shadow-mdNav button elevation
--s-text / --s-text-mutedNav button text colors
--s-primaryActive dot color, nav hover text
--s-radius-fullNav buttons + dots
--s-duration-fast / --s-duration-normalTransitions
--s-focus-ring-color / --s-focus-ring-widthFocus ring