react-spring-carousel 3.0.0-beta056 → 3.0.0-beta058
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSpringCarousel.js","sources":["../../src/useSpringCarousel.tsx"],"sourcesContent":["import { config, useSpring } from '@react-spring/web'\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useRef,\n} from 'react'\n\nimport { useEventsModule } from './modules/useEventsModule'\nimport { useDrag } from '@use-gesture/react'\nimport { useFullscreenModule } from './modules/useFullscreenModule'\nimport { useThumbsModule } from './modules/useThumbsModule'\nimport ResizeObserver from 'resize-observer-polyfill'\n\nimport {\n SlideActionType,\n SlideMode,\n UseSpringCarouselComplete,\n UseSpringCarouselWithFreeScroll,\n UseSpringCarouselWithThumbs,\n UseSpringCarouselWithNoThumbs,\n UseSpringCarouselWithNoFixedItems,\n UseSpringCarouselWithFixedItems,\n UseSpringFreeScrollReturnType,\n UseSpringReturnType,\n SlideType,\n ItemWithThumb,\n} from './types'\n\ntype ReturnType<T> = T extends true ? UseSpringFreeScrollReturnType : UseSpringReturnType\n\n/**\n * With free scroll\n */\nfunction useSpringCarousel(props: UseSpringCarouselWithFreeScroll): ReturnType<true>\nfunction useSpringCarousel(props: UseSpringCarouselWithThumbs<true>): ReturnType<true>\nfunction useSpringCarousel(props: UseSpringCarouselWithNoThumbs<true>): ReturnType<true>\n/**\n * No free scroll\n */\nfunction useSpringCarousel(props: UseSpringCarouselWithThumbs<false>): ReturnType<false>\nfunction useSpringCarousel(props: UseSpringCarouselWithNoThumbs<false>): ReturnType<false>\nfunction useSpringCarousel(\n props: UseSpringCarouselWithFixedItems<false>,\n): ReturnType<false>\nfunction useSpringCarousel(\n props: UseSpringCarouselWithNoFixedItems<false>,\n): ReturnType<false>\n\nfunction useSpringCarousel({\n items,\n init = true,\n withThumbs,\n thumbsSlideAxis = 'x',\n itemsPerSlide: _itemsPerSlide = 1,\n slideType = 'fixed',\n gutter = 0,\n withLoop = false,\n startEndGutter = 0,\n carouselSlideAxis = 'x',\n disableGestures = false,\n draggingSlideTreshold: _draggingSlideTreshold,\n slideWhenThresholdIsReached = false,\n freeScroll,\n enableFreeScrollDrag,\n initialStartingPosition,\n prepareThumbsData,\n initialActiveItem = 0,\n animateWhenActiveItemChange = true,\n getControllerRef,\n}: UseSpringCarouselComplete): ReturnType<typeof freeScroll> {\n const itemsPerSlide = _itemsPerSlide > items.length ? items.length : _itemsPerSlide\n\n const resizeByPropChange = useRef(false)\n const draggingSlideTreshold = useRef(_draggingSlideTreshold ?? 0)\n const slideActionType = useRef<SlideActionType>('initial')\n const slideModeType = useRef<SlideMode>('initial')\n\n /**\n * After the user hits start/end edges of the carousel,\n * we check where the user is going. This is useful\n * to correctly resize the carousel when the carousel is going\n * backward after reaching the last item in fluid slide mode\n */\n const directionAfterReachingEdges = useRef<'forward' | 'backward' | 'initial'>(\n 'initial',\n )\n\n const activeItem = useRef(initialActiveItem)\n const firstItemReached = useRef(initialActiveItem === 0)\n const lastItemReached = useRef(\n slideType === 'fixed' && initialActiveItem === items.length - 1,\n )\n const mainCarouselWrapperRef = useRef<HTMLDivElement | null>(null)\n const carouselTrackWrapperRef = useRef<HTMLDivElement | null>(null)\n\n const isFirstMount = useRef(true)\n\n const prevTotalScrollValue = useRef(0)\n const prevWindowWidth = useRef(0)\n const prevSlidedValue = useRef(0)\n const prevWithLoop = useRef(withLoop)\n const prevSlideType = useRef(slideType)\n const prevFreeScroll = useRef(freeScroll)\n const windowIsHidden = useRef(false)\n\n const getItems = useCallback(() => {\n if (withLoop) {\n return [\n ...items.map(i => ({\n ...i,\n id: `prev-repeated-item-${i.id}`,\n })),\n ...items,\n ...items.map(i => ({\n ...i,\n id: `next-repeated-item-${i.id}`,\n })),\n ]\n }\n return [...items]\n }, [items, withLoop])\n const internalItems = getItems()\n\n const [spring, setSpring] = useSpring(\n () => ({\n val: 0,\n pause: !init,\n onChange: ({ value }) => {\n if (freeScroll && mainCarouselWrapperRef.current) {\n if (carouselSlideAxis === 'x') {\n mainCarouselWrapperRef.current.scrollLeft = Math.abs(value.val)\n } else {\n mainCarouselWrapperRef.current.scrollTop = Math.abs(value.val)\n }\n setStartEndItemReachedOnFreeScroll()\n } else if (carouselTrackWrapperRef.current) {\n if (carouselSlideAxis === 'x') {\n carouselTrackWrapperRef.current.style.transform = `translate3d(${value.val}px, 0px,0px)`\n } else {\n carouselTrackWrapperRef.current.style.transform = `translate3d(0px,${value.val}px,0px)`\n }\n }\n },\n }),\n [freeScroll],\n )\n const { emitEvent, useListenToCustomEvent } = useEventsModule<'use-spring'>()\n const { thumbsFragment, handleScroll } = useThumbsModule<'use-spring'>({\n withThumbs: !!withThumbs,\n thumbsSlideAxis,\n prepareThumbsData,\n items: items as ItemWithThumb<'use-spring'>[],\n renderThumbFnProps: {\n getIsActiveItem,\n getIsPrevItem,\n useListenToCustomEvent,\n getIsNextItem,\n },\n })\n const { enterFullscreen, exitFullscreen, getIsFullscreen } = useFullscreenModule({\n mainCarouselWrapperRef,\n handleResize: () => adjustCarouselWrapperPosition(),\n onFullScreenChange: val => {\n emitEvent({\n eventName: 'onFullscreenChange',\n isFullscreen: val,\n })\n },\n })\n\n function getItemStyles(isLastItem: boolean) {\n if (slideType === 'fixed' && !freeScroll) {\n return {\n marginRight: `${isLastItem ? 0 : gutter}px`,\n flex: `1 0 calc(100% / ${itemsPerSlide} - ${\n (gutter * (itemsPerSlide - 1)) / itemsPerSlide\n }px)`,\n }\n }\n return {\n ...{ marginRight: `${isLastItem ? 0 : gutter}px` },\n }\n }\n\n function getSlideValue() {\n const carouselItem = mainCarouselWrapperRef.current?.querySelector(\n '.use-spring-carousel-item',\n )\n\n if (!carouselItem) {\n throw Error('No carousel items available!')\n }\n\n return (\n carouselItem.getBoundingClientRect()[\n carouselSlideAxis === 'x' ? 'width' : 'height'\n ] + gutter\n )\n }\n\n type SlideToItem = {\n from: number\n to: number\n nextActiveItem?: number\n immediate?: boolean\n slideMode: SlideMode\n }\n\n function slideToItem({\n from,\n to,\n nextActiveItem,\n immediate = false,\n slideMode,\n }: SlideToItem) {\n slideModeType.current = slideMode\n\n if (typeof nextActiveItem === 'number') {\n if (!freeScroll) {\n activeItem.current = nextActiveItem\n }\n emitEvent({\n eventName: 'onSlideStartChange',\n slideActionType: slideActionType.current,\n slideMode: slideModeType.current,\n nextItem: {\n startReached: firstItemReached.current,\n endReached: lastItemReached.current,\n index: freeScroll ? -1 : activeItem.current,\n id: freeScroll ? '' : items[activeItem.current].id,\n },\n })\n }\n\n prevSlidedValue.current = to\n setSpring.start({\n immediate,\n from: {\n val: from,\n },\n to: {\n val: to,\n },\n config: {\n ...config.default,\n velocity: spring.val.velocity,\n },\n onRest(value) {\n if (!immediate && value.finished) {\n emitEvent({\n eventName: 'onSlideChange',\n slideActionType: slideActionType.current,\n slideMode: slideModeType.current,\n currentItem: {\n startReached: firstItemReached.current,\n endReached: lastItemReached.current,\n index: freeScroll ? -1 : activeItem.current,\n id: freeScroll ? '' : items[activeItem.current].id,\n },\n })\n }\n },\n })\n if (withThumbs && !immediate) {\n handleScroll(activeItem.current)\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n function getTotalScrollValue() {\n if (withLoop) {\n return getSlideValue() * items.length\n }\n return Math.round(\n Number(\n carouselTrackWrapperRef.current?.[\n carouselSlideAxis === 'x' ? 'scrollWidth' : 'scrollHeight'\n ],\n ) -\n carouselTrackWrapperRef.current!.getBoundingClientRect()[\n carouselSlideAxis === 'x' ? 'width' : 'height'\n ] -\n startEndGutter * 2,\n )\n }\n function getAnimatedWrapperStyles() {\n const percentValue = `calc(100% - ${startEndGutter * 2}px)`\n return {\n width: carouselSlideAxis === 'x' ? percentValue : '100%',\n height: carouselSlideAxis === 'y' ? percentValue : '100%',\n }\n }\n\n function getCarouselItemWidth() {\n const carouselItem = carouselTrackWrapperRef.current?.querySelector(\n '.use-spring-carousel-item',\n )\n if (!carouselItem) {\n throw Error('No carousel items available!')\n }\n return (\n carouselItem.getBoundingClientRect()[\n carouselSlideAxis === 'x' ? 'width' : 'height'\n ] + gutter\n )\n }\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n function adjustCarouselWrapperPosition() {\n const positionProperty = carouselSlideAxis === 'x' ? 'left' : 'top'\n\n function setPosition(v: number) {\n const ref = carouselTrackWrapperRef.current\n if (!ref) return\n\n if (withLoop) {\n ref.style.top = '0px'\n ref.style.left = '0px'\n ref.style[positionProperty] = `-${v - startEndGutter}px`\n\n firstItemReached.current = false\n lastItemReached.current = false\n } else {\n ref.style.left = '0px'\n ref.style.top = '0px'\n }\n }\n\n if (slideType === 'fixed' && withLoop) {\n if (initialStartingPosition === 'center') {\n setPosition(\n getCarouselItemWidth() * items.length -\n getSlideValue() * Math.round((itemsPerSlide - 1) / 2),\n )\n } else if (initialStartingPosition === 'end') {\n setPosition(\n getCarouselItemWidth() * items.length -\n getSlideValue() * Math.round(itemsPerSlide - 1),\n )\n } else {\n setPosition(getCarouselItemWidth() * items.length)\n }\n }\n\n if (slideType === 'fluid') {\n /**\n * User reached the last item and now is resizing the container that becomes smaller/bigger.\n * Example: on mobile devices the user rotates the device\n */\n if (\n lastItemReached.current &&\n getTotalScrollValue() !== Math.abs(prevSlidedValue.current) &&\n !withLoop\n ) {\n const newVal = -getTotalScrollValue()\n prevSlidedValue.current = newVal\n setSpring.start({\n immediate: true,\n val: prevSlidedValue.current,\n })\n return\n }\n\n if (\n Math.abs(prevSlidedValue.current) > 0 &&\n getTotalScrollValue() !== Math.abs(prevSlidedValue.current) &&\n !withLoop &&\n !freeScroll &&\n directionAfterReachingEdges.current === 'backward'\n ) {\n const diff = prevTotalScrollValue.current - getTotalScrollValue()\n const next = prevSlidedValue.current + diff\n\n setSpring.start({\n immediate: true,\n val: next,\n })\n\n return () => {\n prevSlidedValue.current = next\n }\n }\n\n return\n }\n\n if (!freeScroll && slideType === 'fixed') {\n const nextValue = -(getSlideValue() * activeItem.current)\n\n /**\n * Here we make sure to always show the latest item as the\n * latest item visible in the carousel viewport.\n */\n if (Math.abs(nextValue) > getTotalScrollValue() && !withLoop) {\n const val = -getTotalScrollValue()\n lastItemReached.current = true\n prevSlidedValue.current = val\n setSpring.start({\n immediate: true,\n val: prevSlidedValue.current,\n })\n } else {\n prevSlidedValue.current = nextValue\n setSpring.start({\n immediate: true,\n val: nextValue,\n })\n }\n\n setTimeout(() => {\n resizeByPropChange.current = false\n }, 0)\n }\n }\n function getFromValue() {\n if (freeScroll && mainCarouselWrapperRef.current) {\n return mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ]\n }\n return spring.val.get()\n }\n function getToValue(type: 'next' | 'prev', index?: number) {\n if (freeScroll && type === 'next') {\n const next = prevSlidedValue.current + getSlideValue()\n if (next > getTotalScrollValue()) {\n return getTotalScrollValue()\n }\n return next\n }\n\n if (freeScroll && type === 'prev') {\n const next = prevSlidedValue.current - getSlideValue()\n if (next < 0) {\n return 0\n }\n return next\n }\n\n if (type === 'next') {\n if (typeof index === 'number') {\n return -(index * getSlideValue())\n }\n return prevSlidedValue.current - getSlideValue()\n }\n\n if (typeof index === 'number') {\n return -(index * getSlideValue())\n }\n return prevSlidedValue.current + getSlideValue()\n }\n\n type SlideToPrevNextItem = {\n type: SlideMode\n index?: number\n immediate?: boolean\n }\n function slideToPrevItem({ type, index, immediate }: SlideToPrevNextItem) {\n if (!init || windowIsHidden.current || (firstItemReached.current && !withLoop)) return\n\n if (lastItemReached.current) {\n directionAfterReachingEdges.current = 'backward'\n }\n\n slideActionType.current = 'prev'\n lastItemReached.current = false\n\n const nextItem = typeof index === 'number' ? index : activeItem.current - 1\n\n if (!withLoop) {\n const nextItemWillExceed = freeScroll\n ? getToValue('prev', index) - getSlideValue() / 3 < 0\n : getToValue('prev', index) + getSlideValue() / 3 > 0\n\n if (firstItemReached.current) return\n if (nextItemWillExceed) {\n firstItemReached.current = true\n lastItemReached.current = false\n\n slideToItem({\n slideMode: type,\n from: getFromValue(),\n to: 0,\n nextActiveItem: 0,\n immediate,\n })\n return\n }\n }\n if (withLoop && (firstItemReached.current || nextItem < 0)) {\n firstItemReached.current = false\n lastItemReached.current = true\n slideToItem({\n slideMode: type,\n from: getFromValue() - getSlideValue() * items.length,\n to: -(getSlideValue() * items.length) + getSlideValue(),\n nextActiveItem: items.length - 1,\n immediate,\n })\n return\n }\n if (nextItem === 0) {\n firstItemReached.current = true\n }\n if (nextItem === items.length - 1 || nextItem === -1) {\n lastItemReached.current = true\n }\n slideToItem({\n slideMode: type,\n from: getFromValue(),\n to: getToValue('prev', index),\n nextActiveItem: nextItem,\n immediate,\n })\n }\n function slideToNextItem({ type, index, immediate }: SlideToPrevNextItem) {\n if (!init || windowIsHidden.current || (lastItemReached.current && !withLoop)) return\n\n if (firstItemReached.current) {\n directionAfterReachingEdges.current = 'forward'\n }\n\n slideActionType.current = 'next'\n firstItemReached.current = false\n\n const nextItem = index || activeItem.current + 1\n\n if (!withLoop) {\n const nextItemWillExceed =\n Math.abs(getToValue('next', index)) > getTotalScrollValue() - getSlideValue() / 3\n\n if (lastItemReached.current) return\n if (nextItemWillExceed) {\n firstItemReached.current = false\n lastItemReached.current = true\n\n slideToItem({\n slideMode: type,\n from: getFromValue(),\n to: freeScroll ? getTotalScrollValue() : -getTotalScrollValue(),\n nextActiveItem: nextItem,\n immediate,\n })\n return\n }\n }\n if (withLoop && (lastItemReached.current || nextItem > items.length - 1)) {\n lastItemReached.current = false\n firstItemReached.current = true\n slideToItem({\n slideMode: type,\n from: getFromValue() + getSlideValue() * items.length,\n to: 0,\n nextActiveItem: 0,\n immediate,\n })\n return\n }\n if (nextItem === 0) {\n firstItemReached.current = true\n }\n if (nextItem === items.length - 1) {\n lastItemReached.current = true\n }\n slideToItem({\n slideMode: type,\n from: getFromValue(),\n to: getToValue('next', index),\n nextActiveItem: nextItem,\n immediate,\n })\n }\n function getDraggingSliderTreshold() {\n if (_draggingSlideTreshold) {\n draggingSlideTreshold.current = _draggingSlideTreshold\n } else {\n draggingSlideTreshold.current = Math.floor(getSlideValue() / 2 / 2)\n }\n return draggingSlideTreshold.current\n }\n\n useEffect(() => {\n if (activeItem.current !== initialActiveItem) {\n internalSlideToItem({\n id: initialActiveItem,\n immediate: !animateWhenActiveItemChange,\n })\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialActiveItem])\n useEffect(() => {\n if (init) {\n if (initialActiveItem > items.length - 1) {\n throw new Error(\n `initialActiveItem (${initialActiveItem}) is greater than the total quantity available items (${items.length}).`,\n )\n }\n if (itemsPerSlide > items.length) {\n console.warn(\n `itemsPerSlide (${itemsPerSlide}) is greater than the total quantity available items (${items.length}). Fallback to ${items.length})`,\n )\n }\n }\n }, [initialActiveItem, items, itemsPerSlide, init])\n useEffect(() => {\n prevWindowWidth.current = window.innerWidth\n }, [])\n useEffect(() => {\n prevTotalScrollValue.current = getTotalScrollValue()\n if (!isFirstMount.current) {\n resizeByPropChange.current = true\n adjustCarouselWrapperPosition()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n initialStartingPosition,\n itemsPerSlide,\n startEndGutter,\n gutter,\n init,\n getTotalScrollValue,\n ])\n useEffect(() => {\n /**\n * When these props change we reset the carousel\n */\n if (\n withLoop !== prevWithLoop.current ||\n slideType !== prevSlideType.current ||\n freeScroll !== prevFreeScroll.current\n ) {\n prevWithLoop.current = withLoop\n prevSlideType.current = slideType\n prevFreeScroll.current = freeScroll\n\n if (carouselTrackWrapperRef.current) {\n carouselTrackWrapperRef.current.style.transform = `translate3d(0px, 0px,0px)`\n setSpring.start({\n val: 0,\n immediate: true,\n })\n }\n\n internalSlideToItem({ id: 0, immediate: true, shouldReset: true })\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [withLoop, slideType, freeScroll])\n useLayoutEffect(() => {\n /**\n * Set initial track position\n */\n if (carouselTrackWrapperRef.current) {\n adjustCarouselWrapperPosition()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n useEffect(() => {\n /**\n * When itemsPerSlide change we need to update the draggingSlideTreshold.current,\n * since it's default value is based on the calculation of the\n * width of a single item\n */\n getDraggingSliderTreshold()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [_draggingSlideTreshold, itemsPerSlide, slideType])\n useEffect(() => {\n if (mainCarouselWrapperRef.current) {\n let timer: NodeJS.Timeout\n const observer = new ResizeObserver(() => {\n if (isFirstMount.current) {\n isFirstMount.current = false\n return\n }\n\n if (windowIsHidden.current) return\n if (!resizeByPropChange.current) {\n prevWindowWidth.current = window.innerWidth\n const cb = adjustCarouselWrapperPosition()\n window.clearTimeout(timer)\n\n timer = setTimeout(() => {\n prevTotalScrollValue.current = getTotalScrollValue()\n if (typeof cb === 'function') {\n cb()\n }\n }, 100)\n }\n })\n observer.observe(mainCarouselWrapperRef.current)\n return () => {\n observer.disconnect()\n }\n }\n }, [adjustCarouselWrapperPosition, getTotalScrollValue])\n useEffect(() => {\n if (!init) return\n function handleVisibilityChange() {\n if (document.hidden) {\n windowIsHidden.current = true\n } else {\n windowIsHidden.current = false\n }\n }\n document.addEventListener('visibilitychange', handleVisibilityChange)\n return () => {\n document.removeEventListener('visibilitychange', handleVisibilityChange)\n }\n }, [init])\n\n const bindDrag = useDrag(\n state => {\n const isDragging = state.dragging\n const movement = state.offset[carouselSlideAxis === 'x' ? 0 : 1]\n const currentMovement = state.movement[carouselSlideAxis === 'x' ? 0 : 1]\n const direction = state.direction[carouselSlideAxis === 'x' ? 0 : 1]\n\n const prevItemTreshold = currentMovement > getDraggingSliderTreshold()\n const nextItemTreshold = currentMovement < -getDraggingSliderTreshold()\n const tot = getTotalScrollValue()\n\n if (isDragging) {\n if (direction > 0) {\n slideActionType.current = 'prev'\n } else {\n slideActionType.current = 'next'\n }\n\n emitEvent({\n ...state,\n eventName: 'onDrag',\n slideActionType: slideActionType.current,\n })\n\n if (freeScroll) {\n if (movement > 0) {\n setSpring.start({\n from: {\n val: getFromValue(),\n },\n to: {\n val: 0,\n },\n config: {\n velocity: state.velocity,\n friction: 50,\n tension: 1000,\n },\n })\n state.cancel()\n return\n }\n\n setSpring.start({\n from: {\n val: getFromValue(),\n },\n to: {\n val: -movement,\n },\n config: {\n velocity: state.velocity,\n friction: 50,\n tension: 1000,\n },\n })\n return\n }\n\n setSpring.start({\n val: movement,\n config: {\n velocity: state.velocity,\n friction: 50,\n tension: 1000,\n },\n })\n\n if (slideWhenThresholdIsReached && nextItemTreshold) {\n slideToNextItem({ type: 'drag' })\n state.cancel()\n } else if (slideWhenThresholdIsReached && prevItemTreshold) {\n slideToPrevItem({ type: 'drag' })\n state.cancel()\n }\n\n const res = tot - Math.abs(movement)\n\n if (res < -(getSlideValue() * 2)) {\n state.cancel()\n }\n\n return\n }\n\n if (state.last && freeScroll && movement > 0) {\n setSpring.start({\n from: {\n val: getFromValue(),\n },\n to: {\n val: 0,\n },\n config: {\n velocity: state.velocity,\n friction: 50,\n tension: 1000,\n },\n })\n return\n }\n if (state.last && !state.canceled && freeScroll) {\n if (slideActionType.current === 'prev') {\n slideToPrevItem({ type: 'drag' })\n }\n if (slideActionType.current === 'next') {\n slideToNextItem({ type: 'drag' })\n }\n }\n\n if (state.last && !state.canceled && !freeScroll) {\n if (nextItemTreshold) {\n if (!withLoop && lastItemReached.current) {\n setSpring.start({\n val: -getTotalScrollValue(),\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n } else {\n slideToNextItem({ type: 'drag' })\n }\n } else if (prevItemTreshold) {\n if (!withLoop && firstItemReached.current) {\n setSpring.start({\n val: 0,\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n } else {\n slideToPrevItem({ type: 'drag' })\n }\n } else {\n setSpring.start({\n val: prevSlidedValue.current,\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n }\n }\n if (state.last && state.canceled) {\n setSpring.start({\n val: prevSlidedValue.current,\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n }\n },\n {\n enabled:\n (init && !disableGestures && !freeScroll) ||\n (!!freeScroll && !!enableFreeScrollDrag),\n axis: carouselSlideAxis,\n from: () => {\n if (freeScroll && mainCarouselWrapperRef.current) {\n return [\n -mainCarouselWrapperRef.current.scrollLeft,\n -mainCarouselWrapperRef.current.scrollTop,\n ]\n }\n if (carouselSlideAxis === 'x') {\n return [spring.val.get(), spring.val.get()]\n }\n return [spring.val.get(), spring.val.get()]\n },\n },\n )\n\n function getWrapperOverflowStyles() {\n if (freeScroll) {\n if (carouselSlideAxis === 'x') {\n return {\n overflowX: 'auto',\n }\n }\n return {\n overflowY: 'auto',\n }\n }\n return {}\n }\n\n function setStartEndItemReachedOnFreeScroll() {\n if (mainCarouselWrapperRef.current) {\n prevSlidedValue.current =\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ]\n if (\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] === 0\n ) {\n firstItemReached.current = true\n lastItemReached.current = false\n }\n if (\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] > 0 &&\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] < getTotalScrollValue()\n ) {\n firstItemReached.current = false\n lastItemReached.current = false\n }\n\n if (\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] === getTotalScrollValue()\n ) {\n firstItemReached.current = false\n lastItemReached.current = true\n }\n }\n }\n function getScrollHandlers() {\n if (freeScroll) {\n return {\n onWheel() {\n spring.val.stop()\n setStartEndItemReachedOnFreeScroll()\n },\n }\n }\n return {}\n }\n\n function findItemIndex(id: string | number, error?: string) {\n let itemIndex = 0\n\n if (typeof id === 'string') {\n itemIndex = items.findIndex(item => item.id === id)\n } else {\n itemIndex = id\n }\n if (itemIndex < 0 || itemIndex >= items.length) {\n if (error) {\n throw new Error(error)\n }\n console.error(\n `The item doesn't exist; check that the id provided - ${id} - is correct.`,\n )\n itemIndex = -1\n }\n\n return itemIndex\n }\n type InternalSlideToItem = {\n id: string | number\n immediate?: boolean\n shouldReset?: boolean\n type?: SlideType\n }\n function internalSlideToItem({\n id,\n immediate,\n shouldReset,\n type,\n }: InternalSlideToItem) {\n if (!init || windowIsHidden.current) return\n\n firstItemReached.current = false\n lastItemReached.current = false\n\n const itemIndex = findItemIndex(\n id,\n \"The item you want to slide to doesn't exist; check the provided id.\",\n )\n\n if (itemIndex === activeItem.current && !shouldReset) {\n return\n }\n\n const currentItem = findItemIndex(items[activeItem.current].id)\n const newActiveItem = findItemIndex(items[itemIndex].id)\n\n if (newActiveItem > currentItem) {\n slideToNextItem({\n type: type || shouldReset ? 'initial' : 'click',\n index: newActiveItem,\n immediate,\n })\n } else {\n slideToPrevItem({\n type: type || shouldReset ? 'initial' : 'click',\n index: newActiveItem,\n immediate,\n })\n }\n }\n function getIsNextItem(id: string | number) {\n const itemIndex = findItemIndex(id, \"The item doesn't exist; check the provided id.\")\n const _activeItem = activeItem.current\n if (withLoop && _activeItem === items.length - 1) {\n return itemIndex === 0\n }\n return itemIndex === _activeItem + 1\n }\n function getIsPrevItem(id: string | number) {\n const itemIndex = findItemIndex(id, \"The item doesn't exist; check the provided id.\")\n const _activeItem = activeItem.current\n if (withLoop && _activeItem === 0) {\n return itemIndex === items.length - 1\n }\n return itemIndex === _activeItem - 1\n }\n function getIsActiveItem(id: string | number) {\n return (\n findItemIndex(\n id,\n \"The item you want to check doesn't exist; check the provided id.\",\n ) === activeItem.current\n )\n }\n\n const res = freeScroll\n ? {\n useListenToCustomEvent,\n enterFullscreen,\n exitFullscreen,\n getIsFullscreen,\n slideToPrevItem: (animate = true) => {\n slideToPrevItem({\n type: 'click',\n immediate: !animate,\n })\n },\n slideToNextItem: (animate = true) => {\n slideToNextItem({\n type: 'click',\n immediate: !animate,\n })\n },\n }\n : {\n useListenToCustomEvent,\n enterFullscreen,\n exitFullscreen,\n getIsFullscreen,\n slideToPrevItem: (animate = true) => {\n slideToPrevItem({\n type: 'click',\n immediate: !animate,\n })\n },\n slideToNextItem: (animate = true) => {\n slideToNextItem({\n type: 'click',\n immediate: !animate,\n })\n },\n slideToItem: (id: string | number, animate = true) => {\n internalSlideToItem({ id, immediate: !animate })\n },\n getIsNextItem,\n getIsPrevItem,\n getIsActiveItem,\n }\n\n useEffect(() => {\n if (getControllerRef) {\n getControllerRef({\n slideToNextItem: res.slideToNextItem,\n slideToPrevItem: res.slideToPrevItem,\n slideToItem: res?.slideToItem,\n })\n }\n }, [getControllerRef, res.slideToItem, res.slideToNextItem, res.slideToPrevItem])\n\n const _thumbsFragment = (\n <Context.Provider value={res}>{thumbsFragment}</Context.Provider>\n )\n const carouselFragment = (\n <Context.Provider value={res}>\n <div\n className=\"use-spring-carousel-main-wrapper\"\n ref={mainCarouselWrapperRef}\n {...getScrollHandlers()}\n style={{\n display: 'flex',\n position: 'relative',\n width: '100%',\n height: '100%',\n ...(getWrapperOverflowStyles() as React.CSSProperties),\n }}\n >\n <div\n className=\"use-spring-carousel-track-wrapper\"\n ref={carouselTrackWrapperRef}\n {...bindDrag()}\n style={{\n position: 'relative',\n display: 'flex',\n flexDirection: carouselSlideAxis === 'x' ? 'row' : 'column',\n touchAction: 'none',\n ...getAnimatedWrapperStyles(),\n }}\n >\n {(freeScroll || !withLoop) && startEndGutter ? (\n <div\n style={{\n flexShrink: 0,\n width: startEndGutter,\n }}\n />\n ) : null}\n {internalItems.map((item, index) => {\n return (\n <div\n key={`${item.id}-${index}`}\n className=\"use-spring-carousel-item\"\n data-testid=\"use-spring-carousel-item-wrapper\"\n style={{\n display: 'flex',\n position: 'relative',\n flex: '1',\n ...getItemStyles(!!freeScroll && index === items.length - 1),\n }}\n >\n {typeof item.renderItem === 'function'\n ? item.renderItem({\n getIsActiveItem,\n getIsNextItem,\n getIsPrevItem,\n useListenToCustomEvent,\n })\n : item.renderItem}\n </div>\n )\n })}\n {(freeScroll || !withLoop) && startEndGutter ? (\n <div\n style={{\n flexShrink: 0,\n width: '1px',\n }}\n />\n ) : null}\n </div>\n </div>\n </Context.Provider>\n )\n\n return { ...res, carouselFragment, thumbsFragment: _thumbsFragment }\n}\n\ntype ContextProps<T = undefined> = Omit<\n ReturnType<T extends 'free-scroll' ? true : false>,\n 'carouselFragment' | 'thumbsFragment'\n>\n\nconst Context = createContext<ContextProps | ContextProps<'free-scroll'> | undefined>(\n undefined,\n)\n\nfunction useSpringCarouselContext<T>() {\n const context = useContext(Context)\n if (!context) {\n throw new Error('useSpringCarouselContext must be used within the carousel.')\n }\n return context as ContextProps<T>\n}\n\nexport { useSpringCarousel, useSpringCarouselContext }\n"],"names":["useSpringCarousel","items","init","withThumbs","thumbsSlideAxis","itemsPerSlide","_itemsPerSlide","slideType","gutter","withLoop","startEndGutter","carouselSlideAxis","disableGestures","draggingSlideTreshold","_draggingSlideTreshold","slideWhenThresholdIsReached","freeScroll","enableFreeScrollDrag","initialStartingPosition","prepareThumbsData","initialActiveItem","animateWhenActiveItemChange","getControllerRef","length","resizeByPropChange","useRef","slideActionType","slideModeType","directionAfterReachingEdges","activeItem","firstItemReached","lastItemReached","mainCarouselWrapperRef","carouselTrackWrapperRef","isFirstMount","prevTotalScrollValue","prevWindowWidth","prevSlidedValue","prevWithLoop","prevSlideType","prevFreeScroll","windowIsHidden","internalItems","useCallback","map","i","Object","assign","id","getItems","spring","setSpring","useSpring","val","pause","onChange","value","current","scrollLeft","Math","abs","scrollTop","setStartEndItemReachedOnFreeScroll","style","transform","emitEvent","useListenToCustomEvent","useEventsModule","thumbsFragment","handleScroll","useThumbsModule","renderThumbFnProps","getIsActiveItem","getIsPrevItem","getIsNextItem","enterFullscreen","exitFullscreen","getIsFullscreen","useFullscreenModule","handleResize","adjustCarouselWrapperPosition","onFullScreenChange","eventName","isFullscreen","getSlideValue","carouselItem","_a","querySelector","Error","getBoundingClientRect","slideToItem","from","to","nextActiveItem","immediate","slideMode","nextItem","startReached","endReached","index","start","config","default","velocity","onRest","finished","currentItem","getTotalScrollValue","round","Number","getCarouselItemWidth","positionProperty","setPosition","v","ref","top","left","nextValue","setTimeout","newVal","diff","next","getFromValue","get","getToValue","type","slideToPrevItem","nextItemWillExceed","slideToNextItem","getDraggingSliderTreshold","floor","useEffect","internalSlideToItem","console","warn","window","innerWidth","shouldReset","useLayoutEffect","timer","observer","ResizeObserver","cb","clearTimeout","observe","disconnect","document","addEventListener","handleVisibilityChange","removeEventListener","hidden","bindDrag","useDrag","state","isDragging","dragging","movement","offset","currentMovement","direction","prevItemTreshold","nextItemTreshold","tot","friction","tension","cancel","last","canceled","enabled","axis","findItemIndex","error","itemIndex","findIndex","item","newActiveItem","_activeItem","res","animate","_thumbsFragment","_jsx","Context","Provider","children","carouselFragment","className","onWheel","stop","display","position","width","height","overflowX","overflowY","_jsxs","flexDirection","touchAction","percentValue","getAnimatedWrapperStyles","flexShrink","flex","isLastItem","marginRight","renderItem","createContext","undefined","useSpringCarouselContext","context","useContext"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useSpringCarousel.js","sources":["../../src/useSpringCarousel.tsx"],"sourcesContent":["import { config, useSpring } from '@react-spring/web'\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useRef,\n} from 'react'\n\nimport { useEventsModule } from './modules/useEventsModule'\nimport { useDrag } from '@use-gesture/react'\nimport { useFullscreenModule } from './modules/useFullscreenModule'\nimport { useThumbsModule } from './modules/useThumbsModule'\nimport ResizeObserver from 'resize-observer-polyfill'\n\nimport {\n SlideActionType,\n SlideMode,\n UseSpringCarouselComplete,\n UseSpringCarouselWithFreeScroll,\n UseSpringCarouselWithThumbs,\n UseSpringCarouselWithNoThumbs,\n UseSpringCarouselWithNoFixedItems,\n UseSpringCarouselWithFixedItems,\n UseSpringFreeScrollReturnType,\n UseSpringReturnType,\n SlideType,\n ItemWithThumb,\n} from './types'\n\ntype ReturnType<T> = T extends true ? UseSpringFreeScrollReturnType : UseSpringReturnType\n\n/**\n * With free scroll\n */\nfunction useSpringCarousel(props: UseSpringCarouselWithFreeScroll): ReturnType<true>\nfunction useSpringCarousel(props: UseSpringCarouselWithThumbs<true>): ReturnType<true>\nfunction useSpringCarousel(props: UseSpringCarouselWithNoThumbs<true>): ReturnType<true>\n/**\n * No free scroll\n */\nfunction useSpringCarousel(props: UseSpringCarouselWithThumbs<false>): ReturnType<false>\nfunction useSpringCarousel(props: UseSpringCarouselWithNoThumbs<false>): ReturnType<false>\nfunction useSpringCarousel(\n props: UseSpringCarouselWithFixedItems<false>,\n): ReturnType<false>\nfunction useSpringCarousel(\n props: UseSpringCarouselWithNoFixedItems<false>,\n): ReturnType<false>\n\nfunction useSpringCarousel({\n items,\n init = true,\n withThumbs,\n thumbsSlideAxis = 'x',\n itemsPerSlide: _itemsPerSlide = 1,\n slideType = 'fixed',\n gutter = 0,\n withLoop = false,\n startEndGutter = 0,\n carouselSlideAxis = 'x',\n disableGestures = false,\n draggingSlideTreshold: _draggingSlideTreshold,\n slideWhenThresholdIsReached = false,\n freeScroll,\n enableFreeScrollDrag,\n initialStartingPosition,\n prepareThumbsData,\n initialActiveItem = 0,\n animateWhenActiveItemChange = true,\n getControllerRef,\n}: UseSpringCarouselComplete): ReturnType<typeof freeScroll> {\n const itemsPerSlide = _itemsPerSlide > items.length ? items.length : _itemsPerSlide\n\n const resizeByPropChange = useRef(false)\n const draggingSlideTreshold = useRef(_draggingSlideTreshold ?? 0)\n const slideActionType = useRef<SlideActionType>('initial')\n const slideModeType = useRef<SlideMode>('initial')\n\n /**\n * After the user hits start/end edges of the carousel,\n * we check where the user is going. This is useful\n * to correctly resize the carousel when the carousel is going\n * backward after reaching the last item in fluid slide mode\n */\n const directionAfterReachingEdges = useRef<'forward' | 'backward' | 'initial'>(\n 'initial',\n )\n\n const activeItem = useRef(initialActiveItem)\n const firstItemReached = useRef(initialActiveItem === 0)\n const lastItemReached = useRef(\n slideType === 'fixed' && initialActiveItem === items.length - 1,\n )\n const mainCarouselWrapperRef = useRef<HTMLDivElement | null>(null)\n const carouselTrackWrapperRef = useRef<HTMLDivElement | null>(null)\n\n const isFirstMount = useRef(true)\n\n const prevTotalScrollValue = useRef(0)\n const prevWindowWidth = useRef(0)\n const prevSlidedValue = useRef(0)\n const prevWithLoop = useRef(withLoop)\n const prevSlideType = useRef(slideType)\n const prevFreeScroll = useRef(freeScroll)\n const windowIsHidden = useRef(false)\n\n const getItems = useCallback(() => {\n if (withLoop) {\n return [\n ...items.map(i => ({\n ...i,\n id: `prev-repeated-item-${i.id}`,\n })),\n ...items,\n ...items.map(i => ({\n ...i,\n id: `next-repeated-item-${i.id}`,\n })),\n ]\n }\n return [...items]\n }, [items, withLoop])\n const internalItems = getItems()\n\n const [spring, setSpring] = useSpring(\n () => ({\n val: 0,\n pause: !init,\n onChange: ({ value }) => {\n if (freeScroll && mainCarouselWrapperRef.current) {\n if (carouselSlideAxis === 'x') {\n mainCarouselWrapperRef.current.scrollLeft = Math.abs(value.val)\n } else {\n mainCarouselWrapperRef.current.scrollTop = Math.abs(value.val)\n }\n setStartEndItemReachedOnFreeScroll()\n } else if (carouselTrackWrapperRef.current) {\n if (carouselSlideAxis === 'x') {\n carouselTrackWrapperRef.current.style.transform = `translate3d(${value.val}px, 0px,0px)`\n } else {\n carouselTrackWrapperRef.current.style.transform = `translate3d(0px,${value.val}px,0px)`\n }\n }\n },\n }),\n [freeScroll],\n )\n const { emitEvent, useListenToCustomEvent } = useEventsModule<'use-spring'>()\n const { thumbsFragment, handleScroll } = useThumbsModule<'use-spring'>({\n withThumbs: !!withThumbs,\n thumbsSlideAxis,\n prepareThumbsData,\n items: items as ItemWithThumb<'use-spring'>[],\n renderThumbFnProps: {\n getIsActiveItem,\n getIsPrevItem,\n useListenToCustomEvent,\n getIsNextItem,\n },\n })\n const { enterFullscreen, exitFullscreen, getIsFullscreen } = useFullscreenModule({\n mainCarouselWrapperRef,\n handleResize: () => adjustCarouselWrapperPosition(),\n onFullScreenChange: val => {\n emitEvent({\n eventName: 'onFullscreenChange',\n isFullscreen: val,\n })\n },\n })\n\n function getItemStyles(isLastItem: boolean) {\n if (slideType === 'fixed' && !freeScroll) {\n return {\n marginRight: `${isLastItem ? 0 : gutter}px`,\n flex: `1 0 calc(100% / ${itemsPerSlide} - ${\n (gutter * (itemsPerSlide - 1)) / itemsPerSlide\n }px)`,\n }\n }\n return {\n ...{ marginRight: `${isLastItem ? 0 : gutter}px` },\n }\n }\n\n function getSlideValue() {\n const carouselItem = mainCarouselWrapperRef.current?.querySelector(\n '.use-spring-carousel-item',\n )\n\n if (!carouselItem) {\n throw Error('No carousel items available!')\n }\n\n return (\n carouselItem.getBoundingClientRect()[\n carouselSlideAxis === 'x' ? 'width' : 'height'\n ] + gutter\n )\n }\n\n type SlideToItem = {\n from: number\n to: number\n nextActiveItem?: number\n immediate?: boolean\n slideMode: SlideMode\n }\n\n function slideToItem({\n from,\n to,\n nextActiveItem,\n immediate = false,\n slideMode,\n }: SlideToItem) {\n slideModeType.current = slideMode\n\n if (typeof nextActiveItem === 'number') {\n if (!freeScroll) {\n activeItem.current = nextActiveItem\n }\n emitEvent({\n eventName: 'onSlideStartChange',\n slideActionType: slideActionType.current,\n slideMode: slideModeType.current,\n nextItem: {\n startReached: firstItemReached.current,\n endReached: lastItemReached.current,\n index: freeScroll ? -1 : activeItem.current,\n id: freeScroll ? '' : items[activeItem.current].id,\n },\n })\n }\n\n prevSlidedValue.current = to\n setSpring.start({\n immediate,\n from: {\n val: from,\n },\n to: {\n val: to,\n },\n config: {\n ...config.default,\n velocity: spring.val.velocity,\n },\n onRest(value) {\n if (!immediate && value.finished) {\n emitEvent({\n eventName: 'onSlideChange',\n slideActionType: slideActionType.current,\n slideMode: slideModeType.current,\n currentItem: {\n startReached: firstItemReached.current,\n endReached: lastItemReached.current,\n index: freeScroll ? -1 : activeItem.current,\n id: freeScroll ? '' : items[activeItem.current].id,\n },\n })\n }\n },\n })\n if (withThumbs && !immediate) {\n handleScroll(activeItem.current)\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n function getTotalScrollValue() {\n if (withLoop) {\n return getSlideValue() * items.length\n }\n return Math.round(\n Number(\n carouselTrackWrapperRef.current?.[\n carouselSlideAxis === 'x' ? 'scrollWidth' : 'scrollHeight'\n ],\n ) -\n carouselTrackWrapperRef.current!.getBoundingClientRect()[\n carouselSlideAxis === 'x' ? 'width' : 'height'\n ] -\n startEndGutter * 2,\n )\n }\n function getAnimatedWrapperStyles() {\n const percentValue = `calc(100% - ${startEndGutter * 2}px)`\n return {\n width: carouselSlideAxis === 'x' ? percentValue : '100%',\n height: carouselSlideAxis === 'y' ? percentValue : '100%',\n }\n }\n\n function getCarouselItemWidth() {\n const carouselItem = carouselTrackWrapperRef.current?.querySelector(\n '.use-spring-carousel-item',\n )\n if (!carouselItem) {\n throw Error('No carousel items available!')\n }\n return (\n carouselItem.getBoundingClientRect()[\n carouselSlideAxis === 'x' ? 'width' : 'height'\n ] + gutter\n )\n }\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n function adjustCarouselWrapperPosition() {\n const positionProperty = carouselSlideAxis === 'x' ? 'left' : 'top'\n\n function setPosition(v: number) {\n const ref = carouselTrackWrapperRef.current\n if (!ref) return\n\n if (withLoop) {\n ref.style.top = '0px'\n ref.style.left = '0px'\n ref.style[positionProperty] = `-${v - startEndGutter}px`\n\n firstItemReached.current = false\n lastItemReached.current = false\n } else {\n ref.style.left = '0px'\n ref.style.top = '0px'\n }\n }\n\n if (slideType === 'fixed' && withLoop) {\n if (initialStartingPosition === 'center') {\n setPosition(\n getCarouselItemWidth() * items.length -\n getSlideValue() * Math.round((itemsPerSlide - 1) / 2),\n )\n } else if (initialStartingPosition === 'end') {\n setPosition(\n getCarouselItemWidth() * items.length -\n getSlideValue() * Math.round(itemsPerSlide - 1),\n )\n } else {\n setPosition(getCarouselItemWidth() * items.length)\n }\n }\n\n if (slideType === 'fluid') {\n /**\n * User reached the last item and now is resizing the container that becomes smaller/bigger.\n * Example: on mobile devices the user rotates the device\n */\n if (\n lastItemReached.current &&\n getTotalScrollValue() !== Math.abs(prevSlidedValue.current) &&\n !withLoop\n ) {\n const newVal = -getTotalScrollValue()\n prevSlidedValue.current = newVal\n setSpring.start({\n immediate: true,\n val: prevSlidedValue.current,\n })\n return\n }\n\n if (\n Math.abs(prevSlidedValue.current) > 0 &&\n getTotalScrollValue() !== Math.abs(prevSlidedValue.current) &&\n !withLoop &&\n !freeScroll &&\n directionAfterReachingEdges.current === 'backward'\n ) {\n const diff = prevTotalScrollValue.current - getTotalScrollValue()\n const next = prevSlidedValue.current + diff\n\n setSpring.start({\n immediate: true,\n val: next,\n })\n\n return () => {\n prevSlidedValue.current = next\n }\n }\n\n return\n }\n\n if (!freeScroll && slideType === 'fixed') {\n const nextValue = -(getSlideValue() * activeItem.current)\n\n /**\n * Here we make sure to always show the latest item as the\n * latest item visible in the carousel viewport.\n */\n if (Math.abs(nextValue) > getTotalScrollValue() && !withLoop) {\n const val = -getTotalScrollValue()\n lastItemReached.current = true\n prevSlidedValue.current = val\n setSpring.start({\n immediate: true,\n val: prevSlidedValue.current,\n })\n } else {\n prevSlidedValue.current = nextValue\n setSpring.start({\n immediate: true,\n val: nextValue,\n })\n }\n\n setTimeout(() => {\n resizeByPropChange.current = false\n }, 0)\n }\n }\n function getFromValue() {\n if (freeScroll && mainCarouselWrapperRef.current) {\n return mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ]\n }\n return spring.val.get()\n }\n function getToValue(type: 'next' | 'prev', index?: number) {\n if (freeScroll && type === 'next') {\n const next = prevSlidedValue.current + getSlideValue()\n if (next > getTotalScrollValue()) {\n return getTotalScrollValue()\n }\n return next\n }\n\n if (freeScroll && type === 'prev') {\n const next = prevSlidedValue.current - getSlideValue()\n if (next < 0) {\n return 0\n }\n return next\n }\n\n if (type === 'next') {\n if (typeof index === 'number') {\n return -(index * getSlideValue())\n }\n return prevSlidedValue.current - getSlideValue()\n }\n\n if (typeof index === 'number') {\n return -(index * getSlideValue())\n }\n return prevSlidedValue.current + getSlideValue()\n }\n\n type SlideToPrevNextItem = {\n type: SlideMode\n index?: number\n immediate?: boolean\n }\n function slideToPrevItem({ type, index, immediate }: SlideToPrevNextItem) {\n if (!init || windowIsHidden.current || (firstItemReached.current && !withLoop)) return\n\n if (lastItemReached.current) {\n directionAfterReachingEdges.current = 'backward'\n }\n\n slideActionType.current = 'prev'\n lastItemReached.current = false\n\n const nextItem = typeof index === 'number' ? index : activeItem.current - 1\n\n if (!withLoop) {\n const nextItemWillExceed = freeScroll\n ? getToValue('prev', index) - getSlideValue() / 3 < 0\n : getToValue('prev', index) + getSlideValue() / 3 > 0\n\n if (firstItemReached.current) return\n if (nextItemWillExceed) {\n firstItemReached.current = true\n lastItemReached.current = false\n\n slideToItem({\n slideMode: type,\n from: getFromValue(),\n to: 0,\n nextActiveItem: 0,\n immediate,\n })\n return\n }\n }\n if (withLoop && (firstItemReached.current || nextItem < 0)) {\n firstItemReached.current = false\n lastItemReached.current = true\n slideToItem({\n slideMode: type,\n from: getFromValue() - getSlideValue() * items.length,\n to: -(getSlideValue() * items.length) + getSlideValue(),\n nextActiveItem: items.length - 1,\n immediate,\n })\n return\n }\n if (nextItem === 0) {\n firstItemReached.current = true\n }\n if (nextItem === items.length - 1 || nextItem === -1) {\n lastItemReached.current = true\n }\n slideToItem({\n slideMode: type,\n from: getFromValue(),\n to: getToValue('prev', index),\n nextActiveItem: nextItem,\n immediate,\n })\n }\n function slideToNextItem({ type, index, immediate }: SlideToPrevNextItem) {\n if (!init || windowIsHidden.current || (lastItemReached.current && !withLoop)) return\n\n if (firstItemReached.current) {\n directionAfterReachingEdges.current = 'forward'\n }\n\n slideActionType.current = 'next'\n firstItemReached.current = false\n\n const nextItem = index || activeItem.current + 1\n\n if (!withLoop) {\n const nextItemWillExceed =\n Math.abs(getToValue('next', index)) > getTotalScrollValue() - getSlideValue() / 3\n\n if (lastItemReached.current) return\n if (nextItemWillExceed) {\n firstItemReached.current = false\n lastItemReached.current = true\n\n slideToItem({\n slideMode: type,\n from: getFromValue(),\n to: freeScroll ? getTotalScrollValue() : -getTotalScrollValue(),\n nextActiveItem: nextItem,\n immediate,\n })\n return\n }\n }\n if (withLoop && (lastItemReached.current || nextItem > items.length - 1)) {\n lastItemReached.current = false\n firstItemReached.current = true\n slideToItem({\n slideMode: type,\n from: getFromValue() + getSlideValue() * items.length,\n to: 0,\n nextActiveItem: 0,\n immediate,\n })\n return\n }\n if (nextItem === 0) {\n firstItemReached.current = true\n }\n if (nextItem === items.length - 1) {\n lastItemReached.current = true\n }\n slideToItem({\n slideMode: type,\n from: getFromValue(),\n to: getToValue('next', index),\n nextActiveItem: nextItem,\n immediate,\n })\n }\n function getDraggingSliderTreshold() {\n if (_draggingSlideTreshold) {\n draggingSlideTreshold.current = _draggingSlideTreshold\n } else {\n draggingSlideTreshold.current = Math.floor(getSlideValue() / 2 / 2)\n }\n return draggingSlideTreshold.current\n }\n\n useEffect(() => {\n if (activeItem.current !== initialActiveItem) {\n internalSlideToItem({\n id: initialActiveItem,\n immediate: !animateWhenActiveItemChange,\n })\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialActiveItem])\n useEffect(() => {\n if (init) {\n if (initialActiveItem > items.length - 1) {\n throw new Error(\n `initialActiveItem (${initialActiveItem}) is greater than the total quantity available items (${items.length}).`,\n )\n }\n if (itemsPerSlide > items.length) {\n console.warn(\n `itemsPerSlide (${itemsPerSlide}) is greater than the total quantity available items (${items.length}). Fallback to ${items.length})`,\n )\n }\n }\n }, [initialActiveItem, items, itemsPerSlide, init])\n useEffect(() => {\n prevWindowWidth.current = window.innerWidth\n }, [])\n useEffect(() => {\n prevTotalScrollValue.current = getTotalScrollValue()\n if (!isFirstMount.current) {\n resizeByPropChange.current = true\n adjustCarouselWrapperPosition()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n initialStartingPosition,\n itemsPerSlide,\n startEndGutter,\n gutter,\n init,\n getTotalScrollValue,\n ])\n useEffect(() => {\n /**\n * When these props change we reset the carousel\n */\n if (\n withLoop !== prevWithLoop.current ||\n slideType !== prevSlideType.current ||\n freeScroll !== prevFreeScroll.current\n ) {\n prevWithLoop.current = withLoop\n prevSlideType.current = slideType\n prevFreeScroll.current = freeScroll\n\n if (carouselTrackWrapperRef.current) {\n carouselTrackWrapperRef.current.style.transform = `translate3d(0px, 0px,0px)`\n setSpring.start({\n val: 0,\n immediate: true,\n })\n }\n\n internalSlideToItem({ id: 0, immediate: true, shouldReset: true })\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [withLoop, slideType, freeScroll])\n useLayoutEffect(() => {\n /**\n * Set initial track position\n */\n if (carouselTrackWrapperRef.current) {\n adjustCarouselWrapperPosition()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n useEffect(() => {\n /**\n * When itemsPerSlide change we need to update the draggingSlideTreshold.current,\n * since it's default value is based on the calculation of the\n * width of a single item\n */\n getDraggingSliderTreshold()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [_draggingSlideTreshold, itemsPerSlide, slideType])\n useEffect(() => {\n if (mainCarouselWrapperRef.current) {\n let timer: NodeJS.Timeout\n const observer = new ResizeObserver(() => {\n if (isFirstMount.current) {\n isFirstMount.current = false\n return\n }\n\n if (windowIsHidden.current) return\n if (!resizeByPropChange.current) {\n prevWindowWidth.current = window.innerWidth\n const cb = adjustCarouselWrapperPosition()\n window.clearTimeout(timer)\n\n timer = setTimeout(() => {\n prevTotalScrollValue.current = getTotalScrollValue()\n if (typeof cb === 'function') {\n cb()\n }\n }, 100)\n }\n })\n observer.observe(mainCarouselWrapperRef.current)\n return () => {\n observer.disconnect()\n }\n }\n }, [adjustCarouselWrapperPosition, getTotalScrollValue])\n useEffect(() => {\n if (!init) return\n function handleVisibilityChange() {\n if (document.hidden) {\n windowIsHidden.current = true\n } else {\n windowIsHidden.current = false\n }\n }\n document.addEventListener('visibilitychange', handleVisibilityChange)\n return () => {\n document.removeEventListener('visibilitychange', handleVisibilityChange)\n }\n }, [init])\n\n const bindDrag = useDrag(\n state => {\n const isDragging = state.dragging\n const movement = state.offset[carouselSlideAxis === 'x' ? 0 : 1]\n const currentMovement = state.movement[carouselSlideAxis === 'x' ? 0 : 1]\n const direction = state.direction[carouselSlideAxis === 'x' ? 0 : 1]\n\n const prevItemTreshold = currentMovement > getDraggingSliderTreshold()\n const nextItemTreshold = currentMovement < -getDraggingSliderTreshold()\n const tot = getTotalScrollValue()\n\n if (isDragging) {\n if (direction > 0) {\n slideActionType.current = 'prev'\n } else {\n slideActionType.current = 'next'\n }\n\n emitEvent({\n ...state,\n eventName: 'onDrag',\n slideActionType: slideActionType.current,\n })\n\n if (freeScroll) {\n if (movement > 0) {\n setSpring.start({\n from: {\n val: getFromValue(),\n },\n to: {\n val: 0,\n },\n config: {\n velocity: state.velocity,\n friction: 50,\n tension: 1000,\n },\n })\n state.cancel()\n return\n }\n\n setSpring.start({\n from: {\n val: getFromValue(),\n },\n to: {\n val: -movement,\n },\n config: {\n velocity: state.velocity,\n friction: 50,\n tension: 1000,\n },\n })\n return\n }\n\n setSpring.start({\n val: movement,\n config: {\n velocity: state.velocity,\n friction: 50,\n tension: 1000,\n },\n })\n\n if (slideWhenThresholdIsReached && nextItemTreshold) {\n slideToNextItem({ type: 'drag' })\n state.cancel()\n } else if (slideWhenThresholdIsReached && prevItemTreshold) {\n slideToPrevItem({ type: 'drag' })\n state.cancel()\n }\n\n const res = tot - Math.abs(movement)\n\n if (res < -(getSlideValue() * 2)) {\n state.cancel()\n }\n\n return\n }\n\n if (state.last && freeScroll && movement > 0) {\n setSpring.start({\n from: {\n val: getFromValue(),\n },\n to: {\n val: 0,\n },\n config: {\n velocity: state.velocity,\n friction: 50,\n tension: 1000,\n },\n })\n return\n }\n if (state.last && !state.canceled && freeScroll) {\n if (slideActionType.current === 'prev') {\n slideToPrevItem({ type: 'drag' })\n }\n if (slideActionType.current === 'next') {\n slideToNextItem({ type: 'drag' })\n }\n }\n\n if (state.last && !state.canceled && !freeScroll) {\n if (nextItemTreshold) {\n if (!withLoop && lastItemReached.current) {\n setSpring.start({\n val: -getTotalScrollValue(),\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n } else {\n slideToNextItem({ type: 'drag' })\n }\n } else if (prevItemTreshold) {\n if (!withLoop && firstItemReached.current) {\n setSpring.start({\n val: 0,\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n } else {\n slideToPrevItem({ type: 'drag' })\n }\n } else {\n setSpring.start({\n val: prevSlidedValue.current,\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n }\n }\n if (state.last && state.canceled) {\n setSpring.start({\n val: prevSlidedValue.current,\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n }\n },\n {\n enabled:\n (init && !disableGestures && !freeScroll) ||\n (!!freeScroll && !!enableFreeScrollDrag),\n axis: carouselSlideAxis,\n from: () => {\n if (freeScroll && mainCarouselWrapperRef.current) {\n return [\n -mainCarouselWrapperRef.current.scrollLeft,\n -mainCarouselWrapperRef.current.scrollTop,\n ]\n }\n if (carouselSlideAxis === 'x') {\n return [spring.val.get(), spring.val.get()]\n }\n return [spring.val.get(), spring.val.get()]\n },\n },\n )\n\n function getWrapperOverflowStyles() {\n if (freeScroll) {\n if (carouselSlideAxis === 'x') {\n return {\n overflowX: 'auto',\n }\n }\n return {\n overflowY: 'auto',\n }\n }\n return {}\n }\n\n function setStartEndItemReachedOnFreeScroll() {\n if (mainCarouselWrapperRef.current) {\n prevSlidedValue.current =\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ]\n if (\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] === 0\n ) {\n firstItemReached.current = true\n lastItemReached.current = false\n }\n if (\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] > 0 &&\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] < getTotalScrollValue()\n ) {\n firstItemReached.current = false\n lastItemReached.current = false\n }\n\n if (\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] === getTotalScrollValue()\n ) {\n firstItemReached.current = false\n lastItemReached.current = true\n }\n }\n }\n function getScrollHandlers() {\n if (freeScroll) {\n return {\n onWheel() {\n spring.val.stop()\n setStartEndItemReachedOnFreeScroll()\n },\n }\n }\n return {}\n }\n\n function findItemIndex(id: string | number, error?: string) {\n let itemIndex = 0\n\n if (typeof id === 'string') {\n itemIndex = items.findIndex(item => item.id === id)\n } else {\n itemIndex = id\n }\n if (itemIndex < 0 || itemIndex >= items.length) {\n if (error) {\n throw new Error(error)\n }\n console.error(\n `The item doesn't exist; check that the id provided - ${id} - is correct.`,\n )\n itemIndex = -1\n }\n\n return itemIndex\n }\n type InternalSlideToItem = {\n id: string | number\n immediate?: boolean\n shouldReset?: boolean\n type?: SlideType\n }\n function internalSlideToItem({\n id,\n immediate,\n shouldReset,\n type,\n }: InternalSlideToItem) {\n if (!init || windowIsHidden.current) return\n\n firstItemReached.current = false\n lastItemReached.current = false\n\n const itemIndex = findItemIndex(\n id,\n \"The item you want to slide to doesn't exist; check the provided id.\",\n )\n\n if (itemIndex === activeItem.current && !shouldReset) {\n return\n }\n\n const currentItem = findItemIndex(items[activeItem.current].id)\n const newActiveItem = findItemIndex(items[itemIndex].id)\n\n if (newActiveItem > currentItem) {\n slideToNextItem({\n type: type || shouldReset ? 'initial' : 'click',\n index: newActiveItem,\n immediate,\n })\n } else {\n slideToPrevItem({\n type: type || shouldReset ? 'initial' : 'click',\n index: newActiveItem,\n immediate,\n })\n }\n }\n function getIsNextItem(id: string | number) {\n const itemIndex = findItemIndex(id, \"The item doesn't exist; check the provided id.\")\n const _activeItem = activeItem.current\n if (withLoop && _activeItem === items.length - 1) {\n return itemIndex === 0\n }\n return itemIndex === _activeItem + 1\n }\n function getIsPrevItem(id: string | number) {\n const itemIndex = findItemIndex(id, \"The item doesn't exist; check the provided id.\")\n const _activeItem = activeItem.current\n if (withLoop && _activeItem === 0) {\n return itemIndex === items.length - 1\n }\n return itemIndex === _activeItem - 1\n }\n function getIsActiveItem(id: string | number) {\n return (\n findItemIndex(\n id,\n \"The item you want to check doesn't exist; check the provided id.\",\n ) === activeItem.current\n )\n }\n\n const res = freeScroll\n ? {\n useListenToCustomEvent,\n enterFullscreen,\n exitFullscreen,\n getIsFullscreen,\n slideToPrevItem: (animate = true) => {\n slideToPrevItem({\n type: 'click',\n immediate: !animate,\n })\n },\n slideToNextItem: (animate = true) => {\n slideToNextItem({\n type: 'click',\n immediate: !animate,\n })\n },\n }\n : {\n useListenToCustomEvent,\n enterFullscreen,\n exitFullscreen,\n getIsFullscreen,\n slideToPrevItem: (animate = true) => {\n slideToPrevItem({\n type: 'click',\n immediate: !animate,\n })\n },\n slideToNextItem: (animate = true) => {\n slideToNextItem({\n type: 'click',\n immediate: !animate,\n })\n },\n slideToItem: (id: string | number, animate = true) => {\n internalSlideToItem({ id, immediate: !animate })\n },\n getIsNextItem,\n getIsPrevItem,\n getIsActiveItem,\n }\n\n useEffect(() => {\n if (getControllerRef) {\n getControllerRef({\n slideToNextItem: res.slideToNextItem,\n slideToPrevItem: res.slideToPrevItem,\n slideToItem: res?.slideToItem,\n })\n }\n }, [getControllerRef, res.slideToItem, res.slideToNextItem, res.slideToPrevItem])\n\n const _thumbsFragment = (\n <Context.Provider value={res}>{thumbsFragment}</Context.Provider>\n )\n const carouselFragment = (\n <Context.Provider value={res}>\n <div\n className=\"use-spring-carousel-main-wrapper\"\n ref={mainCarouselWrapperRef}\n {...getScrollHandlers()}\n style={{\n display: 'flex',\n position: 'relative',\n width: '100%',\n height: '100%',\n ...(getWrapperOverflowStyles() as React.CSSProperties),\n }}\n >\n <div\n className=\"use-spring-carousel-track-wrapper\"\n ref={carouselTrackWrapperRef}\n {...bindDrag()}\n style={{\n position: 'relative',\n display: 'flex',\n flexDirection: carouselSlideAxis === 'x' ? 'row' : 'column',\n touchAction: 'none',\n ...getAnimatedWrapperStyles(),\n }}\n >\n {(freeScroll || !withLoop) && startEndGutter ? (\n <div\n style={{\n flexShrink: 0,\n width: startEndGutter,\n }}\n />\n ) : null}\n {internalItems.map((item, index) => {\n return (\n <div\n key={`${item.id}-${index}`}\n className=\"use-spring-carousel-item\"\n data-testid=\"use-spring-carousel-item-wrapper\"\n style={{\n display: 'flex',\n position: 'relative',\n flex: '1',\n ...getItemStyles(item.id === items[internalItems.length - 1].id),\n }}\n >\n {typeof item.renderItem === 'function'\n ? item.renderItem({\n getIsActiveItem,\n getIsNextItem,\n getIsPrevItem,\n useListenToCustomEvent,\n })\n : item.renderItem}\n </div>\n )\n })}\n {(freeScroll || !withLoop) && startEndGutter ? (\n <div\n style={{\n flexShrink: 0,\n width: startEndGutter,\n }}\n />\n ) : null}\n </div>\n </div>\n </Context.Provider>\n )\n\n return { ...res, carouselFragment, thumbsFragment: _thumbsFragment }\n}\n\ntype ContextProps<T = undefined> = Omit<\n ReturnType<T extends 'free-scroll' ? true : false>,\n 'carouselFragment' | 'thumbsFragment'\n>\n\nconst Context = createContext<ContextProps | ContextProps<'free-scroll'> | undefined>(\n undefined,\n)\n\nfunction useSpringCarouselContext<T>() {\n const context = useContext(Context)\n if (!context) {\n throw new Error('useSpringCarouselContext must be used within the carousel.')\n }\n return context as ContextProps<T>\n}\n\nexport { useSpringCarousel, useSpringCarouselContext }\n"],"names":["useSpringCarousel","items","init","withThumbs","thumbsSlideAxis","itemsPerSlide","_itemsPerSlide","slideType","gutter","withLoop","startEndGutter","carouselSlideAxis","disableGestures","draggingSlideTreshold","_draggingSlideTreshold","slideWhenThresholdIsReached","freeScroll","enableFreeScrollDrag","initialStartingPosition","prepareThumbsData","initialActiveItem","animateWhenActiveItemChange","getControllerRef","length","resizeByPropChange","useRef","slideActionType","slideModeType","directionAfterReachingEdges","activeItem","firstItemReached","lastItemReached","mainCarouselWrapperRef","carouselTrackWrapperRef","isFirstMount","prevTotalScrollValue","prevWindowWidth","prevSlidedValue","prevWithLoop","prevSlideType","prevFreeScroll","windowIsHidden","internalItems","useCallback","map","i","Object","assign","id","getItems","spring","setSpring","useSpring","val","pause","onChange","value","current","scrollLeft","Math","abs","scrollTop","setStartEndItemReachedOnFreeScroll","style","transform","emitEvent","useListenToCustomEvent","useEventsModule","thumbsFragment","handleScroll","useThumbsModule","renderThumbFnProps","getIsActiveItem","getIsPrevItem","getIsNextItem","enterFullscreen","exitFullscreen","getIsFullscreen","useFullscreenModule","handleResize","adjustCarouselWrapperPosition","onFullScreenChange","eventName","isFullscreen","getSlideValue","carouselItem","_a","querySelector","Error","getBoundingClientRect","slideToItem","from","to","nextActiveItem","immediate","slideMode","nextItem","startReached","endReached","index","start","config","default","velocity","onRest","finished","currentItem","getTotalScrollValue","round","Number","getCarouselItemWidth","positionProperty","setPosition","v","ref","top","left","nextValue","setTimeout","newVal","diff","next","getFromValue","get","getToValue","type","slideToPrevItem","nextItemWillExceed","slideToNextItem","getDraggingSliderTreshold","floor","useEffect","internalSlideToItem","console","warn","window","innerWidth","shouldReset","useLayoutEffect","timer","observer","ResizeObserver","cb","clearTimeout","observe","disconnect","document","addEventListener","handleVisibilityChange","removeEventListener","hidden","bindDrag","useDrag","state","isDragging","dragging","movement","offset","currentMovement","direction","prevItemTreshold","nextItemTreshold","tot","friction","tension","cancel","last","canceled","enabled","axis","findItemIndex","error","itemIndex","findIndex","item","newActiveItem","_activeItem","res","animate","_thumbsFragment","_jsx","Context","Provider","children","carouselFragment","className","onWheel","stop","display","position","width","height","overflowX","overflowY","_jsxs","flexDirection","touchAction","percentValue","getAnimatedWrapperStyles","flexShrink","flex","isLastItem","marginRight","renderItem","createContext","undefined","useSpringCarouselContext","context","useContext"],"mappings":"0bAmDA,SAASA,GAAkBC,MACzBA,EAAKC,KACLA,GAAO,EAAIC,WACXA,EAAUC,gBACVA,EAAkB,IAClBC,cAAeC,EAAiB,EAACC,UACjCA,EAAY,QAAOC,OACnBA,EAAS,EAACC,SACVA,GAAW,EAAKC,eAChBA,EAAiB,EAACC,kBAClBA,EAAoB,IAAGC,gBACvBA,GAAkB,EAClBC,sBAAuBC,EAAsBC,4BAC7CA,GAA8B,EAAKC,WACnCA,EAAUC,qBACVA,EAAoBC,wBACpBA,EAAuBC,kBACvBA,EAAiBC,kBACjBA,EAAoB,EAACC,4BACrBA,GAA8B,EAAIC,iBAClCA,IAEA,MAAMjB,EAAgBC,EAAiBL,EAAMsB,OAAStB,EAAMsB,OAASjB,EAE/DkB,EAAqBC,GAAO,GAC5BZ,EAAwBY,EAAOX,QAAAA,EAA0B,GACzDY,EAAkBD,EAAwB,WAC1CE,EAAgBF,EAAkB,WAQlCG,EAA8BH,EAClC,WAGII,EAAaJ,EAAOL,GACpBU,EAAmBL,EAA6B,IAAtBL,GAC1BW,EAAkBN,EACR,UAAdlB,GAAyBa,IAAsBnB,EAAMsB,OAAS,GAE1DS,EAAyBP,EAA8B,MACvDQ,EAA0BR,EAA8B,MAExDS,EAAeT,GAAO,GAEtBU,EAAuBV,EAAO,GAC9BW,EAAkBX,EAAO,GACzBY,EAAkBZ,EAAO,GACzBa,EAAeb,EAAOhB,GACtB8B,EAAgBd,EAAOlB,GACvBiC,EAAiBf,EAAOT,GACxByB,EAAiBhB,GAAO,GAkBxBiB,EAhBWC,GAAY,IACvBlC,EACK,IACFR,EAAM2C,KAAIC,GAAKC,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EACbF,GACH,CAAAG,GAAI,sBAAsBH,EAAEG,YAE3B/C,KACAA,EAAM2C,KAAIC,GAAKC,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EACbF,GACH,CAAAG,GAAI,sBAAsBH,EAAEG,UAI3B,IAAI/C,IACV,CAACA,EAAOQ,GACWwC,IAEfC,GAAQC,IAAaC,GAC1B,KAAO,CACLC,IAAK,EACLC,OAAQpD,EACRqD,SAAU,EAAGC,YACPxC,GAAcgB,EAAuByB,SACb,MAAtB9C,EACFqB,EAAuByB,QAAQC,WAAaC,KAAKC,IAAIJ,EAAMH,KAE3DrB,EAAuByB,QAAQI,UAAYF,KAAKC,IAAIJ,EAAMH,KAE5DS,MACS7B,EAAwBwB,UAE/BxB,EAAwBwB,QAAQM,MAAMC,UADd,MAAtBrD,EACgD,eAAe6C,EAAMH,kBAErB,mBAAmBG,EAAMH,aAE9E,KAGL,CAACrC,KAEGiD,UAAEA,GAASC,uBAAEA,IAA2BC,KACxCC,eAAEA,GAAcC,aAAEA,IAAiBC,EAA8B,CACrEnE,aAAcA,EACdC,kBACAe,oBACAlB,MAAOA,EACPsE,mBAAoB,CAClBC,mBACAC,iBACAP,0BACAQ,qBAGEC,gBAAEA,GAAeC,eAAEA,GAAcC,gBAAEA,IAAoBC,EAAoB,CAC/E9C,yBACA+C,aAAc,IAAMC,KACpBC,mBAAoB5B,IAClBY,GAAU,CACRiB,UAAW,qBACXC,aAAc9B,GACd,IAkBN,SAAS+B,WACP,MAAMC,EAA6C,QAA9BC,EAAAtD,EAAuByB,eAAO,IAAA6B,OAAA,EAAAA,EAAEC,cACnD,6BAGF,IAAKF,EACH,MAAMG,MAAM,gCAGd,OACEH,EAAaI,wBACW,MAAtB9E,EAA4B,QAAU,UACpCH,CAEP,CAUD,SAASkF,IAAYC,KACnBA,EAAIC,GACJA,EAAEC,eACFA,EAAcC,UACdA,GAAY,EAAKC,UACjBA,IAEApE,EAAc8B,QAAUsC,EAEM,iBAAnBF,IACJ7E,IACHa,EAAW4B,QAAUoC,GAEvB5B,GAAU,CACRiB,UAAW,qBACXxD,gBAAiBA,EAAgB+B,QACjCsC,UAAWpE,EAAc8B,QACzBuC,SAAU,CACRC,aAAcnE,EAAiB2B,QAC/ByC,WAAYnE,EAAgB0B,QAC5B0C,MAAOnF,GAAc,EAAIa,EAAW4B,QACpCT,GAAIhC,EAAa,GAAKf,EAAM4B,EAAW4B,SAAST,OAKtDX,EAAgBoB,QAAUmC,EAC1BzC,GAAUiD,MAAM,CACdN,YACAH,KAAM,CACJtC,IAAKsC,GAEPC,GAAI,CACFvC,IAAKuC,GAEPS,OACKvD,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAAsD,EAAOC,SACV,CAAAC,SAAUrD,GAAOG,IAAIkD,WAEvBC,OAAOhD,IACAsC,GAAatC,EAAMiD,UACtBxC,GAAU,CACRiB,UAAW,gBACXxD,gBAAiBA,EAAgB+B,QACjCsC,UAAWpE,EAAc8B,QACzBiD,YAAa,CACXT,aAAcnE,EAAiB2B,QAC/ByC,WAAYnE,EAAgB0B,QAC5B0C,MAAOnF,GAAc,EAAIa,EAAW4B,QACpCT,GAAIhC,EAAa,GAAKf,EAAM4B,EAAW4B,SAAST,KAIvD,IAEC7C,IAAe2F,GACjBzB,GAAaxC,EAAW4B,QAE3B,CAED,SAASkD,WACP,OAAIlG,EACK2E,KAAkBnF,EAAMsB,OAE1BoC,KAAKiD,MACVC,OACiC,QAA/BvB,EAAArD,EAAwBwB,eAAO,IAAA6B,OAAA,EAAAA,EACP,MAAtB3E,EAA4B,cAAgB,iBAG9CsB,EAAwBwB,QAASgC,wBACT,MAAtB9E,EAA4B,QAAU,UAEvB,EAAjBD,EAEL,CASD,SAASoG,WACP,MAAMzB,EAA8C,QAA/BC,EAAArD,EAAwBwB,eAAO,IAAA6B,OAAA,EAAAA,EAAEC,cACpD,6BAEF,IAAKF,EACH,MAAMG,MAAM,gCAEd,OACEH,EAAaI,wBACW,MAAtB9E,EAA4B,QAAU,UACpCH,CAEP,CAGD,SAASwE,KACP,MAAM+B,EAAyC,MAAtBpG,EAA4B,OAAS,MAE9D,SAASqG,EAAYC,GACnB,MAAMC,EAAMjF,EAAwBwB,QAC/ByD,IAEDzG,GACFyG,EAAInD,MAAMoD,IAAM,MAChBD,EAAInD,MAAMqD,KAAO,MACjBF,EAAInD,MAAMgD,GAAoB,IAAIE,EAAIvG,MAEtCoB,EAAiB2B,SAAU,EAC3B1B,EAAgB0B,SAAU,IAE1ByD,EAAInD,MAAMqD,KAAO,MACjBF,EAAInD,MAAMoD,IAAM,OAEnB,CAkBD,GAhBkB,UAAd5G,GAAyBE,GAEzBuG,EAD8B,WAA5B9F,EAEA4F,KAAyB7G,EAAMsB,OAC7B6D,KAAkBzB,KAAKiD,OAAOvG,EAAgB,GAAK,GAElB,QAA5Ba,EAEP4F,KAAyB7G,EAAMsB,OAC7B6D,KAAkBzB,KAAKiD,MAAMvG,EAAgB,GAGrCyG,KAAyB7G,EAAMsB,QAI7B,UAAdhB,GA0CJ,IAAKS,GAA4B,UAAdT,EAAuB,CACxC,MAAM8G,GAAcjC,KAAkBvD,EAAW4B,QAMjD,GAAIE,KAAKC,IAAIyD,GAAaV,OAA0BlG,EAAU,CAC5D,MAAM4C,GAAOsD,KACb5E,EAAgB0B,SAAU,EAC1BpB,EAAgBoB,QAAUJ,EAC1BF,GAAUiD,MAAM,CACdN,WAAW,EACXzC,IAAKhB,EAAgBoB,SAExB,MACCpB,EAAgBoB,QAAU4D,EAC1BlE,GAAUiD,MAAM,CACdN,WAAW,EACXzC,IAAKgE,IAITC,YAAW,KACT9F,EAAmBiC,SAAU,CAAK,GACjC,EACJ,MApED,CAKE,GACE1B,EAAgB0B,SAChBkD,OAA0BhD,KAAKC,IAAIvB,EAAgBoB,WAClDhD,EACD,CACA,MAAM8G,GAAUZ,KAMhB,OALAtE,EAAgBoB,QAAU8D,OAC1BpE,GAAUiD,MAAM,CACdN,WAAW,EACXzC,IAAKhB,EAAgBoB,SAGxB,CAED,GACEE,KAAKC,IAAIvB,EAAgBoB,SAAW,GACpCkD,OAA0BhD,KAAKC,IAAIvB,EAAgBoB,WAClDhD,IACAO,GACuC,aAAxCY,EAA4B6B,QAC5B,CACA,MAAM+D,EAAOrF,EAAqBsB,QAAUkD,KACtCc,EAAOpF,EAAgBoB,QAAU+D,EAOvC,OALArE,GAAUiD,MAAM,CACdN,WAAW,EACXzC,IAAKoE,IAGA,KACLpF,EAAgBoB,QAAUgE,CAAI,CAEjC,CAGF,CA6BF,CACD,SAASC,KACP,OAAI1G,GAAcgB,EAAuByB,QAChCzB,EAAuByB,QACN,MAAtB9C,EAA4B,aAAe,aAGxCuC,GAAOG,IAAIsE,KACnB,CACD,SAASC,GAAWC,EAAuB1B,GACzC,GAAInF,GAAuB,SAAT6G,EAAiB,CACjC,MAAMJ,EAAOpF,EAAgBoB,QAAU2B,KACvC,OAAIqC,EAAOd,KACFA,KAEFc,CACR,CAED,GAAIzG,GAAuB,SAAT6G,EAAiB,CACjC,MAAMJ,EAAOpF,EAAgBoB,QAAU2B,KACvC,OAAIqC,EAAO,EACF,EAEFA,CACR,CAED,MAAa,SAATI,EACmB,iBAAV1B,GACAA,EAAQf,KAEZ/C,EAAgBoB,QAAU2B,KAGd,iBAAVe,GACAA,EAAQf,KAEZ/C,EAAgBoB,QAAU2B,IAClC,CAOD,SAAS0C,IAAgBD,KAAEA,EAAI1B,MAAEA,EAAKL,UAAEA,IACtC,IAAK5F,GAAQuC,EAAegB,SAAY3B,EAAiB2B,UAAYhD,EAAW,OAE5EsB,EAAgB0B,UAClB7B,EAA4B6B,QAAU,YAGxC/B,EAAgB+B,QAAU,OAC1B1B,EAAgB0B,SAAU,EAE1B,MAAMuC,EAA4B,iBAAVG,EAAqBA,EAAQtE,EAAW4B,QAAU,EAE1E,IAAKhD,EAAU,CACb,MAAMsH,EAAqB/G,EACvB4G,GAAW,OAAQzB,GAASf,KAAkB,EAAI,EAClDwC,GAAW,OAAQzB,GAASf,KAAkB,EAAI,EAEtD,GAAItD,EAAiB2B,QAAS,OAC9B,GAAIsE,EAWF,OAVAjG,EAAiB2B,SAAU,EAC3B1B,EAAgB0B,SAAU,OAE1BiC,GAAY,CACVK,UAAW8B,EACXlC,KAAM+B,KACN9B,GAAI,EACJC,eAAgB,EAChBC,aAIL,CACD,GAAIrF,IAAaqB,EAAiB2B,SAAWuC,EAAW,GAUtD,OATAlE,EAAiB2B,SAAU,EAC3B1B,EAAgB0B,SAAU,OAC1BiC,GAAY,CACVK,UAAW8B,EACXlC,KAAM+B,KAAiBtC,KAAkBnF,EAAMsB,OAC/CqE,IAAMR,KAAkBnF,EAAMsB,OAAU6D,KACxCS,eAAgB5F,EAAMsB,OAAS,EAC/BuE,cAIa,IAAbE,IACFlE,EAAiB2B,SAAU,GAEzBuC,IAAa/F,EAAMsB,OAAS,IAAmB,IAAdyE,IACnCjE,EAAgB0B,SAAU,GAE5BiC,GAAY,CACVK,UAAW8B,EACXlC,KAAM+B,KACN9B,GAAIgC,GAAW,OAAQzB,GACvBN,eAAgBG,EAChBF,aAEH,CACD,SAASkC,IAAgBH,KAAEA,EAAI1B,MAAEA,EAAKL,UAAEA,IACtC,IAAK5F,GAAQuC,EAAegB,SAAY1B,EAAgB0B,UAAYhD,EAAW,OAE3EqB,EAAiB2B,UACnB7B,EAA4B6B,QAAU,WAGxC/B,EAAgB+B,QAAU,OAC1B3B,EAAiB2B,SAAU,EAE3B,MAAMuC,EAAWG,GAAStE,EAAW4B,QAAU,EAE/C,IAAKhD,EAAU,CACb,MAAMsH,EACJpE,KAAKC,IAAIgE,GAAW,OAAQzB,IAAUQ,KAAwBvB,KAAkB,EAElF,GAAIrD,EAAgB0B,QAAS,OAC7B,GAAIsE,EAWF,OAVAjG,EAAiB2B,SAAU,EAC3B1B,EAAgB0B,SAAU,OAE1BiC,GAAY,CACVK,UAAW8B,EACXlC,KAAM+B,KACN9B,GAAI5E,EAAa2F,MAAyBA,KAC1Cd,eAAgBG,EAChBF,aAIL,CACD,GAAIrF,IAAasB,EAAgB0B,SAAWuC,EAAW/F,EAAMsB,OAAS,GAUpE,OATAQ,EAAgB0B,SAAU,EAC1B3B,EAAiB2B,SAAU,OAC3BiC,GAAY,CACVK,UAAW8B,EACXlC,KAAM+B,KAAiBtC,KAAkBnF,EAAMsB,OAC/CqE,GAAI,EACJC,eAAgB,EAChBC,cAIa,IAAbE,IACFlE,EAAiB2B,SAAU,GAEzBuC,IAAa/F,EAAMsB,OAAS,IAC9BQ,EAAgB0B,SAAU,GAE5BiC,GAAY,CACVK,UAAW8B,EACXlC,KAAM+B,KACN9B,GAAIgC,GAAW,OAAQzB,GACvBN,eAAgBG,EAChBF,aAEH,CACD,SAASmC,KAMP,OAJEpH,EAAsB4C,QADpB3C,GAG8B6C,KAAKuE,MAAM9C,KAAkB,EAAI,GAE5DvE,EAAsB4C,OAC9B,CAED0E,GAAU,KACJtG,EAAW4B,UAAYrC,GACzBgH,GAAoB,CAClBpF,GAAI5B,EACJ0E,WAAYzE,GAEf,GAEA,CAACD,IACJ+G,GAAU,KACR,GAAIjI,EAAM,CACR,GAAIkB,EAAoBnB,EAAMsB,OAAS,EACrC,MAAM,IAAIiE,MACR,sBAAsBpE,0DAA0EnB,EAAMsB,YAGtGlB,EAAgBJ,EAAMsB,QACxB8G,QAAQC,KACN,kBAAkBjI,0DAAsEJ,EAAMsB,wBAAwBtB,EAAMsB,UAGjI,IACA,CAACH,EAAmBnB,EAAOI,EAAeH,IAC7CiI,GAAU,KACR/F,EAAgBqB,QAAU8E,OAAOC,UAAU,GAC1C,IACHL,GAAU,KACRhG,EAAqBsB,QAAUkD,KAC1BzE,EAAauB,UAChBjC,EAAmBiC,SAAU,EAC7BuB,KACD,GAEA,CACD9D,EACAb,EACAK,EACAF,EACAN,EACAyG,KAEFwB,GAAU,KAKN1H,IAAa6B,EAAamB,SAC1BlD,IAAcgC,EAAckB,SAC5BzC,IAAewB,EAAeiB,UAE9BnB,EAAamB,QAAUhD,EACvB8B,EAAckB,QAAUlD,EACxBiC,EAAeiB,QAAUzC,EAErBiB,EAAwBwB,UAC1BxB,EAAwBwB,QAAQM,MAAMC,UAAY,4BAClDb,GAAUiD,MAAM,CACd/C,IAAK,EACLyC,WAAW,KAIfsC,GAAoB,CAAEpF,GAAI,EAAG8C,WAAW,EAAM2C,aAAa,IAC5D,GAEA,CAAChI,EAAUF,EAAWS,IACzB0H,GAAgB,KAIVzG,EAAwBwB,SAC1BuB,IACD,GAEA,IACHmD,GAAU,KAMRF,IAA2B,GAE1B,CAACnH,EAAwBT,EAAeE,IAC3C4H,GAAU,KACR,GAAInG,EAAuByB,QAAS,CAClC,IAAIkF,EACJ,MAAMC,EAAW,IAAIC,GAAe,KAClC,GAAI3G,EAAauB,QACfvB,EAAauB,SAAU,OAIzB,IAAIhB,EAAegB,UACdjC,EAAmBiC,QAAS,CAC/BrB,EAAgBqB,QAAU8E,OAAOC,WACjC,MAAMM,EAAK9D,KACXuD,OAAOQ,aAAaJ,GAEpBA,EAAQrB,YAAW,KACjBnF,EAAqBsB,QAAUkD,KACb,mBAAPmC,GACTA,GACD,GACA,IACJ,KAGH,OADAF,EAASI,QAAQhH,EAAuByB,SACjC,KACLmF,EAASK,YAAY,CAExB,IACA,CAACjE,GAA+B2B,KACnCwB,GAAU,KACR,GAAKjI,EASL,OADAgJ,SAASC,iBAAiB,mBAAoBC,GACvC,KACLF,SAASG,oBAAoB,mBAAoBD,EAAuB,EAT1E,SAASA,IACHF,SAASI,OACX7G,EAAegB,SAAU,EAEzBhB,EAAegB,SAAU,CAE5B,CAIA,GACA,CAACvD,IAEJ,MAAMqJ,GAAWC,GACfC,IACE,MAAMC,EAAaD,EAAME,SACnBC,EAAWH,EAAMI,OAA6B,MAAtBlJ,EAA4B,EAAI,GACxDmJ,EAAkBL,EAAMG,SAA+B,MAAtBjJ,EAA4B,EAAI,GACjEoJ,EAAYN,EAAMM,UAAgC,MAAtBpJ,EAA4B,EAAI,GAE5DqJ,EAAmBF,EAAkB7B,KACrCgC,EAAmBH,GAAmB7B,KACtCiC,EAAMvD,KAEZ,GAAI+C,EAAJ,CAaE,GAXEhI,EAAgB+B,QADdsG,EAAY,EACY,OAEA,OAG5B9F,GACKnB,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAA0G,GACH,CAAAvE,UAAW,SACXxD,gBAAiBA,EAAgB+B,WAG/BzC,EACF,OAAI4I,EAAW,GACbzG,GAAUiD,MAAM,CACdT,KAAM,CACJtC,IAAKqE,MAEP9B,GAAI,CACFvC,IAAK,GAEPgD,OAAQ,CACNE,SAAUkD,EAAMlD,SAChB4D,SAAU,GACVC,QAAS,YAGbX,EAAMY,eAIRlH,GAAUiD,MAAM,CACdT,KAAM,CACJtC,IAAKqE,MAEP9B,GAAI,CACFvC,KAAMuG,GAERvD,OAAQ,CACNE,SAAUkD,EAAMlD,SAChB4D,SAAU,GACVC,QAAS,OAMfjH,GAAUiD,MAAM,CACd/C,IAAKuG,EACLvD,OAAQ,CACNE,SAAUkD,EAAMlD,SAChB4D,SAAU,GACVC,QAAS,OAITrJ,GAA+BkJ,GACjCjC,GAAgB,CAAEH,KAAM,SACxB4B,EAAMY,UACGtJ,GAA+BiJ,IACxClC,GAAgB,CAAED,KAAM,SACxB4B,EAAMY,UAGIH,EAAMvG,KAAKC,IAAIgG,IAEG,EAAlBxE,MACVqE,EAAMY,QAIT,MAEGZ,EAAMa,MAAQtJ,GAAc4I,EAAW,EACzCzG,GAAUiD,MAAM,CACdT,KAAM,CACJtC,IAAKqE,MAEP9B,GAAI,CACFvC,IAAK,GAEPgD,OAAQ,CACNE,SAAUkD,EAAMlD,SAChB4D,SAAU,GACVC,QAAS,QAKXX,EAAMa,OAASb,EAAMc,UAAYvJ,IACH,SAA5BU,EAAgB+B,SAClBqE,GAAgB,CAAED,KAAM,SAEM,SAA5BnG,EAAgB+B,SAClBuE,GAAgB,CAAEH,KAAM,WAIxB4B,EAAMa,MAASb,EAAMc,UAAavJ,IAChCiJ,GACGxJ,GAAYsB,EAAgB0B,QAC/BN,GAAUiD,MAAM,CACd/C,KAAMsD,KACNN,OAAMvD,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EACDsD,EAAOC,SAAO,CACjBC,SAAUkD,EAAMlD,aAIpByB,GAAgB,CAAEH,KAAM,SAEjBmC,GACJvJ,GAAYqB,EAAiB2B,QAChCN,GAAUiD,MAAM,CACd/C,IAAK,EACLgD,OAAMvD,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EACDsD,EAAOC,SAAO,CACjBC,SAAUkD,EAAMlD,aAIpBuB,GAAgB,CAAED,KAAM,SAG1B1E,GAAUiD,MAAM,CACd/C,IAAKhB,EAAgBoB,QACrB4C,OAAMvD,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EACDsD,EAAOC,SAAO,CACjBC,SAAUkD,EAAMlD,cAKpBkD,EAAMa,MAAQb,EAAMc,UACtBpH,GAAUiD,MAAM,CACd/C,IAAKhB,EAAgBoB,QACrB4C,OAAMvD,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EACDsD,EAAOC,SAAO,CACjBC,SAAUkD,EAAMlD,aAGrB,GAEH,CACEiE,QACGtK,IAASU,IAAoBI,KAC3BA,KAAgBC,EACrBwJ,KAAM9J,EACNgF,KAAM,IACA3E,GAAcgB,EAAuByB,QAChC,EACJzB,EAAuByB,QAAQC,YAC/B1B,EAAuByB,QAAQI,WAI3B,CAACX,GAAOG,IAAIsE,MAAOzE,GAAOG,IAAIsE,SAqB7C,SAAS7D,KACH9B,EAAuByB,UACzBpB,EAAgBoB,QACdzB,EAAuByB,QACC,MAAtB9C,EAA4B,aAAe,aAKvC,IAFNqB,EAAuByB,QACC,MAAtB9C,EAA4B,aAAe,eAG7CmB,EAAiB2B,SAAU,EAC3B1B,EAAgB0B,SAAU,GAG1BzB,EAAuByB,QACC,MAAtB9C,EAA4B,aAAe,aACzC,GACJqB,EAAuByB,QACC,MAAtB9C,EAA4B,aAAe,aACzCgG,OAEJ7E,EAAiB2B,SAAU,EAC3B1B,EAAgB0B,SAAU,GAI1BzB,EAAuByB,QACC,MAAtB9C,EAA4B,aAAe,eACvCgG,OAEN7E,EAAiB2B,SAAU,EAC3B1B,EAAgB0B,SAAU,GAG/B,CAaD,SAASiH,GAAc1H,EAAqB2H,GAC1C,IAAIC,EAAY,EAOhB,GAJEA,EADgB,iBAAP5H,EACG/C,EAAM4K,WAAUC,GAAQA,EAAK9H,KAAOA,IAEpCA,EAEV4H,EAAY,GAAKA,GAAa3K,EAAMsB,OAAQ,CAC9C,GAAIoJ,EACF,MAAM,IAAInF,MAAMmF,GAElBtC,QAAQsC,MACN,wDAAwD3H,mBAE1D4H,GAAa,CACd,CAED,OAAOA,CACR,CAOD,SAASxC,IAAoBpF,GAC3BA,EAAE8C,UACFA,EAAS2C,YACTA,EAAWZ,KACXA,IAEA,IAAK3H,GAAQuC,EAAegB,QAAS,OAErC3B,EAAiB2B,SAAU,EAC3B1B,EAAgB0B,SAAU,EAE1B,MAAMmH,EAAYF,GAChB1H,EACA,uEAGF,GAAI4H,IAAc/I,EAAW4B,UAAYgF,EACvC,OAGF,MAAM/B,EAAcgE,GAAczK,EAAM4B,EAAW4B,SAAST,IACtD+H,EAAgBL,GAAczK,EAAM2K,GAAW5H,IAEjD+H,EAAgBrE,EAClBsB,GAAgB,CACdH,KAAMA,GAAQY,EAAc,UAAY,QACxCtC,MAAO4E,EACPjF,cAGFgC,GAAgB,CACdD,KAAMA,GAAQY,EAAc,UAAY,QACxCtC,MAAO4E,EACPjF,aAGL,CACD,SAASpB,GAAc1B,GACrB,MAAM4H,EAAYF,GAAc1H,EAAI,kDAC9BgI,EAAcnJ,EAAW4B,QAC/B,OAAIhD,GAAYuK,IAAgB/K,EAAMsB,OAAS,EACxB,IAAdqJ,EAEFA,IAAcI,EAAc,CACpC,CACD,SAASvG,GAAczB,GACrB,MAAM4H,EAAYF,GAAc1H,EAAI,kDAC9BgI,EAAcnJ,EAAW4B,QAC/B,OAAIhD,GAA4B,IAAhBuK,EACPJ,IAAc3K,EAAMsB,OAAS,EAE/BqJ,IAAcI,EAAc,CACpC,CACD,SAASxG,GAAgBxB,GACvB,OACE0H,GACE1H,EACA,sEACInB,EAAW4B,OAEpB,CAED,MAAMwH,GAAMjK,EACR,CACEkD,0BACAS,mBACAC,kBACAC,mBACAiD,gBAAiB,CAACoD,GAAU,KAC1BpD,GAAgB,CACdD,KAAM,QACN/B,WAAYoF,GACZ,EAEJlD,gBAAiB,CAACkD,GAAU,KAC1BlD,GAAgB,CACdH,KAAM,QACN/B,WAAYoF,GACZ,GAGN,CACEhH,0BACAS,mBACAC,kBACAC,mBACAiD,gBAAiB,CAACoD,GAAU,KAC1BpD,GAAgB,CACdD,KAAM,QACN/B,WAAYoF,GACZ,EAEJlD,gBAAiB,CAACkD,GAAU,KAC1BlD,GAAgB,CACdH,KAAM,QACN/B,WAAYoF,GACZ,EAEJxF,YAAa,CAAC1C,EAAqBkI,GAAU,KAC3C9C,GAAoB,CAAEpF,KAAI8C,WAAYoF,GAAU,EAElDxG,iBACAD,iBACAD,oBAGN2D,GAAU,KACJ7G,GACFA,EAAiB,CACf0G,gBAAiBiD,GAAIjD,gBACrBF,gBAAiBmD,GAAInD,gBACrBpC,YAAauF,cAAA,EAAAA,GAAKvF,aAErB,GACA,CAACpE,EAAkB2J,GAAIvF,YAAauF,GAAIjD,gBAAiBiD,GAAInD,kBAEhE,MAAMqD,GACJC,EAACC,EAAQC,SAASxI,OAAAC,OAAA,CAAAS,MAAOyH,IAAG,CAAAM,SAAGnH,MAE3BoH,GACJJ,EAACC,EAAQC,SAASxI,OAAAC,OAAA,CAAAS,MAAOyH,cACvBG,EACE,MAAAtI,OAAAC,OAAA,CAAA0I,UAAU,mCACVvE,IAAKlF,GAhKLhB,EACK,CACL0K,UACExI,GAAOG,IAAIsI,OACX7H,IACD,GAGE,GAyJoB,CACvBC,MACEjB,OAAAC,OAAA,CAAA6I,QAAS,OACTC,SAAU,WACVC,MAAO,OACPC,OAAQ,QAxNV/K,EACwB,MAAtBL,EACK,CACLqL,UAAW,QAGR,CACLC,UAAW,QAGR,eAkNHC,EACE,MAAApJ,OAAAC,OAAA,CAAA0I,UAAU,oCACVvE,IAAKjF,GACDsH,KAAU,CACdxF,MACEjB,OAAAC,OAAA,CAAA8I,SAAU,WACVD,QAAS,OACTO,cAAqC,MAAtBxL,EAA4B,MAAQ,SACnDyL,YAAa,QA5zBvB,WACE,MAAMC,EAAe,eAAgC,EAAjB3L,OACpC,MAAO,CACLoL,MAA6B,MAAtBnL,EAA4B0L,EAAe,OAClDN,OAA8B,MAAtBpL,EAA4B0L,EAAe,OAEtD,CAuzBYC,KAA0B,CAAAf,SAAA,EAG7BvK,GAAeP,IAAaC,EAO1B,KANF0K,EACE,MAAA,CAAArH,MAAO,CACLwI,WAAY,EACZT,MAAOpL,KAIZgC,EAAcE,KAAI,CAACkI,EAAM3E,KACxB,OACEiF,uBAEEK,UAAU,2BACE,cAAA,mCACZ1H,MAAKjB,OAAAC,OAAA,CACH6I,QAAS,OACTC,SAAU,WACVW,KAAM,MAn8BCC,EAo8BU3B,EAAK9H,KAAO/C,EAAMyC,EAAcnB,OAAS,GAAGyB,GAn8BzD,UAAdzC,GAA0BS,EAQ9B8B,OAAAC,OACK,CAAE2J,YAAa,GAAGD,EAAa,EAAIjM,QAR/B,CACLkM,YAAa,GAAGD,EAAa,EAAIjM,MACjCgM,KAAM,mBAAmBnM,OACtBG,GAAUH,EAAgB,GAAMA,WA+7BuC,CAAAkL,SAGtC,mBAApBT,EAAK6B,WACT7B,EAAK6B,WAAW,CACdnI,mBACAE,iBACAD,iBACAP,4BAEF4G,EAAK6B,aAjBJ,GAAG7B,EAAK9H,MAAMmD,KA77BjC,IAAuBsG,CAg9BZ,KAEDzL,GAAeP,IAAaC,EAO1B,KANF0K,EAAA,MAAA,CACErH,MAAO,CACLwI,WAAY,EACZT,MAAOpL,eASrB,OAAAoC,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAYkI,IAAK,CAAAO,oBAAkBpH,eAAgB+G,IACrD,CAOA,MAAME,EAAUuB,OACdC,GAGF,SAASC,IACP,MAAMC,EAAUC,EAAW3B,GAC3B,IAAK0B,EACH,MAAM,IAAIvH,MAAM,8DAElB,OAAOuH,CACT"}
|
package/dist/umd/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react/jsx-runtime"),require("@react-spring/web"),require("react"),require("@use-gesture/react"),require("screenfull"),require("resize-observer-polyfill")):"function"==typeof define&&define.amd?define(["exports","react/jsx-runtime","@react-spring/web","react","@use-gesture/react","screenfull","resize-observer-polyfill"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).ReactSpringCarousel={},e.ReactJSXRuntime,e.ReactSpring,e.React,e.UseGestureReact,e.Screenfull,e.ResizeObserver)}(this,(function(e,t,n,r,i,s,c){"use strict";const o="RSC::Event";function u(){const e=r.useRef(null);return{useListenToCustomEvent:function(t){r.useEffect((()=>{function n(e){t(e.detail)}if(e.current||(e.current=document.createElement("div")),e.current)return e.current.addEventListener(o,n,!1),()=>{var t;null===(t=e.current)||void 0===t||t.removeEventListener(o,n,!1)}}),[t])},emitEvent:function(t){if(e.current){const n=new CustomEvent(o,{detail:t});e.current.dispatchEvent(n)}}}}function l({mainCarouselWrapperRef:e,onFullScreenChange:t,handleResize:n}){const i=r.useRef(!1);function c(e){i.current=e}return r.useEffect((()=>{function e(){document.fullscreenElement&&(c(!0),t(!0),n&&n()),document.fullscreenElement||(c(!1),t(!1),n&&n())}if(s.isEnabled)return s.on("change",e),()=>{s.isEnabled&&s.off("change",e)}}),[]),{enterFullscreen:function(t){s.isEnabled&&s.request(t||e.current)},exitFullscreen:function(){s.isEnabled&&s.exit()},getIsFullscreen:function(){return i.current}}}function a({thumbsSlideAxis:e="x",withThumbs:i=!1,prepareThumbsData:s,items:c,renderThumbFnProps:o}){const u=r.useRef(null),[l,a]=n.useSpring((()=>({val:0})));function d(){var t;return Math.round(Number(null===(t=u.current)||void 0===t?void 0:t["x"===e?"scrollWidth":"scrollHeight"])-u.current.getBoundingClientRect()["x"===e?"width":"height"])}return{thumbsFragment:i?t.jsx("div",Object.assign({className:"use-spring-carousel-thumbs-wrapper",ref:u,onWheel:()=>l.val.stop(),style:Object.assign({display:"flex",flex:"1",position:"relative",width:"100%",height:"100%",flexDirection:"x"===e?"row":"column"},"x"===e?{overflowX:"auto"}:{overflowY:"auto",maxHeight:"100%"})},{children:function(){function e(e){return e.map((e=>({id:e.id,renderThumb:e.renderThumb})))}return s?s(e(c)):e(c)}().map((({id:e,renderThumb:n})=>{const r=`thumb-item-${e}`;return t.jsx("div",Object.assign({id:r,className:"thumb-item"},{children:"function"==typeof n?n(o):n}),r)}))})):null,handleScroll:function(t){var n,r;const i=u.current?u.current.querySelector(`#thumb-item-${c[t].id}`):null;if(i&&u.current&&!function(e){const t=e.getBoundingClientRect();return t.top>=0&&t.left>=0&&t.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&t.right<=(window.innerWidth||document.documentElement.clientWidth)}(i)){const t=i.offsetLeft,s=t>d()?d():t;a.start({from:{val:null!==(r=null===(n=u.current)||void 0===n?void 0:n["x"===e?"scrollLeft":"scrollTop"])&&void 0!==r?r:0},to:{val:s},onChange:({value:t})=>{u.current&&(u.current["x"===e?"scrollLeft":"scrollTop"]=Math.abs(t.val))}})}}}}const d=r.createContext(void 0);const f={initial:{opacity:1,position:"relative"},from:{opacity:0,position:"relative"},enter:{position:"relative",opacity:1},leave:{opacity:1,position:"absolute"}};const m=r.createContext(void 0);e.useEventsModule=u,e.useFullscreenModule=l,e.useSpringCarousel=function({items:e,init:s=!0,withThumbs:o,thumbsSlideAxis:f="x",itemsPerSlide:m=1,slideType:h="fixed",gutter:g=0,withLoop:v=!1,startEndGutter:p=0,carouselSlideAxis:x="x",disableGestures:b=!1,draggingSlideTreshold:y,slideWhenThresholdIsReached:T=!1,freeScroll:I,enableFreeScrollDrag:j,initialStartingPosition:w,prepareThumbsData:R,initialActiveItem:E=0,animateWhenActiveItemChange:O=!0,getControllerRef:C}){const S=m>e.length?e.length:m,M=r.useRef(!1),N=r.useRef(null!=y?y:0),F=r.useRef("initial"),L=r.useRef("initial"),k=r.useRef("initial"),A=r.useRef(E),P=r.useRef(0===E),$=r.useRef("fixed"===h&&E===e.length-1),q=r.useRef(null),W=r.useRef(null),D=r.useRef(!0),B=r.useRef(0),z=r.useRef(0),H=r.useRef(0),G=r.useRef(v),X=r.useRef(h),Y=r.useRef(I),J=r.useRef(!1),U=r.useCallback((()=>v?[...e.map((e=>Object.assign(Object.assign({},e),{id:`prev-repeated-item-${e.id}`}))),...e,...e.map((e=>Object.assign(Object.assign({},e),{id:`next-repeated-item-${e.id}`})))]:[...e]),[e,v])(),[K,Q]=n.useSpring((()=>({val:0,pause:!s,onChange:({value:e})=>{I&&q.current?("x"===x?q.current.scrollLeft=Math.abs(e.val):q.current.scrollTop=Math.abs(e.val),ge()):W.current&&(W.current.style.transform="x"===x?`translate3d(${e.val}px, 0px,0px)`:`translate3d(0px,${e.val}px,0px)`)}})),[I]),{emitEvent:V,useListenToCustomEvent:Z}=u(),{thumbsFragment:_,handleScroll:ee}=a({withThumbs:!!o,thumbsSlideAxis:f,prepareThumbsData:R,items:e,renderThumbFnProps:{getIsActiveItem:ye,getIsPrevItem:be,useListenToCustomEvent:Z,getIsNextItem:xe}}),{enterFullscreen:te,exitFullscreen:ne,getIsFullscreen:re}=l({mainCarouselWrapperRef:q,handleResize:()=>ue(),onFullScreenChange:e=>{V({eventName:"onFullscreenChange",isFullscreen:e})}});function ie(){var e;const t=null===(e=q.current)||void 0===e?void 0:e.querySelector(".use-spring-carousel-item");if(!t)throw Error("No carousel items available!");return t.getBoundingClientRect()["x"===x?"width":"height"]+g}function se({from:t,to:r,nextActiveItem:i,immediate:s=!1,slideMode:c}){L.current=c,"number"==typeof i&&(I||(A.current=i),V({eventName:"onSlideStartChange",slideActionType:F.current,slideMode:L.current,nextItem:{startReached:P.current,endReached:$.current,index:I?-1:A.current,id:I?"":e[A.current].id}})),H.current=r,Q.start({immediate:s,from:{val:t},to:{val:r},config:Object.assign(Object.assign({},n.config.default),{velocity:K.val.velocity}),onRest(t){!s&&t.finished&&V({eventName:"onSlideChange",slideActionType:F.current,slideMode:L.current,currentItem:{startReached:P.current,endReached:$.current,index:I?-1:A.current,id:I?"":e[A.current].id}})}}),o&&!s&&ee(A.current)}function ce(){var t;return v?ie()*e.length:Math.round(Number(null===(t=W.current)||void 0===t?void 0:t["x"===x?"scrollWidth":"scrollHeight"])-W.current.getBoundingClientRect()["x"===x?"width":"height"]-2*p)}function oe(){var e;const t=null===(e=W.current)||void 0===e?void 0:e.querySelector(".use-spring-carousel-item");if(!t)throw Error("No carousel items available!");return t.getBoundingClientRect()["x"===x?"width":"height"]+g}function ue(){const t="x"===x?"left":"top";function n(e){const n=W.current;n&&(v?(n.style.top="0px",n.style.left="0px",n.style[t]=`-${e-p}px`,P.current=!1,$.current=!1):(n.style.left="0px",n.style.top="0px"))}if("fixed"===h&&v&&n("center"===w?oe()*e.length-ie()*Math.round((S-1)/2):"end"===w?oe()*e.length-ie()*Math.round(S-1):oe()*e.length),"fluid"!==h){if(!I&&"fixed"===h){const e=-ie()*A.current;if(Math.abs(e)>ce()&&!v){const e=-ce();$.current=!0,H.current=e,Q.start({immediate:!0,val:H.current})}else H.current=e,Q.start({immediate:!0,val:e});setTimeout((()=>{M.current=!1}),0)}}else{if($.current&&ce()!==Math.abs(H.current)&&!v){const e=-ce();return H.current=e,void Q.start({immediate:!0,val:H.current})}if(Math.abs(H.current)>0&&ce()!==Math.abs(H.current)&&!v&&!I&&"backward"===k.current){const e=B.current-ce(),t=H.current+e;return Q.start({immediate:!0,val:t}),()=>{H.current=t}}}}function le(){return I&&q.current?q.current["x"===x?"scrollLeft":"scrollTop"]:K.val.get()}function ae(e,t){if(I&&"next"===e){const e=H.current+ie();return e>ce()?ce():e}if(I&&"prev"===e){const e=H.current-ie();return e<0?0:e}return"next"===e?"number"==typeof t?-t*ie():H.current-ie():"number"==typeof t?-t*ie():H.current+ie()}function de({type:t,index:n,immediate:r}){if(!s||J.current||P.current&&!v)return;$.current&&(k.current="backward"),F.current="prev",$.current=!1;const i="number"==typeof n?n:A.current-1;if(!v){const e=I?ae("prev",n)-ie()/3<0:ae("prev",n)+ie()/3>0;if(P.current)return;if(e)return P.current=!0,$.current=!1,void se({slideMode:t,from:le(),to:0,nextActiveItem:0,immediate:r})}if(v&&(P.current||i<0))return P.current=!1,$.current=!0,void se({slideMode:t,from:le()-ie()*e.length,to:-ie()*e.length+ie(),nextActiveItem:e.length-1,immediate:r});0===i&&(P.current=!0),i!==e.length-1&&-1!==i||($.current=!0),se({slideMode:t,from:le(),to:ae("prev",n),nextActiveItem:i,immediate:r})}function fe({type:t,index:n,immediate:r}){if(!s||J.current||$.current&&!v)return;P.current&&(k.current="forward"),F.current="next",P.current=!1;const i=n||A.current+1;if(!v){const e=Math.abs(ae("next",n))>ce()-ie()/3;if($.current)return;if(e)return P.current=!1,$.current=!0,void se({slideMode:t,from:le(),to:I?ce():-ce(),nextActiveItem:i,immediate:r})}if(v&&($.current||i>e.length-1))return $.current=!1,P.current=!0,void se({slideMode:t,from:le()+ie()*e.length,to:0,nextActiveItem:0,immediate:r});0===i&&(P.current=!0),i===e.length-1&&($.current=!0),se({slideMode:t,from:le(),to:ae("next",n),nextActiveItem:i,immediate:r})}function me(){return N.current=y||Math.floor(ie()/2/2),N.current}r.useEffect((()=>{A.current!==E&&pe({id:E,immediate:!O})}),[E]),r.useEffect((()=>{if(s){if(E>e.length-1)throw new Error(`initialActiveItem (${E}) is greater than the total quantity available items (${e.length}).`);S>e.length&&console.warn(`itemsPerSlide (${S}) is greater than the total quantity available items (${e.length}). Fallback to ${e.length})`)}}),[E,e,S,s]),r.useEffect((()=>{z.current=window.innerWidth}),[]),r.useEffect((()=>{B.current=ce(),D.current||(M.current=!0,ue())}),[w,S,p,g,s,ce]),r.useEffect((()=>{v===G.current&&h===X.current&&I===Y.current||(G.current=v,X.current=h,Y.current=I,W.current&&(W.current.style.transform="translate3d(0px, 0px,0px)",Q.start({val:0,immediate:!0})),pe({id:0,immediate:!0,shouldReset:!0}))}),[v,h,I]),r.useLayoutEffect((()=>{W.current&&ue()}),[]),r.useEffect((()=>{me()}),[y,S,h]),r.useEffect((()=>{if(q.current){let e;const t=new c((()=>{if(D.current)D.current=!1;else if(!J.current&&!M.current){z.current=window.innerWidth;const t=ue();window.clearTimeout(e),e=setTimeout((()=>{B.current=ce(),"function"==typeof t&&t()}),100)}}));return t.observe(q.current),()=>{t.disconnect()}}}),[ue,ce]),r.useEffect((()=>{if(s)return document.addEventListener("visibilitychange",e),()=>{document.removeEventListener("visibilitychange",e)};function e(){document.hidden?J.current=!0:J.current=!1}}),[s]);const he=i.useDrag((e=>{const t=e.dragging,r=e.offset["x"===x?0:1],i=e.movement["x"===x?0:1],s=e.direction["x"===x?0:1],c=i>me(),o=i<-me(),u=ce();if(t){if(F.current=s>0?"prev":"next",V(Object.assign(Object.assign({},e),{eventName:"onDrag",slideActionType:F.current})),I)return r>0?(Q.start({from:{val:le()},to:{val:0},config:{velocity:e.velocity,friction:50,tension:1e3}}),void e.cancel()):void Q.start({from:{val:le()},to:{val:-r},config:{velocity:e.velocity,friction:50,tension:1e3}});Q.start({val:r,config:{velocity:e.velocity,friction:50,tension:1e3}}),T&&o?(fe({type:"drag"}),e.cancel()):T&&c&&(de({type:"drag"}),e.cancel());u-Math.abs(r)<-2*ie()&&e.cancel()}else e.last&&I&&r>0?Q.start({from:{val:le()},to:{val:0},config:{velocity:e.velocity,friction:50,tension:1e3}}):(e.last&&!e.canceled&&I&&("prev"===F.current&&de({type:"drag"}),"next"===F.current&&fe({type:"drag"})),!e.last||e.canceled||I||(o?!v&&$.current?Q.start({val:-ce(),config:Object.assign(Object.assign({},n.config.default),{velocity:e.velocity})}):fe({type:"drag"}):c?!v&&P.current?Q.start({val:0,config:Object.assign(Object.assign({},n.config.default),{velocity:e.velocity})}):de({type:"drag"}):Q.start({val:H.current,config:Object.assign(Object.assign({},n.config.default),{velocity:e.velocity})})),e.last&&e.canceled&&Q.start({val:H.current,config:Object.assign(Object.assign({},n.config.default),{velocity:e.velocity})}))}),{enabled:s&&!b&&!I||!!I&&!!j,axis:x,from:()=>I&&q.current?[-q.current.scrollLeft,-q.current.scrollTop]:[K.val.get(),K.val.get()]});function ge(){q.current&&(H.current=q.current["x"===x?"scrollLeft":"scrollTop"],0===q.current["x"===x?"scrollLeft":"scrollTop"]&&(P.current=!0,$.current=!1),q.current["x"===x?"scrollLeft":"scrollTop"]>0&&q.current["x"===x?"scrollLeft":"scrollTop"]<ce()&&(P.current=!1,$.current=!1),q.current["x"===x?"scrollLeft":"scrollTop"]===ce()&&(P.current=!1,$.current=!0))}function ve(t,n){let r=0;if(r="string"==typeof t?e.findIndex((e=>e.id===t)):t,r<0||r>=e.length){if(n)throw new Error(n);console.error(`The item doesn't exist; check that the id provided - ${t} - is correct.`),r=-1}return r}function pe({id:t,immediate:n,shouldReset:r,type:i}){if(!s||J.current)return;P.current=!1,$.current=!1;const c=ve(t,"The item you want to slide to doesn't exist; check the provided id.");if(c===A.current&&!r)return;const o=ve(e[A.current].id),u=ve(e[c].id);u>o?fe({type:i||r?"initial":"click",index:u,immediate:n}):de({type:i||r?"initial":"click",index:u,immediate:n})}function xe(t){const n=ve(t,"The item doesn't exist; check the provided id."),r=A.current;return v&&r===e.length-1?0===n:n===r+1}function be(t){const n=ve(t,"The item doesn't exist; check the provided id."),r=A.current;return v&&0===r?n===e.length-1:n===r-1}function ye(e){return ve(e,"The item you want to check doesn't exist; check the provided id.")===A.current}const Te=I?{useListenToCustomEvent:Z,enterFullscreen:te,exitFullscreen:ne,getIsFullscreen:re,slideToPrevItem:(e=!0)=>{de({type:"click",immediate:!e})},slideToNextItem:(e=!0)=>{fe({type:"click",immediate:!e})}}:{useListenToCustomEvent:Z,enterFullscreen:te,exitFullscreen:ne,getIsFullscreen:re,slideToPrevItem:(e=!0)=>{de({type:"click",immediate:!e})},slideToNextItem:(e=!0)=>{fe({type:"click",immediate:!e})},slideToItem:(e,t=!0)=>{pe({id:e,immediate:!t})},getIsNextItem:xe,getIsPrevItem:be,getIsActiveItem:ye};r.useEffect((()=>{C&&C({slideToNextItem:Te.slideToNextItem,slideToPrevItem:Te.slideToPrevItem,slideToItem:null==Te?void 0:Te.slideToItem})}),[C,Te.slideToItem,Te.slideToNextItem,Te.slideToPrevItem]);const Ie=t.jsx(d.Provider,Object.assign({value:Te},{children:_})),je=t.jsx(d.Provider,Object.assign({value:Te},{children:t.jsx("div",Object.assign({className:"use-spring-carousel-main-wrapper",ref:q},I?{onWheel(){K.val.stop(),ge()}}:{},{style:Object.assign({display:"flex",position:"relative",width:"100%",height:"100%"},I?"x"===x?{overflowX:"auto"}:{overflowY:"auto"}:{})},{children:t.jsxs("div",Object.assign({className:"use-spring-carousel-track-wrapper",ref:W},he(),{style:Object.assign({position:"relative",display:"flex",flexDirection:"x"===x?"row":"column",touchAction:"none"},function(){const e=`calc(100% - ${2*p}px)`;return{width:"x"===x?e:"100%",height:"y"===x?e:"100%"}}())},{children:[!I&&v||!p?null:t.jsx("div",{style:{flexShrink:0,width:p}}),U.map(((n,r)=>{return t.jsx("div",Object.assign({className:"use-spring-carousel-item","data-testid":"use-spring-carousel-item-wrapper",style:Object.assign({display:"flex",position:"relative",flex:"1"},(i=!!I&&r===e.length-1,"fixed"!==h||I?Object.assign({marginRight:`${i?0:g}px`}):{marginRight:`${i?0:g}px`,flex:`1 0 calc(100% / ${S} - ${g*(S-1)/S}px)`}))},{children:"function"==typeof n.renderItem?n.renderItem({getIsActiveItem:ye,getIsNextItem:xe,getIsPrevItem:be,useListenToCustomEvent:Z}):n.renderItem}),`${n.id}-${r}`);var i})),!I&&v||!p?null:t.jsx("div",{style:{flexShrink:0,width:"1px"}})]}))}))}));return Object.assign(Object.assign({},Te),{carouselFragment:je,thumbsFragment:Ie})},e.useSpringCarouselContext=function(){const e=r.useContext(d);if(!e)throw new Error("useSpringCarouselContext must be used within the carousel.");return e},e.useThumbsModule=a,e.useTransitionCarousel=function({init:e=!0,disableGestures:s=!1,items:c,springConfig:o=n.config.default,exitBeforeEnter:l=!1,trail:d,withLoop:h=!1,activeItem:g,toPrevItemSpringProps:v=f,toNextItemSpringProps:p=f,draggingSlideTreshold:x=50,thumbsSlideAxis:b="x"}){const y=r.useRef("next"),T=r.useRef("initial"),I=r.useRef(null),[j,w]=r.useState(null!=g?g:0),{emitEvent:R,useListenToCustomEvent:E}=u(),{handleScroll:O,thumbsFragment:C}=a({thumbsSlideAxis:b,items:c,renderThumbFnProps:{getIsNextItem:A,getIsPrevItem:P,useListenToCustomEvent:E,activeItem:{index:j,id:c[j].id}}});function S({to:e,slideType:t,slideMode:n}){y.current=t,T.current=n,R({eventName:"onSlideStartChange",slideActionType:y.current,slideMode:T.current,nextItem:{index:e,id:c[e].id,startReached:0===e,endReached:e===c.length-1}}),w(e),O(j)}function M(t){if(!e)return;const n=0===j;!h&&n||S(h&&n?{to:c.length-1,slideType:"prev",slideMode:t}:{to:j-1,slideType:"prev",slideMode:t})}function N(t){if(!e)return;const n=j===c.length-1;!h&&n||S(h&&n?{to:0,slideType:"next",slideMode:t}:{to:j+1,slideType:"next",slideMode:t})}r.useEffect((()=>{"number"==typeof g&&g!==j&&w(g)}),[g]);const F=n.useTransition(j,Object.assign(Object.assign({config:o,key:null,trail:d,exitBeforeEnter:l},"prev"===y.current?{initial:Object.assign({},v.initial),from:Object.assign({},v.from),enter:Object.assign({},v.enter),leave:Object.assign({},v.leave)}:"next"===y.current?{initial:Object.assign({},p.initial),from:Object.assign({},p.from),enter:Object.assign({},p.enter),leave:Object.assign({},p.leave)}:{initial:Object.assign({},f.initial),from:Object.assign({},f.from),enter:Object.assign({},f.enter),leave:Object.assign({},f.leave)}),{onRest(e,t,n){e.finished&&n===j&&R({eventName:"onSlideChange",slideActionType:y.current,slideMode:T.current,currentItem:{index:j,id:c[j].id,startReached:0===j,endReached:j===c.length-1}})}})),L=i.useDrag((({last:e,movement:[t]})=>{if(e){const e=t>x,n=t<-x,r=0===j,i=j===c.length-1;if(n){if(!h&&i)return;R({eventName:"onLeftSwipe"}),N("swipe")}else if(e){if(!h&&r)return;R({eventName:"onRightSwipe"}),M("swipe")}}}),{enabled:!s});function k(e,t){let n=0;if(n="string"==typeof e?c.findIndex((t=>t.id===e)):e,n<0||n>=c.length){if(t)throw new Error(t);console.error(`The item doesn't exist; check that the id provided - ${e} - is correct.`),n=-1}return n}function A(e){const t=k(e,"The item doesn't exist; check the provided id."),n=j;return h&&n===c.length-1?0===t:t===n+1}function P(e){const t=k(e,"The item doesn't exist; check the provided id."),n=j;return h&&0===n?t===c.length-1:t===n-1}const $=F(((e,r,i,s)=>{const o=c[r].renderItem;return t.jsx(n.a.div,Object.assign({id:`use-transition-carousel-item-${s}`,className:"use-transition-carousel-item",style:Object.assign(Object.assign({},e),{flex:"1 0 100%",width:"100%",height:"100%"})},{children:"function"==typeof o?o({useListenToCustomEvent:E,getIsNextItem:A,getIsPrevItem:P,activeItem:{index:j,id:c[j].id}}):o}))})),q={useListenToCustomEvent:E,slideToPrevItem:()=>M("click"),slideToNextItem:()=>N("click")},W=t.jsx(m.Provider,Object.assign({value:q},{children:C})),D=t.jsx(m.Provider,Object.assign({value:q},{children:t.jsx("div",Object.assign({ref:I},L(),{style:{display:"flex",position:"relative",width:"100%",height:"100%",overflow:"hidden"}},{children:$}))}));return Object.assign(Object.assign({},q),{carouselFragment:D,thumbsFragment:W})},e.useTransitionCarouselContext=function(){const e=r.useContext(m);if(!e)throw new Error("useTransitionCarouselContext must be used within the carousel.");return e}}));
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react/jsx-runtime"),require("@react-spring/web"),require("react"),require("@use-gesture/react"),require("screenfull"),require("resize-observer-polyfill")):"function"==typeof define&&define.amd?define(["exports","react/jsx-runtime","@react-spring/web","react","@use-gesture/react","screenfull","resize-observer-polyfill"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).ReactSpringCarousel={},e.ReactJSXRuntime,e.ReactSpring,e.React,e.UseGestureReact,e.Screenfull,e.ResizeObserver)}(this,(function(e,t,n,r,i,s,c){"use strict";const o="RSC::Event";function u(){const e=r.useRef(null);return{useListenToCustomEvent:function(t){r.useEffect((()=>{function n(e){t(e.detail)}if(e.current||(e.current=document.createElement("div")),e.current)return e.current.addEventListener(o,n,!1),()=>{var t;null===(t=e.current)||void 0===t||t.removeEventListener(o,n,!1)}}),[t])},emitEvent:function(t){if(e.current){const n=new CustomEvent(o,{detail:t});e.current.dispatchEvent(n)}}}}function l({mainCarouselWrapperRef:e,onFullScreenChange:t,handleResize:n}){const i=r.useRef(!1);function c(e){i.current=e}return r.useEffect((()=>{function e(){document.fullscreenElement&&(c(!0),t(!0),n&&n()),document.fullscreenElement||(c(!1),t(!1),n&&n())}if(s.isEnabled)return s.on("change",e),()=>{s.isEnabled&&s.off("change",e)}}),[]),{enterFullscreen:function(t){s.isEnabled&&s.request(t||e.current)},exitFullscreen:function(){s.isEnabled&&s.exit()},getIsFullscreen:function(){return i.current}}}function a({thumbsSlideAxis:e="x",withThumbs:i=!1,prepareThumbsData:s,items:c,renderThumbFnProps:o}){const u=r.useRef(null),[l,a]=n.useSpring((()=>({val:0})));function d(){var t;return Math.round(Number(null===(t=u.current)||void 0===t?void 0:t["x"===e?"scrollWidth":"scrollHeight"])-u.current.getBoundingClientRect()["x"===e?"width":"height"])}return{thumbsFragment:i?t.jsx("div",Object.assign({className:"use-spring-carousel-thumbs-wrapper",ref:u,onWheel:()=>l.val.stop(),style:Object.assign({display:"flex",flex:"1",position:"relative",width:"100%",height:"100%",flexDirection:"x"===e?"row":"column"},"x"===e?{overflowX:"auto"}:{overflowY:"auto",maxHeight:"100%"})},{children:function(){function e(e){return e.map((e=>({id:e.id,renderThumb:e.renderThumb})))}return s?s(e(c)):e(c)}().map((({id:e,renderThumb:n})=>{const r=`thumb-item-${e}`;return t.jsx("div",Object.assign({id:r,className:"thumb-item"},{children:"function"==typeof n?n(o):n}),r)}))})):null,handleScroll:function(t){var n,r;const i=u.current?u.current.querySelector(`#thumb-item-${c[t].id}`):null;if(i&&u.current&&!function(e){const t=e.getBoundingClientRect();return t.top>=0&&t.left>=0&&t.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&t.right<=(window.innerWidth||document.documentElement.clientWidth)}(i)){const t=i.offsetLeft,s=t>d()?d():t;a.start({from:{val:null!==(r=null===(n=u.current)||void 0===n?void 0:n["x"===e?"scrollLeft":"scrollTop"])&&void 0!==r?r:0},to:{val:s},onChange:({value:t})=>{u.current&&(u.current["x"===e?"scrollLeft":"scrollTop"]=Math.abs(t.val))}})}}}}const d=r.createContext(void 0);const f={initial:{opacity:1,position:"relative"},from:{opacity:0,position:"relative"},enter:{position:"relative",opacity:1},leave:{opacity:1,position:"absolute"}};const m=r.createContext(void 0);e.useEventsModule=u,e.useFullscreenModule=l,e.useSpringCarousel=function({items:e,init:s=!0,withThumbs:o,thumbsSlideAxis:f="x",itemsPerSlide:m=1,slideType:h="fixed",gutter:g=0,withLoop:v=!1,startEndGutter:p=0,carouselSlideAxis:x="x",disableGestures:b=!1,draggingSlideTreshold:y,slideWhenThresholdIsReached:T=!1,freeScroll:I,enableFreeScrollDrag:j,initialStartingPosition:w,prepareThumbsData:R,initialActiveItem:E=0,animateWhenActiveItemChange:O=!0,getControllerRef:C}){const S=m>e.length?e.length:m,M=r.useRef(!1),N=r.useRef(null!=y?y:0),F=r.useRef("initial"),L=r.useRef("initial"),k=r.useRef("initial"),A=r.useRef(E),P=r.useRef(0===E),$=r.useRef("fixed"===h&&E===e.length-1),q=r.useRef(null),W=r.useRef(null),D=r.useRef(!0),B=r.useRef(0),z=r.useRef(0),H=r.useRef(0),G=r.useRef(v),X=r.useRef(h),Y=r.useRef(I),J=r.useRef(!1),U=r.useCallback((()=>v?[...e.map((e=>Object.assign(Object.assign({},e),{id:`prev-repeated-item-${e.id}`}))),...e,...e.map((e=>Object.assign(Object.assign({},e),{id:`next-repeated-item-${e.id}`})))]:[...e]),[e,v])(),[K,Q]=n.useSpring((()=>({val:0,pause:!s,onChange:({value:e})=>{I&&q.current?("x"===x?q.current.scrollLeft=Math.abs(e.val):q.current.scrollTop=Math.abs(e.val),ge()):W.current&&(W.current.style.transform="x"===x?`translate3d(${e.val}px, 0px,0px)`:`translate3d(0px,${e.val}px,0px)`)}})),[I]),{emitEvent:V,useListenToCustomEvent:Z}=u(),{thumbsFragment:_,handleScroll:ee}=a({withThumbs:!!o,thumbsSlideAxis:f,prepareThumbsData:R,items:e,renderThumbFnProps:{getIsActiveItem:ye,getIsPrevItem:be,useListenToCustomEvent:Z,getIsNextItem:xe}}),{enterFullscreen:te,exitFullscreen:ne,getIsFullscreen:re}=l({mainCarouselWrapperRef:q,handleResize:()=>ue(),onFullScreenChange:e=>{V({eventName:"onFullscreenChange",isFullscreen:e})}});function ie(){var e;const t=null===(e=q.current)||void 0===e?void 0:e.querySelector(".use-spring-carousel-item");if(!t)throw Error("No carousel items available!");return t.getBoundingClientRect()["x"===x?"width":"height"]+g}function se({from:t,to:r,nextActiveItem:i,immediate:s=!1,slideMode:c}){L.current=c,"number"==typeof i&&(I||(A.current=i),V({eventName:"onSlideStartChange",slideActionType:F.current,slideMode:L.current,nextItem:{startReached:P.current,endReached:$.current,index:I?-1:A.current,id:I?"":e[A.current].id}})),H.current=r,Q.start({immediate:s,from:{val:t},to:{val:r},config:Object.assign(Object.assign({},n.config.default),{velocity:K.val.velocity}),onRest(t){!s&&t.finished&&V({eventName:"onSlideChange",slideActionType:F.current,slideMode:L.current,currentItem:{startReached:P.current,endReached:$.current,index:I?-1:A.current,id:I?"":e[A.current].id}})}}),o&&!s&&ee(A.current)}function ce(){var t;return v?ie()*e.length:Math.round(Number(null===(t=W.current)||void 0===t?void 0:t["x"===x?"scrollWidth":"scrollHeight"])-W.current.getBoundingClientRect()["x"===x?"width":"height"]-2*p)}function oe(){var e;const t=null===(e=W.current)||void 0===e?void 0:e.querySelector(".use-spring-carousel-item");if(!t)throw Error("No carousel items available!");return t.getBoundingClientRect()["x"===x?"width":"height"]+g}function ue(){const t="x"===x?"left":"top";function n(e){const n=W.current;n&&(v?(n.style.top="0px",n.style.left="0px",n.style[t]=`-${e-p}px`,P.current=!1,$.current=!1):(n.style.left="0px",n.style.top="0px"))}if("fixed"===h&&v&&n("center"===w?oe()*e.length-ie()*Math.round((S-1)/2):"end"===w?oe()*e.length-ie()*Math.round(S-1):oe()*e.length),"fluid"!==h){if(!I&&"fixed"===h){const e=-ie()*A.current;if(Math.abs(e)>ce()&&!v){const e=-ce();$.current=!0,H.current=e,Q.start({immediate:!0,val:H.current})}else H.current=e,Q.start({immediate:!0,val:e});setTimeout((()=>{M.current=!1}),0)}}else{if($.current&&ce()!==Math.abs(H.current)&&!v){const e=-ce();return H.current=e,void Q.start({immediate:!0,val:H.current})}if(Math.abs(H.current)>0&&ce()!==Math.abs(H.current)&&!v&&!I&&"backward"===k.current){const e=B.current-ce(),t=H.current+e;return Q.start({immediate:!0,val:t}),()=>{H.current=t}}}}function le(){return I&&q.current?q.current["x"===x?"scrollLeft":"scrollTop"]:K.val.get()}function ae(e,t){if(I&&"next"===e){const e=H.current+ie();return e>ce()?ce():e}if(I&&"prev"===e){const e=H.current-ie();return e<0?0:e}return"next"===e?"number"==typeof t?-t*ie():H.current-ie():"number"==typeof t?-t*ie():H.current+ie()}function de({type:t,index:n,immediate:r}){if(!s||J.current||P.current&&!v)return;$.current&&(k.current="backward"),F.current="prev",$.current=!1;const i="number"==typeof n?n:A.current-1;if(!v){const e=I?ae("prev",n)-ie()/3<0:ae("prev",n)+ie()/3>0;if(P.current)return;if(e)return P.current=!0,$.current=!1,void se({slideMode:t,from:le(),to:0,nextActiveItem:0,immediate:r})}if(v&&(P.current||i<0))return P.current=!1,$.current=!0,void se({slideMode:t,from:le()-ie()*e.length,to:-ie()*e.length+ie(),nextActiveItem:e.length-1,immediate:r});0===i&&(P.current=!0),i!==e.length-1&&-1!==i||($.current=!0),se({slideMode:t,from:le(),to:ae("prev",n),nextActiveItem:i,immediate:r})}function fe({type:t,index:n,immediate:r}){if(!s||J.current||$.current&&!v)return;P.current&&(k.current="forward"),F.current="next",P.current=!1;const i=n||A.current+1;if(!v){const e=Math.abs(ae("next",n))>ce()-ie()/3;if($.current)return;if(e)return P.current=!1,$.current=!0,void se({slideMode:t,from:le(),to:I?ce():-ce(),nextActiveItem:i,immediate:r})}if(v&&($.current||i>e.length-1))return $.current=!1,P.current=!0,void se({slideMode:t,from:le()+ie()*e.length,to:0,nextActiveItem:0,immediate:r});0===i&&(P.current=!0),i===e.length-1&&($.current=!0),se({slideMode:t,from:le(),to:ae("next",n),nextActiveItem:i,immediate:r})}function me(){return N.current=y||Math.floor(ie()/2/2),N.current}r.useEffect((()=>{A.current!==E&&pe({id:E,immediate:!O})}),[E]),r.useEffect((()=>{if(s){if(E>e.length-1)throw new Error(`initialActiveItem (${E}) is greater than the total quantity available items (${e.length}).`);S>e.length&&console.warn(`itemsPerSlide (${S}) is greater than the total quantity available items (${e.length}). Fallback to ${e.length})`)}}),[E,e,S,s]),r.useEffect((()=>{z.current=window.innerWidth}),[]),r.useEffect((()=>{B.current=ce(),D.current||(M.current=!0,ue())}),[w,S,p,g,s,ce]),r.useEffect((()=>{v===G.current&&h===X.current&&I===Y.current||(G.current=v,X.current=h,Y.current=I,W.current&&(W.current.style.transform="translate3d(0px, 0px,0px)",Q.start({val:0,immediate:!0})),pe({id:0,immediate:!0,shouldReset:!0}))}),[v,h,I]),r.useLayoutEffect((()=>{W.current&&ue()}),[]),r.useEffect((()=>{me()}),[y,S,h]),r.useEffect((()=>{if(q.current){let e;const t=new c((()=>{if(D.current)D.current=!1;else if(!J.current&&!M.current){z.current=window.innerWidth;const t=ue();window.clearTimeout(e),e=setTimeout((()=>{B.current=ce(),"function"==typeof t&&t()}),100)}}));return t.observe(q.current),()=>{t.disconnect()}}}),[ue,ce]),r.useEffect((()=>{if(s)return document.addEventListener("visibilitychange",e),()=>{document.removeEventListener("visibilitychange",e)};function e(){document.hidden?J.current=!0:J.current=!1}}),[s]);const he=i.useDrag((e=>{const t=e.dragging,r=e.offset["x"===x?0:1],i=e.movement["x"===x?0:1],s=e.direction["x"===x?0:1],c=i>me(),o=i<-me(),u=ce();if(t){if(F.current=s>0?"prev":"next",V(Object.assign(Object.assign({},e),{eventName:"onDrag",slideActionType:F.current})),I)return r>0?(Q.start({from:{val:le()},to:{val:0},config:{velocity:e.velocity,friction:50,tension:1e3}}),void e.cancel()):void Q.start({from:{val:le()},to:{val:-r},config:{velocity:e.velocity,friction:50,tension:1e3}});Q.start({val:r,config:{velocity:e.velocity,friction:50,tension:1e3}}),T&&o?(fe({type:"drag"}),e.cancel()):T&&c&&(de({type:"drag"}),e.cancel());u-Math.abs(r)<-2*ie()&&e.cancel()}else e.last&&I&&r>0?Q.start({from:{val:le()},to:{val:0},config:{velocity:e.velocity,friction:50,tension:1e3}}):(e.last&&!e.canceled&&I&&("prev"===F.current&&de({type:"drag"}),"next"===F.current&&fe({type:"drag"})),!e.last||e.canceled||I||(o?!v&&$.current?Q.start({val:-ce(),config:Object.assign(Object.assign({},n.config.default),{velocity:e.velocity})}):fe({type:"drag"}):c?!v&&P.current?Q.start({val:0,config:Object.assign(Object.assign({},n.config.default),{velocity:e.velocity})}):de({type:"drag"}):Q.start({val:H.current,config:Object.assign(Object.assign({},n.config.default),{velocity:e.velocity})})),e.last&&e.canceled&&Q.start({val:H.current,config:Object.assign(Object.assign({},n.config.default),{velocity:e.velocity})}))}),{enabled:s&&!b&&!I||!!I&&!!j,axis:x,from:()=>I&&q.current?[-q.current.scrollLeft,-q.current.scrollTop]:[K.val.get(),K.val.get()]});function ge(){q.current&&(H.current=q.current["x"===x?"scrollLeft":"scrollTop"],0===q.current["x"===x?"scrollLeft":"scrollTop"]&&(P.current=!0,$.current=!1),q.current["x"===x?"scrollLeft":"scrollTop"]>0&&q.current["x"===x?"scrollLeft":"scrollTop"]<ce()&&(P.current=!1,$.current=!1),q.current["x"===x?"scrollLeft":"scrollTop"]===ce()&&(P.current=!1,$.current=!0))}function ve(t,n){let r=0;if(r="string"==typeof t?e.findIndex((e=>e.id===t)):t,r<0||r>=e.length){if(n)throw new Error(n);console.error(`The item doesn't exist; check that the id provided - ${t} - is correct.`),r=-1}return r}function pe({id:t,immediate:n,shouldReset:r,type:i}){if(!s||J.current)return;P.current=!1,$.current=!1;const c=ve(t,"The item you want to slide to doesn't exist; check the provided id.");if(c===A.current&&!r)return;const o=ve(e[A.current].id),u=ve(e[c].id);u>o?fe({type:i||r?"initial":"click",index:u,immediate:n}):de({type:i||r?"initial":"click",index:u,immediate:n})}function xe(t){const n=ve(t,"The item doesn't exist; check the provided id."),r=A.current;return v&&r===e.length-1?0===n:n===r+1}function be(t){const n=ve(t,"The item doesn't exist; check the provided id."),r=A.current;return v&&0===r?n===e.length-1:n===r-1}function ye(e){return ve(e,"The item you want to check doesn't exist; check the provided id.")===A.current}const Te=I?{useListenToCustomEvent:Z,enterFullscreen:te,exitFullscreen:ne,getIsFullscreen:re,slideToPrevItem:(e=!0)=>{de({type:"click",immediate:!e})},slideToNextItem:(e=!0)=>{fe({type:"click",immediate:!e})}}:{useListenToCustomEvent:Z,enterFullscreen:te,exitFullscreen:ne,getIsFullscreen:re,slideToPrevItem:(e=!0)=>{de({type:"click",immediate:!e})},slideToNextItem:(e=!0)=>{fe({type:"click",immediate:!e})},slideToItem:(e,t=!0)=>{pe({id:e,immediate:!t})},getIsNextItem:xe,getIsPrevItem:be,getIsActiveItem:ye};r.useEffect((()=>{C&&C({slideToNextItem:Te.slideToNextItem,slideToPrevItem:Te.slideToPrevItem,slideToItem:null==Te?void 0:Te.slideToItem})}),[C,Te.slideToItem,Te.slideToNextItem,Te.slideToPrevItem]);const Ie=t.jsx(d.Provider,Object.assign({value:Te},{children:_})),je=t.jsx(d.Provider,Object.assign({value:Te},{children:t.jsx("div",Object.assign({className:"use-spring-carousel-main-wrapper",ref:q},I?{onWheel(){K.val.stop(),ge()}}:{},{style:Object.assign({display:"flex",position:"relative",width:"100%",height:"100%"},I?"x"===x?{overflowX:"auto"}:{overflowY:"auto"}:{})},{children:t.jsxs("div",Object.assign({className:"use-spring-carousel-track-wrapper",ref:W},he(),{style:Object.assign({position:"relative",display:"flex",flexDirection:"x"===x?"row":"column",touchAction:"none"},function(){const e=`calc(100% - ${2*p}px)`;return{width:"x"===x?e:"100%",height:"y"===x?e:"100%"}}())},{children:[!I&&v||!p?null:t.jsx("div",{style:{flexShrink:0,width:p}}),U.map(((n,r)=>{return t.jsx("div",Object.assign({className:"use-spring-carousel-item","data-testid":"use-spring-carousel-item-wrapper",style:Object.assign({display:"flex",position:"relative",flex:"1"},(i=n.id===e[U.length-1].id,"fixed"!==h||I?Object.assign({marginRight:`${i?0:g}px`}):{marginRight:`${i?0:g}px`,flex:`1 0 calc(100% / ${S} - ${g*(S-1)/S}px)`}))},{children:"function"==typeof n.renderItem?n.renderItem({getIsActiveItem:ye,getIsNextItem:xe,getIsPrevItem:be,useListenToCustomEvent:Z}):n.renderItem}),`${n.id}-${r}`);var i})),!I&&v||!p?null:t.jsx("div",{style:{flexShrink:0,width:p}})]}))}))}));return Object.assign(Object.assign({},Te),{carouselFragment:je,thumbsFragment:Ie})},e.useSpringCarouselContext=function(){const e=r.useContext(d);if(!e)throw new Error("useSpringCarouselContext must be used within the carousel.");return e},e.useThumbsModule=a,e.useTransitionCarousel=function({init:e=!0,disableGestures:s=!1,items:c,springConfig:o=n.config.default,exitBeforeEnter:l=!1,trail:d,withLoop:h=!1,activeItem:g,toPrevItemSpringProps:v=f,toNextItemSpringProps:p=f,draggingSlideTreshold:x=50,thumbsSlideAxis:b="x"}){const y=r.useRef("next"),T=r.useRef("initial"),I=r.useRef(null),[j,w]=r.useState(null!=g?g:0),{emitEvent:R,useListenToCustomEvent:E}=u(),{handleScroll:O,thumbsFragment:C}=a({thumbsSlideAxis:b,items:c,renderThumbFnProps:{getIsNextItem:A,getIsPrevItem:P,useListenToCustomEvent:E,activeItem:{index:j,id:c[j].id}}});function S({to:e,slideType:t,slideMode:n}){y.current=t,T.current=n,R({eventName:"onSlideStartChange",slideActionType:y.current,slideMode:T.current,nextItem:{index:e,id:c[e].id,startReached:0===e,endReached:e===c.length-1}}),w(e),O(j)}function M(t){if(!e)return;const n=0===j;!h&&n||S(h&&n?{to:c.length-1,slideType:"prev",slideMode:t}:{to:j-1,slideType:"prev",slideMode:t})}function N(t){if(!e)return;const n=j===c.length-1;!h&&n||S(h&&n?{to:0,slideType:"next",slideMode:t}:{to:j+1,slideType:"next",slideMode:t})}r.useEffect((()=>{"number"==typeof g&&g!==j&&w(g)}),[g]);const F=n.useTransition(j,Object.assign(Object.assign({config:o,key:null,trail:d,exitBeforeEnter:l},"prev"===y.current?{initial:Object.assign({},v.initial),from:Object.assign({},v.from),enter:Object.assign({},v.enter),leave:Object.assign({},v.leave)}:"next"===y.current?{initial:Object.assign({},p.initial),from:Object.assign({},p.from),enter:Object.assign({},p.enter),leave:Object.assign({},p.leave)}:{initial:Object.assign({},f.initial),from:Object.assign({},f.from),enter:Object.assign({},f.enter),leave:Object.assign({},f.leave)}),{onRest(e,t,n){e.finished&&n===j&&R({eventName:"onSlideChange",slideActionType:y.current,slideMode:T.current,currentItem:{index:j,id:c[j].id,startReached:0===j,endReached:j===c.length-1}})}})),L=i.useDrag((({last:e,movement:[t]})=>{if(e){const e=t>x,n=t<-x,r=0===j,i=j===c.length-1;if(n){if(!h&&i)return;R({eventName:"onLeftSwipe"}),N("swipe")}else if(e){if(!h&&r)return;R({eventName:"onRightSwipe"}),M("swipe")}}}),{enabled:!s});function k(e,t){let n=0;if(n="string"==typeof e?c.findIndex((t=>t.id===e)):e,n<0||n>=c.length){if(t)throw new Error(t);console.error(`The item doesn't exist; check that the id provided - ${e} - is correct.`),n=-1}return n}function A(e){const t=k(e,"The item doesn't exist; check the provided id."),n=j;return h&&n===c.length-1?0===t:t===n+1}function P(e){const t=k(e,"The item doesn't exist; check the provided id."),n=j;return h&&0===n?t===c.length-1:t===n-1}const $=F(((e,r,i,s)=>{const o=c[r].renderItem;return t.jsx(n.a.div,Object.assign({id:`use-transition-carousel-item-${s}`,className:"use-transition-carousel-item",style:Object.assign(Object.assign({},e),{flex:"1 0 100%",width:"100%",height:"100%"})},{children:"function"==typeof o?o({useListenToCustomEvent:E,getIsNextItem:A,getIsPrevItem:P,activeItem:{index:j,id:c[j].id}}):o}))})),q={useListenToCustomEvent:E,slideToPrevItem:()=>M("click"),slideToNextItem:()=>N("click")},W=t.jsx(m.Provider,Object.assign({value:q},{children:C})),D=t.jsx(m.Provider,Object.assign({value:q},{children:t.jsx("div",Object.assign({ref:I},L(),{style:{display:"flex",position:"relative",width:"100%",height:"100%",overflow:"hidden"}},{children:$}))}));return Object.assign(Object.assign({},q),{carouselFragment:D,thumbsFragment:W})},e.useTransitionCarouselContext=function(){const e=r.useContext(m);if(!e)throw new Error("useTransitionCarouselContext must be used within the carousel.");return e}}));
|
|
2
2
|
//# sourceMappingURL=index.js.map
|