OTTODesign System

Components

Carousel

The carousel displays one item at a time in a horizontal slide.

Configurator

LiveCarousel: size, arrows, pagination dots and skip link
Wohnzimmer mit Sofa und StehlampeKinderzimmer mit SpielzeugMojo Drop SweatshirtBücher im OTTO Sortiment
HTML
<oc-carousel-v1 oc-aria-label="Wohnideen"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-living-room.webp" alt="Wohnzimmer mit Sofa und Stehlampe" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-kids-room.webp" alt="Kinderzimmer mit Spielzeug" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/references/images/otto/otto-fashion-drop-mojo-06.webp" alt="Mojo Drop Sweatshirt" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/references/images/otto/otto-buecher-sortiment.webp" alt="Bücher im OTTO Sortiment" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"></oc-carousel-v1>

Usage

Anatomy

Wohnzimmer mit Sofa und StehlampeKinderzimmer mit SpielzeugMojo Drop SweatshirtBücher im OTTO SortimentPaket vor der Haustür 123
  1. Item (fill-parent)
  2. Scroll buttons
  3. Pagination dots
LiveAnatomy
HTML
<div class="anatomy" style="display:block;max-width:480px;margin:28px auto">
<oc-carousel-v1 oc-aria-label="Wohnideen"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-living-room.webp" alt="Wohnzimmer mit Sofa und Stehlampe" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-kids-room.webp" alt="Kinderzimmer mit Spielzeug" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/references/images/otto/otto-fashion-drop-mojo-06.webp" alt="Mojo Drop Sweatshirt" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/references/images/otto/otto-buecher-sortiment.webp" alt="Bücher im OTTO Sortiment" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-parcel-doorstep.webp" alt="Paket vor der Haustür" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"></oc-carousel-v1>
<span class="anatomy-pin" style="left:50%;top:40%">1</span><span class="anatomy-pin" style="left:103%;top:45%">2</span><span class="anatomy-pin" style="left:34%;top:97%">3</span>
<ol class="anatomy-key"><li data-n="1">Item (fill-parent)</li><li data-n="2">Scroll buttons</li><li data-n="3">Pagination dots</li></ol>

Item stage: The items of the carousel are stored in the item stage. There is only one item visible at a time.

Pagination dots: Pagination dots show the amount of item-sets in the carousel. When tapping a pagination dot, the carousel will scroll into the corresponding view. Pagination dots are optional.

Variants

The carousel is available in two sizes. Size 100 uses icon button 50 as scroll buttons and size 50 uses icon button 25. Carousel 50 uses smaller pagination dots positioned on the inside.

Size 100

Wohnzimmer mit Sofa und StehlampeKinderzimmer mit SpielzeugMojo Drop SweatshirtBücher im OTTO SortimentPaket vor der Haustür

Size 50

Wohnzimmer mit Sofa und StehlampeKinderzimmer mit SpielzeugMojo Drop SweatshirtBücher im OTTO SortimentPaket vor der Haustür
LiveCarousel sizes 100 and 50
HTML
<p class="demo-label">Size 100</p><div style="background:#fff;padding:32px 0"><oc-carousel-v1 oc-aria-label="Wohnideen"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-living-room.webp" alt="Wohnzimmer mit Sofa und Stehlampe" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-kids-room.webp" alt="Kinderzimmer mit Spielzeug" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/references/images/otto/otto-fashion-drop-mojo-06.webp" alt="Mojo Drop Sweatshirt" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/references/images/otto/otto-buecher-sortiment.webp" alt="Bücher im OTTO Sortiment" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-parcel-doorstep.webp" alt="Paket vor der Haustür" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"></oc-carousel-v1></div></div>
<p class="demo-label">Size 50</p><div style="background:#fff;padding:24px 0;max-width:320px"><oc-carousel-v1 oc-aria-label="Wohnideen" size="50"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-living-room.webp" alt="Wohnzimmer mit Sofa und Stehlampe" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-kids-room.webp" alt="Kinderzimmer mit Spielzeug" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/references/images/otto/otto-fashion-drop-mojo-06.webp" alt="Mojo Drop Sweatshirt" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/references/images/otto/otto-buecher-sortiment.webp" alt="Bücher im OTTO Sortiment" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-parcel-doorstep.webp" alt="Paket vor der Haustür" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"></oc-carousel-v1></div></div>

If you place a video inside the carousel the pagination dots automatically show a play icon instead of a dot.

Wohnzimmer mit Sofa und StehlampeKinderzimmer mit SpielzeugMojo Drop Sweatshirt

Video slides show a play icon in the pagination dots (poster frame only; the mirror has no video file)

LiveVideo pagination dots
HTML
<div class="on-frame"><div style="background:#fff;padding:32px 0;max-width:480px;margin:0 auto"><oc-carousel-v1 oc-aria-label="Wohnideen"><video data-oc-carousel-v1.item-type="video" poster="/previews/imagery/samples/otto-group-layered-photo/woven-lamps.webp" width="1200" height="800" controls preload="none" style="display:block;width:100%;height:auto" aria-label="Video: Geflochtene Lampen"></video><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-living-room.webp" alt="Wohnzimmer mit Sofa und Stehlampe" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-kids-room.webp" alt="Kinderzimmer mit Spielzeug" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><video data-oc-carousel-v1.item-type="video" poster="/previews/imagery/samples/otto-group-layered-photo/still-life-toy.webp" width="1200" height="800" controls preload="none" style="display:block;width:100%;height:auto" aria-label="Video: Spielzeug als Stillleben"></video><img src="/previews/references/images/otto/otto-fashion-drop-mojo-06.webp" alt="Mojo Drop Sweatshirt" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"></oc-carousel-v1></div><p class="demo-label" style="text-align:center">Video slides show a play icon in the pagination dots (poster frame only; the mirror has no video file)</p></div>

Behavior

States

The carousel has no own states, but uses the states of the scroll buttons and the pagination dots.

Interaction

The items of the carousel scroll by tapping the scroll buttons or scrolling horizontally. The item always snaps into place to become fully visible.

Wohnzimmer mit Sofa und StehlampeKinderzimmer mit SpielzeugMojo Drop SweatshirtBücher im OTTO SortimentPaket vor der Haustür

Click the scroll button or scroll horizontally; items snap automatically

Liveinteraction
HTML
<div style="background:#fff;padding:32px 0;max-width:480px;margin:0 auto"><oc-carousel-v1 oc-aria-label="Wohnideen"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-living-room.webp" alt="Wohnzimmer mit Sofa und Stehlampe" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-kids-room.webp" alt="Kinderzimmer mit Spielzeug" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/references/images/otto/otto-fashion-drop-mojo-06.webp" alt="Mojo Drop Sweatshirt" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/references/images/otto/otto-buecher-sortiment.webp" alt="Bücher im OTTO Sortiment" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-parcel-doorstep.webp" alt="Paket vor der Haustür" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"></oc-carousel-v1></div><p class="demo-label" style="text-align:center">Click the scroll button or scroll horizontally; items snap automatically</p></div>

Infinite Scrolling: The carousel does not support infinite scrolling. That means, whenever users get to the last item, there is no shortcut back to the first item.

Auto-forwarding: The carousel does not support auto-forwarding. This can lead to unease, create unnecessary feelings of urgency, and necessitate the provision of a pause option.

Fitting

The items in the carousel are set to fill-parent. There is no spacing to the sides, but there is a small gap between the items.

Items fill-parent, 16px gap between items (scroll to see it)

Wohnzimmer mit Sofa und StehlampeKinderzimmer mit SpielzeugMojo Drop SweatshirtBücher im OTTO SortimentPaket vor der Haustür
Livefitting
HTML
<p class="demo-label" style="text-align:center">Items fill-parent, 16px gap between items (scroll to see it)</p><div style="background:#fff;padding:32px 0;max-width:480px;margin:0 auto"><oc-carousel-v1 oc-aria-label="Wohnideen"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-living-room.webp" alt="Wohnzimmer mit Sofa und Stehlampe" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-kids-room.webp" alt="Kinderzimmer mit Spielzeug" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/references/images/otto/otto-fashion-drop-mojo-06.webp" alt="Mojo Drop Sweatshirt" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/references/images/otto/otto-buecher-sortiment.webp" alt="Bücher im OTTO Sortiment" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-parcel-doorstep.webp" alt="Paket vor der Haustür" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"></oc-carousel-v1></div></div>

Placement

To position the carousel, use fill-parent with no spacing to the left or right. This ensures that items can scroll out of view without disappearing too early or too late.

fill-parent

Wohnzimmer mit Sofa und StehlampeKinderzimmer mit SpielzeugMojo Drop SweatshirtBücher im OTTO SortimentPaket vor der Haustür
Liveplacement
HTML
<p class="demo-label" style="text-align:center">fill-parent</p><div style="background:#fff;padding:32px 0;max-width:480px;margin:0 auto"><oc-carousel-v1 oc-aria-label="Wohnideen"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-living-room.webp" alt="Wohnzimmer mit Sofa und Stehlampe" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-kids-room.webp" alt="Kinderzimmer mit Spielzeug" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/references/images/otto/otto-fashion-drop-mojo-06.webp" alt="Mojo Drop Sweatshirt" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/references/images/otto/otto-buecher-sortiment.webp" alt="Bücher im OTTO Sortiment" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-parcel-doorstep.webp" alt="Paket vor der Haustür" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"></oc-carousel-v1></div></div>

Responsiveness

On mobile devices, the scroll buttons are hidden automatically.

Wohnzimmer mit Sofa und StehlampeKinderzimmer mit SpielzeugMojo Drop SweatshirtBücher im OTTO SortimentPaket vor der Haustür

mobile

Wohnzimmer mit Sofa und StehlampeKinderzimmer mit SpielzeugMojo Drop SweatshirtBücher im OTTO SortimentPaket vor der Haustür

desktop

Liveresponsivness
HTML
<div style="background:#fff;padding:32px 0;max-width:360px;margin:0 auto"><oc-carousel-v1 oc-aria-label="Wohnideen"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-living-room.webp" alt="Wohnzimmer mit Sofa und Stehlampe" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-kids-room.webp" alt="Kinderzimmer mit Spielzeug" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/references/images/otto/otto-fashion-drop-mojo-06.webp" alt="Mojo Drop Sweatshirt" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/references/images/otto/otto-buecher-sortiment.webp" alt="Bücher im OTTO Sortiment" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-parcel-doorstep.webp" alt="Paket vor der Haustür" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"></oc-carousel-v1></div><p class="demo-label" style="text-align:center">mobile</p><div style="background:#fff;padding:32px 0"><oc-carousel-v1 oc-aria-label="Wohnideen"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-living-room.webp" alt="Wohnzimmer mit Sofa und Stehlampe" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-kids-room.webp" alt="Kinderzimmer mit Spielzeug" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/references/images/otto/otto-fashion-drop-mojo-06.webp" alt="Mojo Drop Sweatshirt" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/references/images/otto/otto-buecher-sortiment.webp" alt="Bücher im OTTO Sortiment" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-parcel-doorstep.webp" alt="Paket vor der Haustür" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"></oc-carousel-v1></div><p class="demo-label" style="text-align:center">desktop</p></div>

By default, the vertical position of the scroll buttons is set to 50% of the height of the carousel. If needed, this can be customized.

Wohnzimmer mit Sofa und StehlampeKinderzimmer mit SpielzeugMojo Drop SweatshirtBücher im OTTO SortimentPaket vor der Haustür

default position (50%)

Wohnzimmer mit Sofa und StehlampeKinderzimmer mit SpielzeugMojo Drop SweatshirtBücher im OTTO SortimentPaket vor der Haustür

custom position (arrow-button-position="80%")

