Skip to main content

Carousel

Overview

The Carousel component provides an image/content slider with navigation arrows and indicators.

It supports auto-play, drag navigation, and customizable styles.


Import

import { Carousel, CarouselItem } from '@allxsmith/bestax-bulma';

Usage

A simple carousel with colored slides using the Hero component.

<Carousel indicatorStyle="dots">
  <CarouselItem>
    <Hero color="primary" size="medium">
      <Hero.Body textAlign="centered">
        <Title as="p">Slide 1</Title>
      </Hero.Body>
    </Hero>
  </CarouselItem>
  <CarouselItem>
    <Hero color="success" size="medium">
      <Hero.Body textAlign="centered">
        <Title as="p">Slide 2</Title>
      </Hero.Body>
    </Hero>
  </CarouselItem>
  <CarouselItem>
    <Hero color="danger" size="medium">
      <Hero.Body textAlign="centered">
        <Title as="p">Slide 3</Title>
      </Hero.Body>
    </Hero>
  </CarouselItem>
</Carousel>


Carousel that automatically advances slides.

<Carousel autoplay interval={3000}>
  <CarouselItem>
    <Hero color="info" size="medium">
      <Hero.Body textAlign="centered">
        <Title as="p">Info</Title>
      </Hero.Body>
    </Hero>
  </CarouselItem>
  <CarouselItem>
    <Hero color="warning" size="medium">
      <Hero.Body textAlign="centered">
        <Title as="p">Warning</Title>
      </Hero.Body>
    </Hero>
  </CarouselItem>
  <CarouselItem>
    <Hero color="success" size="medium">
      <Hero.Body textAlign="centered">
        <Title as="p">Success</Title>
      </Hero.Body>
    </Hero>
  </CarouselItem>
</Carousel>


Indicator Styles

Different indicator style options.

function IndicatorExample() {
  const [style, setStyle] = useState('dots');
  return (
    <Block>
      <Buttons mb="4">
        <Button
          onClick={() => setStyle('dots')}
          color={style === 'dots' ? 'primary' : undefined}
        >
          Dots
        </Button>
        <Button
          onClick={() => setStyle('circles')}
          color={style === 'circles' ? 'primary' : undefined}
        >
          Circles
        </Button>
        <Button
          onClick={() => setStyle('lines')}
          color={style === 'lines' ? 'primary' : undefined}
        >
          Lines
        </Button>
        <Button
          onClick={() => setStyle('bars')}
          color={style === 'bars' ? 'primary' : undefined}
        >
          Bars
        </Button>
      </Buttons>
      <Carousel indicatorStyle={style}>
        <CarouselItem>
          <Hero color="primary" size="medium">
            <Hero.Body textAlign="centered">
              <Paragraph textColor="white">Slide 1</Paragraph>
            </Hero.Body>
          </Hero>
        </CarouselItem>
        <CarouselItem>
          <Hero color="success" size="medium">
            <Hero.Body textAlign="centered">
              <Paragraph textColor="white">Slide 2</Paragraph>
            </Hero.Body>
          </Hero>
        </CarouselItem>
        <CarouselItem>
          <Hero color="danger" size="medium">
            <Hero.Body textAlign="centered">
              <Paragraph textColor="white">Slide 3</Paragraph>
            </Hero.Body>
          </Hero>
        </CarouselItem>
      </Carousel>
    </Block>
  );
}


Without Arrows

Carousel with indicators only.

<Carousel arrow={false}>
  <CarouselItem>
    <Hero color="primary" size="medium">
      <Hero.Body textAlign="centered">
        <Title as="p">Swipe or Click Dots</Title>
      </Hero.Body>
    </Hero>
  </CarouselItem>
  <CarouselItem>
    <Hero color="link" size="medium">
      <Hero.Body textAlign="centered">
        <Title as="p">Navigation Only</Title>
      </Hero.Body>
    </Hero>
  </CarouselItem>
</Carousel>


Arrows on Hover

Show arrows only when hovering over the carousel.

