{"version":3,"sources":["jsdelivr-header.js","/npm/nuka-carousel@8.2.0/src/index.tsx","/npm/nuka-carousel@8.2.0/src/hooks/use-carousel.tsx","/npm/nuka-carousel@8.2.0/src/Carousel/Carousel.tsx","/npm/nuka-carousel@8.2.0/src/hooks/use-interval.tsx","/npm/nuka-carousel@8.2.0/src/hooks/use-paging.tsx","/npm/nuka-carousel@8.2.0/src/hooks/use-measurement.tsx","/npm/nuka-carousel@8.2.0/src/utils/array.ts","/npm/nuka-carousel@8.2.0/src/utils/browser.ts","/npm/nuka-carousel@8.2.0/src/utils/css.ts","/npm/nuka-carousel@8.2.0/src/utils/mouse.ts","/npm/nuka-carousel@8.2.0/src/hooks/use-resize-observer.tsx","/npm/nuka-carousel@8.2.0/src/hooks/use-hover.tsx","/npm/nuka-carousel@8.2.0/src/hooks/use-keyboard.tsx","/npm/nuka-carousel@8.2.0/src/hooks/use-reduced-motion.tsx","/npm/nuka-carousel@8.2.0/src/Carousel/NavButtons.tsx","/npm/nuka-carousel@8.2.0/src/Carousel/PageIndicators.tsx","/npm/nuka-carousel@8.2.0/dist/#style-inject:#style-inject","/npm/nuka-carousel@8.2.0/src/Carousel/Carousel.css"],"names":[],"mappings":"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","file":"/npm/nuka-carousel@8.2.0/dist/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.37.0.\n * Original file: /npm/nuka-carousel@8.2.0/dist/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","export * from './hooks/use-carousel';\nexport * from './Carousel/Carousel';\nexport * from './types';\n","import React, { useContext } from 'react';\n\nimport { CarouselProps } from '../types';\n\ntype CarouselContextType = CarouselProps & {\n  currentPage: number;\n  scrollOffset: number[];\n  totalPages: number;\n  goToPage: (idx: number) => void;\n  goForward: () => void;\n  goBack: () => void;\n};\n\nconst CarouselContext = React.createContext<CarouselContextType>(\n  {} as unknown as CarouselContextType,\n);\nexport const CarouselProvider = CarouselContext.Provider;\n\nexport const useCarousel = () => {\n  const context = useContext(CarouselContext);\n  return context;\n};\n","import {\n  MouseEvent,\n  TouchEvent,\n  forwardRef,\n  useEffect,\n  useImperativeHandle,\n  useRef,\n  useState,\n} from 'react';\n\nimport { useInterval } from '../hooks/use-interval';\nimport { usePaging } from '../hooks/use-paging';\nimport { useMeasurement } from '../hooks/use-measurement';\nimport { useHover } from '../hooks/use-hover';\nimport { useKeyboard } from '../hooks/use-keyboard';\nimport { useReducedMotion } from '../hooks/use-reduced-motion';\nimport { CarouselProvider } from '../hooks/use-carousel';\nimport { CarouselProps, SlideHandle } from '../types';\nimport { cls, isMouseEvent } from '../utils';\nimport { NavButtons } from './NavButtons';\nimport { PageIndicators } from './PageIndicators';\n\nimport './Carousel.css';\n\nconst defaults = {\n  arrows: <NavButtons />,\n  autoplay: false,\n  autoplayInterval: 3000,\n  dots: <PageIndicators />,\n  id: 'nuka-carousel',\n  keyboard: true,\n  minSwipeDistance: 50,\n  scrollDistance: 'screen',\n  showArrows: false,\n  showDots: false,\n  swiping: true,\n  wrapMode: 'nowrap',\n} satisfies Partial<CarouselProps>;\n\nexport const Carousel = forwardRef<SlideHandle, CarouselProps>(\n  (props: CarouselProps, ref) => {\n    const options = { ...defaults, ...props };\n\n    const {\n      afterSlide,\n      arrows,\n      autoplay,\n      autoplayInterval,\n      beforeSlide,\n      children,\n      className,\n      dots,\n      id,\n      keyboard,\n      minSwipeDistance,\n      scrollDistance,\n      showArrows,\n      showDots,\n      swiping,\n      title,\n      wrapMode,\n      initialPage,\n    } = options;\n\n    const carouselRef = useRef<HTMLDivElement | null>(null);\n    const containerRef = useRef<HTMLDivElement | null>(null);\n    const previousPageRef = useRef<number>(-1);\n    const arrowsContainerRef = useRef<HTMLDivElement | null>(null);\n\n    // -- update page count and scroll offset based on scroll distance\n    const { totalPages, scrollOffset } = useMeasurement({\n      element: containerRef,\n      scrollDistance,\n    });\n\n    // -- paging\n    const { currentPage, goBack, goForward, goToPage } = usePaging({\n      totalPages,\n      wrapMode,\n      initialPage,\n    });\n\n    // -- handle touch scroll events\n    const [touchStart, setTouchStart] = useState<null | number>(null);\n    const [touchEnd, setTouchEnd] = useState<null | number>(null);\n\n    const onTouchStart = (e: MouseEvent | TouchEvent) => {\n      if (!swiping) return;\n      setTouchEnd(null);\n      setTouchStart(isMouseEvent(e) ? e.clientX : e.targetTouches[0].clientX);\n    };\n\n    const onTouchMove = (e: MouseEvent | TouchEvent) => {\n      if (!swiping) return;\n      setTouchEnd(isMouseEvent(e) ? e.clientX : e.targetTouches[0].clientX);\n    };\n\n    const onTouchEnd = () => {\n      if (!swiping) return;\n      if (!containerRef.current) return;\n      if (!touchStart || !touchEnd) return;\n\n      const distance = touchStart - touchEnd;\n      const isLeftSwipe = distance > minSwipeDistance;\n      const isRightSwipe = distance < -minSwipeDistance;\n      if (isLeftSwipe || isRightSwipe) {\n        if (isLeftSwipe) {\n          goForward();\n        } else {\n          goBack();\n        }\n      }\n    };\n\n    // -- keyboard nav\n    useKeyboard({\n      element: carouselRef,\n      enabled: keyboard,\n      goForward,\n      goBack,\n    });\n\n    // -- forward events to ref\n    useImperativeHandle(ref, () => ({ goForward, goBack, goToPage }), [\n      goForward,\n      goBack,\n      goToPage,\n    ]);\n\n    // -- autoplay\n    const isHovered = useHover({ element: containerRef, enabled: autoplay });\n    const isArrowHovered = useHover({\n      element: arrowsContainerRef,\n      enabled: autoplay && showArrows === true,\n    });\n    const prefersReducedMotion = useReducedMotion({ enabled: autoplay });\n    const autoplayEnabled =\n      autoplay && !(isHovered || prefersReducedMotion || isArrowHovered);\n    useInterval(goForward, autoplayInterval, autoplayEnabled);\n\n    // -- scroll container when page index changes\n    useEffect(() => {\n      if (containerRef.current) {\n        const currentSlideIndex = previousPageRef.current;\n        const endSlideIndex = currentPage;\n        beforeSlide && beforeSlide(currentSlideIndex, endSlideIndex);\n        containerRef.current.scrollLeft = scrollOffset[currentPage];\n        afterSlide && setTimeout(() => afterSlide(endSlideIndex), 0);\n        previousPageRef.current = currentPage;\n        if (initialPage === undefined || currentPage === initialPage) {\n          containerRef.current.classList.remove('scroll-auto');\n          containerRef.current.classList.add('scroll-smooth');\n        }\n      }\n    }, [currentPage, scrollOffset, beforeSlide, afterSlide, initialPage]);\n\n    const containerClassName = cls(\n      'nuka-container',\n      showArrows === 'hover' && 'nuka-container-auto-hide',\n      className,\n    );\n\n    const providerValues = {\n      ...options,\n      totalPages,\n      currentPage,\n      scrollOffset,\n      goBack,\n      goForward,\n      goToPage,\n    };\n\n    return (\n      <CarouselProvider value={providerValues}>\n        <div\n          className={containerClassName}\n          aria-labelledby=\"nuka-carousel-heading\"\n          tabIndex={keyboard ? 0 : undefined}\n          ref={carouselRef}\n          id={id}\n        >\n          {title && (\n            <h3 id=\"nuka-carousel-heading\" className=\"nuka-hidden\">\n              {title}\n            </h3>\n          )}\n          <div className=\"nuka-slide-container\">\n            <div\n              className=\"nuka-overflow\"\n              ref={containerRef}\n              onTouchEnd={onTouchEnd}\n              onTouchMove={onTouchMove}\n              onTouchStart={onTouchStart}\n              id=\"nuka-overflow\"\n              data-testid=\"nuka-overflow\"\n              style={{ touchAction: 'pan-y' }}\n            >\n              <div\n                className=\"nuka-wrapper\"\n                id=\"nuka-wrapper\"\n                data-testid=\"nuka-wrapper\"\n              >\n                {children}\n              </div>\n            </div>\n            {showArrows && <div ref={arrowsContainerRef}>{arrows}</div>}\n          </div>\n        </div>\n        {showDots && dots}\n      </CarouselProvider>\n    );\n  },\n);\n\nCarousel.displayName = 'Carousel';\n","import { useEffect, useRef } from 'react';\n\ntype CallbackFunction = (...args: never[]) => void;\n\nexport function useInterval(\n  callback: CallbackFunction,\n  delay: number,\n  enabled = true,\n) {\n  const _callback = useRef<CallbackFunction>();\n\n  useEffect(() => {\n    _callback.current = callback;\n  }, [callback]);\n\n  useEffect(() => {\n    if (enabled && delay !== null) {\n      const id = setInterval(() => {\n        if (_callback.current) _callback.current();\n      }, delay);\n      return () => clearInterval(id);\n    }\n  }, [delay, enabled]);\n}\n","import { useEffect, useState } from 'react';\n\nimport { CarouselProps } from '../types';\n\ntype UsePagingReturnType = {\n  currentPage: number;\n  goToPage: (idx: number) => void;\n  goForward: () => void;\n  goBack: () => void;\n};\n\ntype PagingProps = {\n  totalPages: number;\n  wrapMode: CarouselProps['wrapMode'];\n  initialPage?: number;\n};\n\nexport function usePaging({\n  totalPages,\n  wrapMode,\n  initialPage,\n}: PagingProps): UsePagingReturnType {\n  const [currentPage, setCurrentPage] = useState(0);\n\n  useEffect(() => {\n    if (initialPage) {\n      setCurrentPage(Math.max(0, Math.min(initialPage, totalPages)));\n    }\n  }, [initialPage, totalPages]);\n\n  const goToPage = (idx: number) => {\n    if (idx < 0 || idx >= totalPages) return;\n    setCurrentPage(idx);\n  };\n\n  const goForward = () => {\n    if (wrapMode === 'wrap') {\n      setCurrentPage((prev) => (prev + 1) % totalPages);\n    } else {\n      setCurrentPage((prev) => Math.min(prev + 1, totalPages - 1));\n    }\n  };\n\n  const goBack = () => {\n    if (wrapMode === 'wrap') {\n      setCurrentPage((prev) => (prev - 1 + totalPages) % totalPages);\n    } else {\n      setCurrentPage((prev) => Math.max(prev - 1, 0));\n    }\n  };\n\n  return { currentPage, goToPage, goForward, goBack };\n}\n","import { useEffect, useState } from 'react';\n\nimport { arraySeq, arraySum } from '../utils';\nimport { useResizeObserver } from './use-resize-observer';\n\ntype MeasurementProps = {\n  element: React.RefObject<HTMLDivElement>;\n  scrollDistance: number | 'slide' | 'screen';\n};\n\nexport function useMeasurement({ element, scrollDistance }: MeasurementProps) {\n  const [totalPages, setTotalPages] = useState(0);\n  const [scrollOffset, setScrollOffset] = useState(arraySeq(totalPages, 0));\n  const dimensions = useResizeObserver(element);\n\n  useEffect(() => {\n    const container = element.current;\n    if (!(container && dimensions)) return;\n\n    // determine the width of the content that is not visible (overflow)\n    // we ignore the bounding box width because its a float\n    // and scrollWidth is an integer, so it creates an imperfect\n    // calculation when the scrollWidth is a few pixels larger\n    const scrollWidth = container.scrollWidth;\n    const visibleWidth = container.offsetWidth;\n    const remainder = scrollWidth - visibleWidth;\n\n    if (visibleWidth === 0) return;\n\n    switch (scrollDistance) {\n      case 'screen': {\n        const pageCount = Math.round(scrollWidth / visibleWidth);\n\n        setTotalPages(pageCount);\n        setScrollOffset(arraySeq(pageCount, visibleWidth));\n        break;\n      }\n      case 'slide': {\n        // creates an array of slide widths in order to support\n        // slides of varying widths as children\n        const children =\n          container.querySelector('#nuka-wrapper')?.children || [];\n        const offsets = Array.from(children).map(\n          (child) => (child as HTMLElement).offsetWidth,\n        );\n\n        // shift the scroll offsets by one to account for the first slide\n        const scrollOffsets = arraySum([0, ...offsets.slice(0, -1)]);\n\n        // find the index of the scroll offset that is greater than\n        // the remainder of the full width and window width\n        const pageCount =\n          scrollOffsets.findIndex((offset) => offset >= remainder) + 1;\n\n        setTotalPages(pageCount);\n        setScrollOffset(scrollOffsets);\n        break;\n      }\n      default: {\n        if (typeof scrollDistance === 'number' && scrollDistance > 0) {\n          // find the number of pages required to scroll all the slides\n          // to the end of the container\n          const pageCount = Math.ceil(remainder / scrollDistance) + 1;\n\n          setTotalPages(pageCount);\n          setScrollOffset(arraySeq(pageCount, scrollDistance));\n        }\n      }\n    }\n  }, [element, scrollDistance, dimensions]);\n\n  return { totalPages, scrollOffset };\n}\n","/**\n * Creates an zero based array of numbers each multiplied by initialValue\n * @param length The length of the array\n * @param initialValue The seed value that each element will be multiplied by\n * @returns An array of numbers\n */\nexport function arraySeq(length: number, initialValue: number): number[] {\n  return new Array(length).fill(0).map((_, i) => i * initialValue);\n}\n\n/**\n * Creates an array where each element is the sum of all previous elements\n * @param values The seed array\n * @returns An array of numbers\n */\nexport function arraySum(values: number[]): number[] {\n  let sum = 0;\n  return values.map((value) => (sum += value));\n}\n","export const isBrowser = () => typeof window !== 'undefined';\n","type ClassName = string | boolean | undefined;\n\nexport function cls(...classes: ClassName[]) {\n  return classes.filter(Boolean).join(' ');\n}\n","export function isMouseEvent(\n  e: React.MouseEvent | React.TouchEvent,\n): e is React.MouseEvent {\n  return 'clientX' && 'clientY' in e;\n}\n","import { RefObject, useEffect, useState } from 'react';\n\nexport function useResizeObserver(element: RefObject<HTMLElement>) {\n  const [dimensions, setDimensions] = useState<DOMRect>();\n\n  useEffect(() => {\n    if (!element.current) return;\n\n    const target = element.current;\n\n    const observer = new ResizeObserver(() =>\n      setDimensions(target.getBoundingClientRect()),\n    );\n\n    observer.observe(target);\n    return () => {\n      observer.unobserve(target);\n    };\n  }, [element]);\n\n  return dimensions;\n}\n","import { useEffect, useState } from 'react';\nimport type { RefObject } from 'react';\n\nexport function useHover<T extends HTMLElement>({\n  element,\n  enabled,\n}: {\n  element: RefObject<T>;\n  enabled: boolean;\n}) {\n  const [hovered, setHovered] = useState(false);\n\n  const target = element?.current;\n\n  useEffect(() => {\n    if (!(target && target.addEventListener)) return;\n\n    if (enabled) {\n      const onMouseOver = () => setHovered(true);\n      const onMouseOut = () => setHovered(false);\n\n      target.addEventListener('mouseover', onMouseOver);\n      target.addEventListener('mouseout', onMouseOut);\n\n      return () => {\n        target.removeEventListener('mouseover', onMouseOver);\n        target.removeEventListener('mouseout', onMouseOut);\n      };\n    }\n  }, [target, enabled]);\n\n  return hovered;\n}\n","import { useEffect } from 'react';\nimport type { RefObject } from 'react';\n\nexport function useKeyboard<T extends HTMLElement>({\n  element,\n  enabled,\n  goForward,\n  goBack,\n}: {\n  element: RefObject<T>;\n  enabled: boolean;\n  goForward: () => void;\n  goBack: () => void;\n}) {\n  const target = element?.current;\n\n  useEffect(() => {\n    if (target && enabled) {\n      const onKeyDown = (e: KeyboardEvent) => {\n        if (e.key === 'ArrowLeft') {\n          goBack();\n        } else if (e.key === 'ArrowRight') {\n          goForward();\n        }\n      };\n      target.addEventListener('keydown', onKeyDown);\n      return () => target.removeEventListener('keydown', onKeyDown);\n    }\n  }, [enabled, goBack, goForward, target]);\n}\n","import { useEffect, useState } from 'react';\n\nimport { isBrowser } from '../utils';\n\nconst QUERY = '(prefers-reduced-motion: no-preference)';\nconst getInitialState = () =>\n  isBrowser() ? !window.matchMedia(QUERY).matches : true;\n\nexport function useReducedMotion({ enabled }: { enabled: boolean }) {\n  const [reduceMotion, setReducedMotion] = useState(getInitialState);\n\n  useEffect(() => {\n    if (!(isBrowser() && enabled)) return;\n\n    const mediaQueryList = window.matchMedia(QUERY);\n\n    const listener = (event: MediaQueryListEvent) => {\n      setReducedMotion(!event.matches);\n    };\n\n    mediaQueryList.addEventListener('change', listener);\n\n    return () => {\n      mediaQueryList.removeEventListener('change', listener);\n    };\n  }, [enabled]);\n  return reduceMotion;\n}\n","import { useCarousel } from '../hooks/use-carousel';\nimport { cls } from '../utils';\n\nexport function NavButtons() {\n  const { currentPage, totalPages, wrapMode, goBack, goForward } =\n    useCarousel();\n\n  const allowWrap = wrapMode !== 'nowrap';\n\n  const enablePrevNavButton = allowWrap || currentPage > 0;\n  const enableNextNavButton = allowWrap || currentPage < totalPages - 1;\n\n  const prevNavClassName = cls(\n    'nuka-nav-button',\n    'nuka-nav-button-prev',\n    enablePrevNavButton && 'nuka-nav-button-enabled',\n  );\n\n  const nextNavClassName = cls(\n    'nuka-nav-button',\n    'nuka-nav-button-next',\n    enableNextNavButton && 'nuka-nav-button-enabled',\n  );\n\n  return (\n    <>\n      <div className={prevNavClassName} onClick={goBack}>\n        <svg\n          xmlns=\"http://www.w3.org/2000/svg\"\n          viewBox=\"0 0 20 20\"\n          fill=\"currentcolor\"\n        >\n          <path\n            fillRule=\"evenodd\"\n            d=\"M11.78 5.22a.75.75 0 0 1 0 1.06L8.06 10l3.72 3.72a.75.75 0 1 1-1.06 1.06l-4.25-4.25a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0Z\"\n            clipRule=\"evenodd\"\n          />\n        </svg>\n      </div>\n      <div className={nextNavClassName} onClick={goForward}>\n        <svg\n          xmlns=\"http://www.w3.org/2000/svg\"\n          viewBox=\"0 0 20 20\"\n          fill=\"currentcolor\"\n        >\n          <path\n            fillRule=\"evenodd\"\n            d=\"M8.22 5.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.75.75 0 0 1-1.06-1.06L11.94 10 8.22 6.28a.75.75 0 0 1 0-1.06Z\"\n            clipRule=\"evenodd\"\n          />\n        </svg>\n      </div>\n    </>\n  );\n}\n","import { useCarousel } from '../hooks/use-carousel';\nimport { cls } from '../utils';\n\nexport const PageIndicators = () => {\n  const { totalPages, currentPage, goToPage } = useCarousel();\n\n  const className = (index: number) =>\n    cls(\n      'nuka-page-indicator',\n      currentPage === index ? 'nuka-page-indicator-active' : '',\n    );\n\n  return (\n    <div className=\"nuka-page-container\" data-testid=\"pageIndicatorContainer\">\n      {[...Array(totalPages)].map((_, index) => (\n        <button\n          key={index}\n          onClick={() => goToPage(index)}\n          className={className(index)}\n        >\n          <span className=\"nuka-hidden\">{index + 1}</span>\n        </button>\n      ))}\n    </div>\n  );\n};\n","\n          export default function styleInject(css, { insertAt } = {}) {\n            if (!css || typeof document === 'undefined') return\n          \n            const head = document.head || document.getElementsByTagName('head')[0]\n            const style = document.createElement('style')\n            style.type = 'text/css'\n          \n            if (insertAt === 'top') {\n              if (head.firstChild) {\n                head.insertBefore(style, head.firstChild)\n              } else {\n                head.appendChild(style)\n              }\n            } else {\n              head.appendChild(style)\n            }\n          \n            if (style.styleSheet) {\n              style.styleSheet.cssText = css\n            } else {\n              style.appendChild(document.createTextNode(css))\n            }\n          }\n          ","import styleInject from '#style-inject';styleInject(\".nuka-hidden {\\n  position: absolute;\\n  width: 1px;\\n  height: 1px;\\n  padding: 0;\\n  margin: -1px;\\n  overflow: hidden;\\n  clip: rect(0, 0, 0, 0);\\n  white-space: nowrap;\\n  border-width: 0;\\n}\\n.nuka-container {\\n  position: relative;\\n}\\n.nuka-slide-container {\\n  position: relative;\\n}\\n.nuka-overflow {\\n  overflow: scroll;\\n  -ms-overflow-style: none;\\n  scrollbar-width: none;\\n}\\n.nuka-overflow.scroll-smooth {\\n  scroll-behavior: smooth;\\n}\\n.nuka-overflow.scroll-auto {\\n  scroll-behavior: auto;\\n}\\n.nuka-overflow::-webkit-scrollbar {\\n  display: none;\\n}\\n.nuka-wrapper {\\n  display: flex;\\n}\\n.nuka-nav-button {\\n  position: absolute;\\n  top: calc(50% - 2rem);\\n  margin: 1rem;\\n  display: none;\\n  height: 2rem;\\n  width: 2rem;\\n  cursor: pointer;\\n  background-color: rgba(146, 148, 151, 0.5);\\n  color: white;\\n  border-radius: 9999px;\\n  font-size: 1rem;\\n  user-select: none;\\n}\\n.nuka-nav-button.nuka-nav-button-prev {\\n  left: 0;\\n  margin-right: 1rem;\\n}\\n.nuka-nav-button.nuka-nav-button-next {\\n  right: 0;\\n  margin-left: 1rem;\\n}\\n.nuka-nav-button:hover {\\n  background-color: rgba(146, 148, 151, 0.65);\\n}\\n.nuka-nav-button-enabled {\\n  display: block;\\n}\\n.nuka-container-auto-hide .nuka-nav-button {\\n  display: none;\\n}\\n.nuka-container-auto-hide:hover .nuka-nav-button-enabled {\\n  display: block;\\n}\\n.nuka-page-container {\\n  padding-top: 1rem;\\n  padding-bottom: 1rem;\\n  display: flex;\\n  gap: 0.5rem;\\n  justify-content: center;\\n  align-items: center;\\n}\\n.nuka-page-indicator {\\n  width: 0.75rem;\\n  height: 0.75rem;\\n  cursor: pointer;\\n  border-radius: 9999px;\\n  border-style: none;\\n  background-color: rgba(146, 148, 151, 0.65);\\n}\\n.nuka-page-indicator.nuka-page-indicator-active,\\n.nuka-page-indicator.nuka-page-indicator-active:hover {\\n  background-color: rgb(229 231 235 / 1);\\n}\\n.nuka-page-indicator:hover {\\n  background-color: rgb(229 231 235 / 1);\\n}\\n\")"]}