Livescroll button position
HTML
<div style="background:#fff;padding:32px 0;max-width:480px;margin:0 auto"><oc-carousel-v1 oc-aria-label="Wohnideen"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-living-room.webp" alt="Wohnzimmer mit Sofa und Stehlampe" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-kids-room.webp" alt="Kinderzimmer mit Spielzeug" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/references/images/otto/otto-fashion-drop-mojo-06.webp" alt="Mojo Drop Sweatshirt" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/references/images/otto/otto-buecher-sortiment.webp" alt="Bücher im OTTO Sortiment" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-parcel-doorstep.webp" alt="Paket vor der Haustür" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"></oc-carousel-v1></div><p class="demo-label" style="text-align:center">default position (50%)</p><div style="background:#fff;padding:32px 0;max-width:480px;margin:0 auto"><oc-carousel-v1 oc-aria-label="Wohnideen" arrow-button-position="80%"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-living-room.webp" alt="Wohnzimmer mit Sofa und Stehlampe" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-kids-room.webp" alt="Kinderzimmer mit Spielzeug" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/references/images/otto/otto-fashion-drop-mojo-06.webp" alt="Mojo Drop Sweatshirt" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/references/images/otto/otto-buecher-sortiment.webp" alt="Bücher im OTTO Sortiment" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-parcel-doorstep.webp" alt="Paket vor der Haustür" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"></oc-carousel-v1></div><p class="demo-label" style="text-align:center">custom position (arrow-button-position="80%")</p></div>

The left scroll button is hidden at the start of the carousel. The right scroll button is hidden at the end of the carousel. When the scroll buttons are hidden, the respective space is reserved for another second so accidental clicks are prevented (click-prevention).

Wohnzimmer mit Sofa und StehlampeKinderzimmer mit SpielzeugMojo Drop SweatshirtBücher im OTTO SortimentPaket vor der HaustürHermes ZustellungGeflochtene LampenSpielzeug als StilllebenKopfhörerSitzecke auf dem OTTO Campus

First item: only the right scroll button; scroll to item 10 and only the left one remains

Livestart and end of carousel
HTML
<div style="background:#fff;padding:32px 0;max-width:480px;margin:0 auto"><oc-carousel-v1 oc-aria-label="Wohnideen"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-living-room.webp" alt="Wohnzimmer mit Sofa und Stehlampe" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-kids-room.webp" alt="Kinderzimmer mit Spielzeug" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/references/images/otto/otto-fashion-drop-mojo-06.webp" alt="Mojo Drop Sweatshirt" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/references/images/otto/otto-buecher-sortiment.webp" alt="Bücher im OTTO Sortiment" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-parcel-doorstep.webp" alt="Paket vor der Haustür" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/references/images/otto/otto-peak2025-hermes-zustellung.webp" alt="Hermes Zustellung" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/imagery/samples/otto-group-layered-photo/woven-lamps.webp" alt="Geflochtene Lampen" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/imagery/samples/otto-group-layered-photo/still-life-toy.webp" alt="Spielzeug als Stillleben" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/imagery/samples/otto-group-layered-photo/headphones-through-shapes.webp" alt="Kopfhörer" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/references/images/otto/otto-campus-social-space.webp" alt="Sitzecke auf dem OTTO Campus" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"></oc-carousel-v1></div><p class="demo-label" style="text-align:center">First item: only the right scroll button; scroll to item 10 and only the left one remains</p></div>

Use the carousel to display one item at a time and draw more attention to the content. Alternatively, you can use the cinema to display multiple items at once.

Carousel: one item per view

Wohnzimmer mit Sofa und StehlampeKinderzimmer mit SpielzeugMojo Drop SweatshirtBücher im OTTO SortimentPaket vor der Haustür

Cinema: several items, the next one is cut

Wohnzimmer mit Sofa und StehlampeKinderzimmer mit SpielzeugMojo Drop SweatshirtBücher im OTTO SortimentPaket vor der HaustürHermes Zustellung
Livecarousel vs. cinema
HTML
<p class="demo-label" style="text-align:center">Carousel: one item per view</p><div style="background:#fff;padding:32px 0;max-width:480px;margin:0 auto"><oc-carousel-v1 oc-aria-label="Wohnideen"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-living-room.webp" alt="Wohnzimmer mit Sofa und Stehlampe" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-kids-room.webp" alt="Kinderzimmer mit Spielzeug" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/references/images/otto/otto-fashion-drop-mojo-06.webp" alt="Mojo Drop Sweatshirt" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/references/images/otto/otto-buecher-sortiment.webp" alt="Bücher im OTTO Sortiment" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-parcel-doorstep.webp" alt="Paket vor der Haustür" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"></oc-carousel-v1></div><p class="demo-label" style="text-align:center">Cinema: several items, the next one is cut</p><div style="background:#fff;padding:32px 0;max-width:480px;margin:0 auto"><oc-cinema-v1 oc-aria-label="Wohnideen"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-living-room.webp" alt="Wohnzimmer mit Sofa und Stehlampe" width="240" height="160" loading="lazy" style="display:block;width:240px;height:auto"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-kids-room.webp" alt="Kinderzimmer mit Spielzeug" width="240" height="160" loading="lazy" style="display:block;width:240px;height:auto"><img src="/previews/references/images/otto/otto-fashion-drop-mojo-06.webp" alt="Mojo Drop Sweatshirt" width="240" height="160" loading="lazy" style="display:block;width:240px;height:auto"><img src="/previews/references/images/otto/otto-buecher-sortiment.webp" alt="Bücher im OTTO Sortiment" width="240" height="160" loading="lazy" style="display:block;width:240px;height:auto"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-parcel-doorstep.webp" alt="Paket vor der Haustür" width="240" height="160" loading="lazy" style="display:block;width:240px;height:auto"><img src="/previews/references/images/otto/otto-peak2025-hermes-zustellung.webp" alt="Hermes Zustellung" width="240" height="160" loading="lazy" style="display:block;width:240px;height:auto"></oc-cinema-v1></div></div>

Best practices

Wohnzimmer mit Sofa und StehlampeKinderzimmer mit SpielzeugMojo Drop SweatshirtBücher im OTTO SortimentPaket vor der Haustür
DoPlace within a layout with full-bleed.
Wohnzimmer mit Sofa und StehlampeKinderzimmer mit SpielzeugMojo Drop SweatshirtBücher im OTTO SortimentPaket vor der Haustür
Don'tPlace with additional outer spacing.
Wohnzimmer mit Sofa und StehlampeKinderzimmer mit SpielzeugMojo Drop SweatshirtBücher im OTTO SortimentPaket vor der Haustür
DoUse with at least one indicator, like the scroll buttons or pagination dots.
Wohnzimmer mit Sofa und StehlampeKinderzimmer mit SpielzeugMojo Drop SweatshirtBücher im OTTO SortimentPaket vor der Haustür
Don'tUse no indicator.

Accessibility

The hitbox of the pagination dots is "undersized" as of "WCAG 2.2 Success Criterion 2.5.8 target size". That is acceptable though, as there is an equivalent control (horizontal scrolling / scroll buttons) for this function.

Wohnzimmer mit Sofa und StehlampeKinderzimmer mit SpielzeugMojo Drop SweatshirtBücher im OTTO SortimentPaket vor der Haustür

Each pagination dot has a hitbox of at least 16 × 16 px

Liveundersized hitbox of pagination on dots
HTML
<div style="background:#fff;padding:0 0 24px;max-width:720px;margin:0 auto"><oc-carousel-v1 oc-aria-label="Wohnideen"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-living-room.webp" alt="Wohnzimmer mit Sofa und Stehlampe" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-kids-room.webp" alt="Kinderzimmer mit Spielzeug" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/references/images/otto/otto-fashion-drop-mojo-06.webp" alt="Mojo Drop Sweatshirt" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/references/images/otto/otto-buecher-sortiment.webp" alt="Bücher im OTTO Sortiment" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-parcel-doorstep.webp" alt="Paket vor der Haustür" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"></oc-carousel-v1></div><p class="demo-label" style="text-align:center">Each pagination dot has a hitbox of at least 16 × 16 px</p></div>

When entering a carousel using keyboard navigation, a skip link is shown that offers an option to "Überspringen". If this should be made more specific, "oc-aria-label" may be used to change this Skip Link to "[Label] überspringen".

Press Tab to move into the carousel: the skip link „Überspringen“ appears

Wohnzimmer mit Sofa und StehlampeKinderzimmer mit SpielzeugMojo Drop Sweatshirt
Liveskip link within cinema
HTML
<p class="demo-label" style="text-align:center">Press Tab to move into the carousel: the skip link „Überspringen“ appears</p><div style="background:#fff;padding:24px 0;max-width:480px;margin:0 auto"><oc-carousel-v1 oc-aria-label="Wohnideen"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-living-room.webp" alt="Wohnzimmer mit Sofa und Stehlampe" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-kids-room.webp" alt="Kinderzimmer mit Spielzeug" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"><img src="/previews/references/images/otto/otto-fashion-drop-mojo-06.webp" alt="Mojo Drop Sweatshirt" width="1200" height="800" loading="lazy" style="display:block;width:100%;height:auto"></oc-carousel-v1></div></div>

Pagination dots are not part of keyboard navigation, as the function is doubled for keyboard users.

For information on accessibility, refer to the technical documentation.

Status

Implementation

Live demo

Over-Ear-Kopfhörer in Schwarz, FrontansichtKopfhörer im DetailKopfhörer im Homeoffice
-20 %Bestseller

Over-Ear-Kopfhörer mit Noise Cancelling, bis zu 40 Stunden Akkulaufzeit

4,6 (128 Bewertungen)

79,99 €

UVP 99,99 € · inkl. MwSt., zzgl. Versand

Lieferung Mi., 01.10. bis Do., 02.10.

In den Warenkorb

Geschlossene Bauweise, aktive Geräuschunterdrückung, Bluetooth 5.3, faltbar, mit Transporttasche und USB-C-Ladekabel.

Kostenlose Lieferung ab 29 € Bestellwert. Du kannst den Artikel 30 Tage lang kostenlos zurückschicken.

„Toller Klang und die Geräuschunterdrückung ist im Zug Gold wert.“ – Jana, 12.09.2026

LiveReal OTTO components, rendered by the OTTO component runtime
HTML
<div class="on-frame" style="padding:32px 16px">
<div style="width:100%;max-width:390px;margin:0 auto;background:#fff;border-radius:16px;overflow:hidden;box-shadow:0 1px 3px rgba(0,0,0,.08)">
<oc-carousel-v1 oc-aria-label="Produktbilder Over-Ear-Kopfhörer"><img src="/previews/imagery/samples/otto-product-still/product-headphones.webp" alt="Over-Ear-Kopfhörer in Schwarz, Frontansicht" width="1200" height="1200" style="display:block;width:100%;height:auto;aspect-ratio:1;object-fit:cover"><img src="/previews/imagery/samples/otto-group-layered-photo/headphones-through-shapes.webp" alt="Kopfhörer im Detail" width="1200" height="800" style="display:block;width:100%;height:auto;aspect-ratio:1;object-fit:cover"><img src="/previews/imagery/samples/otto-group-layered-photo/over-shoulder-laptop.webp" alt="Kopfhörer im Homeoffice" width="1200" height="800" style="display:block;width:100%;height:auto;aspect-ratio:1;object-fit:cover"></oc-carousel-v1>
<div style="display:grid;gap:8px;padding:16px">
<oc-tag-v1 variant="sale" size="50">-20 %</oc-tag-v1><oc-tag-v1 size="50">Bestseller</oc-tag-v1></div>
  <p class="oc-copy-100" style="margin:0">Over-Ear-Kopfhörer mit Noise Cancelling, bis zu 40 Stunden Akkulaufzeit</p>
  <p class="oc-copy-75" style="margin:0;display:flex;align-items:center;gap:6px"><span style="display:inline-flex;align-items:center;gap:2px"><oc-icon-v1 type="rating-filled" size="50"></oc-icon-v1><oc-icon-v1 type="rating-filled" size="50"></oc-icon-v1><oc-icon-v1 type="rating-filled" size="50"></oc-icon-v1><oc-icon-v1 type="rating-filled" size="50"></oc-icon-v1><oc-icon-v1 type="rating-half" size="50"></oc-icon-v1></span> 4,6 (128 Bewertungen)</p>
  <p class="oc-headline-200" style="margin:4px 0 0;color:var(--oc-semantic-color-text-sale)">79,99 €</p>
  <p class="oc-copy-75" style="margin:0;color:var(--oc-semantic-color-text-secondary)">UVP 99,99 € · inkl. MwSt., zzgl. Versand</p>
  <p class="oc-copy-75" style="margin:4px 0 8px;display:flex;align-items:center;gap:6px"><oc-icon-v1 type="delivery-flat"></oc-icon-v1>Lieferung Mi., 01.10. bis Do., 02.10.</p>
  <oc-button-v1 variant="primary" icon-type-left="basket">In den Warenkorb</oc-button-v1>