<Carousel arrowHover>
  <CarouselItem>
    <Hero color="dark" size="medium">
      <Hero.Body textAlign="centered">
        <Paragraph textColor="white">Hover to see arrows</Paragraph>
      </Hero.Body>
    </Hero>
  </CarouselItem>
  <CarouselItem>
    <Hero color="primary" size="medium">
      <Hero.Body textAlign="centered">
        <Paragraph textColor="white">Slide 2</Paragraph>
      </Hero.Body>
    </Hero>
  </CarouselItem>
  <CarouselItem>
    <Hero color="success" size="medium">
      <Hero.Body textAlign="centered">
        <Paragraph textColor="white">Slide 3</Paragraph>
      </Hero.Body>
    </Hero>
  </CarouselItem>
</Carousel>


Transparent Arrow Buttons

Remove the arrow button backgrounds to show just the icons.

<Carousel arrowBackground={false}>
  <CarouselItem>
    <Hero color="primary" size="medium">
      <Hero.Body textAlign="centered">
        <Title as="p">Slide 1</Title>
      </Hero.Body>
    </Hero>
  </CarouselItem>
  <CarouselItem>
    <Hero color="success" size="medium">
      <Hero.Body textAlign="centered">
        <Title as="p">Slide 2</Title>
      </Hero.Body>
    </Hero>
  </CarouselItem>
  <CarouselItem>
    <Hero color="danger" size="medium">
      <Hero.Body textAlign="centered">
        <Title as="p">Slide 3</Title>
      </Hero.Body>
    </Hero>
  </CarouselItem>
</Carousel>


Custom Arrow Icons

Customize navigation arrows using the icon props. The Carousel uses the Icon component internally.

<Carousel
  iconPrev="chevron-left"
  iconNext="chevron-right"
  iconLibrary="fa"
  iconVariant="solid"
>
  <CarouselItem>
    <Hero color="primary" size="medium">
      <Hero.Body textAlign="centered">
        <Title as="p">Slide 1</Title>
      </Hero.Body>
    </Hero>
  </CarouselItem>
  <CarouselItem>
    <Hero color="success" size="medium">
      <Hero.Body textAlign="centered">
        <Title as="p">Slide 2</Title>
      </Hero.Body>
    </Hero>
  </CarouselItem>
  <CarouselItem>
    <Hero color="danger" size="medium">
      <Hero.Body textAlign="centered">
        <Title as="p">Slide 3</Title>
      </Hero.Body>
    </Hero>
  </CarouselItem>
</Carousel>

With Material Design Icons

<Carousel iconPrev="arrow-left" iconNext="arrow-right" iconLibrary="mdi">
  <CarouselItem>
    <Hero color="primary" size="medium">
      <Hero.Body textAlign="centered">
        <Title as="p">Slide 1</Title>
      </Hero.Body>
    </Hero>
  </CarouselItem>
  <CarouselItem>
    <Hero color="success" size="medium">
      <Hero.Body textAlign="centered">
        <Title as="p">Slide 2</Title>
      </Hero.Body>
    </Hero>
  </CarouselItem>
</Carousel>

Icon Libraries

The icon props follow the same naming as the Icon component. See Alternative Icon Libraries for setup instructions.


Externally controlled carousel with custom navigation.

