Carousel

Image and content slider with neumorphic prev/next controls, dot indicators, autoplay, and multiple visible items.

This component requires softui.js for interactive behavior.

Default

<div class="sui-carousel" id="myCarousel">
  <div class="sui-carousel-track">
    <div class="sui-carousel-item">
      <div style="height:140px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-primary), var(--sui-info));">
        <span style="font-size:32px;font-weight:700;color:#fff;">1</span>
      </div>
    </div>
    <div class="sui-carousel-item">
      <div style="height:140px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-info), var(--sui-success));">
        <span style="font-size:32px;font-weight:700;color:#fff;">2</span>
      </div>
    </div>
    <div class="sui-carousel-item">
      <div style="height:140px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-success), var(--sui-warning));">
        <span style="font-size:32px;font-weight:700;color:#fff;">3</span>
      </div>
    </div>
    <div class="sui-carousel-item">
      <div style="height:140px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-warning), var(--sui-danger));">
        <span style="font-size:32px;font-weight:700;color:#fff;">4</span>
      </div>
    </div>
    <div class="sui-carousel-item">
      <div style="height:140px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-danger), var(--sui-primary));">
        <span style="font-size:32px;font-weight:700;color:#fff;">5</span>
      </div>
    </div>
  </div>
  <button class="sui-carousel-prev" aria-label="Previous slide"></button>
  <button class="sui-carousel-next" aria-label="Next slide"></button>
</div>

With Dots

<div class="sui-carousel" id="myCarousel">
  <div class="sui-carousel-track">
    <div class="sui-carousel-item">
      <div style="height:140px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-primary), var(--sui-info));">
        <span style="font-size:32px;font-weight:700;color:#fff;">1</span>
      </div>
    </div>
    <div class="sui-carousel-item">
      <div style="height:140px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-info), var(--sui-success));">
        <span style="font-size:32px;font-weight:700;color:#fff;">2</span>
      </div>
    </div>
    <div class="sui-carousel-item">
      <div style="height:140px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-success), var(--sui-warning));">
        <span style="font-size:32px;font-weight:700;color:#fff;">3</span>
      </div>
    </div>
    <div class="sui-carousel-item">
      <div style="height:140px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-warning), var(--sui-danger));">
        <span style="font-size:32px;font-weight:700;color:#fff;">4</span>
      </div>
    </div>
    <div class="sui-carousel-item">
      <div style="height:140px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-danger), var(--sui-primary));">
        <span style="font-size:32px;font-weight:700;color:#fff;">5</span>
      </div>
    </div>
  </div>
  <button class="sui-carousel-prev" aria-label="Previous slide"></button>
  <button class="sui-carousel-next" aria-label="Next slide"></button>
  <div class="sui-carousel-dots">
    <button class="sui-carousel-dot active" aria-label="Slide 1"></button>
    <button class="sui-carousel-dot" aria-label="Slide 2"></button>
    <button class="sui-carousel-dot" aria-label="Slide 3"></button>
    <button class="sui-carousel-dot" aria-label="Slide 4"></button>
    <button class="sui-carousel-dot" aria-label="Slide 5"></button>
  </div>
</div>

Loop

Add data-sui-loop to loop continuously — navigating past the last slide wraps back to the first, and vice versa.

<div class="sui-carousel" id="myCarousel" data-sui-loop>
  <div class="sui-carousel-track">
    <div class="sui-carousel-item">
      <div style="height:140px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-primary), var(--sui-info));">
        <span style="font-size:32px;font-weight:700;color:#fff;">1</span>
      </div>
    </div>
    <div class="sui-carousel-item">
      <div style="height:140px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-info), var(--sui-success));">
        <span style="font-size:32px;font-weight:700;color:#fff;">2</span>
      </div>
    </div>
    <div class="sui-carousel-item">
      <div style="height:140px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-success), var(--sui-warning));">
        <span style="font-size:32px;font-weight:700;color:#fff;">3</span>
      </div>
    </div>
    <div class="sui-carousel-item">
      <div style="height:140px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-warning), var(--sui-danger));">
        <span style="font-size:32px;font-weight:700;color:#fff;">4</span>
      </div>
    </div>
  </div>
  <button class="sui-carousel-prev" aria-label="Previous slide"></button>
  <button class="sui-carousel-next" aria-label="Next slide"></button>
  <div class="sui-carousel-dots">
    <button class="sui-carousel-dot active" aria-label="Slide 1"></button>
    <button class="sui-carousel-dot" aria-label="Slide 2"></button>
    <button class="sui-carousel-dot" aria-label="Slide 3"></button>
    <button class="sui-carousel-dot" aria-label="Slide 4"></button>
  </div>
</div>

Loop Rewind

Use data-sui-loop="rewind" to wrap around by scrolling back to the beginning instead of seamlessly continuing.