<div style="padding:0 16px 8px">
  <oc-accordion-v1 title="Produktdetails"><p class="oc-copy-100">Geschlossene Bauweise, aktive Geräuschunterdrückung, Bluetooth 5.3, faltbar, mit Transporttasche und USB-C-Ladekabel.</p></oc-accordion-v1>
  <oc-accordion-v1 title="Lieferung &amp; Rücksendung"><p class="oc-copy-100">Kostenlose Lieferung ab 29 € Bestellwert. Du kannst den Artikel 30 Tage lang kostenlos zurückschicken.</p></oc-accordion-v1>
  <oc-accordion-v1 title="Bewertungen (128)"><p class="oc-copy-100">„Toller Klang und die Geräuschunterdrückung ist im Zug Gold wert.“ – Jana, 12.09.2026</p></oc-accordion-v1>

Code

Version Tag Status API
v1 <oc-carousel-v1> Stable, allowed for generation CarouselV1

Overview (v1)

The carousel component provides a way to display multiple items in a horizontal slide. This component is useful in cases where visual space is limited, and you want to present a series of related content (e.g., images or cards) that the user can navigate through.

Default variation
Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder
HTML
<oc-carousel-v1 oc-aria-label="carousel of placeholders">
<oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
</oc-carousel-v1>
Configuration

The carousel component is configurable, allowing you to tailor its features and appearance to your specific needs. To explore all the available options and adjust the component, use the component configurator and see the changes affect the component in real-time.

Usage guidelines

Before integrating the carousel component into your project, make sure you have correctly installed the OTTO components package. Look through the variations page for examples of possible component variations. Here, you can discover both common and specific variations that address different use cases.

Info

See the Carousel UX documentation for detailed user experience guidelines.

Accessibility

The carousel component comes with a set of built-in accessibility features to ensure a seamless experience for all users.

Use oc-aria-label

To make the carousel recognizable for screen readers, use the oc-aria-label attribute to provide clear and descriptive context information. See the general accessibility documentation for guidance on using oc-aria-label, including how it works with link and masked link behavior.

Events

The carousel component provides events for checking the item visibility and the stage scroll state.

Item visibility changed

The oc-item-visibility-changed event triggers, whenever a slide enters or leaves the viewport. The event returns an object that provides an array with one visible item, the index position of the item's slide, the scroll direction of the carousel stage, whether it is currently scrolling or not and the source that triggered the scroll:

myCarousel.addEventListener("oc-item-visibility-changed", (event) => {
  event.detail; // Returns: { { visibleItem: {element: HTMLElement; index: number }, scrollDirection: "left | right", stageIsScrolling: boolean, scrollSource: "arrows" | "pagination-dots" | "move-method" | "swipe" }
});

For more information on tracking the visibility state of the component itself, see the visibility tracking documentation.

Stage scroll

The oc-stage-scroll event triggers when the stage is being scrolled. It returns the boolean isScrolling that reflects the current state as well as the source that initiated the scroll:

myCarousel.addEventListener("oc-stage-scroll", (event) => {
  event.detail; // Returns: { isScrolling: boolean, source: "arrows" | "pagination-dots" | "move-method" | "swipe" }
});

Sources that initiate the scroll can be:

  • arrows - When the user interacts via the visual buttons.
  • pagination-dots - When the user interacts via the additional pagination-dots.
  • move-method - When the stage is being scrolled programmatically.
  • swipe - When the user interacts via swipe gestures on smartphones or laptop touchpads.

Configuration (v1)

Configure the carousel component with the controls below and see the changes live in the preview canvas. Click the Show code button within the preview canvas to see the source code for the current component configuration.

Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder
HTML
<oc-carousel-v1 oc-aria-label="carousel of placeholders">
<oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
</oc-carousel-v1>

Interactive configurator (Storybook controls); every option is listed in the API section of this file.

API v1

The Carousel component provides a way to display multiple items in a horizontal slide. This component is useful in cases where visual space is limited, and you want to present a series of related content (e.g., images or cards) that the user can navigate through.

The Carousel component supports navigation through arrow buttons. The position of these buttons can be customized. It also supports ARIA labels for accessibility.

Attributes / properties
Attribute Type Default Required Description
size "50" | "100" "100" no Sets the size of the carousel
visible-item HTMLElement no The current visible item.
arrow-buttons-on-hover boolean false no Indicates whether the arrow buttons are only visible on hover.
hide-arrow-buttons boolean false no Indicates whether the arrow buttons are hidden.
hide-pagination-dots boolean false no Indicates whether the pagination-dots are hidden.
hide-skip-link boolean false no Indicates whether the skip link that allows users to skip the carousel content is hidden.
arrow-button-position string "50%" no Specifies the custom position of the arrow buttons. This can be any valid CSS value for the top property. The arrow buttons are used to navigate through the items in the carousel.
oc-aria-label string yes Sets the ARIA label of the carousel section. This label is used by screen readers to provide context to users with visual impairments. The label should describe the overall content or purpose of the carousel.

Note: This is mandatory for skipping the carousel with modern screen readers.
Slots
Slot Required Description
default yes Defines the main content of the carousel. This slot should contain a series of items (e.g., images or cards) that you want to present in a carousel format.
Events
Event Detail type Description
oc-item-visibility-changed CustomEvent<{ visibleItem: { element: HTMLElement; index: number; }; scrollDirection: "left" | "right"; stageIsScrolling: boolean; scrollSource?: "arrows" | "pagination-dots" | "move-method" | "swipe" | undefined; }> The oc-item-visibility-changed event triggers, whenever a slide enters or leaves the viewport. The event returns an object that provides an array with one visible item, the index position of the item's slide, and the scroll direction of the carousel stage The event returns a boolean of the current state of the stage as well as the source that initiated the scroll.
oc-stage-scroll CustomEvent<{ isScrolling: boolean; source?: "arrows" | "pagination-dots" | "move-method" | "swipe" | undefined; }> Scrolling the carousel triggers the oc-stage-scroll event. The event returns a boolean of the current state as well as the source that initiated the scroll.
oc-property-change OcCarouselV1Events["oc-property-change"] Whenever a property value changes, this event triggers. Use this event to track all property changes within the component.

Refer to the Events documentation for more information.
oc-mount { component: string; } Fired when the component is mounted to the DOM. The event is fired when the onMount hook of the component is called by the runtime.
oc-unmount { component: string; } Fired when the component is unmounted from the DOM. The event is fired when the function returned by the onMount hook of the component is called by the runtime.
Methods
  • moveTo: (index: number, options?: { source?: "arrows" | "pagination-dots" | undefined; reducedMotion?: boolean | undefined; } | undefined) => void

    Programmatically moves the stage of the carousel.

    Parameters:

    • index: number - The index of the slide that should be scrolled to.
    • options: { source?: "arrows" | "pagination-dots" | undefined; reducedMotion?: boolean | undefined; } | undefined - Optional scroll behavior settings.

    Returns: void

    Example:

    const carousel = document.querySelector("oc-carousel-v1");
    carousel.moveTo(2, { reducedMotion: true, source: "arrows" });
    
CSS custom properties
Custom property Default Description
--overflow-behavior unset Defines the overflow behavior of the carousel stage. This variable controls how the content that exceeds the visible area of the carousel is handled. It can be set to values like auto, hidden, or scroll to determine whether scrollbars are shown and how users can navigate through the overflow content.

Variations (v1)

Variations

Listed below are the most common variations of the carousel component as well as specific component variations for different use cases.

You can explore all available options using the component configurator, adjust the component to your needs, and see the changes live in a preview canvas.

Default

Story: components-carousel-variations--default · tags: components

The default configuration uses the component to render a carousel with 16 placeholders.

Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder
HTML
<oc-carousel-v1 oc-aria-label="carousel of placeholders">
<oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
</oc-carousel-v1>
Size 50

Story: components-carousel-variations--size-50 · tags: components

The size 50 configuration uses the component to render a smaller carousel with 16 placeholders.

Args: size=50

Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder Placeholder
HTML
<oc-carousel-v1 oc-aria-label="carousel of placeholders" size="50">
<oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
        <oc-placeholder-v1 style="height: 100px" interactive="true">Placeholder</oc-placeholder-v1>
</oc-carousel-v1>
With video

Story: components-carousel-variations--with-video · tags: components

The configuration with items + a video. Via a data-attribute, a slide can be flagged to have a play icon instead of a dot in the pagination dots stage.

Args: defaultSlot=(see snippet)

ITEM 1 ITEM 2 ITEM 3 ITEM 5 ITEM 6 ITEM 7
HTML
<oc-carousel-v1 oc-aria-label="carousel of placeholders">
<oc-placeholder-v1 interactive="true">ITEM 1</oc-placeholder-v1>
<oc-placeholder-v1  interactive="true">ITEM 2</oc-placeholder-v1>
<oc-placeholder-v1  interactive="true">ITEM 3</oc-placeholder-v1>
<video data-oc-carousel-v1.item-type="video" height="240" controls></video>
<oc-placeholder-v1  interactive="true">ITEM 5</oc-placeholder-v1>
<oc-placeholder-v1  interactive="true">ITEM 6</oc-placeholder-v1>
<oc-placeholder-v1  interactive="true">ITEM 7</oc-placeholder-v1>
</oc-carousel-v1>
Arrow-Buttons on Hover

Story: components-carousel-variations--arrow-buttons-on-hover · tags: components

The configuration with arrow buttons to only be visible during hover.

Args: defaultSlot=(see snippet), arrow-buttons-on-hover=true

ITEM 1 ITEM 2 ITEM 3 ITEM 5 ITEM 6
HTML
<oc-carousel-v1 oc-aria-label="carousel of placeholders" arrow-buttons-on-hover>
<oc-placeholder-v1 interactive="true">ITEM 1</oc-placeholder-v1>
<oc-placeholder-v1  interactive="true">ITEM 2</oc-placeholder-v1>
<oc-placeholder-v1  interactive="true">ITEM 3</oc-placeholder-v1>
<oc-placeholder-v1  interactive="true">ITEM 5</oc-placeholder-v1>
<oc-placeholder-v1  interactive="true">ITEM 6</oc-placeholder-v1>
</oc-carousel-v1>
Hidden Arrow-Buttons

Story: components-carousel-variations--hidden-arrow-buttons · tags: components

The configuration with hidden arrow buttons.

Args: defaultSlot=(see snippet), hide-arrow-buttons=true

ITEM 1 ITEM 2 ITEM 3 ITEM 5 ITEM 6
HTML
<oc-carousel-v1 oc-aria-label="carousel of placeholders" hide-arrow-buttons>
<oc-placeholder-v1 interactive="true">ITEM 1</oc-placeholder-v1>
<oc-placeholder-v1  interactive="true">ITEM 2</oc-placeholder-v1>
<oc-placeholder-v1  interactive="true">ITEM 3</oc-placeholder-v1>
<oc-placeholder-v1  interactive="true">ITEM 5</oc-placeholder-v1>
<oc-placeholder-v1  interactive="true">ITEM 6</oc-placeholder-v1>
</oc-carousel-v1>
Few Items

Story: components-carousel-variations--few-items · tags: components

The configuration with only a few items.

Args: defaultSlot=(see snippet)

ITEM 1 ITEM 2 ITEM 3
HTML
<oc-carousel-v1 oc-aria-label="carousel of placeholders">
<oc-placeholder-v1 interactive="true">ITEM 1</oc-placeholder-v1>
<oc-placeholder-v1  interactive="true">ITEM 2</oc-placeholder-v1>
<oc-placeholder-v1  interactive="true">ITEM 3</oc-placeholder-v1>
</oc-carousel-v1>
Few Items Size 50