function ControlledExample() {
  const [currentSlide, setCurrentSlide] = useState(0);
  return (
    <Block>
      <Buttons mb="4">
        <Button
          onClick={() => setCurrentSlide(0)}
          color={currentSlide === 0 ? 'primary' : undefined}
        >
          1
        </Button>
        <Button
          onClick={() => setCurrentSlide(1)}
          color={currentSlide === 1 ? 'primary' : undefined}
        >
          2
        </Button>
        <Button
          onClick={() => setCurrentSlide(2)}
          color={currentSlide === 2 ? 'primary' : undefined}
        >
          3
        </Button>
      </Buttons>
      <Carousel
        value={currentSlide}
        onChange={setCurrentSlide}
        indicator={false}
      >
        <CarouselItem>
          <Hero color="primary" size="medium">
            <Hero.Body textAlign="centered">
              <Paragraph textColor="white">Slide 1</Paragraph>
            </Hero.Body>
          </Hero>
        </CarouselItem>
        <CarouselItem>
          <Hero color="success" size="medium">
            <Hero.Body textAlign="centered">
              <Paragraph textColor="white">Slide 2</Paragraph>
            </Hero.Body>
          </Hero>
        </CarouselItem>
        <CarouselItem>
          <Hero color="danger" size="medium">
            <Hero.Body textAlign="centered">
              <Paragraph textColor="white">Slide 3</Paragraph>
            </Hero.Body>
          </Hero>
        </CarouselItem>
      </Carousel>
      <Paragraph mt="2">Current slide: {currentSlide + 1}</Paragraph>
    </Block>
  );
}


Carousel that stops at the first and last slides.

<Carousel repeat={false}>
  <CarouselItem>
    <Hero color="danger" size="medium">
      <Hero.Body textAlign="centered">
        <Paragraph textColor="white">First (no previous)</Paragraph>
      </Hero.Body>
    </Hero>
  </CarouselItem>
  <CarouselItem>
    <Hero color="warning" size="medium">
      <Hero.Body textAlign="centered">
        <Paragraph>Middle slide</Paragraph>
      </Hero.Body>
    </Hero>
  </CarouselItem>
  <CarouselItem>
    <Hero color="success" size="medium">
      <Hero.Body textAlign="centered">
        <Paragraph textColor="white">Last (no next)</Paragraph>
      </Hero.Body>
    </Hero>
  </CarouselItem>
</Carousel>


Accessibility

  • Uses role="region" with aria-roledescription="carousel"
  • Navigation arrows have aria-label for screen readers
  • Indicators use role="tablist" and role="tab" semantics
  • Keyboard navigation with arrow keys when focused
  • Previous/Next buttons are properly disabled at boundaries when not repeating

  • Modal - For displaying content in an overlay
  • Tabs - For tabbed content navigation

Additional Resources

Pro Tip

Use the pauseOnHover prop (enabled by default) to let users interact with carousel content without it auto-advancing.


Props

PropTypeDefaultDescription
valuenumber0Current active slide index (controlled).
autoplaybooleanfalseEnable auto-play.
intervalnumber5000Auto-play interval in milliseconds. Default: 5000.
pauseOnHoverbooleantruePause auto-play on hover. Default: true.
repeatbooleantrueLoop back to first slide after last. Default: true.
hasDragbooleantrueEnable drag/swipe navigation. Default: true.
arrowbooleantrueShow navigation arrows. Default: true.
arrowHoverbooleanfalseOnly show arrows on hover.
indicatorbooleantrueShow slide indicators. Default: true.
indicatorInsidebooleanfalsePosition indicators inside carousel.
indicatorPosition'bottom' | 'top''bottom'Indicator position. Default: 'bottom'.
indicatorStyle'circles' | 'dots' | 'lines' | 'bars''dots'Indicator style. Default: 'dots'.
iconPrevstringIcon name for the previous arrow button.
iconNextstringIcon name for the next arrow button.
iconLibrary'fa' | 'mdi' | 'ion' | 'material-icons' | 'material-symbols'Icon library to use.
iconVariantstringIcon style variant (e.g., 'solid', 'outlined').
iconSize'small' | 'medium' | 'large'Icon size modifier.
iconFeaturesstring | string[]Additional icon modifiers.
arrowBackgroundbooleantrueShow semi-transparent background on arrow buttons. Set to false for icon-only arrows.
arrowColor'light' | 'dark'Color theme for navigation arrows.
ariaLabelstring'Image carousel'Accessible label for the carousel region. Default: 'Image carousel'.
onChange(value: number) => voidCallback when slide changes.
childrenReact.ReactNodeCarouselItem children.
classNamestringAdditional CSS classes.
refReact.Ref<HTMLElement>Ref forwarded to the carousel element.
...All standard <div> attributes and Bulma helper propsSee Helper Props