<div class="sui-carousel" id="myCarousel" data-sui-loop="rewind">
  <div class="sui-carousel-track">
    <div class="sui-carousel-item">
      <div style="height:140px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-primary), var(--sui-info));">
        <span style="font-size:32px;font-weight:700;color:#fff;">1</span>
      </div>
    </div>
    <div class="sui-carousel-item">
      <div style="height:140px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-info), var(--sui-success));">
        <span style="font-size:32px;font-weight:700;color:#fff;">2</span>
      </div>
    </div>
    <div class="sui-carousel-item">
      <div style="height:140px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-success), var(--sui-warning));">
        <span style="font-size:32px;font-weight:700;color:#fff;">3</span>
      </div>
    </div>
    <div class="sui-carousel-item">
      <div style="height:140px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-warning), var(--sui-danger));">
        <span style="font-size:32px;font-weight:700;color:#fff;">4</span>
      </div>
    </div>
  </div>
  <button class="sui-carousel-prev" aria-label="Previous slide"></button>
  <button class="sui-carousel-next" aria-label="Next slide"></button>
  <div class="sui-carousel-dots">
    <button class="sui-carousel-dot active" aria-label="Slide 1"></button>
    <button class="sui-carousel-dot" aria-label="Slide 2"></button>
    <button class="sui-carousel-dot" aria-label="Slide 3"></button>
    <button class="sui-carousel-dot" aria-label="Slide 4"></button>
  </div>
</div>

Multiple Items

Use sui-carousel-2, sui-carousel-3, or sui-carousel-4 to show multiple items at once.

<div class="sui-carousel sui-carousel-3" id="myCarousel">
  <div class="sui-carousel-track">
    <div class="sui-carousel-item">
      <div style="height:100px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-primary), var(--sui-info));">
        <span style="font-size:24px;font-weight:700;color:#fff;">1</span>
      </div>
    </div>
    <div class="sui-carousel-item">
      <div style="height:100px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-info), var(--sui-success));">
        <span style="font-size:24px;font-weight:700;color:#fff;">2</span>
      </div>
    </div>
    <div class="sui-carousel-item">
      <div style="height:100px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-success), var(--sui-warning));">
        <span style="font-size:24px;font-weight:700;color:#fff;">3</span>
      </div>
    </div>
    <div class="sui-carousel-item">
      <div style="height:100px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-warning), var(--sui-danger));">
        <span style="font-size:24px;font-weight:700;color:#fff;">4</span>
      </div>
    </div>
    <div class="sui-carousel-item">
      <div style="height:100px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-danger), var(--sui-primary));">
        <span style="font-size:24px;font-weight:700;color:#fff;">5</span>
      </div>
    </div>
    <div class="sui-carousel-item">
      <div style="height:100px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-primary), var(--sui-success));">
        <span style="font-size:24px;font-weight:700;color:#fff;">6</span>
      </div>
    </div>
  </div>
  <button class="sui-carousel-prev" aria-label="Previous slide"></button>
  <button class="sui-carousel-next" aria-label="Next slide"></button>
</div>

Multiple with Cards

Wrap slide content in sui-card for a raised neumorphic look. Add sui-carousel-gap for spacing between cards.

<div class="sui-carousel sui-carousel-3 sui-carousel-gap" id="myCarousel">
  <div class="sui-carousel-track">
    <div class="sui-carousel-item">
      <div class="sui-card" style="padding:32px 16px;text-align:center;">
        <span style="font-size:24px;font-weight:700;color:var(--sui-text-muted);">1</span>
      </div>
    </div>
    <div class="sui-carousel-item">
      <div class="sui-card" style="padding:32px 16px;text-align:center;">
        <span style="font-size:24px;font-weight:700;color:var(--sui-text-muted);">2</span>
      </div>
    </div>
    <div class="sui-carousel-item">
      <div class="sui-card" style="padding:32px 16px;text-align:center;">
        <span style="font-size:24px;font-weight:700;color:var(--sui-text-muted);">3</span>
      </div>
    </div>
    <div class="sui-carousel-item">
      <div class="sui-card" style="padding:32px 16px;text-align:center;">
        <span style="font-size:24px;font-weight:700;color:var(--sui-text-muted);">4</span>
      </div>
    </div>
    <div class="sui-carousel-item">
      <div class="sui-card" style="padding:32px 16px;text-align:center;">
        <span style="font-size:24px;font-weight:700;color:var(--sui-text-muted);">5</span>
      </div>
    </div>
    <div class="sui-carousel-item">
      <div class="sui-card" style="padding:32px 16px;text-align:center;">
        <span style="font-size:24px;font-weight:700;color:var(--sui-text-muted);">6</span>
      </div>
    </div>
  </div>
  <button class="sui-carousel-prev" aria-label="Previous slide"></button>
  <button class="sui-carousel-next" aria-label="Next slide"></button>
</div>

With Gap

Add sui-carousel-gap to add spacing between items in multi-item carousels.