Story: components-carousel-variations--few-items-size-50 · tags: components

The configuration of size 50 with only a few items.

Args: defaultSlot=(see snippet), size=50

ITEM 1 ITEM 2
HTML
<oc-carousel-v1 oc-aria-label="carousel of placeholders" size="50">
<oc-placeholder-v1 interactive="true">ITEM 1</oc-placeholder-v1>
<oc-placeholder-v1  interactive="true">ITEM 2</oc-placeholder-v1>
</oc-carousel-v1>
Demo: In a sheet

Story: components-carousel-variations--demo-in-a-sheet · tags: components

The configuration within the oc-sheet-v1 component.

ITEM 1 ITEM 2 ITEM 3 ITEM 4 ITEM 5 ITEM 6 ITEM 7 ITEM 8

Open sheet

HTML
<oc-sheet-v1 id="carousel-in-sheet">
<oc-carousel-v1>
  <oc-placeholder-v1 interactive="true">ITEM 1</oc-placeholder-v1>
  <oc-placeholder-v1 interactive="true">ITEM 2</oc-placeholder-v1>
  <oc-placeholder-v1 interactive="true">ITEM 3</oc-placeholder-v1>
  <oc-placeholder-v1 interactive="true">ITEM 4</oc-placeholder-v1>
  <oc-placeholder-v1 interactive="true">ITEM 5</oc-placeholder-v1>
  <oc-placeholder-v1 interactive="true">ITEM 6</oc-placeholder-v1>
  <oc-placeholder-v1 interactive="true">ITEM 7</oc-placeholder-v1>
  <oc-placeholder-v1 interactive="true">ITEM 8</oc-placeholder-v1>
</oc-carousel-v1>
</oc-sheet-v1>
<p>
<oc-button-v1 data-oc-sheet-v1-open data-oc-sheet-v1-open.id="carousel-in-sheet" size="50">
  Open sheet
</oc-button-v1>
</p>
Story source (TypeScript, verbatim from Storybook)
{
  name: "Demo: In a sheet",
  parameters: {
    chromatic: {
      hideInChromatic: true
    },
    itest: {
      disableSnapshot: true
    }
  },
  render() {
    return html`
      <oc-sheet-v1 id="carousel-in-sheet">
        <oc-carousel-v1>
          <oc-placeholder-v1 interactive="true">ITEM 1</oc-placeholder-v1>
          <oc-placeholder-v1 interactive="true">ITEM 2</oc-placeholder-v1>
          <oc-placeholder-v1 interactive="true">ITEM 3</oc-placeholder-v1>
          <oc-placeholder-v1 interactive="true">ITEM 4</oc-placeholder-v1>
          <oc-placeholder-v1 interactive="true">ITEM 5</oc-placeholder-v1>
          <oc-placeholder-v1 interactive="true">ITEM 6</oc-placeholder-v1>
          <oc-placeholder-v1 interactive="true">ITEM 7</oc-placeholder-v1>
          <oc-placeholder-v1 interactive="true">ITEM 8</oc-placeholder-v1>
        </oc-carousel-v1>
      </oc-sheet-v1>

      <p>
        <oc-button-v1 data-oc-sheet-v1-open data-oc-sheet-v1-open.id="carousel-in-sheet" size="50">
          Open sheet
        </oc-button-v1>
      </p>
    `;
  }
}
Demo: multiple images

Story: components-carousel-variations--demo · tags: components

Demo showcasing the carousel with multiple images.

Args: defaultSlot=(see snippet)

<!-- Wrapper to limit the width & height-->
<div style="max-width: 400px; max-height: 300px">
  <!-- The component-->
  <oc-carousel-v1 oc-aria-label="carousel of placeholders"><oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    </oc-carousel-v1>
</div>
Story source (TypeScript, verbatim from Storybook)
{
  name: "Demo: multiple images",
  parameters: {
    chromatic: {
      hideInChromatic: true
    }
  },
  args: {
    defaultSlot: `<oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    `
  },
  render: ({
    defaultSlot,
    ...props
  }) => {
    return html`
      <!-- Wrapper to limit the width & height-->
      <div style="max-width: 400px; max-height: 300px">
        <!-- The component-->
        <oc-carousel-v1 ${spread(props)}>${unsafeHTML(defaultSlot)}</oc-carousel-v1>
      </div>
    `;
  }
}
Demo: Move-Method

Story: components-carousel-variations--demo-move-method · tags: components

Demo showcasing the movement of the stage programmatically.

Args: defaultSlot=(see snippet)

<!-- Wrapper to limit the width & height-->
<div style="max-width: 400px; max-height: 300px">
  <!-- The component-->
  <oc-carousel-v1 oc-aria-label="carousel of placeholders"><oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    </oc-carousel-v1>
</div>
<br />
<br />
<p>
  <oc-button-v1 size="50">Move stage to slide 5</oc-button-v1>
  <br />
  <br />
  <textarea
    style="width: 100%; height: 4rem; resize:none; font-family: Monospace; border:0;"
    aria-label="example"
    disabled
  >
  const moveMyCarousel = (myCarousel) => {
    myCarousel.moveTo(5);
  }
  </textarea>
</p>
<br />
<br />
<p>
  <oc-button-v1 size="50">Move stage to slide 5 (reduced motion)</oc-button-v1>
  <br />
  <br />
  <textarea
    style="width: 100%; height: 4rem; resize:none; font-family: Monospace; border:0;"
    aria-label="example"
    disabled
  >
  const moveMyCarousel = (myCarousel) => {
    myCarousel.moveTo(5, { reducedMotion: true });
  }
  </textarea>
</p>

<script>
  (() => {
    const [moveStage, moveStageReducedMotion] = document.getElementsByTagName("oc-button-v1");

    moveStage.addEventListener("click", () => {
      document.querySelector("oc-carousel-v1").moveTo(5);
    });

    moveStageReducedMotion.addEventListener("click", () => {
      document.querySelector("oc-carousel-v1").moveTo(5, { reducedMotion: true });
    });
  })();
</script>
Story source (TypeScript, verbatim from Storybook)
{
  name: "Demo: Move-Method",
  parameters: {
    chromatic: {
      hideInChromatic: true,
      disableSnapshot: true
    }
  },
  args: {
    defaultSlot: `<oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    <oc-placeholder-v1  variant="image" width="100%" height="100%" style="height: 300px" interactive="true"></oc-placeholder-v1>
    `
  },
  render: ({
    defaultSlot,
    ...props
  }) => {
    return html`
      <!-- Wrapper to limit the width & height-->
      <div style="max-width: 400px; max-height: 300px">
        <!-- The component-->
        <oc-carousel-v1 ${spread(props)}>${unsafeHTML(defaultSlot)}</oc-carousel-v1>
      </div>
      <br />
      <br />
      <p>
        <oc-button-v1 size="50">Move stage to slide 5</oc-button-v1>
        <br />
        <br />
        <textarea
          style="width: 100%; height: 4rem; resize:none; font-family: Monospace; border:0;"
          aria-label="example"
          disabled
        >
        const moveMyCarousel = (myCarousel) => {
          myCarousel.moveTo(5);
        }
        </textarea>
      </p>
      <br />
      <br />
      <p>
        <oc-button-v1 size="50">Move stage to slide 5 (reduced motion)</oc-button-v1>
        <br />
        <br />
        <textarea
          style="width: 100%; height: 4rem; resize:none; font-family: Monospace; border:0;"
          aria-label="example"
          disabled
        >
        const moveMyCarousel = (myCarousel) => {
          myCarousel.moveTo(5, { reducedMotion: true });
        }
        </textarea>
      </p>

      <script>
        (() => {
          const [moveStage, moveStageReducedMotion] = document.getElementsByTagName("oc-button-v1");

          moveStage.addEventListener("click", () => {
            document.querySelector("oc-carousel-v1").moveTo(5);
          });

          moveStageReducedMotion.addEventListener("click", () => {
            document.querySelector("oc-carousel-v1").moveTo(5, { reducedMotion: true });
          });
        })();
      </script>
    `;
  }
}
Demo: Multiple Carousels

Story: components-carousel-variations--demo-multiple-carousels · tags: components

A Demo of multiple carousels.

List of Carousels

Lorem ipsum dolor sit amet consectetur adipisicing elit. Officiis facilis nobis nisi odit maiores libero assumenda repudiandae. Repudiandae sapiente odit id. Voluptas dolores repellendus sit corrupti ab dolor distinctio, expedita id quod suscipit. Saepe culpa libero laborum vel quos illum officia, fuga corporis dolor excepturi! Excepturi, nobis. Pariatur itaque voluptas tenetur qui aut eveniet, aliquam numquam quia distinctio dolor ducimus quod optio quam soluta expedita eligendi quae, ipsa culpa. Praesentium autem impedit, necessitatibus quos porro cupiditate ipsam eveniet nisi illo. Sequi molestias magnam exercitationem repudiandae maiores dolor itaque earum necessitatibus facere. Officiis dolorem, hic modi, maxime sint sapiente, libero quas impedit earum quibusdam rerum minus atque doloribus! Accusamus impedit rerum ea pariatur sunt ex iure consequatur! Quisquam maiores doloremque, sit vero, sint a ullam eum possimus dicta voluptatem numquam sequi eveniet dolorem recusandae ratione odio! Sint reprehenderit earum quas fugit dolorum laudantium maiores officiis necessitatibus harum? Exercitationem provident dolores soluta. Rerum minus hic asperiores nesciunt, error quae blanditiis expedita ducimus facere provident reprehenderit, ex autem tempore praesentium? Culpa blanditiis repellendus earum qui? Atque dolorem, impedit dignissimos non pariatur blanditiis porro nisi doloribus? Fugit recusandae qui dignissimos, natus architecto sapiente sunt laudantium tenetur temporibus iste totam placeat facilis facere quia doloribus.

ITEM 1 ITEM 2 ITEM 3 ITEM 4 ITEM 5 ITEM 6 ITEM 7 ITEM 8 ITEM 9
ITEM 1 ITEM 2 ITEM 3 ITEM 4 ITEM 5 ITEM 6 ITEM 7 ITEM 8 ITEM 9

Lorem ipsum dolor sit amet consectetur adipisicing elit. Officiis facilis nobis nisi odit maiores libero assumenda repudiandae. Repudiandae sapiente odit id. Voluptas dolores repellendus sit corrupti ab dolor distinctio, expedita id quod suscipit. Saepe culpa libero laborum vel quos illum officia, fuga corporis dolor excepturi! Excepturi, nobis. Pariatur itaque voluptas tenetur qui aut eveniet, aliquam numquam quia distinctio dolor ducimus quod optio quam soluta expedita eligendi quae, ipsa culpa. Praesentium autem impedit, necessitatibus quos porro cupiditate ipsam eveniet nisi illo. Sequi molestias magnam exercitationem repudiandae maiores dolor itaque earum necessitatibus facere. Officiis dolorem, hic modi, maxime sint sapiente, libero quas impedit earum quibusdam rerum minus atque doloribus! Accusamus impedit rerum ea pariatur sunt ex iure consequatur! Quisquam maiores doloremque, sit vero, sint a ullam eum possimus dicta voluptatem numquam sequi eveniet dolorem recusandae ratione odio! Sint reprehenderit earum quas fugit dolorum laudantium maiores officiis necessitatibus harum? Exercitationem provident dolores soluta. Rerum minus hic asperiores nesciunt, error quae blanditiis expedita ducimus facere provident reprehenderit, ex autem tempore praesentium? Culpa blanditiis repellendus earum qui? Atque dolorem, impedit dignissimos non pariatur blanditiis porro nisi doloribus? Fugit recusandae qui dignissimos, natus architecto sapiente sunt laudantium tenetur temporibus iste totam placeat facilis facere quia doloribus.

