{"version":3,"sources":["../../src/carousel/Carousel.tsx","../../src/carousel/useCarousel.ts","../../src/carousel/useEvent.ts","../../src/carousel/useIsMounted.ts","../../src/carousel/useScrollEnd.ts","../../src/carousel/useSnapPoints.ts","../../src/carousel/useResizeObserver.ts","../../src/carousel/utils.ts","../../src/carousel/CarouselControls.tsx","../../src/carousel/CarouselNextButton.tsx","../../src/carousel/CarouselPageIndicator.tsx","../../src/carousel/CarouselPagePicker.tsx","../../src/carousel/CarouselPrevButton.tsx","../../src/carousel/CarouselSlide.tsx","../../src/carousel/useIsVisible.ts","../../src/carousel/CarouselSlides.tsx","../../src/carousel/CarouselViewport.tsx","../../src/carousel/index.ts"],"sourcesContent":["import { cx } from 'class-variance-authority'\nimport { createContext, ReactNode, useContext } from 'react'\n\nimport { CarouselAPI, UseCarouselProps } from './types'\nimport { useCarousel } from './useCarousel'\n\ninterface Props extends UseCarouselProps {\n  children?: ReactNode\n  className?: string\n}\n\nconst CarouselContext = createContext<CarouselAPI | null>(null)\n\nexport const Carousel = ({\n  className,\n  snapType = 'mandatory',\n  snapStop = 'always',\n  scrollBehavior = 'smooth',\n  slidesPerMove = 'auto',\n  slidesPerPage = 1,\n  loop = false,\n  children,\n  gap = 16,\n  defaultPage,\n  page,\n  onPageChange,\n}: Props) => {\n  const carouselApi = useCarousel({\n    defaultPage,\n    slidesPerPage,\n    slidesPerMove,\n    loop,\n    gap,\n    scrollBehavior,\n    snapStop,\n    snapType,\n    page,\n    onPageChange,\n  })\n\n  return (\n    <CarouselContext.Provider\n      value={{\n        ...carouselApi,\n        scrollBehavior,\n      }}\n    >\n      <div\n        data-spark-component=\"carousel\"\n        className={cx('gap-lg relative box-border flex flex-col', className)}\n        {...carouselApi.getRootProps()}\n      >\n        {children}\n      </div>\n    </CarouselContext.Provider>\n  )\n}\n\nCarousel.displayName = 'Carousel'\n\nexport const useCarouselContext = () => {\n  const context = useContext(CarouselContext)\n\n  if (!context) {\n    throw Error('useCarouselContext must be used within a Carousel provider')\n  }\n\n  return context\n}\n","/* eslint-disable max-lines-per-function */\nimport {\n  KeyboardEvent,\n  useCallback,\n  useEffect,\n  useId,\n  useLayoutEffect,\n  useRef,\n  useState,\n} from 'react'\n\nimport {\n  CarouselAPI,\n  ComputedControlProps,\n  ComputedIndicatorGroupProps,\n  ComputedIndicatorProps,\n  ComputedRootProps,\n  ComputedSlideGroupProps,\n  ComputedSlideProps,\n  ComputedTriggerProps,\n  UseCarouselProps,\n} from './types'\nimport { useEvent } from './useEvent'\nimport { useIsMounted } from './useIsMounted'\nimport { useScrollEnd } from './useScrollEnd'\nimport { useSnapPoints } from './useSnapPoints'\nimport { getSnapPositions, isSnapPoint } from './utils'\n\nconst DATA_SCOPE = 'carousel' as const\nconst DIRECTION = 'ltr' as const\n\nexport const useCarousel = ({\n  defaultPage,\n  gap = 16,\n  snapType = 'mandatory',\n  snapStop = 'always',\n  scrollPadding = 0,\n  slidesPerPage = 1,\n  slidesPerMove = 'auto',\n  scrollBehavior = 'smooth',\n  loop = false,\n  // state control\n  page: controlledPage,\n  onPageChange: onPageChangeProp,\n}: UseCarouselProps): CarouselAPI => {\n  const carouselId = useId()\n  const [pageState, setPageState] = useState(defaultPage || controlledPage || 0)\n\n  const carouselRef = useRef<HTMLDivElement>(null)\n  const pageIndicatorsRefs = useRef<(HTMLElement | null)[]>([])\n  const isMountedRef = useIsMounted()\n  const isMounted = isMountedRef.current\n  const onPageChange = useEvent(onPageChangeProp)\n\n  const [pageSnapPoints] = useSnapPoints([], {\n    carouselRef,\n    slidesPerMove,\n    slidesPerPage,\n  })\n\n  const canScrollPrev = useRef(loop || pageState > 0)\n  const canScrollNext = useRef(loop || pageState < pageSnapPoints.length - 1)\n  canScrollPrev.current = loop || pageState > 0\n  canScrollNext.current = loop || pageState < pageSnapPoints.length - 1\n\n  const handlePageChange = useCallback(\n    (page: number) => {\n      if (page !== pageState) {\n        setPageState(page)\n        onPageChange?.(page)\n      }\n    },\n    [onPageChange, pageState]\n  )\n\n  const scrollTo = useCallback(\n    (page: number, behavior: 'instant' | 'smooth') => {\n      if (carouselRef.current) {\n        carouselRef.current.scrollTo({\n          left: pageSnapPoints[page],\n          behavior: behavior === 'instant' ? 'auto' : 'smooth',\n        })\n        handlePageChange(page)\n      }\n    },\n    [handlePageChange, pageSnapPoints]\n  )\n\n  const scrollPrev = useCallback(\n    (cb?: (pageIndex: number) => void) => {\n      if (canScrollPrev) {\n        const targetPage =\n          loop && pageState === 0 ? pageSnapPoints.length - 1 : Math.max(pageState - 1, 0)\n\n        scrollTo(targetPage, scrollBehavior)\n        cb?.(targetPage)\n      }\n    },\n    [loop, pageSnapPoints, pageState, scrollBehavior, scrollTo]\n  )\n\n  const scrollNext = useCallback(\n    (cb?: (pageIndex: number) => void) => {\n      if (canScrollNext) {\n        const targetPage =\n          loop && pageState === pageSnapPoints.length - 1\n            ? 0\n            : Math.min(pageState + 1, pageSnapPoints.length - 1)\n\n        scrollTo(targetPage, scrollBehavior)\n        cb?.(targetPage)\n      }\n    },\n    [loop, pageSnapPoints, pageState, scrollBehavior, scrollTo]\n  )\n\n  useEffect(() => {\n    if (controlledPage != null) {\n      scrollTo(controlledPage, scrollBehavior)\n    }\n  }, [controlledPage, scrollBehavior, scrollTo])\n\n  /**\n   * Set the default scroll position of the carousel based on `defaultPage`.\n   * As this operation is done before the snap points are set in the state, we have to get them from the ref directly.\n   */\n  useLayoutEffect(() => {\n    if (defaultPage != null && !isMounted && carouselRef.current) {\n      const snapPositions = getSnapPositions({\n        container: carouselRef.current,\n        slidesPerMove,\n        slidesPerPage,\n      })\n\n      carouselRef.current.scrollTo({\n        left: snapPositions[defaultPage],\n        behavior: 'instant',\n      })\n    }\n  }, [defaultPage, isMounted, slidesPerMove, slidesPerPage])\n\n  /**\n   * Monitoring scrollend events inside the scrollable area to sync the carousel active page with current scroll position.\n   * Scrollend has been chosen over \"scroll\" for performance reason.\n   */\n  const syncPageStateWithScrollPosition = useCallback(() => {\n    if (!carouselRef.current || pageSnapPoints.length === 0) return\n\n    const { scrollLeft } = carouselRef.current\n\n    const distances = pageSnapPoints.map(pagePosition => Math.abs(scrollLeft - pagePosition))\n    const pageInViewport = distances.indexOf(Math.min(...distances))\n\n    if (pageInViewport !== -1) {\n      handlePageChange(pageInViewport)\n    }\n  }, [pageSnapPoints, handlePageChange])\n\n  useScrollEnd(carouselRef, syncPageStateWithScrollPosition)\n\n  const contextValue: CarouselAPI = {\n    ref: carouselRef,\n    pageIndicatorsRefs,\n    // props\n    gap,\n    snapType,\n    snapStop,\n    scrollPadding,\n    slidesPerPage,\n    slidesPerMove,\n    scrollBehavior,\n    loop,\n    // computed state\n    page: pageState,\n    pageSnapPoints,\n    canScrollNext: canScrollNext.current,\n    canScrollPrev: canScrollPrev.current,\n    scrollTo,\n    scrollPrev,\n    scrollNext,\n    // anatomy\n    getRootProps: (): ComputedRootProps => ({\n      id: `carousel::${carouselId}:`,\n      role: 'region',\n      'aria-roledescription': 'carousel',\n      'data-scope': DATA_SCOPE,\n      'data-part': 'root',\n      'data-orientation': 'horizontal',\n      dir: DIRECTION,\n      style: {\n        '--slides-per-page': slidesPerPage,\n        '--slide-spacing': `${gap}px`,\n        '--slide-item-size':\n          'calc(100% / var(--slides-per-page) - var(--slide-spacing) * (var(--slides-per-page) - 1) / var(--slides-per-page))',\n      },\n    }),\n\n    getControlProps: (): ComputedControlProps => ({\n      'data-scope': DATA_SCOPE,\n      'data-part': 'control',\n      'data-orientation': 'horizontal',\n    }),\n\n    getPrevTriggerProps: (): ComputedTriggerProps<'prev-trigger'> => ({\n      id: `carousel::${carouselId}::prev-trigger`,\n      'aria-controls': `carousel::${carouselId}::item-group`,\n      'data-scope': DATA_SCOPE,\n      'data-part': 'prev-trigger',\n      'data-orientation': 'horizontal',\n      type: 'button',\n      dir: DIRECTION,\n      disabled: !canScrollPrev.current,\n      onClick: () => scrollPrev(),\n    }),\n\n    getNextTriggerProps: (): ComputedTriggerProps<'next-trigger'> => ({\n      id: `carousel::${carouselId}::next-trigger`,\n      'aria-controls': `carousel::${carouselId}::item-group`,\n      'data-scope': DATA_SCOPE,\n      'data-part': 'next-trigger',\n      'data-orientation': 'horizontal',\n      type: 'button',\n      dir: DIRECTION,\n      disabled: !canScrollNext.current,\n      onClick: () => scrollNext(),\n    }),\n\n    getSlidesContainerProps: (): ComputedSlideGroupProps => ({\n      id: `carousel::${carouselId}::item-group`,\n      /**\n       * The carousel pattern was originally designed for a single slide.\n       * When there is more than one slide, the aria-live region is set to off to avoid announcing the whole list of slides.\n       * This is not ideal but we keep it for backwards compatibility.\n       *\n       * @see https://www.w3.org/WAI/ARIA/apg/patterns/carousel/#wai-aria-attributes\n       */\n      'aria-live': slidesPerPage > 1 ? 'off' : 'polite',\n      'data-scope': DATA_SCOPE,\n      'data-part': 'item-group',\n      'data-orientation': 'horizontal',\n      dir: DIRECTION,\n      tabIndex: 0,\n      style: {\n        display: 'grid',\n        gap: 'var(--slide-spacing)',\n        scrollSnapType: `x ${snapType}`,\n        gridAutoFlow: 'column',\n        scrollbarWidth: 'none',\n        overscrollBehavior: 'contain',\n        gridAutoColumns: 'var(--slide-item-size)',\n        overflowX: 'auto',\n      },\n      ref: carouselRef,\n    }),\n\n    getSlideProps: ({ index }): ComputedSlideProps => {\n      const isStopPoint = isSnapPoint(index, {\n        container: carouselRef.current,\n        slidesPerMove,\n        slidesPerPage,\n      })\n\n      return {\n        id: `carousel::${carouselId}::item:${index}`,\n        role: 'group',\n        'aria-roledescription': 'slide',\n        'data-scope': DATA_SCOPE,\n        'data-part': 'item',\n        'data-index': index,\n        'data-orientation': 'horizontal',\n        dir: DIRECTION,\n        style: {\n          ...(isStopPoint && {\n            scrollSnapAlign: 'start',\n            scrollSnapStop: snapStop,\n          }),\n        },\n      }\n    },\n\n    getIndicatorGroupProps: (): ComputedIndicatorGroupProps => ({\n      role: 'radiogroup',\n      id: `carousel::${carouselId}::indicator-group`,\n      'data-scope': DATA_SCOPE,\n      'data-part': 'indicator-group',\n      'data-orientation': 'horizontal',\n      dir: DIRECTION,\n    }),\n\n    getIndicatorProps: ({ index }): ComputedIndicatorProps => {\n      const isActivePage = index === pageState\n\n      return {\n        role: 'radio',\n        id: `carousel::${carouselId}::indicator:${index}`,\n        'aria-checked': isActivePage,\n        'data-scope': DATA_SCOPE,\n        'data-part': 'indicator',\n        'data-orientation': 'horizontal',\n        'data-index': index,\n        'data-state': isActivePage ? 'active' : 'inactive',\n        tabIndex: isActivePage ? 0 : -1,\n        onClick: () => {\n          scrollTo(index, scrollBehavior)\n        },\n        onKeyDown: (event: KeyboardEvent) => {\n          const focusActiveIndicator = (page: number) => {\n            pageIndicatorsRefs.current[page]?.focus()\n          }\n\n          if (event.key === 'ArrowRight' && canScrollNext) {\n            scrollNext(focusActiveIndicator)\n          } else if (event.key === 'ArrowLeft' && canScrollPrev) {\n            scrollPrev(focusActiveIndicator)\n          }\n        },\n      }\n    },\n  }\n\n  return contextValue\n}\n","import { useCallback, useLayoutEffect, useRef } from 'react'\n\ntype AnyFunction = (...args: any[]) => any\n\n/**\n * Directly from this gist: https://gist.github.com/diegohaz/695097a06f038a707c3a1b11e4e40195\n * Until React releases a native `useEvent` hook.\n */\nexport function useEvent<T extends AnyFunction>(callback?: T) {\n  const ref = useRef<AnyFunction | undefined>(() => {\n    throw new Error('Cannot call an event handler while rendering.')\n  })\n\n  useLayoutEffect(() => {\n    ref.current = callback\n  })\n\n  return useCallback<AnyFunction>((...args) => ref.current?.(...args), []) as T\n}\n","import { useEffect, useRef } from 'react'\n\nexport const useIsMounted = () => {\n  const isMounted = useRef(false)\n\n  useEffect(() => {\n    isMounted.current = true\n\n    return () => {\n      isMounted.current = false\n    }\n  }, [])\n\n  return isMounted\n}\n","import { useEffect, useRef, RefObject } from 'react'\n\nexport function useScrollEnd(scrollRef: RefObject<HTMLDivElement | null>, callback: () => void) {\n  const scrollLeft = useRef(0)\n\n  /**\n   * Safari (and some smaller browsers) to not yet support the `scrollend` event.\n   * For those we must rely on the `scroll` event and and an idle state delay to trigger the \"scroll end\".\n   *\n   * Caveats:\n   * - when using a trackpad or your fingers on a touch device, scrolling then holding the position might trigger the \"scrollend\" callback too early.\n   */\n  const safariTimeout = useRef<NodeJS.Timeout | null>(null)\n\n  useEffect(() => {\n    const element = scrollRef.current\n    if (!element) return\n\n    const supportsScrollend = 'onscrollend' in window\n\n    const handleScrollEnd = () => {\n      callback()\n    }\n\n    const handleSafariScroll = () => {\n      if (safariTimeout.current) {\n        clearTimeout(safariTimeout.current)\n      }\n\n      if (scrollRef.current) {\n        scrollLeft.current = scrollRef.current.scrollLeft\n\n        safariTimeout.current = setTimeout(() => {\n          if (scrollRef.current) {\n            handleScrollEnd()\n          }\n        }, 150)\n      }\n    }\n\n    if (supportsScrollend) {\n      element.addEventListener('scrollend', handleScrollEnd)\n    } else {\n      element.addEventListener('scroll', handleSafariScroll)\n    }\n\n    return () => {\n      if (safariTimeout.current) {\n        clearTimeout(safariTimeout.current)\n      }\n\n      if (supportsScrollend) {\n        element.removeEventListener('scrollend', handleScrollEnd)\n      } else {\n        element.removeEventListener('scroll', handleSafariScroll)\n      }\n    }\n  }, [callback, scrollRef])\n}\n\nexport default useScrollEnd\n","import { useMemo, useState, RefObject } from 'react'\n\nimport { useResizeObserver } from './useResizeObserver'\nimport { getSnapPositions } from './utils'\n\n/**\n * Get the scroll value of each slides that serves as the start of a page\n * The array is updated when resize event are caught in the carousel.\n */\nexport function useSnapPoints<T extends HTMLDivElement | null>(\n  initialSnapPoints: number[] = [],\n  {\n    carouselRef,\n    slidesPerMove,\n    slidesPerPage,\n  }: {\n    carouselRef: RefObject<T>\n    slidesPerMove: 'auto' | number\n    slidesPerPage: number\n  }\n) {\n  const [pageSnapPoints, setPageSnapPoints] = useState(initialSnapPoints)\n\n  const stableSnapPoints = useMemo(() => pageSnapPoints, [pageSnapPoints])\n\n  /**\n   * On resize, dimensions of the carousel might changes, which requires to update the snap points positions in the state.\n   */\n  useResizeObserver(carouselRef, () => {\n    const newSnapPoints = getSnapPositions({\n      slidesPerMove,\n      slidesPerPage,\n      container: carouselRef.current,\n    })\n\n    if (JSON.stringify(pageSnapPoints) !== JSON.stringify(newSnapPoints)) {\n      setPageSnapPoints(newSnapPoints)\n    }\n  })\n\n  return [stableSnapPoints, setPageSnapPoints] as const\n}\n","import { useLayoutEffect, RefObject } from 'react'\n\nexport function useResizeObserver<T extends HTMLElement | null>(\n  ref: RefObject<T>,\n  callback: (width: number) => void\n) {\n  useLayoutEffect(() => {\n    const element = ref.current\n    if (!element) return\n\n    const observer = new ResizeObserver(entries => {\n      for (const entry of entries) {\n        callback(entry.contentRect.width)\n      }\n    })\n\n    observer.observe(element)\n\n    return () => observer.disconnect() // Cleanup on unmount\n  }, [ref, callback])\n}\n","/**\n * Get the indices of each slides that serves as the start of a page\n * @returns number[] (ex: [0, 2, 4])\n */\nfunction getSnapIndices({\n  totalSlides,\n  slidesPerMove,\n  slidesPerPage,\n}: {\n  totalSlides: number\n  slidesPerMove: number | 'auto'\n  slidesPerPage: number\n}) {\n  const slideBy = slidesPerMove === 'auto' ? slidesPerPage : slidesPerMove\n  const snapPoints: number[] = []\n\n  const lastSnapIndex = Math.floor((totalSlides - slidesPerPage) / slideBy) * slideBy\n\n  for (let i = 0; i <= lastSnapIndex; i += slideBy) {\n    snapPoints.push(i)\n  }\n\n  // Adding final snap point if necessary\n  if (snapPoints[snapPoints.length - 1] !== totalSlides - slidesPerPage) {\n    snapPoints.push(totalSlides - slidesPerPage)\n  }\n\n  return snapPoints\n}\n\nexport function getSlideElements(container: HTMLDivElement | null): Element[] {\n  return container ? Array.from(container.querySelectorAll('[data-part=\"item\"]')) : []\n}\n\nexport function isSnapPoint(\n  slideIndex: number,\n  {\n    container,\n    slidesPerMove,\n    slidesPerPage,\n  }: {\n    container: HTMLDivElement | null\n    slidesPerMove: number | 'auto'\n    slidesPerPage: number\n  }\n) {\n  return getSnapIndices({\n    totalSlides: getSlideElements(container).length,\n    slidesPerPage,\n    slidesPerMove,\n  }).includes(slideIndex)\n}\n\n/**\n * Get the scroll value of each slides that serves as the start of a page\n * @returns number[] (ex for a 400px carousel with no gap: [400, 800, 1200])\n */\nexport function getSnapPositions({\n  container,\n  slidesPerMove,\n  slidesPerPage,\n}: {\n  container: HTMLDivElement | null\n  slidesPerMove: number | 'auto'\n  slidesPerPage: number\n}) {\n  if (!container) return []\n\n  return getSlideElements(container)\n    .filter((_, index) => {\n      return isSnapPoint(index, {\n        slidesPerMove,\n        slidesPerPage,\n        container,\n      })\n    })\n    .map(slide => (slide as HTMLElement).offsetLeft)\n}\n","import { cx } from 'class-variance-authority'\nimport { HTMLAttributes, ReactNode } from 'react'\n\nimport { useCarouselContext } from './Carousel'\n\ninterface ControlsProps extends HTMLAttributes<HTMLDivElement> {\n  children: ReactNode\n}\n\nexport const CarouselControls = ({ children, className, ...props }: ControlsProps) => {\n  const ctx = useCarouselContext()\n\n  return (\n    <div\n      data-spark-component=\"carousel-controls\"\n      className={cx(\n        'default:px-lg pointer-events-none absolute inset-0 flex flex-row items-center justify-between',\n        className\n      )}\n      {...ctx.getControlProps()}\n      {...props}\n    >\n      {children}\n    </div>\n  )\n}\n\nCarouselControls.displayName = 'Carousel.Controls'\n","import { ArrowVerticalRight } from '@spark-ui/icons/ArrowVerticalRight'\n\nimport { Icon } from '../icon'\nimport { IconButton, IconButtonProps } from '../icon-button'\nimport { useCarouselContext } from './Carousel'\n\nexport const CarouselNextButton = ({\n  'aria-label': ariaLabel,\n  ...buttonProps\n}: IconButtonProps) => {\n  const ctx = useCarouselContext()\n\n  return (\n    <IconButton\n      data-spark-component=\"carousel-next-button\"\n      {...ctx.getNextTriggerProps()}\n      intent=\"surface\"\n      design=\"filled\"\n      className=\"pointer-events-auto cursor-pointer shadow-sm disabled:invisible\"\n      aria-label={ariaLabel}\n      {...buttonProps}\n    >\n      <Icon>\n        <ArrowVerticalRight />\n      </Icon>\n    </IconButton>\n  )\n}\n\nCarouselNextButton.displayName = 'Carousel.NextButton'\n","import { cx } from 'class-variance-authority'\nimport { ReactNode, useEffect, useRef } from 'react'\n\nimport { useCarouselContext } from './Carousel'\n\ninterface Props {\n  children?: ReactNode\n  'aria-label': string\n  index: number\n  className?: string\n  unstyled?: boolean\n}\n\nexport const CarouselPageIndicator = ({\n  children,\n  unstyled = false,\n  index,\n  'aria-label': ariaLabel,\n  className,\n}: Props) => {\n  const ctx = useCarouselContext()\n\n  const ref = useRef<HTMLButtonElement | null>(null)\n\n  useEffect(() => {\n    if (ctx.pageIndicatorsRefs.current) {\n      ctx.pageIndicatorsRefs.current[index] = ref.current\n    }\n  })\n\n  const styles = cx(\n    'group h-sz-16 relative flex',\n    'hover:cursor-pointer',\n    'w-sz-16 data-[state=active]:w-sz-44'\n  )\n\n  const dotsStyles = cx(\n    'before:rounded-sm before:block before:size-md',\n    'before:absolute before:left-1/2 before:top-1/2 before:-translate-x-1/2 before:-translate-y-1/2',\n    'data-[state=active]:before:w-sz-32 data-[state=active]:before:bg-basic',\n    'data-[state=inactive]:before:bg-on-surface/dim-3'\n  )\n\n  return (\n    <button\n      data-spark-component=\"carousel-page-indicator\"\n      ref={ref}\n      key={index}\n      {...ctx.getIndicatorProps({ index })}\n      aria-label={ariaLabel}\n      className={cx(\n        {\n          [styles]: !unstyled,\n          [dotsStyles]: !unstyled,\n        },\n        className\n      )}\n    >\n      {children}\n    </button>\n  )\n}\n\nCarouselPageIndicator.displayName = 'Carousel.PageIndicator'\n","import { cx } from 'class-variance-authority'\nimport { ReactNode } from 'react'\n\nimport { useCarouselContext } from './Carousel'\nimport { CarouselAPI } from './types'\n\ninterface RenderProps extends CarouselAPI {\n  pages: number[]\n}\n\ninterface Props {\n  children: (renderProps: RenderProps) => ReactNode\n  className?: string\n}\n\nexport const CarouselPagePicker = ({ children, className }: Props) => {\n  const ctx = useCarouselContext()\n\n  return (\n    <>\n      <div\n        data-spark-component=\"carousel-page-picker\"\n        {...ctx.getIndicatorGroupProps()}\n        className={cx(\n          'default:min-h-sz-16 flex w-full flex-wrap items-center justify-center',\n          className\n        )}\n      >\n        {ctx.pageSnapPoints.length <= 1\n          ? null\n          : children({\n              ...ctx,\n              pages: Array.from({ length: ctx.pageSnapPoints.length }, (_, i) => i),\n            })}\n      </div>\n    </>\n  )\n}\n\nCarouselPagePicker.displayName = 'Carousel.PagePicker'\n","import { ArrowVerticalLeft } from '@spark-ui/icons/ArrowVerticalLeft'\n\nimport { Icon } from '../icon'\nimport { IconButton, IconButtonProps } from '../icon-button'\nimport { useCarouselContext } from './Carousel'\n\nexport const CarouselPrevButton = ({\n  'aria-label': ariaLabel,\n  ...buttonProps\n}: IconButtonProps) => {\n  const ctx = useCarouselContext()\n\n  return (\n    <IconButton\n      data-spark-component=\"carousel-prev-button\"\n      {...ctx.getPrevTriggerProps()}\n      intent=\"surface\"\n      design=\"filled\"\n      className=\"pointer-events-auto cursor-pointer shadow-sm disabled:invisible\"\n      aria-label={ariaLabel}\n      {...buttonProps}\n    >\n      <Icon>\n        <ArrowVerticalLeft />\n      </Icon>\n    </IconButton>\n  )\n}\n\nCarouselPrevButton.displayName = 'Carousel.PrevButton'\n","import { cx } from 'class-variance-authority'\nimport { ComponentProps, ReactNode, useRef } from 'react'\n\nimport { useCarouselContext } from './Carousel'\nimport { useIsVisible } from './useIsVisible'\n\nexport interface CarouselSlideProps extends ComponentProps<'div'> {\n  isSnapPoint?: boolean\n  children?: ReactNode\n  index?: number\n  totalSlides?: number\n  className?: string\n}\n\nexport const CarouselSlide = ({\n  children,\n  index = 0,\n  totalSlides,\n  className = '',\n  ...props\n}: CarouselSlideProps) => {\n  const itemRef = useRef<HTMLDivElement>(null)\n  const ctx = useCarouselContext()\n\n  const isVisible = useIsVisible(itemRef, ctx.ref)\n\n  return (\n    <div\n      data-spark-component=\"carousel-slide\"\n      ref={itemRef}\n      {...ctx.getSlideProps({ index, totalSlides: totalSlides as number })}\n      className={cx('default:bg-surface relative overflow-hidden', className)}\n      aria-hidden={!isVisible}\n      inert={!isVisible}\n      {...props}\n    >\n      {children}\n    </div>\n  )\n}\n\nCarouselSlide.displayName = 'Carousel.Slide'\n","import { useLayoutEffect, useState, RefObject } from 'react'\n\nexport function useIsVisible(\n  elementRef: RefObject<HTMLElement | null>,\n  parentRef: RefObject<HTMLElement | null>\n) {\n  const [isVisible, setIsVisible] = useState(true)\n\n  useLayoutEffect(() => {\n    const el = elementRef.current\n    const parent = parentRef.current\n\n    if (!parent || !el) return\n\n    const observer = new IntersectionObserver(\n      ([entry]) => {\n        if (entry) {\n          setIsVisible(entry.isIntersecting)\n        }\n      },\n      { root: parent, threshold: 0.2 }\n    )\n\n    observer.observe(el)\n\n    return () => observer.disconnect()\n  })\n\n  return isVisible\n}\n","import { cx } from 'class-variance-authority'\nimport { Children, cloneElement, ComponentProps, isValidElement, ReactNode } from 'react'\n\nimport { useCarouselContext } from './Carousel'\nimport { CarouselSlideProps } from './CarouselSlide'\n\ninterface Props extends ComponentProps<'div'> {\n  children?: ReactNode\n  className?: string\n}\n\nexport const CarouselSlides = ({ children, className = '' }: Props) => {\n  const ctx = useCarouselContext()\n\n  const childrenElements = Children.toArray(children)\n\n  return (\n    <div\n      data-spark-component=\"carousel-slides\"\n      {...ctx.getSlidesContainerProps()}\n      className={cx(\n        'focus-visible:u-outline relative w-full',\n        '[-ms-overflow-style:none] [scrollbar-width:none] [&::-webkit-scrollbar]:hidden',\n        className\n      )}\n    >\n      {childrenElements.map((child, index) =>\n        isValidElement<CarouselSlideProps>(child)\n          ? cloneElement(child, {\n              index,\n              totalSlides: childrenElements.length,\n            })\n          : child\n      )}\n    </div>\n  )\n}\n\nCarouselSlides.displayName = 'Carousel.Slides'\n","import { ReactNode } from 'react'\n\ninterface Props {\n  children: ReactNode\n}\n\nexport const CarouselViewport = ({ children }: Props) => {\n  return <div className=\"relative flex items-center justify-around p-0\">{children}</div>\n}\n\nCarouselViewport.displayName = 'Carousel.Viewport'\n","import { Carousel as Root } from './Carousel'\nimport { CarouselControls as Controls } from './CarouselControls'\nimport { CarouselNextButton as NextButton } from './CarouselNextButton'\nimport { CarouselPageIndicator as PageIndicator } from './CarouselPageIndicator'\nimport { CarouselPagePicker as PagePicker } from './CarouselPagePicker'\nimport { CarouselPrevButton as PrevButton } from './CarouselPrevButton'\nimport { CarouselSlide as Slide } from './CarouselSlide'\nimport { CarouselSlides as Slides } from './CarouselSlides'\nimport { CarouselViewport as Viewport } from './CarouselViewport'\n\nexport const Carousel: typeof Root & {\n  Controls: typeof Controls\n  NextButton: typeof NextButton\n  PrevButton: typeof PrevButton\n  Slide: typeof Slide\n  Slides: typeof Slides\n  Viewport: typeof Viewport\n  PagePicker: typeof PagePicker\n  PageIndicator: typeof PageIndicator\n} = Object.assign(Root, {\n  Controls,\n  NextButton,\n  PrevButton,\n  Slide,\n  Slides,\n  Viewport,\n  PagePicker,\n  PageIndicator,\n})\n\nCarousel.displayName = 'Carousel'\n"],"mappings":"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","names":["useCallback","useEffect","useLayoutEffect","useRef","useState","useRef","useEffect","useRef","useLayoutEffect","useState","useRef","useCallback","useEffect","useLayoutEffect","cx","jsx","cx","jsx","cx","useEffect","useRef","jsx","useRef","useEffect","cx","cx","jsx","cx","jsx","cx","useRef","useLayoutEffect","useState","jsx","useRef","cx","cx","jsx","cx","jsx","Carousel"]}