Component

BOBCarousel

Slideshow with arrows, indicators, keyboard navigation, touch swipe, and optional auto-play. Slide / Fade / None / Coverflow transitions.

API reference ↗

Basic usage

RAZOR
<BOBCarousel @bind-ActiveIndex="_basicIndex">
    <BOBCarouselItem>
        <div class="demo-slide demo-slide--blue">Slide one</div>
    </BOBCarouselItem>
    <BOBCarouselItem>
        <div class="demo-slide demo-slide--green">Slide two</div>
    </BOBCarouselItem>
    <BOBCarouselItem>
        <div class="demo-slide demo-slide--purple">Slide three</div>
    </BOBCarouselItem>
</BOBCarousel>

Auto-play

Advances every 3 seconds. Pauses on hover or focus.

RAZOR
<BOBCarousel AutoPlay="true" AutoPlayInterval="@TimeSpan.FromSeconds(3)" Loop="true">
    <BOBCarouselItem>
        <div class="demo-slide demo-slide--blue">Auto 1</div>
    </BOBCarouselItem>
    <BOBCarouselItem>
        <div class="demo-slide demo-slide--green">Auto 2</div>
    </BOBCarouselItem>
    <BOBCarouselItem>
        <div class="demo-slide demo-slide--purple">Auto 3</div>
    </BOBCarouselItem>
</BOBCarousel>

Seamless loop

With Loop=true and Slide transition, a clone of the first slide is rendered after the last (and vice versa). Going from the last to the first looks like a continuous wrap rather than a jump back.

RAZOR
<BOBCarousel Loop="true" TransitionDurationMs="500">
    <BOBCarouselItem AriaLabel="Wrap A">
        <div class="demo-slide demo-slide--blue">A — try clicking next from the last slide</div>
    </BOBCarouselItem>
    <BOBCarouselItem AriaLabel="Wrap B">
        <div class="demo-slide demo-slide--green">B</div>
    </BOBCarouselItem>
    <BOBCarouselItem AriaLabel="Wrap C">
        <div class="demo-slide demo-slide--purple">C</div>
    </BOBCarouselItem>
</BOBCarousel>

Fade transition

RAZOR
<BOBCarousel Transition="BOBCarouselTransition.Fade">
    <BOBCarouselItem>
        <div class="demo-slide demo-slide--blue">Fade A</div>
    </BOBCarouselItem>
    <BOBCarouselItem>
        <div class="demo-slide demo-slide--green">Fade B</div>
    </BOBCarouselItem>
    <BOBCarouselItem>
        <div class="demo-slide demo-slide--purple">Fade C</div>
    </BOBCarouselItem>
</BOBCarousel>

Wheel (3D cylinder)

Slides arranged on a vertical cylinder that rotates around the Y axis. Side slides peek in from behind the active one as the wheel spins. Tune WheelRadiusPx to change how deep the back slides sit.

RAZOR
<BOBCarousel Transition="BOBCarouselTransition.Wheel" Loop="true" WheelRadiusPx="320">
    <BOBCarouselItem>
        <div class="demo-slide demo-slide--blue">Wheel 1</div>
    </BOBCarouselItem>
    <BOBCarouselItem>
        <div class="demo-slide demo-slide--green">Wheel 2</div>
    </BOBCarouselItem>
    <BOBCarouselItem>
        <div class="demo-slide demo-slide--purple">Wheel 3</div>
    </BOBCarouselItem>
    <BOBCarouselItem>
        <div class="demo-slide demo-slide--orange">Wheel 4</div>
    </BOBCarouselItem>
    <BOBCarouselItem>
        <div class="demo-slide demo-slide--teal">Wheel 5</div>
    </BOBCarouselItem>
    <BOBCarouselItem>
        <div class="demo-slide demo-slide--blue">Wheel 6</div>
    </BOBCarouselItem>
</BOBCarousel>

Wheel 3D (continuous perspective)

Several slides visible at once with a fixed inward tilt. Side slides keep their size — the carousel always feels 3D, with depth at the sides instead of behind the active slide.

RAZOR
<BOBCarousel Transition="BOBCarouselTransition.Wheel3D" Loop="true">
    <BOBCarouselItem>
        <div class="demo-slide demo-slide--blue">3D 1</div>
    </BOBCarouselItem>
    <BOBCarouselItem>
        <div class="demo-slide demo-slide--green">3D 2</div>
    </BOBCarouselItem>
    <BOBCarouselItem>
        <div class="demo-slide demo-slide--purple">3D 3</div>
    </BOBCarouselItem>
    <BOBCarouselItem>
        <div class="demo-slide demo-slide--orange">3D 4</div>
    </BOBCarouselItem>
    <BOBCarouselItem>
        <div class="demo-slide demo-slide--teal">3D 5</div>
    </BOBCarouselItem>
    <BOBCarouselItem>
        <div class="demo-slide demo-slide--blue">3D 6</div>
    </BOBCarouselItem>
    <BOBCarouselItem>
        <div class="demo-slide demo-slide--green">3D 7</div>
    </BOBCarouselItem>