ITEM 1 ITEM 2 ITEM 3 ITEM 4 ITEM 5 ITEM 6 ITEM 7 ITEM 8 ITEM 9
ITEM 1 ITEM 2 ITEM 3 ITEM 4 ITEM 5 ITEM 6 ITEM 7 ITEM 8 ITEM 9
ITEM 1 ITEM 2 ITEM 3 ITEM 4 ITEM 5 ITEM 6 ITEM 7 ITEM 8 ITEM 9

Lorem ipsum dolor sit amet consectetur adipisicing elit. Officiis facilis nobis nisi odit maiores libero assumenda repudiandae. Repudiandae sapiente odit id. Voluptas dolores repellendus sit corrupti ab dolor distinctio, expedita id quod suscipit. Saepe culpa libero laborum vel quos illum officia, fuga corporis dolor excepturi! Excepturi, nobis. Pariatur itaque voluptas tenetur qui aut eveniet, aliquam numquam quia distinctio dolor ducimus quod optio quam soluta expedita eligendi quae, ipsa culpa. Praesentium autem impedit, necessitatibus quos porro cupiditate ipsam eveniet nisi illo. Sequi molestias magnam exercitationem repudiandae maiores dolor itaque earum necessitatibus facere. Officiis dolorem, hic modi, maxime sint sapiente, libero quas impedit earum quibusdam rerum minus atque doloribus! Accusamus impedit rerum ea pariatur sunt ex iure consequatur! Quisquam maiores doloremque, sit vero, sint a ullam eum possimus dicta voluptatem numquam sequi eveniet dolorem recusandae ratione odio! Sint reprehenderit earum quas fugit dolorum laudantium maiores officiis necessitatibus harum? Exercitationem provident dolores soluta. Rerum minus hic asperiores nesciunt, error quae blanditiis expedita ducimus facere provident reprehenderit, ex autem tempore praesentium? Culpa blanditiis repellendus earum qui? Atque dolorem, impedit dignissimos non pariatur blanditiis porro nisi doloribus? Fugit recusandae qui dignissimos, natus architecto sapiente sunt laudantium tenetur temporibus iste totam placeat facilis facere quia doloribus.

Lorem ipsum dolor sit amet consectetur adipisicing elit. Officiis facilis nobis nisi odit maiores libero assumenda repudiandae. Repudiandae sapiente odit id. Voluptas dolores repellendus sit corrupti ab dolor distinctio, expedita id quod suscipit. Saepe culpa libero laborum vel quos illum officia, fuga corporis dolor excepturi! Excepturi, nobis. Pariatur itaque voluptas tenetur qui aut eveniet, aliquam numquam quia distinctio dolor ducimus quod optio quam soluta expedita eligendi quae, ipsa culpa. Praesentium autem impedit, necessitatibus quos porro cupiditate ipsam eveniet nisi illo. Sequi molestias magnam exercitationem repudiandae maiores dolor itaque earum necessitatibus facere. Officiis dolorem, hic modi, maxime sint sapiente, libero quas impedit earum quibusdam rerum minus atque doloribus! Accusamus impedit rerum ea pariatur sunt ex iure consequatur! Quisquam maiores doloremque, sit vero, sint a ullam eum possimus dicta voluptatem numquam sequi eveniet dolorem recusandae ratione odio! Sint reprehenderit earum quas fugit dolorum laudantium maiores officiis necessitatibus harum? Exercitationem provident dolores soluta. Rerum minus hic asperiores nesciunt, error quae blanditiis expedita ducimus facere provident reprehenderit, ex autem tempore praesentium? Culpa blanditiis repellendus earum qui? Atque dolorem, impedit dignissimos non pariatur blanditiis porro nisi doloribus? Fugit recusandae qui dignissimos, natus architecto sapiente sunt laudantium tenetur temporibus iste totam placeat facilis facere quia doloribus.

Lorem ipsum dolor sit amet consectetur adipisicing elit. Officiis facilis nobis nisi odit maiores libero assumenda repudiandae. Repudiandae sapiente odit id. Voluptas dolores repellendus sit corrupti ab dolor distinctio, expedita id quod suscipit. Saepe culpa libero laborum vel quos illum officia, fuga corporis dolor excepturi! Excepturi, nobis. Pariatur itaque voluptas tenetur qui aut eveniet, aliquam numquam quia distinctio dolor ducimus quod optio quam soluta expedita eligendi quae, ipsa culpa. Praesentium autem impedit, necessitatibus quos porro cupiditate ipsam eveniet nisi illo. Sequi molestias magnam exercitationem repudiandae maiores dolor itaque earum necessitatibus facere. Officiis dolorem, hic modi, maxime sint sapiente, libero quas impedit earum quibusdam rerum minus atque doloribus! Accusamus impedit rerum ea pariatur sunt ex iure consequatur! Quisquam maiores doloremque, sit vero, sint a ullam eum possimus dicta voluptatem numquam sequi eveniet dolorem recusandae ratione odio! Sint reprehenderit earum quas fugit dolorum laudantium maiores officiis necessitatibus harum? Exercitationem provident dolores soluta. Rerum minus hic asperiores nesciunt, error quae blanditiis expedita ducimus facere provident reprehenderit, ex autem tempore praesentium? Culpa blanditiis repellendus earum qui? Atque dolorem, impedit dignissimos non pariatur blanditiis porro nisi doloribus? Fugit recusandae qui dignissimos, natus architecto sapiente sunt laudantium tenetur temporibus iste totam placeat facilis facere quia doloribus.

Lorem ipsum dolor sit amet consectetur adipisicing elit. Officiis facilis nobis nisi odit maiores libero assumenda repudiandae. Repudiandae sapiente odit id. Voluptas dolores repellendus sit corrupti ab dolor distinctio, expedita id quod suscipit. Saepe culpa libero laborum vel quos illum officia, fuga corporis dolor excepturi! Excepturi, nobis. Pariatur itaque voluptas tenetur qui aut eveniet, aliquam numquam quia distinctio dolor ducimus quod optio quam soluta expedita eligendi quae, ipsa culpa. Praesentium autem impedit, necessitatibus quos porro cupiditate ipsam eveniet nisi illo. Sequi molestias magnam exercitationem repudiandae maiores dolor itaque earum necessitatibus facere. Officiis dolorem, hic modi, maxime sint sapiente, libero quas impedit earum quibusdam rerum minus atque doloribus! Accusamus impedit rerum ea pariatur sunt ex iure consequatur! Quisquam maiores doloremque, sit vero, sint a ullam eum possimus dicta voluptatem numquam sequi eveniet dolorem recusandae ratione odio! Sint reprehenderit earum quas fugit dolorum laudantium maiores officiis necessitatibus harum? Exercitationem provident dolores soluta. Rerum minus hic asperiores nesciunt, error quae blanditiis expedita ducimus facere provident reprehenderit, ex autem tempore praesentium? Culpa blanditiis repellendus earum qui? Atque dolorem, impedit dignissimos non pariatur blanditiis porro nisi doloribus? Fugit recusandae qui dignissimos, natus architecto sapiente sunt laudantium tenetur temporibus iste totam placeat facilis facere quia doloribus.

Lorem ipsum dolor sit amet consectetur adipisicing elit. Officiis facilis nobis nisi odit maiores libero assumenda repudiandae. Repudiandae sapiente odit id. Voluptas dolores repellendus sit corrupti ab dolor distinctio, expedita id quod suscipit. Saepe culpa libero laborum vel quos illum officia, fuga corporis dolor excepturi! Excepturi, nobis. Pariatur itaque voluptas tenetur qui aut eveniet, aliquam numquam quia distinctio dolor ducimus quod optio quam soluta expedita eligendi quae, ipsa culpa. Praesentium autem impedit, necessitatibus quos porro cupiditate ipsam eveniet nisi illo. Sequi molestias magnam exercitationem repudiandae maiores dolor itaque earum necessitatibus facere. Officiis dolorem, hic modi, maxime sint sapiente, libero quas impedit earum quibusdam rerum minus atque doloribus! Accusamus impedit rerum ea pariatur sunt ex iure consequatur! Quisquam maiores doloremque, sit vero, sint a ullam eum possimus dicta voluptatem numquam sequi eveniet dolorem recusandae ratione odio! Sint reprehenderit earum quas fugit dolorum laudantium maiores officiis necessitatibus harum? Exercitationem provident dolores soluta. Rerum minus hic asperiores nesciunt, error quae blanditiis expedita ducimus facere provident reprehenderit, ex autem tempore praesentium? Culpa blanditiis repellendus earum qui? Atque dolorem, impedit dignissimos non pariatur blanditiis porro nisi doloribus? Fugit recusandae qui dignissimos, natus architecto sapiente sunt laudantium tenetur temporibus iste totam placeat facilis facere quia doloribus.

ITEM 1 ITEM 2 ITEM 3 ITEM 4 ITEM 5 ITEM 6 ITEM 7 ITEM 8 ITEM 9

Lorem ipsum dolor sit amet consectetur adipisicing elit. Officiis facilis nobis nisi odit maiores libero assumenda repudiandae. Repudiandae sapiente odit id. Voluptas dolores repellendus sit corrupti ab dolor distinctio, expedita id quod suscipit. Saepe culpa libero laborum vel quos illum officia, fuga corporis dolor excepturi! Excepturi, nobis. Pariatur itaque voluptas tenetur qui aut eveniet, aliquam numquam quia distinctio dolor ducimus quod optio quam soluta expedita eligendi quae, ipsa culpa. Praesentium autem impedit, necessitatibus quos porro cupiditate ipsam eveniet nisi illo. Sequi molestias magnam exercitationem repudiandae maiores dolor itaque earum necessitatibus facere. Officiis dolorem, hic modi, maxime sint sapiente, libero quas impedit earum quibusdam rerum minus atque doloribus! Accusamus impedit rerum ea pariatur sunt ex iure consequatur! Quisquam maiores doloremque, sit vero, sint a ullam eum possimus dicta voluptatem numquam sequi eveniet dolorem recusandae ratione odio! Sint reprehenderit earum quas fugit dolorum laudantium maiores officiis necessitatibus harum? Exercitationem provident dolores soluta. Rerum minus hic asperiores nesciunt, error quae blanditiis expedita ducimus facere provident reprehenderit, ex autem tempore praesentium? Culpa blanditiis repellendus earum qui? Atque dolorem, impedit dignissimos non pariatur blanditiis porro nisi doloribus? Fugit recusandae qui dignissimos, natus architecto sapiente sunt laudantium tenetur temporibus iste totam placeat facilis facere quia doloribus.