CarouselItem

PropTypeDefaultDescription
activebooleanWhether this item is active (set automatically).
classNamestringAdditional CSS classes.

CSS & Sass Variables

Carousel registers these variables on its own .carousel element. Override them there (or via className) — a value set on an ancestor is only inherited, and loses to the component-level declaration. See Theme.

CSS VariableSass VariableDefault
--bulma-carousel-arrow-size$carousel-arrow-size48px
--bulma-carousel-arrow-size-mobile$carousel-arrow-size-mobile36px
--bulma-carousel-arrow-background$carousel-arrow-backgroundhsla(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-scheme-main-l), 0.8)
--bulma-carousel-arrow-background-hover$carousel-arrow-background-hoverhsla(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-scheme-main-l), 0.95)
--bulma-carousel-arrow-color$carousel-arrow-colorvar(--bulma-text)
--bulma-carousel-arrow-disabled-opacity$carousel-arrow-disabled-opacity0.3
--bulma-carousel-arrow-offset$carousel-arrow-offset1rem
--bulma-carousel-arrow-offset-mobile$carousel-arrow-offset-mobile0.5rem
--bulma-carousel-arrow-icon-size$carousel-arrow-icon-size24px
--bulma-carousel-arrow-icon-size-mobile$carousel-arrow-icon-size-mobile18px
--bulma-carousel-arrow-radius$carousel-arrow-radiusvar(--bulma-radius)
--bulma-carousel-indicator-size$carousel-indicator-size10px
--bulma-carousel-indicator-size-mobile$carousel-indicator-size-mobile8px
--bulma-carousel-indicator-gap$carousel-indicator-gap0.5rem
--bulma-carousel-indicator-gap-mobile$carousel-indicator-gap-mobile0.375rem
--bulma-carousel-indicator-background$carousel-indicator-backgroundvar(--bulma-border)
--bulma-carousel-indicator-background-hover$carousel-indicator-background-hovervar(--bulma-border-hover)
--bulma-carousel-indicator-background-active$carousel-indicator-background-activevar(--bulma-primary)
--bulma-carousel-indicator-circle-size$carousel-indicator-circle-size12px
--bulma-carousel-indicator-line-width$carousel-indicator-line-width30px
--bulma-carousel-indicator-line-width-mobile$carousel-indicator-line-width-mobile20px
--bulma-carousel-indicator-line-height$carousel-indicator-line-height4px
--bulma-carousel-indicator-line-height-mobile$carousel-indicator-line-height-mobile3px
--bulma-carousel-indicator-line-radius$carousel-indicator-line-radiusvar(--bulma-radius-small)
--bulma-carousel-indicator-bar-width$carousel-indicator-bar-width24px
--bulma-carousel-indicator-bar-width-mobile$carousel-indicator-bar-width-mobile16px
--bulma-carousel-indicator-bar-height$carousel-indicator-bar-height6px
--bulma-carousel-indicator-bar-height-mobile$carousel-indicator-bar-height-mobile4px
--bulma-carousel-overlay-arrow-background$carousel-overlay-arrow-backgroundhsla(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-scheme-invert-l), 0.3)
--bulma-carousel-overlay-arrow-background-hover$carousel-overlay-arrow-background-hoverhsla(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-scheme-invert-l), 0.5)
--bulma-carousel-overlay-arrow-color$carousel-overlay-arrow-colorvar(--bulma-scheme-main)
--bulma-carousel-overlay-indicator-background$carousel-overlay-indicator-backgroundhsla(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-scheme-main-l), 0.5)
--bulma-carousel-overlay-indicator-background-hover$carousel-overlay-indicator-background-hoverhsla(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-scheme-main-l), 0.8)
--bulma-carousel-overlay-indicator-background-active$carousel-overlay-indicator-background-activevar(--bulma-scheme-main)
--bulma-carousel-transition-duration$carousel-transition-durationvar(--bulma-duration)
--bulma-carousel-fade-duration$carousel-fade-duration0.5s