<div class="sui-carousel sui-carousel-3 sui-carousel-gap" id="myCarousel">
  <div class="sui-carousel-track">
    <div class="sui-carousel-item">
      <div style="height:100px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-primary), var(--sui-info));border-radius:var(--sui-radius);">
        <span style="font-size:24px;font-weight:700;color:#fff;">1</span>
      </div>
    </div>
    <div class="sui-carousel-item">
      <div style="height:100px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-info), var(--sui-success));border-radius:var(--sui-radius);">
        <span style="font-size:24px;font-weight:700;color:#fff;">2</span>
      </div>
    </div>
    <div class="sui-carousel-item">
      <div style="height:100px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-success), var(--sui-warning));border-radius:var(--sui-radius);">
        <span style="font-size:24px;font-weight:700;color:#fff;">3</span>
      </div>
    </div>
    <div class="sui-carousel-item">
      <div style="height:100px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-warning), var(--sui-danger));border-radius:var(--sui-radius);">
        <span style="font-size:24px;font-weight:700;color:#fff;">4</span>
      </div>
    </div>
    <div class="sui-carousel-item">
      <div style="height:100px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-danger), var(--sui-primary));border-radius:var(--sui-radius);">
        <span style="font-size:24px;font-weight:700;color:#fff;">5</span>
      </div>
    </div>
    <div class="sui-carousel-item">
      <div style="height:100px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-primary), var(--sui-success));border-radius:var(--sui-radius);">
        <span style="font-size:24px;font-weight:700;color:#fff;">6</span>
      </div>
    </div>
  </div>
  <button class="sui-carousel-prev" aria-label="Previous slide"></button>
  <button class="sui-carousel-next" aria-label="Next slide"></button>
</div>

Autoplay

Add data-sui-autoplay="3000" (milliseconds) for auto-advancing slides. Pauses on hover. Combine with data-sui-loop for continuous looping.

<div class="sui-carousel" id="myCarousel"
     data-sui-autoplay="3000" data-sui-loop>
  <div class="sui-carousel-track">
    <div class="sui-carousel-item">
      <div style="height:140px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-primary), var(--sui-info));">
        <span style="font-size:32px;font-weight:700;color:#fff;">1</span>
      </div>
    </div>
    <div class="sui-carousel-item">
      <div style="height:140px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-info), var(--sui-success));">
        <span style="font-size:32px;font-weight:700;color:#fff;">2</span>
      </div>
    </div>
    <div class="sui-carousel-item">
      <div style="height:140px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-success), var(--sui-warning));">
        <span style="font-size:32px;font-weight:700;color:#fff;">3</span>
      </div>
    </div>
    <div class="sui-carousel-item">
      <div style="height:140px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-warning), var(--sui-danger));">
        <span style="font-size:32px;font-weight:700;color:#fff;">4</span>
      </div>
    </div>
  </div>
  <button class="sui-carousel-prev" aria-label="Previous slide"></button>
  <button class="sui-carousel-next" aria-label="Next slide"></button>
  <div class="sui-carousel-dots">
    <button class="sui-carousel-dot active" aria-label="Slide 1"></button>
    <button class="sui-carousel-dot" aria-label="Slide 2"></button>
    <button class="sui-carousel-dot" aria-label="Slide 3"></button>
    <button class="sui-carousel-dot" aria-label="Slide 4"></button>
  </div>
</div>

Vertical

Add sui-carousel-vertical for a vertically scrolling carousel. Combine with sui-carousel-3 to show multiple items.

<div class="sui-carousel sui-carousel-vertical sui-carousel-3"
     id="myCarousel" style="height:340px;">
  <div class="sui-carousel-track">
    <div class="sui-carousel-item">
      <div style="height:100%;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-primary), var(--sui-info));">
        <span style="font-size:28px;font-weight:700;color:#fff;">1</span>
      </div>
    </div>
    <div class="sui-carousel-item">
      <div style="height:100%;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-info), var(--sui-success));">
        <span style="font-size:28px;font-weight:700;color:#fff;">2</span>
      </div>
    </div>
    <div class="sui-carousel-item">
      <div style="height:100%;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-success), var(--sui-warning));">
        <span style="font-size:28px;font-weight:700;color:#fff;">3</span>
      </div>
    </div>
    <div class="sui-carousel-item">
      <div style="height:100%;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-warning), var(--sui-danger));">
        <span style="font-size:28px;font-weight:700;color:#fff;">4</span>
      </div>
    </div>
    <div class="sui-carousel-item">
      <div style="height:100%;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-danger), var(--sui-primary));">
        <span style="font-size:28px;font-weight:700;color:#fff;">5</span>
      </div>
    </div>
    <div class="sui-carousel-item">
      <div style="height:100%;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--sui-primary), var(--sui-success));">
        <span style="font-size:28px;font-weight:700;color:#fff;">6</span>
      </div>
    </div>
  </div>
  <button class="sui-carousel-prev" aria-label="Previous slide"></button>
  <button class="sui-carousel-next" aria-label="Next slide"></button>
</div>

Delete this item?

This action cannot be undone. This will permanently delete the item and remove all associated data.