HTML
<h1>List of Carousels</h1>
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Officiis facilis nobis nisi odit
maiores libero assumenda repudiandae. Repudiandae sapiente odit id. Voluptas dolores
repellendus sit corrupti ab dolor distinctio, expedita id quod suscipit. Saepe culpa libero
laborum vel quos illum officia, fuga corporis dolor excepturi! Excepturi, nobis. Pariatur
itaque voluptas tenetur qui aut eveniet, aliquam numquam quia distinctio dolor ducimus quod
optio quam soluta expedita eligendi quae, ipsa culpa. Praesentium autem impedit,
necessitatibus quos porro cupiditate ipsam eveniet nisi illo. Sequi molestias magnam
exercitationem repudiandae maiores dolor itaque earum necessitatibus facere. Officiis
dolorem, hic modi, maxime sint sapiente, libero quas impedit earum quibusdam rerum minus
atque doloribus! Accusamus impedit rerum ea pariatur sunt ex iure consequatur! Quisquam
maiores doloremque, sit vero, sint a ullam eum possimus dicta voluptatem numquam sequi
eveniet dolorem recusandae ratione odio! Sint reprehenderit earum quas fugit dolorum
laudantium maiores officiis necessitatibus harum? Exercitationem provident dolores soluta.
Rerum minus hic asperiores nesciunt, error quae blanditiis expedita ducimus facere provident
reprehenderit, ex autem tempore praesentium? Culpa blanditiis repellendus earum qui? Atque
dolorem, impedit dignissimos non pariatur blanditiis porro nisi doloribus? Fugit recusandae
qui dignissimos, natus architecto sapiente sunt laudantium tenetur temporibus iste totam
placeat facilis facere quia doloribus.
</p>
<oc-carousel-v1 id="carousel-1">
<oc-placeholder-v1 interactive="true">ITEM 1</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true" style="width: 1500px">ITEM 2</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true">ITEM 3</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true">ITEM 4</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true" style="width: 100px">ITEM 5</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true">ITEM 6</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true">ITEM 7</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true">ITEM 8</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true">ITEM 9</oc-placeholder-v1>
</oc-carousel-v1>
<div style="margin-top: 32px"></div>
<oc-carousel-v1 id="carousel-2">
<oc-placeholder-v1 interactive="true">ITEM 1</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true" style="width: 1500px">ITEM 2</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true">ITEM 3</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true">ITEM 4</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true" style="width: 100px">ITEM 5</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true">ITEM 6</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true">ITEM 7</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true">ITEM 8</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true">ITEM 9</oc-placeholder-v1>
</oc-carousel-v1>
<div style="margin-top: 32px"></div>
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Officiis facilis nobis nisi odit
maiores libero assumenda repudiandae. Repudiandae sapiente odit id. Voluptas dolores
repellendus sit corrupti ab dolor distinctio, expedita id quod suscipit. Saepe culpa libero
laborum vel quos illum officia, fuga corporis dolor excepturi! Excepturi, nobis. Pariatur
itaque voluptas tenetur qui aut eveniet, aliquam numquam quia distinctio dolor ducimus quod
optio quam soluta expedita eligendi quae, ipsa culpa. Praesentium autem impedit,
necessitatibus quos porro cupiditate ipsam eveniet nisi illo. Sequi molestias magnam
exercitationem repudiandae maiores dolor itaque earum necessitatibus facere. Officiis
dolorem, hic modi, maxime sint sapiente, libero quas impedit earum quibusdam rerum minus
atque doloribus! Accusamus impedit rerum ea pariatur sunt ex iure consequatur! Quisquam
maiores doloremque, sit vero, sint a ullam eum possimus dicta voluptatem numquam sequi
eveniet dolorem recusandae ratione odio! Sint reprehenderit earum quas fugit dolorum
laudantium maiores officiis necessitatibus harum? Exercitationem provident dolores soluta.
Rerum minus hic asperiores nesciunt, error quae blanditiis expedita ducimus facere provident
reprehenderit, ex autem tempore praesentium? Culpa blanditiis repellendus earum qui? Atque
dolorem, impedit dignissimos non pariatur blanditiis porro nisi doloribus? Fugit recusandae
qui dignissimos, natus architecto sapiente sunt laudantium tenetur temporibus iste totam
placeat facilis facere quia doloribus.
</p>
<oc-carousel-v1 id="carousel-3">
<oc-placeholder-v1 interactive="true">ITEM 1</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true" style="width: 1500px">ITEM 2</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true">ITEM 3</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true">ITEM 4</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true" style="width: 100px">ITEM 5</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true">ITEM 6</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true">ITEM 7</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true">ITEM 8</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true">ITEM 9</oc-placeholder-v1>
</oc-carousel-v1>
<div style="margin-top: 32px"></div>
<oc-carousel-v1 id="carousel-4">
<oc-placeholder-v1 interactive="true">ITEM 1</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true" style="width: 1500px">ITEM 2</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true">ITEM 3</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true">ITEM 4</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true" style="width: 100px">ITEM 5</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true">ITEM 6</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true">ITEM 7</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true">ITEM 8</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true">ITEM 9</oc-placeholder-v1>
</oc-carousel-v1>
<div style="margin-top: 32px"></div>
<oc-carousel-v1 id="carousel-5">
<oc-placeholder-v1 interactive="true">ITEM 1</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true" style="width: 1500px">ITEM 2</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true">ITEM 3</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true">ITEM 4</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true" style="width: 100px">ITEM 5</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true">ITEM 6</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true">ITEM 7</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true">ITEM 8</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true">ITEM 9</oc-placeholder-v1>
</oc-carousel-v1>
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Officiis facilis nobis nisi odit
maiores libero assumenda repudiandae. Repudiandae sapiente odit id. Voluptas dolores
repellendus sit corrupti ab dolor distinctio, expedita id quod suscipit. Saepe culpa libero
laborum vel quos illum officia, fuga corporis dolor excepturi! Excepturi, nobis. Pariatur
itaque voluptas tenetur qui aut eveniet, aliquam numquam quia distinctio dolor ducimus quod
optio quam soluta expedita eligendi quae, ipsa culpa. Praesentium autem impedit,
necessitatibus quos porro cupiditate ipsam eveniet nisi illo. Sequi molestias magnam
exercitationem repudiandae maiores dolor itaque earum necessitatibus facere. Officiis
dolorem, hic modi, maxime sint sapiente, libero quas impedit earum quibusdam rerum minus
atque doloribus! Accusamus impedit rerum ea pariatur sunt ex iure consequatur! Quisquam
maiores doloremque, sit vero, sint a ullam eum possimus dicta voluptatem numquam sequi
eveniet dolorem recusandae ratione odio! Sint reprehenderit earum quas fugit dolorum
laudantium maiores officiis necessitatibus harum? Exercitationem provident dolores soluta.
Rerum minus hic asperiores nesciunt, error quae blanditiis expedita ducimus facere provident
reprehenderit, ex autem tempore praesentium? Culpa blanditiis repellendus earum qui? Atque
dolorem, impedit dignissimos non pariatur blanditiis porro nisi doloribus? Fugit recusandae
qui dignissimos, natus architecto sapiente sunt laudantium tenetur temporibus iste totam
placeat facilis facere quia doloribus.
</p>
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Officiis facilis nobis nisi odit
maiores libero assumenda repudiandae. Repudiandae sapiente odit id. Voluptas dolores
repellendus sit corrupti ab dolor distinctio, expedita id quod suscipit. Saepe culpa libero
laborum vel quos illum officia, fuga corporis dolor excepturi! Excepturi, nobis. Pariatur
itaque voluptas tenetur qui aut eveniet, aliquam numquam quia distinctio dolor ducimus quod
optio quam soluta expedita eligendi quae, ipsa culpa. Praesentium autem impedit,
necessitatibus quos porro cupiditate ipsam eveniet nisi illo. Sequi molestias magnam
exercitationem repudiandae maiores dolor itaque earum necessitatibus facere. Officiis
dolorem, hic modi, maxime sint sapiente, libero quas impedit earum quibusdam rerum minus
atque doloribus! Accusamus impedit rerum ea pariatur sunt ex iure consequatur! Quisquam
maiores doloremque, sit vero, sint a ullam eum possimus dicta voluptatem numquam sequi
eveniet dolorem recusandae ratione odio! Sint reprehenderit earum quas fugit dolorum
laudantium maiores officiis necessitatibus harum? Exercitationem provident dolores soluta.
Rerum minus hic asperiores nesciunt, error quae blanditiis expedita ducimus facere provident
reprehenderit, ex autem tempore praesentium? Culpa blanditiis repellendus earum qui? Atque
dolorem, impedit dignissimos non pariatur blanditiis porro nisi doloribus? Fugit recusandae
qui dignissimos, natus architecto sapiente sunt laudantium tenetur temporibus iste totam
placeat facilis facere quia doloribus.
</p>
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Officiis facilis nobis nisi odit
maiores libero assumenda repudiandae. Repudiandae sapiente odit id. Voluptas dolores
repellendus sit corrupti ab dolor distinctio, expedita id quod suscipit. Saepe culpa libero
laborum vel quos illum officia, fuga corporis dolor excepturi! Excepturi, nobis. Pariatur
itaque voluptas tenetur qui aut eveniet, aliquam numquam quia distinctio dolor ducimus quod
optio quam soluta expedita eligendi quae, ipsa culpa. Praesentium autem impedit,
necessitatibus quos porro cupiditate ipsam eveniet nisi illo. Sequi molestias magnam
exercitationem repudiandae maiores dolor itaque earum necessitatibus facere. Officiis
dolorem, hic modi, maxime sint sapiente, libero quas impedit earum quibusdam rerum minus
atque doloribus! Accusamus impedit rerum ea pariatur sunt ex iure consequatur! Quisquam
maiores doloremque, sit vero, sint a ullam eum possimus dicta voluptatem numquam sequi
eveniet dolorem recusandae ratione odio! Sint reprehenderit earum quas fugit dolorum
laudantium maiores officiis necessitatibus harum? Exercitationem provident dolores soluta.
Rerum minus hic asperiores nesciunt, error quae blanditiis expedita ducimus facere provident
reprehenderit, ex autem tempore praesentium? Culpa blanditiis repellendus earum qui? Atque
dolorem, impedit dignissimos non pariatur blanditiis porro nisi doloribus? Fugit recusandae
qui dignissimos, natus architecto sapiente sunt laudantium tenetur temporibus iste totam
placeat facilis facere quia doloribus.
</p>
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Officiis facilis nobis nisi odit
maiores libero assumenda repudiandae. Repudiandae sapiente odit id. Voluptas dolores
repellendus sit corrupti ab dolor distinctio, expedita id quod suscipit. Saepe culpa libero
laborum vel quos illum officia, fuga corporis dolor excepturi! Excepturi, nobis. Pariatur
itaque voluptas tenetur qui aut eveniet, aliquam numquam quia distinctio dolor ducimus quod
optio quam soluta expedita eligendi quae, ipsa culpa. Praesentium autem impedit,
necessitatibus quos porro cupiditate ipsam eveniet nisi illo. Sequi molestias magnam
exercitationem repudiandae maiores dolor itaque earum necessitatibus facere. Officiis
dolorem, hic modi, maxime sint sapiente, libero quas impedit earum quibusdam rerum minus
atque doloribus! Accusamus impedit rerum ea pariatur sunt ex iure consequatur! Quisquam
maiores doloremque, sit vero, sint a ullam eum possimus dicta voluptatem numquam sequi
eveniet dolorem recusandae ratione odio! Sint reprehenderit earum quas fugit dolorum
laudantium maiores officiis necessitatibus harum? Exercitationem provident dolores soluta.
Rerum minus hic asperiores nesciunt, error quae blanditiis expedita ducimus facere provident
reprehenderit, ex autem tempore praesentium? Culpa blanditiis repellendus earum qui? Atque
dolorem, impedit dignissimos non pariatur blanditiis porro nisi doloribus? Fugit recusandae
qui dignissimos, natus architecto sapiente sunt laudantium tenetur temporibus iste totam
placeat facilis facere quia doloribus.
</p>
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Officiis facilis nobis nisi odit
maiores libero assumenda repudiandae. Repudiandae sapiente odit id. Voluptas dolores
repellendus sit corrupti ab dolor distinctio, expedita id quod suscipit. Saepe culpa libero
laborum vel quos illum officia, fuga corporis dolor excepturi! Excepturi, nobis. Pariatur
itaque voluptas tenetur qui aut eveniet, aliquam numquam quia distinctio dolor ducimus quod
optio quam soluta expedita eligendi quae, ipsa culpa. Praesentium autem impedit,
necessitatibus quos porro cupiditate ipsam eveniet nisi illo. Sequi molestias magnam
exercitationem repudiandae maiores dolor itaque earum necessitatibus facere. Officiis
dolorem, hic modi, maxime sint sapiente, libero quas impedit earum quibusdam rerum minus
atque doloribus! Accusamus impedit rerum ea pariatur sunt ex iure consequatur! Quisquam
maiores doloremque, sit vero, sint a ullam eum possimus dicta voluptatem numquam sequi
eveniet dolorem recusandae ratione odio! Sint reprehenderit earum quas fugit dolorum
laudantium maiores officiis necessitatibus harum? Exercitationem provident dolores soluta.
Rerum minus hic asperiores nesciunt, error quae blanditiis expedita ducimus facere provident
reprehenderit, ex autem tempore praesentium? Culpa blanditiis repellendus earum qui? Atque
dolorem, impedit dignissimos non pariatur blanditiis porro nisi doloribus? Fugit recusandae
qui dignissimos, natus architecto sapiente sunt laudantium tenetur temporibus iste totam
placeat facilis facere quia doloribus.
</p>
<oc-carousel-v1 id="carousel-6">
<oc-placeholder-v1 interactive="true">ITEM 1</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true" style="width: 1500px">ITEM 2</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true">ITEM 3</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true">ITEM 4</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true" style="width: 100px">ITEM 5</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true">ITEM 6</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true">ITEM 7</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true">ITEM 8</oc-placeholder-v1>
<oc-placeholder-v1 interactive="true">ITEM 9</oc-placeholder-v1>
</oc-carousel-v1>
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Officiis facilis nobis nisi odit
maiores libero assumenda repudiandae. Repudiandae sapiente odit id. Voluptas dolores
repellendus sit corrupti ab dolor distinctio, expedita id quod suscipit. Saepe culpa libero
laborum vel quos illum officia, fuga corporis dolor excepturi! Excepturi, nobis. Pariatur
itaque voluptas tenetur qui aut eveniet, aliquam numquam quia distinctio dolor ducimus quod
optio quam soluta expedita eligendi quae, ipsa culpa. Praesentium autem impedit,
necessitatibus quos porro cupiditate ipsam eveniet nisi illo. Sequi molestias magnam
exercitationem repudiandae maiores dolor itaque earum necessitatibus facere. Officiis
dolorem, hic modi, maxime sint sapiente, libero quas impedit earum quibusdam rerum minus
atque doloribus! Accusamus impedit rerum ea pariatur sunt ex iure consequatur! Quisquam
maiores doloremque, sit vero, sint a ullam eum possimus dicta voluptatem numquam sequi
eveniet dolorem recusandae ratione odio! Sint reprehenderit earum quas fugit dolorum
laudantium maiores officiis necessitatibus harum? Exercitationem provident dolores soluta.
Rerum minus hic asperiores nesciunt, error quae blanditiis expedita ducimus facere provident
reprehenderit, ex autem tempore praesentium? Culpa blanditiis repellendus earum qui? Atque
dolorem, impedit dignissimos non pariatur blanditiis porro nisi doloribus? Fugit recusandae
qui dignissimos, natus architecto sapiente sunt laudantium tenetur temporibus iste totam
placeat facilis facere quia doloribus.
</p>
Story source (TypeScript, verbatim from Storybook)
{
  name: "Demo: Multiple Carousels",
  parameters: {
    chromatic: {
      hideInChromatic: true
    }
  },
  render: () => {
    return html`
      <h1>List of Carousels</h1>

      <p>
        Lorem ipsum dolor sit amet consectetur adipisicing elit. Officiis facilis nobis nisi odit
        maiores libero assumenda repudiandae. Repudiandae sapiente odit id. Voluptas dolores
        repellendus sit corrupti ab dolor distinctio, expedita id quod suscipit. Saepe culpa libero
        laborum vel quos illum officia, fuga corporis dolor excepturi! Excepturi, nobis. Pariatur
        itaque voluptas tenetur qui aut eveniet, aliquam numquam quia distinctio dolor ducimus quod
        optio quam soluta expedita eligendi quae, ipsa culpa. Praesentium autem impedit,
        necessitatibus quos porro cupiditate ipsam eveniet nisi illo. Sequi molestias magnam
        exercitationem repudiandae maiores dolor itaque earum necessitatibus facere. Officiis
        dolorem, hic modi, maxime sint sapiente, libero quas impedit earum quibusdam rerum minus
        atque doloribus! Accusamus impedit rerum ea pariatur sunt ex iure consequatur! Quisquam
        maiores doloremque, sit vero, sint a ullam eum possimus dicta voluptatem numquam sequi
        eveniet dolorem recusandae ratione odio! Sint reprehenderit earum quas fugit dolorum
        laudantium maiores officiis necessitatibus harum? Exercitationem provident dolores soluta.
        Rerum minus hic asperiores nesciunt, error quae blanditiis expedita ducimus facere provident
        reprehenderit, ex autem tempore praesentium? Culpa blanditiis repellendus earum qui? Atque
        dolorem, impedit dignissimos non pariatur blanditiis porro nisi doloribus? Fugit recusandae
        qui dignissimos, natus architecto sapiente sunt laudantium tenetur temporibus iste totam
        placeat facilis facere quia doloribus.
      </p>

      <oc-carousel-v1 id="carousel-1">
        <oc-placeholder-v1 interactive="true">ITEM 1</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true" style="width: 1500px">ITEM 2</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true">ITEM 3</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true">ITEM 4</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true" style="width: 100px">ITEM 5</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true">ITEM 6</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true">ITEM 7</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true">ITEM 8</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true">ITEM 9</oc-placeholder-v1>
      </oc-carousel-v1>
      <div style="margin-top: 32px"></div>
      <oc-carousel-v1 id="carousel-2">
        <oc-placeholder-v1 interactive="true">ITEM 1</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true" style="width: 1500px">ITEM 2</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true">ITEM 3</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true">ITEM 4</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true" style="width: 100px">ITEM 5</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true">ITEM 6</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true">ITEM 7</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true">ITEM 8</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true">ITEM 9</oc-placeholder-v1>
      </oc-carousel-v1>
      <div style="margin-top: 32px"></div>

      <p>
        Lorem ipsum dolor sit amet consectetur adipisicing elit. Officiis facilis nobis nisi odit
        maiores libero assumenda repudiandae. Repudiandae sapiente odit id. Voluptas dolores
        repellendus sit corrupti ab dolor distinctio, expedita id quod suscipit. Saepe culpa libero
        laborum vel quos illum officia, fuga corporis dolor excepturi! Excepturi, nobis. Pariatur
        itaque voluptas tenetur qui aut eveniet, aliquam numquam quia distinctio dolor ducimus quod
        optio quam soluta expedita eligendi quae, ipsa culpa. Praesentium autem impedit,
        necessitatibus quos porro cupiditate ipsam eveniet nisi illo. Sequi molestias magnam
        exercitationem repudiandae maiores dolor itaque earum necessitatibus facere. Officiis
        dolorem, hic modi, maxime sint sapiente, libero quas impedit earum quibusdam rerum minus
        atque doloribus! Accusamus impedit rerum ea pariatur sunt ex iure consequatur! Quisquam
        maiores doloremque, sit vero, sint a ullam eum possimus dicta voluptatem numquam sequi
        eveniet dolorem recusandae ratione odio! Sint reprehenderit earum quas fugit dolorum
        laudantium maiores officiis necessitatibus harum? Exercitationem provident dolores soluta.
        Rerum minus hic asperiores nesciunt, error quae blanditiis expedita ducimus facere provident
        reprehenderit, ex autem tempore praesentium? Culpa blanditiis repellendus earum qui? Atque
        dolorem, impedit dignissimos non pariatur blanditiis porro nisi doloribus? Fugit recusandae
        qui dignissimos, natus architecto sapiente sunt laudantium tenetur temporibus iste totam
        placeat facilis facere quia doloribus.
      </p>

      <oc-carousel-v1 id="carousel-3">
        <oc-placeholder-v1 interactive="true">ITEM 1</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true" style="width: 1500px">ITEM 2</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true">ITEM 3</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true">ITEM 4</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true" style="width: 100px">ITEM 5</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true">ITEM 6</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true">ITEM 7</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true">ITEM 8</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true">ITEM 9</oc-placeholder-v1>
      </oc-carousel-v1>
      <div style="margin-top: 32px"></div>
      <oc-carousel-v1 id="carousel-4">
        <oc-placeholder-v1 interactive="true">ITEM 1</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true" style="width: 1500px">ITEM 2</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true">ITEM 3</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true">ITEM 4</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true" style="width: 100px">ITEM 5</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true">ITEM 6</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true">ITEM 7</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true">ITEM 8</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true">ITEM 9</oc-placeholder-v1>
      </oc-carousel-v1>
      <div style="margin-top: 32px"></div>
      <oc-carousel-v1 id="carousel-5">
        <oc-placeholder-v1 interactive="true">ITEM 1</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true" style="width: 1500px">ITEM 2</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true">ITEM 3</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true">ITEM 4</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true" style="width: 100px">ITEM 5</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true">ITEM 6</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true">ITEM 7</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true">ITEM 8</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true">ITEM 9</oc-placeholder-v1>
      </oc-carousel-v1>

      <p>
        Lorem ipsum dolor sit amet consectetur adipisicing elit. Officiis facilis nobis nisi odit
        maiores libero assumenda repudiandae. Repudiandae sapiente odit id. Voluptas dolores
        repellendus sit corrupti ab dolor distinctio, expedita id quod suscipit. Saepe culpa libero
        laborum vel quos illum officia, fuga corporis dolor excepturi! Excepturi, nobis. Pariatur
        itaque voluptas tenetur qui aut eveniet, aliquam numquam quia distinctio dolor ducimus quod
        optio quam soluta expedita eligendi quae, ipsa culpa. Praesentium autem impedit,
        necessitatibus quos porro cupiditate ipsam eveniet nisi illo. Sequi molestias magnam
        exercitationem repudiandae maiores dolor itaque earum necessitatibus facere. Officiis
        dolorem, hic modi, maxime sint sapiente, libero quas impedit earum quibusdam rerum minus
        atque doloribus! Accusamus impedit rerum ea pariatur sunt ex iure consequatur! Quisquam
        maiores doloremque, sit vero, sint a ullam eum possimus dicta voluptatem numquam sequi
        eveniet dolorem recusandae ratione odio! Sint reprehenderit earum quas fugit dolorum
        laudantium maiores officiis necessitatibus harum? Exercitationem provident dolores soluta.
        Rerum minus hic asperiores nesciunt, error quae blanditiis expedita ducimus facere provident
        reprehenderit, ex autem tempore praesentium? Culpa blanditiis repellendus earum qui? Atque
        dolorem, impedit dignissimos non pariatur blanditiis porro nisi doloribus? Fugit recusandae
        qui dignissimos, natus architecto sapiente sunt laudantium tenetur temporibus iste totam
        placeat facilis facere quia doloribus.
      </p>
      <p>
        Lorem ipsum dolor sit amet consectetur adipisicing elit. Officiis facilis nobis nisi odit
        maiores libero assumenda repudiandae. Repudiandae sapiente odit id. Voluptas dolores
        repellendus sit corrupti ab dolor distinctio, expedita id quod suscipit. Saepe culpa libero
        laborum vel quos illum officia, fuga corporis dolor excepturi! Excepturi, nobis. Pariatur
        itaque voluptas tenetur qui aut eveniet, aliquam numquam quia distinctio dolor ducimus quod
        optio quam soluta expedita eligendi quae, ipsa culpa. Praesentium autem impedit,
        necessitatibus quos porro cupiditate ipsam eveniet nisi illo. Sequi molestias magnam
        exercitationem repudiandae maiores dolor itaque earum necessitatibus facere. Officiis
        dolorem, hic modi, maxime sint sapiente, libero quas impedit earum quibusdam rerum minus
        atque doloribus! Accusamus impedit rerum ea pariatur sunt ex iure consequatur! Quisquam
        maiores doloremque, sit vero, sint a ullam eum possimus dicta voluptatem numquam sequi
        eveniet dolorem recusandae ratione odio! Sint reprehenderit earum quas fugit dolorum
        laudantium maiores officiis necessitatibus harum? Exercitationem provident dolores soluta.
        Rerum minus hic asperiores nesciunt, error quae blanditiis expedita ducimus facere provident
        reprehenderit, ex autem tempore praesentium? Culpa blanditiis repellendus earum qui? Atque
        dolorem, impedit dignissimos non pariatur blanditiis porro nisi doloribus? Fugit recusandae
        qui dignissimos, natus architecto sapiente sunt laudantium tenetur temporibus iste totam
        placeat facilis facere quia doloribus.
      </p>
      <p>
        Lorem ipsum dolor sit amet consectetur adipisicing elit. Officiis facilis nobis nisi odit
        maiores libero assumenda repudiandae. Repudiandae sapiente odit id. Voluptas dolores
        repellendus sit corrupti ab dolor distinctio, expedita id quod suscipit. Saepe culpa libero
        laborum vel quos illum officia, fuga corporis dolor excepturi! Excepturi, nobis. Pariatur
        itaque voluptas tenetur qui aut eveniet, aliquam numquam quia distinctio dolor ducimus quod
        optio quam soluta expedita eligendi quae, ipsa culpa. Praesentium autem impedit,
        necessitatibus quos porro cupiditate ipsam eveniet nisi illo. Sequi molestias magnam
        exercitationem repudiandae maiores dolor itaque earum necessitatibus facere. Officiis
        dolorem, hic modi, maxime sint sapiente, libero quas impedit earum quibusdam rerum minus
        atque doloribus! Accusamus impedit rerum ea pariatur sunt ex iure consequatur! Quisquam
        maiores doloremque, sit vero, sint a ullam eum possimus dicta voluptatem numquam sequi
        eveniet dolorem recusandae ratione odio! Sint reprehenderit earum quas fugit dolorum
        laudantium maiores officiis necessitatibus harum? Exercitationem provident dolores soluta.
        Rerum minus hic asperiores nesciunt, error quae blanditiis expedita ducimus facere provident
        reprehenderit, ex autem tempore praesentium? Culpa blanditiis repellendus earum qui? Atque
        dolorem, impedit dignissimos non pariatur blanditiis porro nisi doloribus? Fugit recusandae
        qui dignissimos, natus architecto sapiente sunt laudantium tenetur temporibus iste totam
        placeat facilis facere quia doloribus.
      </p>
      <p>
        Lorem ipsum dolor sit amet consectetur adipisicing elit. Officiis facilis nobis nisi odit
        maiores libero assumenda repudiandae. Repudiandae sapiente odit id. Voluptas dolores
        repellendus sit corrupti ab dolor distinctio, expedita id quod suscipit. Saepe culpa libero
        laborum vel quos illum officia, fuga corporis dolor excepturi! Excepturi, nobis. Pariatur
        itaque voluptas tenetur qui aut eveniet, aliquam numquam quia distinctio dolor ducimus quod
        optio quam soluta expedita eligendi quae, ipsa culpa. Praesentium autem impedit,
        necessitatibus quos porro cupiditate ipsam eveniet nisi illo. Sequi molestias magnam
        exercitationem repudiandae maiores dolor itaque earum necessitatibus facere. Officiis
        dolorem, hic modi, maxime sint sapiente, libero quas impedit earum quibusdam rerum minus
        atque doloribus! Accusamus impedit rerum ea pariatur sunt ex iure consequatur! Quisquam
        maiores doloremque, sit vero, sint a ullam eum possimus dicta voluptatem numquam sequi
        eveniet dolorem recusandae ratione odio! Sint reprehenderit earum quas fugit dolorum
        laudantium maiores officiis necessitatibus harum? Exercitationem provident dolores soluta.
        Rerum minus hic asperiores nesciunt, error quae blanditiis expedita ducimus facere provident
        reprehenderit, ex autem tempore praesentium? Culpa blanditiis repellendus earum qui? Atque
        dolorem, impedit dignissimos non pariatur blanditiis porro nisi doloribus? Fugit recusandae
        qui dignissimos, natus architecto sapiente sunt laudantium tenetur temporibus iste totam
        placeat facilis facere quia doloribus.
      </p>
      <p>
        Lorem ipsum dolor sit amet consectetur adipisicing elit. Officiis facilis nobis nisi odit
        maiores libero assumenda repudiandae. Repudiandae sapiente odit id. Voluptas dolores
        repellendus sit corrupti ab dolor distinctio, expedita id quod suscipit. Saepe culpa libero
        laborum vel quos illum officia, fuga corporis dolor excepturi! Excepturi, nobis. Pariatur
        itaque voluptas tenetur qui aut eveniet, aliquam numquam quia distinctio dolor ducimus quod
        optio quam soluta expedita eligendi quae, ipsa culpa. Praesentium autem impedit,
        necessitatibus quos porro cupiditate ipsam eveniet nisi illo. Sequi molestias magnam
        exercitationem repudiandae maiores dolor itaque earum necessitatibus facere. Officiis
        dolorem, hic modi, maxime sint sapiente, libero quas impedit earum quibusdam rerum minus
        atque doloribus! Accusamus impedit rerum ea pariatur sunt ex iure consequatur! Quisquam
        maiores doloremque, sit vero, sint a ullam eum possimus dicta voluptatem numquam sequi
        eveniet dolorem recusandae ratione odio! Sint reprehenderit earum quas fugit dolorum
        laudantium maiores officiis necessitatibus harum? Exercitationem provident dolores soluta.
        Rerum minus hic asperiores nesciunt, error quae blanditiis expedita ducimus facere provident
        reprehenderit, ex autem tempore praesentium? Culpa blanditiis repellendus earum qui? Atque
        dolorem, impedit dignissimos non pariatur blanditiis porro nisi doloribus? Fugit recusandae
        qui dignissimos, natus architecto sapiente sunt laudantium tenetur temporibus iste totam
        placeat facilis facere quia doloribus.
      </p>
      <oc-carousel-v1 id="carousel-6">
        <oc-placeholder-v1 interactive="true">ITEM 1</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true" style="width: 1500px">ITEM 2</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true">ITEM 3</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true">ITEM 4</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true" style="width: 100px">ITEM 5</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true">ITEM 6</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true">ITEM 7</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true">ITEM 8</oc-placeholder-v1>
        <oc-placeholder-v1 interactive="true">ITEM 9</oc-placeholder-v1>
      </oc-carousel-v1>

      <p>
        Lorem ipsum dolor sit amet consectetur adipisicing elit. Officiis facilis nobis nisi odit
        maiores libero assumenda repudiandae. Repudiandae sapiente odit id. Voluptas dolores
        repellendus sit corrupti ab dolor distinctio, expedita id quod suscipit. Saepe culpa libero
        laborum vel quos illum officia, fuga corporis dolor excepturi! Excepturi, nobis. Pariatur
        itaque voluptas tenetur qui aut eveniet, aliquam numquam quia distinctio dolor ducimus quod
        optio quam soluta expedita eligendi quae, ipsa culpa. Praesentium autem impedit,
        necessitatibus quos porro cupiditate ipsam eveniet nisi illo. Sequi molestias magnam
        exercitationem repudiandae maiores dolor itaque earum necessitatibus facere. Officiis
        dolorem, hic modi, maxime sint sapiente, libero quas impedit earum quibusdam rerum minus
        atque doloribus! Accusamus impedit rerum ea pariatur sunt ex iure consequatur! Quisquam
        maiores doloremque, sit vero, sint a ullam eum possimus dicta voluptatem numquam sequi
        eveniet dolorem recusandae ratione odio! Sint reprehenderit earum quas fugit dolorum
        laudantium maiores officiis necessitatibus harum? Exercitationem provident dolores soluta.
        Rerum minus hic asperiores nesciunt, error quae blanditiis expedita ducimus facere provident
        reprehenderit, ex autem tempore praesentium? Culpa blanditiis repellendus earum qui? Atque
        dolorem, impedit dignissimos non pariatur blanditiis porro nisi doloribus? Fugit recusandae
        qui dignissimos, natus architecto sapiente sunt laudantium tenetur temporibus iste totam
        placeat facilis facere quia doloribus.
      </p>
    `;
  }
}