</BOBCarousel>

Coverflow 3D

Side slides recede with a 3D rotation. The active slide stays in front; neighbours rotate, scale and fade.

RAZOR
<BOBCarousel Transition="BOBCarouselTransition.Coverflow" Loop="true">
    <BOBCarouselItem>
        <div class="demo-slide demo-slide--blue">Cover 1</div>
    </BOBCarouselItem>
    <BOBCarouselItem>
        <div class="demo-slide demo-slide--green">Cover 2</div>
    </BOBCarouselItem>
    <BOBCarouselItem>
        <div class="demo-slide demo-slide--purple">Cover 3</div>
    </BOBCarouselItem>
    <BOBCarouselItem>
        <div class="demo-slide demo-slide--orange">Cover 4</div>
    </BOBCarouselItem>
    <BOBCarouselItem>
        <div class="demo-slide demo-slide--teal">Cover 5</div>
    </BOBCarouselItem>
</BOBCarousel>

Indicator icons

Inactive indicators use IndicatorIcon; the active one can override via ActiveIndicatorIcon + ActiveIndicatorIconColor.

RAZOR
<BOBCarousel IndicatorIcon="@BOBIconKeys.UI.Plus"
             IndicatorIconColor="var(--palette-surface-contrast)"
             ActiveIndicatorIcon="@BOBIconKeys.UI.Close"
             ActiveIndicatorIconColor="var(--palette-primary)">
    <BOBCarouselItem>
        <div class="demo-slide demo-slide--blue">A</div>
    </BOBCarouselItem>
    <BOBCarouselItem>
        <div class="demo-slide demo-slide--green">B</div>
    </BOBCarouselItem>
    <BOBCarouselItem>
        <div class="demo-slide demo-slide--purple">C</div>
    </BOBCarouselItem>
</BOBCarousel>

Properties

BOBCarousel

21 rows.
PropertyTypeDefaultDescription
ChildContentRenderFragment?Markup that emits the slides (typically &lt;BOBCarouselItem&gt; children).
ActiveIndexintIndex of the currently visible slide.
ActiveIndexChangedEventCallback<int>Raised when changes via user interaction or auto-play.
AutoPlayboolWhen , the carousel advances automatically every .
AutoPlayIntervalTimeSpanTimeSpan.FromSeconds(5)Time between automatic transitions when is enabled. Defaults to 5 seconds.
Loopbool/// When , navigation wraps around at both ends. With /// the carousel renders cloned slides at the /// boundaries so wrap-around feels continuous (no jump back to the start). ///
ShowArrowsbooltrueWhen (default), the previous/next arrow buttons are visible.
ShowIndicatorsbooltrueWhen (default), the slide indicators row is visible.
IndicatorIconIconKey?/// Optional icon used for non-active slide indicators. When (default), /// a CSS dot is rendered for inactive slides. ///
IndicatorIconColorstring?Color applied to the inactive-indicator icon. Accepts any valid CSS color value.
ActiveIndicatorIconIconKey?/// Optional icon override for the active slide indicator. When , /// the active indicator uses (or the default dot). ///
ActiveIndicatorIconColorstring?Color applied to the active-indicator icon. Falls back to .
ArrowIconLeftIconKey?Icon for the previous-slide arrow. Defaults to .UI.ChevronLeft.
ArrowIconRightIconKey?Icon for the next-slide arrow. Defaults to .UI.ChevronRight.
TransitionBOBCarouselTransitionBOBCarouselTransition.SlideVisual transition between slides. Defaults to .
PreviousLabelstring"Previous slide"Accessible label for the previous-slide arrow. Defaults to "Previous slide".
NextLabelstring"Next slide"Accessible label for the next-slide arrow. Defaults to "Next slide".
SwipeThresholdPxint50Pixel distance a horizontal swipe must cover before it triggers slide navigation. Defaults to 50.
SizeBOBSizeBOBSize.MediumVisual size of the carousel.
TransitionDurationMsint350/// Duration of the slide transition in milliseconds. Drives both the CSS animation and the /// post-animation snap-back used by the looping wrap behaviour. Defaults to 350. ///
WheelRadiusPxint280/// Radius (in pixels) of the cylinder used by . /// Larger values push the side slides further behind the active one. Defaults to 280. ///

BOBCarouselItem

2 rows.
PropertyTypeDefaultDescription
ChildContentRenderFragment?Slide content.
AriaLabelstring?Optional accessible label for the slide. Falls back to "Slide N of M" when null.