Interaction tests (CarouselV1.interactions.stories.ts)

Interaction test stories (automated tests, not usage patterns).

Story: components-carousel-interaction-tests--move-carousel · tags: play-fn

Args: defaultSlot=(see snippet)

Story source (TypeScript, verbatim from Storybook)
{
  args: {
    defaultSlot: `${new Array(5).fill(`<div tabindex="0">
              Content
            </div>
          `).join("")}`
  },
  parameters: {
    chromatic: {
      disableSnapshot: true
    }
  },
  play: async ({
    canvasElement
  }) => {
    const carouselElement = canvasElement.getElementsByTagName("oc-carousel-v1")[0]!;
    const prevButton = carouselElement.shadowRoot!.querySelector(".arrow-button--left")!;
    const nextButton = carouselElement.shadowRoot!.querySelector(".arrow-button--right")!;
    await waitFor(() => [expect(prevButton, "left button should not be visible initially").not.toBeVisible(), expect(nextButton, "right button should be visible initially").toBeVisible()]);
    await click(nextButton as HTMLElement);
    await waitFor(() => [expect(prevButton, "left button should not be visible after scroll").toBeVisible(), expect(nextButton, "right button should not be still visible after scroll").toBeVisible()]);
  }
}

Single Slide

Story: components-carousel-interaction-tests--single-slide · tags: play-fn

Args: defaultSlot=<div tabindex="0"> Content </div>

Story source (TypeScript, verbatim from Storybook)
{
  args: {
    defaultSlot: `${new Array(1).fill(`<div tabindex="0">
              Content
            </div>
          `).join("")}`
  },
  parameters: {
    chromatic: {
      disableSnapshot: true
    }
  },
  play: async ({
    canvasElement
  }) => {
    const carouselElement = canvasElement.getElementsByTagName("oc-carousel-v1")[0]!;
    const prevButton = carouselElement.shadowRoot!.querySelector(".arrow-button--left")!;
    const nextButton = carouselElement.shadowRoot!.querySelector(".arrow-button--right")!;
    await macrotasks(100);
    await expect(prevButton).toHaveClass("arrow-button--hidden");
    await expect(nextButton).toHaveClass("arrow-button--hidden");
    await expect(carouselElement.shadowRoot!.querySelector(".paginationdots-container__wrapper")).toBeNull();
  }
}

Move On Pagination Dots Click

Story: components-carousel-interaction-tests--move-on-pagination-dots-click · tags: play-fn

Args: defaultSlot=(see snippet)

Story source (TypeScript, verbatim from Storybook)
{
  args: {
    defaultSlot: `${new Array(4).fill(`<div tabindex="0">
              Content
            </div>
          `).join("")}`
  },
  play: async ({
    canvasElement
  }) => {
    const carouselElement = canvasElement.getElementsByTagName("oc-carousel-v1")[0]!;
    const prevButton = carouselElement.shadowRoot!.querySelector(".arrow-button--left")!;
    const nextButton = carouselElement.shadowRoot!.querySelector(".arrow-button--right")!;
    const paginationDots = carouselElement.shadowRoot!.querySelector(".paginationdots__wrapper")!;
    await waitFor(() => [expect(prevButton).not.toBeVisible(), expect(prevButton).toHaveClass("arrow-button--hidden"), expect(nextButton).toBeVisible(), expect(nextButton).not.toHaveClass("arrow-button--hidden")]);
    await expect(paginationDots).toBeVisible();
    await click(paginationDots.children[1] as HTMLElement);
    await waitFor(() => [expect(prevButton).toBeVisible(), expect(prevButton).not.toHaveClass("arrow-button--hidden"), expect(nextButton).toBeVisible(), expect(nextButton).not.toHaveClass("arrow-button--hidden")]);
  }
}

Asynchronous Content

Story: components-carousel-interaction-tests--asynchronous-content · tags: play-fn

HTML
<oc-carousel-v1></oc-carousel-v1>
Story source (TypeScript, verbatim from Storybook)
{
  render() {
    return html` <oc-carousel-v1></oc-carousel-v1>`;
  },
  parameters: {
    chromatic: {
      disableSnapshot: true
    }
  },
  play: async ({
    canvasElement
  }) => {
    const cinemaElement = canvasElement.getElementsByTagName("oc-carousel-v1")[0]!;
    const item = document.createElement("div");
    item.innerHTML = "Content";
    item.tabIndex = 0;
    const items = Array.from({
      length: 20
    }).map(() => item.cloneNode(true));
    cinemaElement.append(...items);
    await tick();
    const paginationDots = Array.from(cinemaElement.shadowRoot!.querySelectorAll(".paginationdots__item"));
    await expect(paginationDots.length, "pagination dots should be rendered").toBe(20);
    await expect(paginationDots[0].classList.contains("paginationdots__item--selected"), "first pagination dot should be selected").toBeTruthy();
    await expect(paginationDots.slice(1).some(e => e.classList.contains("paginationdots__item--selected")), "other pagination dots should not be selected").toBeFalsy();
  }
}