react-spring-carousel 3.0.0-beta028 → 3.0.0-beta030

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":"index.js","sources":["../../src/modules/useEventsModule.ts","../../src/modules/useFullscreenModule.ts","../../src/modules/useThumbsModule.tsx","../../src/useSpringCarousel.tsx","../../src/useTransitionCarousel.tsx"],"sourcesContent":["import { FullGestureState } from '@use-gesture/react'\nimport { useEffect, useRef } from 'react'\nimport { SlideActionType, SlideMode, TransitionSlideMode } from '../types/common'\n\nconst eventLabel = 'RSC::Event'\n\ntype OnSlideStartChange<T> = {\n eventName: 'onSlideStartChange'\n slideActionType: SlideActionType\n slideMode: T extends 'use-spring' ? SlideMode : TransitionSlideMode\n nextItem: {\n index: number\n id: string\n startReached: boolean\n endReached: boolean\n }\n}\ntype OnSlideChange<T> = {\n eventName: 'onSlideChange'\n slideActionType: SlideActionType\n slideMode: T extends 'use-spring' ? SlideMode : TransitionSlideMode\n currentItem: {\n index: number\n id: string\n startReached: boolean\n endReached: boolean\n }\n}\ntype OnFullscreenChange = {\n eventName: 'onFullscreenChange'\n isFullscreen: boolean\n}\ntype OnDrag = Omit<FullGestureState<'drag'>, 'event'> & {\n eventName: 'onDrag'\n slideActionType: SlideActionType\n}\n\ntype OnLeftSwipe = {\n eventName: 'onLeftSwipe'\n}\n\ntype OnRightSwipe = {\n eventName: 'onRightSwipe'\n}\n\ntype SpringCarouselEvents<T> =\n | OnSlideStartChange<T>\n | OnSlideChange<T>\n | OnDrag\n | OnFullscreenChange\n\ntype TransitionCarouselEvents<T> =\n | OnSlideStartChange<T>\n | OnSlideChange<T>\n | OnFullscreenChange\n | OnLeftSwipe\n | OnRightSwipe\n\ntype Events<T> = T extends 'use-spring'\n ? SpringCarouselEvents<'use-spring'>\n : TransitionCarouselEvents<'use-transition'>\n\ntype EventHandler<T> = (props: Events<T>) => void\n\nexport type UseListenToCustomEvent<T> = {\n useListenToCustomEvent: (eventHandler: EventHandler<T>) => void\n emitEvent: (event: Events<T>) => void\n}\n\nexport function useEventsModule<T extends 'use-spring' | 'use-transition'>() {\n const targetEvent = useRef<HTMLDivElement | null>(null)\n\n function useListenToCustomEvent(eventHandler: EventHandler<T>) {\n useEffect(() => {\n if (!targetEvent.current) {\n targetEvent.current = document.createElement('div')\n }\n\n function handleEvent(event: CustomEvent<Events<T>>) {\n eventHandler(event.detail)\n }\n\n if (targetEvent.current) {\n // @ts-ignore\n targetEvent.current.addEventListener(eventLabel, handleEvent, false)\n return () => {\n // @ts-ignore\n targetEvent.current?.removeEventListener(eventLabel, handleEvent, false)\n }\n }\n }, [eventHandler])\n }\n function emitEvent(event: Events<T>) {\n if (targetEvent.current) {\n const newEvent = new CustomEvent(eventLabel, {\n detail: event,\n })\n targetEvent.current.dispatchEvent(newEvent)\n }\n }\n\n return {\n useListenToCustomEvent,\n emitEvent,\n }\n}\n","import { useRef, MutableRefObject, useEffect } from 'react'\nimport screenfull from 'screenfull'\n\ntype FullscreenModule = {\n mainCarouselWrapperRef: MutableRefObject<HTMLDivElement | null>\n handleResize?(): void\n onFullScreenChange(isFullscreen: boolean): void\n}\n\nexport function useFullscreenModule({\n mainCarouselWrapperRef,\n onFullScreenChange,\n handleResize,\n}: FullscreenModule) {\n const isFullscreen = useRef(false)\n\n useEffect(() => {\n function handleFullscreenChange() {\n if (document.fullscreenElement) {\n setIsFullscreen(true)\n onFullScreenChange(true)\n handleResize && handleResize()\n }\n\n if (!document.fullscreenElement) {\n setIsFullscreen(false)\n onFullScreenChange(false)\n handleResize && handleResize()\n }\n }\n\n if (screenfull.isEnabled) {\n screenfull.on('change', handleFullscreenChange)\n return () => {\n if (screenfull.isEnabled) {\n screenfull.off('change', handleFullscreenChange)\n }\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n function setIsFullscreen(_isFullscreen: boolean) {\n isFullscreen.current = _isFullscreen\n }\n\n function getIsFullscreen() {\n return isFullscreen.current\n }\n\n function enterFullscreen(elementRef?: HTMLElement) {\n if (screenfull.isEnabled) {\n screenfull.request((elementRef || mainCarouselWrapperRef.current) as Element)\n }\n }\n\n function exitFullscreen() {\n screenfull.isEnabled && screenfull.exit()\n }\n\n return {\n enterFullscreen,\n exitFullscreen,\n getIsFullscreen,\n }\n}\n","import { useSpring } from '@react-spring/web'\nimport { useRef } from 'react'\n\nimport { ItemWithThumb, PrepareThumbsData, SpringCarouselWithThumbs } from '../types'\n\ntype Props = {\n withThumbs?: boolean\n thumbsSlideAxis: SpringCarouselWithThumbs['thumbsSlideAxis']\n prepareThumbsData?: PrepareThumbsData\n items: ItemWithThumb[]\n}\n\nfunction isInViewport(el: HTMLElement) {\n const rect = el.getBoundingClientRect()\n return (\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&\n rect.right <= (window.innerWidth || document.documentElement.clientWidth)\n )\n}\n\nexport function useThumbsModule({\n thumbsSlideAxis = 'x',\n withThumbs = false,\n prepareThumbsData,\n items,\n}: Props) {\n const wrapperRef = useRef<HTMLDivElement | null>(null)\n const [spring, setSpring] = useSpring(() => ({\n val: 0,\n }))\n\n function getTotalScrollValue() {\n return Math.round(\n Number(\n wrapperRef.current?.[thumbsSlideAxis === 'x' ? 'scrollWidth' : 'scrollHeight'],\n ) -\n wrapperRef.current!.getBoundingClientRect()[\n thumbsSlideAxis === 'x' ? 'width' : 'height'\n ],\n )\n }\n\n function handleScroll(activeItem: number) {\n function getThumbNode() {\n if (wrapperRef.current) {\n return wrapperRef.current.querySelector(\n `#thumb-item-${items[activeItem].id}`,\n ) as HTMLElement\n }\n return null\n }\n\n const thumbNode = getThumbNode()\n if (thumbNode && wrapperRef.current) {\n if (!isInViewport(thumbNode)) {\n const offset = thumbNode.offsetLeft\n const val = offset > getTotalScrollValue() ? getTotalScrollValue() : offset\n\n setSpring.start({\n from: {\n val:\n wrapperRef.current?.[\n thumbsSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] ?? 0,\n },\n to: {\n val,\n },\n onChange: ({ value }) => {\n if (wrapperRef.current) {\n wrapperRef.current[thumbsSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'] =\n Math.abs(value.val)\n }\n },\n })\n }\n }\n }\n\n function handlePrepareThumbsData() {\n function getPreparedItems(\n _items: ReturnType<PrepareThumbsData>,\n ): ReturnType<PrepareThumbsData> {\n return _items.map(i => ({\n id: i.id,\n renderThumb: i.renderThumb,\n }))\n }\n\n if (prepareThumbsData) {\n return prepareThumbsData(getPreparedItems(items))\n }\n return getPreparedItems(items)\n }\n\n const thumbsFragment = withThumbs ? (\n <div\n className=\"use-spring-carousel-thumbs-wrapper\"\n ref={wrapperRef}\n onWheel={() => spring.val.stop()}\n style={{\n display: 'flex',\n flex: '1',\n position: 'relative',\n width: '100%',\n height: '100%',\n flexDirection: thumbsSlideAxis === 'x' ? 'row' : 'column',\n ...(thumbsSlideAxis === 'x'\n ? { overflowX: 'auto' }\n : {\n overflowY: 'auto',\n maxHeight: '100%',\n }),\n }}\n >\n {handlePrepareThumbsData().map(({ id, renderThumb }) => {\n const thumbId = `thumb-item-${id}`\n return (\n <div key={thumbId} id={thumbId} className=\"thumb-item\">\n {renderThumb}\n </div>\n )\n })}\n </div>\n ) : null\n\n return {\n thumbsFragment,\n handleScroll,\n }\n}\n","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 {\n SlideActionType,\n SlideMode,\n UseSpringCarouselComplete,\n SpringCarouselWithThumbs,\n UseSpringCarouselWithFreeScroll,\n UseSpringCarouselWithThumbs,\n UseSpringCarouselWithNoThumbs,\n UseSpringCarouselWithNoFixedItems,\n UseSpringCarouselWithFixedItems,\n UseSpringFreeScrollReturnType,\n UseSpringReturnType,\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}: UseSpringCarouselComplete): ReturnType<typeof freeScroll> {\n const itemsPerSlide = _itemsPerSlide > items.length ? items.length : _itemsPerSlide\n const prevWindowWidth = useRef(0)\n const draggingSlideTreshold = useRef(_draggingSlideTreshold ?? 0)\n const slideActionType = useRef<SlideActionType>('initial')\n const slideModeType = useRef<SlideMode>('initial')\n const prevSlidedValue = useRef(0)\n const [spring, setSpring] = useSpring(() => ({\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 const activeItem = useRef(initialActiveItem)\n const firstItemReached = useRef(initialActiveItem === 0)\n const lastItemReached = useRef(false)\n const mainCarouselWrapperRef = useRef<HTMLDivElement | null>(null)\n const carouselTrackWrapperRef = useRef<HTMLDivElement | null>(null)\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 { emitEvent, useListenToCustomEvent } = useEventsModule<'use-spring'>()\n const { thumbsFragment, handleScroll } = useThumbsModule({\n withThumbs: !!withThumbs,\n thumbsSlideAxis,\n prepareThumbsData,\n items: items as SpringCarouselWithThumbs['items'],\n })\n const { enterFullscreen, exitFullscreen, getIsFullscreen } = useFullscreenModule({\n mainCarouselWrapperRef,\n handleResize: () => {\n console.log('resize')\n adjustCarouselWrapperPosition()\n },\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: 'click' | 'drag'\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\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 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 } else {\n ref.style.left = '0px'\n ref.style.top = '0px'\n }\n }\n\n const currentFromValue = Math.abs(getFromValue())\n\n if (\n currentFromValue < getTotalScrollValue() &&\n lastItemReached.current &&\n !withLoop\n ) {\n lastItemReached.current = false\n }\n if (currentFromValue > getTotalScrollValue() && !withLoop) {\n const val = -getTotalScrollValue()\n lastItemReached.current = true\n prevSlidedValue.current = val\n setSpring.start({\n immediate: true,\n val,\n })\n return\n }\n\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 if (!freeScroll && slideType === 'fixed') {\n const val = -(getSlideValue() * activeItem.current)\n prevSlidedValue.current = val\n setSpring.start({\n immediate: true,\n val,\n })\n }\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 (index) {\n return -(index * getSlideValue())\n }\n return prevSlidedValue.current - getSlideValue()\n }\n\n if (index) {\n return -(index * getSlideValue())\n }\n return prevSlidedValue.current + getSlideValue()\n }\n function slideToPrevItem(\n type: Exclude<SlideMode, 'initial'> = 'click',\n index?: number,\n ) {\n if (!init || (firstItemReached.current && !withLoop)) return\n\n slideActionType.current = 'prev'\n lastItemReached.current = false\n\n const nextItem = 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 })\n return\n }\n }\n if (withLoop && firstItemReached.current) {\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 })\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 })\n }\n function slideToNextItem(\n type: Exclude<SlideMode, 'initial'> = 'click',\n index?: number,\n ) {\n if (!init || (lastItemReached.current && !withLoop)) return\n\n slideActionType.current = 'next'\n firstItemReached.current = false\n\n const nextItem = index || activeItem.current + 1\n console.log({ nextItem })\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 })\n return\n }\n }\n if (withLoop && lastItemReached.current) {\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 })\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 })\n }\n\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 adjustCarouselWrapperPosition()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n initialStartingPosition,\n itemsPerSlide,\n withLoop,\n startEndGutter,\n gutter,\n freeScroll,\n slideType,\n init,\n ])\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 if (_draggingSlideTreshold) {\n draggingSlideTreshold.current = _draggingSlideTreshold\n } else {\n draggingSlideTreshold.current = Math.floor(getSlideValue() / 2 / 2)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [_draggingSlideTreshold])\n useEffect(() => {\n function handleResize() {\n if (window.innerWidth === prevWindowWidth.current) return\n prevWindowWidth.current = window.innerWidth\n adjustCarouselWrapperPosition()\n }\n if ('ResizeObserver' in window && mainCarouselWrapperRef.current) {\n const observer = new ResizeObserver(() => {\n prevWindowWidth.current = window.innerWidth\n adjustCarouselWrapperPosition()\n })\n observer.observe(mainCarouselWrapperRef.current)\n return () => {\n observer.disconnect()\n }\n } else {\n window.addEventListener('resize', handleResize)\n return () => {\n window.removeEventListener('resize', handleResize)\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n carouselSlideAxis,\n initialStartingPosition,\n itemsPerSlide,\n withLoop,\n startEndGutter,\n gutter,\n freeScroll,\n slideType,\n init,\n ])\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 > draggingSlideTreshold.current\n const nextItemTreshold = currentMovement < -draggingSlideTreshold.current\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 (slideActionType.current === 'prev' && movement > 0) {\n state.cancel()\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\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('drag')\n state.cancel()\n } else if (slideWhenThresholdIsReached && prevItemTreshold) {\n slideToPrevItem('drag')\n state.cancel()\n }\n return\n }\n\n if (state.last && !state.canceled && freeScroll) {\n if (slideActionType.current === 'prev') {\n slideToPrevItem('drag')\n }\n if (slideActionType.current === 'next') {\n slideToNextItem('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('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('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 },\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 function internalSlideToItem(id: string | number) {\n if (!init) 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) {\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('click', newActiveItem)\n } else {\n slideToPrevItem('click', newActiveItem)\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: () => slideToPrevItem(),\n slideToNextItem: () => slideToNextItem(),\n }\n : {\n useListenToCustomEvent,\n enterFullscreen,\n exitFullscreen,\n getIsFullscreen,\n slideToPrevItem: () => slideToPrevItem(),\n slideToNextItem: () => slideToNextItem(),\n slideToItem: internalSlideToItem,\n getIsNextItem,\n getIsPrevItem,\n getIsActiveItem,\n }\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 && 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 {item.renderItem}\n </div>\n )\n })}\n {freeScroll && 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 =\n createContext<ContextProps | ContextProps<'free-scroll'> | undefined>(undefined)\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","import { a, config, useTransition } from '@react-spring/web'\nimport { useEffect, useRef, useState, createContext, useContext } from 'react'\nimport { useEventsModule } from './modules/useEventsModule'\nimport { useDrag } from '@use-gesture/react'\nimport { useThumbsModule } from './modules'\nimport {\n ItemWithThumb,\n UseTransitionCarouselProps,\n UseTransitionCarouselReturnProps,\n SlideActionType,\n TransitionSlideMode,\n} from './types'\n\nconst defaultAnimationProps = {\n initial: {\n opacity: 1,\n position: 'relative',\n },\n from: {\n opacity: 0,\n position: 'relative',\n },\n enter: {\n position: 'relative',\n opacity: 1,\n },\n leave: {\n opacity: 1,\n position: 'absolute',\n },\n}\n\nfunction useTransitionCarousel({\n init = true,\n disableGestures = false,\n items,\n springConfig = config.default,\n exitBeforeEnter = false,\n trail,\n withLoop = false,\n activeItem: externalActiveItem,\n toPrevItemSpringProps = defaultAnimationProps,\n toNextItemSpringProps = defaultAnimationProps,\n draggingSlideTreshold = 50,\n thumbsSlideAxis = 'x',\n}: UseTransitionCarouselProps): UseTransitionCarouselReturnProps {\n const slideActionType = useRef<SlideActionType>('next')\n const slideModeType = useRef<TransitionSlideMode>('initial')\n const mainCarouselWrapperRef = useRef<HTMLDivElement | null>(null)\n const [activeItem, setActiveItem] = useState(externalActiveItem ?? 0)\n const { emitEvent, useListenToCustomEvent } = useEventsModule<'use-transition'>()\n const { handleScroll, thumbsFragment } = useThumbsModule({\n thumbsSlideAxis,\n items: items as ItemWithThumb[],\n })\n\n function getConfig() {\n if (slideActionType.current === 'prev') {\n return {\n initial: {\n ...toPrevItemSpringProps.initial,\n },\n from: {\n ...toPrevItemSpringProps.from,\n },\n enter: {\n ...toPrevItemSpringProps.enter,\n },\n leave: {\n ...toPrevItemSpringProps.leave,\n },\n }\n }\n if (slideActionType.current === 'next') {\n return {\n initial: {\n ...toNextItemSpringProps.initial,\n },\n from: {\n ...toNextItemSpringProps.from,\n },\n enter: {\n ...toNextItemSpringProps.enter,\n },\n leave: {\n ...toNextItemSpringProps.leave,\n },\n }\n }\n return {\n initial: {\n ...defaultAnimationProps.initial,\n },\n from: {\n ...defaultAnimationProps.from,\n },\n enter: {\n ...defaultAnimationProps.enter,\n },\n leave: {\n ...defaultAnimationProps.leave,\n },\n }\n }\n\n useEffect(() => {\n if (typeof externalActiveItem === 'number' && externalActiveItem !== activeItem) {\n setActiveItem(externalActiveItem)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [externalActiveItem])\n\n type SlideToItem = {\n to: number\n slideType: SlideActionType\n slideMode: TransitionSlideMode\n }\n\n function slideToItem({ to, slideType, slideMode }: SlideToItem) {\n slideActionType.current = slideType\n slideModeType.current = slideMode\n emitEvent({\n eventName: 'onSlideStartChange',\n slideActionType: slideActionType.current,\n slideMode: slideModeType.current,\n nextItem: {\n index: to,\n id: items[to].id,\n startReached: to === 0,\n endReached: to === items.length - 1,\n },\n })\n setActiveItem(to)\n handleScroll(activeItem)\n }\n\n function slideToPrevItem(slideMode: TransitionSlideMode) {\n if (!init) return\n const isFirstItem = activeItem === 0\n\n if (!withLoop && isFirstItem) return\n\n if (withLoop && isFirstItem) {\n slideToItem({\n to: items.length - 1,\n slideType: 'prev',\n slideMode,\n })\n } else {\n slideToItem({\n to: activeItem - 1,\n slideType: 'prev',\n slideMode,\n })\n }\n }\n function slideToNextItem(slideMode: TransitionSlideMode) {\n if (!init) return\n const isLastItem = activeItem === items.length - 1\n\n if (!withLoop && isLastItem) return\n\n if (withLoop && isLastItem) {\n slideToItem({\n to: 0,\n slideType: 'next',\n slideMode,\n })\n } else {\n slideToItem({\n to: activeItem + 1,\n slideType: 'next',\n slideMode,\n })\n }\n }\n\n const transitions = useTransition(activeItem, {\n config: springConfig,\n key: null,\n trail,\n exitBeforeEnter,\n ...getConfig(),\n onRest(value, _, index) {\n if (value.finished && index === activeItem) {\n emitEvent({\n eventName: 'onSlideChange',\n slideActionType: slideActionType.current,\n slideMode: slideModeType.current,\n currentItem: {\n index: activeItem,\n id: items[activeItem].id,\n startReached: activeItem === 0,\n endReached: activeItem === items.length - 1,\n },\n })\n }\n },\n })\n\n const bindSwipe = useDrag(\n ({ last, movement: [mx] }) => {\n if (last) {\n const prevItemTreshold = mx > draggingSlideTreshold\n const nextItemTreshold = mx < -draggingSlideTreshold\n const isFirstItem = activeItem === 0\n const isLastItem = activeItem === items.length - 1\n\n if (nextItemTreshold) {\n if (!withLoop && isLastItem) return\n\n emitEvent({\n eventName: 'onLeftSwipe',\n })\n slideToNextItem('swipe')\n } else if (prevItemTreshold) {\n if (!withLoop && isFirstItem) return\n\n emitEvent({\n eventName: 'onRightSwipe',\n })\n slideToPrevItem('swipe')\n }\n }\n },\n {\n enabled: !disableGestures,\n },\n )\n\n const itemsFragment = transitions((styles, item, _, indx) => {\n return (\n <a.div\n id={`use-transition-carousel-item-${indx}`}\n className=\"use-transition-carousel-item\"\n style={{\n ...styles,\n flex: '1 0 100%',\n width: '100%',\n height: '100%',\n }}\n >\n {items[item].renderItem}\n </a.div>\n )\n })\n\n const res = {\n useListenToCustomEvent,\n slideToPrevItem: () => slideToPrevItem('click'),\n slideToNextItem: () => slideToNextItem('click'),\n }\n\n const _thumbsFragment = (\n <Context.Provider value={res}>{thumbsFragment}</Context.Provider>\n )\n const carouselFragment = (\n <Context.Provider value={res}>\n <div\n ref={mainCarouselWrapperRef}\n {...bindSwipe()}\n style={{\n display: 'flex',\n position: 'relative',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n {itemsFragment}\n </div>\n </Context.Provider>\n )\n\n return {\n ...res,\n carouselFragment,\n thumbsFragment: _thumbsFragment,\n }\n}\n\ntype ContextProps = Omit<\n UseTransitionCarouselReturnProps,\n 'carouselFragment' | 'thumbsFragment'\n>\n\nconst Context = createContext<ContextProps | undefined>(undefined)\n\nfunction useTransitionCarouselContext() {\n const context = useContext(Context)\n if (!context) {\n throw new Error('useTransitionCarouselContext must be used within the carousel.')\n }\n return context\n}\n\nexport { useTransitionCarousel, useTransitionCarouselContext }\n"],"names":["eventLabel","useEventsModule","targetEvent","useRef","useListenToCustomEvent","eventHandler","useEffect","handleEvent","event","detail","current","document","createElement","addEventListener","_a","removeEventListener","emitEvent","newEvent","CustomEvent","dispatchEvent","useFullscreenModule","mainCarouselWrapperRef","onFullScreenChange","handleResize","isFullscreen","setIsFullscreen","_isFullscreen","handleFullscreenChange","fullscreenElement","screenfull","isEnabled","on","off","enterFullscreen","elementRef","request","exitFullscreen","exit","getIsFullscreen","useThumbsModule","thumbsSlideAxis","withThumbs","prepareThumbsData","items","wrapperRef","spring","setSpring","useSpring","val","getTotalScrollValue","Math","round","Number","getBoundingClientRect","thumbsFragment","_jsx","jsx","Object","assign","className","ref","onWheel","stop","style","display","flex","position","width","height","flexDirection","overflowX","overflowY","maxHeight","children","getPreparedItems","_items","map","i","id","renderThumb","handlePrepareThumbsData","thumbId","handleScroll","activeItem","thumbNode","querySelector","el","rect","top","left","bottom","window","innerHeight","documentElement","clientHeight","right","innerWidth","clientWidth","isInViewport","offset","offsetLeft","start","from","to","onChange","value","abs","Context","createContext","undefined","defaultAnimationProps","initial","opacity","enter","leave","init","itemsPerSlide","_itemsPerSlide","slideType","gutter","withLoop","startEndGutter","carouselSlideAxis","disableGestures","draggingSlideTreshold","_draggingSlideTreshold","slideWhenThresholdIsReached","freeScroll","enableFreeScrollDrag","initialStartingPosition","initialActiveItem","length","prevWindowWidth","slideActionType","slideModeType","prevSlidedValue","pause","scrollLeft","scrollTop","setStartEndItemReachedOnFreeScroll","carouselTrackWrapperRef","transform","firstItemReached","lastItemReached","internalItems","useCallback","getItems","console","log","adjustCarouselWrapperPosition","eventName","getSlideValue","carouselItem","Error","slideToItem","nextActiveItem","immediate","slideMode","nextItem","startReached","endReached","index","config","default","velocity","onRest","finished","currentItem","getCarouselItemWidth","positionProperty","setPosition","v","currentFromValue","getFromValue","get","getToValue","type","next","slideToPrevItem","nextItemWillExceed","slideToNextItem","warn","useLayoutEffect","floor","observer","ResizeObserver","observe","disconnect","bindDrag","useDrag","state","isDragging","dragging","movement","currentMovement","direction","prevItemTreshold","nextItemTreshold","cancel","friction","tension","last","canceled","enabled","axis","findItemIndex","error","itemIndex","findIndex","item","res","newActiveItem","getIsNextItem","_activeItem","getIsPrevItem","getIsActiveItem","_thumbsFragment","Provider","carouselFragment","_jsxs","touchAction","percentValue","getAnimatedWrapperStyles","flexShrink","isLastItem","marginRight","renderItem","context","useContext","springConfig","exitBeforeEnter","trail","externalActiveItem","toPrevItemSpringProps","toNextItemSpringProps","setActiveItem","useState","isFirstItem","transitions","useTransition","key","_","bindSwipe","mx","itemsFragment","styles","indx","a","div","overflow"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/modules/useEventsModule.ts","../../src/modules/useFullscreenModule.ts","../../src/modules/useThumbsModule.tsx","../../src/useSpringCarousel.tsx","../../src/useTransitionCarousel.tsx"],"sourcesContent":["import { FullGestureState } from '@use-gesture/react'\nimport { useEffect, useRef } from 'react'\nimport { SlideActionType, SlideMode, TransitionSlideMode } from '../types/common'\n\nconst eventLabel = 'RSC::Event'\n\ntype OnSlideStartChange<T> = {\n eventName: 'onSlideStartChange'\n slideActionType: SlideActionType\n slideMode: T extends 'use-spring' ? SlideMode : TransitionSlideMode\n nextItem: {\n index: number\n id: string\n startReached: boolean\n endReached: boolean\n }\n}\ntype OnSlideChange<T> = {\n eventName: 'onSlideChange'\n slideActionType: SlideActionType\n slideMode: T extends 'use-spring' ? SlideMode : TransitionSlideMode\n currentItem: {\n index: number\n id: string\n startReached: boolean\n endReached: boolean\n }\n}\ntype OnFullscreenChange = {\n eventName: 'onFullscreenChange'\n isFullscreen: boolean\n}\ntype OnDrag = Omit<FullGestureState<'drag'>, 'event'> & {\n eventName: 'onDrag'\n slideActionType: SlideActionType\n}\n\ntype OnLeftSwipe = {\n eventName: 'onLeftSwipe'\n}\n\ntype OnRightSwipe = {\n eventName: 'onRightSwipe'\n}\n\ntype SpringCarouselEvents<T> =\n | OnSlideStartChange<T>\n | OnSlideChange<T>\n | OnDrag\n | OnFullscreenChange\n\ntype TransitionCarouselEvents<T> =\n | OnSlideStartChange<T>\n | OnSlideChange<T>\n | OnFullscreenChange\n | OnLeftSwipe\n | OnRightSwipe\n\ntype Events<T> = T extends 'use-spring'\n ? SpringCarouselEvents<'use-spring'>\n : TransitionCarouselEvents<'use-transition'>\n\ntype EventHandler<T> = (props: Events<T>) => void\n\nexport type UseListenToCustomEvent<T> = {\n useListenToCustomEvent: (eventHandler: EventHandler<T>) => void\n emitEvent: (event: Events<T>) => void\n}\n\nexport function useEventsModule<T extends 'use-spring' | 'use-transition'>() {\n const targetEvent = useRef<HTMLDivElement | null>(null)\n\n function useListenToCustomEvent(eventHandler: EventHandler<T>) {\n useEffect(() => {\n if (!targetEvent.current) {\n targetEvent.current = document.createElement('div')\n }\n\n function handleEvent(event: CustomEvent<Events<T>>) {\n eventHandler(event.detail)\n }\n\n if (targetEvent.current) {\n // @ts-ignore\n targetEvent.current.addEventListener(eventLabel, handleEvent, false)\n return () => {\n // @ts-ignore\n targetEvent.current?.removeEventListener(eventLabel, handleEvent, false)\n }\n }\n }, [eventHandler])\n }\n function emitEvent(event: Events<T>) {\n if (targetEvent.current) {\n const newEvent = new CustomEvent(eventLabel, {\n detail: event,\n })\n targetEvent.current.dispatchEvent(newEvent)\n }\n }\n\n return {\n useListenToCustomEvent,\n emitEvent,\n }\n}\n","import { useRef, MutableRefObject, useEffect } from 'react'\nimport screenfull from 'screenfull'\n\ntype FullscreenModule = {\n mainCarouselWrapperRef: MutableRefObject<HTMLDivElement | null>\n handleResize?(): void\n onFullScreenChange(isFullscreen: boolean): void\n}\n\nexport function useFullscreenModule({\n mainCarouselWrapperRef,\n onFullScreenChange,\n handleResize,\n}: FullscreenModule) {\n const isFullscreen = useRef(false)\n\n useEffect(() => {\n function handleFullscreenChange() {\n if (document.fullscreenElement) {\n setIsFullscreen(true)\n onFullScreenChange(true)\n handleResize && handleResize()\n }\n\n if (!document.fullscreenElement) {\n setIsFullscreen(false)\n onFullScreenChange(false)\n handleResize && handleResize()\n }\n }\n\n if (screenfull.isEnabled) {\n screenfull.on('change', handleFullscreenChange)\n return () => {\n if (screenfull.isEnabled) {\n screenfull.off('change', handleFullscreenChange)\n }\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n function setIsFullscreen(_isFullscreen: boolean) {\n isFullscreen.current = _isFullscreen\n }\n\n function getIsFullscreen() {\n return isFullscreen.current\n }\n\n function enterFullscreen(elementRef?: HTMLElement) {\n if (screenfull.isEnabled) {\n screenfull.request((elementRef || mainCarouselWrapperRef.current) as Element)\n }\n }\n\n function exitFullscreen() {\n screenfull.isEnabled && screenfull.exit()\n }\n\n return {\n enterFullscreen,\n exitFullscreen,\n getIsFullscreen,\n }\n}\n","import { useSpring } from '@react-spring/web'\nimport { useRef } from 'react'\n\nimport { ItemWithThumb, PrepareThumbsData, SpringCarouselWithThumbs } from '../types'\n\ntype Props = {\n withThumbs?: boolean\n thumbsSlideAxis: SpringCarouselWithThumbs['thumbsSlideAxis']\n prepareThumbsData?: PrepareThumbsData\n items: ItemWithThumb[]\n}\n\nfunction isInViewport(el: HTMLElement) {\n const rect = el.getBoundingClientRect()\n return (\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&\n rect.right <= (window.innerWidth || document.documentElement.clientWidth)\n )\n}\n\nexport function useThumbsModule({\n thumbsSlideAxis = 'x',\n withThumbs = false,\n prepareThumbsData,\n items,\n}: Props) {\n const wrapperRef = useRef<HTMLDivElement | null>(null)\n const [spring, setSpring] = useSpring(() => ({\n val: 0,\n }))\n\n function getTotalScrollValue() {\n return Math.round(\n Number(\n wrapperRef.current?.[thumbsSlideAxis === 'x' ? 'scrollWidth' : 'scrollHeight'],\n ) -\n wrapperRef.current!.getBoundingClientRect()[\n thumbsSlideAxis === 'x' ? 'width' : 'height'\n ],\n )\n }\n\n function handleScroll(activeItem: number) {\n function getThumbNode() {\n if (wrapperRef.current) {\n return wrapperRef.current.querySelector(\n `#thumb-item-${items[activeItem].id}`,\n ) as HTMLElement\n }\n return null\n }\n\n const thumbNode = getThumbNode()\n if (thumbNode && wrapperRef.current) {\n if (!isInViewport(thumbNode)) {\n const offset = thumbNode.offsetLeft\n const val = offset > getTotalScrollValue() ? getTotalScrollValue() : offset\n\n setSpring.start({\n from: {\n val:\n wrapperRef.current?.[\n thumbsSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] ?? 0,\n },\n to: {\n val,\n },\n onChange: ({ value }) => {\n if (wrapperRef.current) {\n wrapperRef.current[thumbsSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'] =\n Math.abs(value.val)\n }\n },\n })\n }\n }\n }\n\n function handlePrepareThumbsData() {\n function getPreparedItems(\n _items: ReturnType<PrepareThumbsData>,\n ): ReturnType<PrepareThumbsData> {\n return _items.map(i => ({\n id: i.id,\n renderThumb: i.renderThumb,\n }))\n }\n\n if (prepareThumbsData) {\n return prepareThumbsData(getPreparedItems(items))\n }\n return getPreparedItems(items)\n }\n\n const thumbsFragment = withThumbs ? (\n <div\n className=\"use-spring-carousel-thumbs-wrapper\"\n ref={wrapperRef}\n onWheel={() => spring.val.stop()}\n style={{\n display: 'flex',\n flex: '1',\n position: 'relative',\n width: '100%',\n height: '100%',\n flexDirection: thumbsSlideAxis === 'x' ? 'row' : 'column',\n ...(thumbsSlideAxis === 'x'\n ? { overflowX: 'auto' }\n : {\n overflowY: 'auto',\n maxHeight: '100%',\n }),\n }}\n >\n {handlePrepareThumbsData().map(({ id, renderThumb }) => {\n const thumbId = `thumb-item-${id}`\n return (\n <div key={thumbId} id={thumbId} className=\"thumb-item\">\n {renderThumb}\n </div>\n )\n })}\n </div>\n ) : null\n\n return {\n thumbsFragment,\n handleScroll,\n }\n}\n","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 {\n SlideActionType,\n SlideMode,\n UseSpringCarouselComplete,\n SpringCarouselWithThumbs,\n UseSpringCarouselWithFreeScroll,\n UseSpringCarouselWithThumbs,\n UseSpringCarouselWithNoThumbs,\n UseSpringCarouselWithNoFixedItems,\n UseSpringCarouselWithFixedItems,\n UseSpringFreeScrollReturnType,\n UseSpringReturnType,\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}: UseSpringCarouselComplete): ReturnType<typeof freeScroll> {\n const itemsPerSlide = _itemsPerSlide > items.length ? items.length : _itemsPerSlide\n const prevWindowWidth = useRef(0)\n const draggingSlideTreshold = useRef(_draggingSlideTreshold ?? 0)\n const slideActionType = useRef<SlideActionType>('initial')\n const slideModeType = useRef<SlideMode>('initial')\n const prevSlidedValue = useRef(0)\n const [spring, setSpring] = useSpring(() => ({\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 const activeItem = useRef(initialActiveItem)\n const firstItemReached = useRef(initialActiveItem === 0)\n const lastItemReached = useRef(false)\n const mainCarouselWrapperRef = useRef<HTMLDivElement | null>(null)\n const carouselTrackWrapperRef = useRef<HTMLDivElement | null>(null)\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 { emitEvent, useListenToCustomEvent } = useEventsModule<'use-spring'>()\n const { thumbsFragment, handleScroll } = useThumbsModule({\n withThumbs: !!withThumbs,\n thumbsSlideAxis,\n prepareThumbsData,\n items: items as SpringCarouselWithThumbs['items'],\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: 'click' | 'drag'\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 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,\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 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 } else {\n ref.style.left = '0px'\n ref.style.top = '0px'\n }\n }\n\n const currentFromValue = Math.abs(getFromValue())\n\n if (\n currentFromValue < getTotalScrollValue() &&\n slideType === 'fluid' &&\n lastItemReached.current &&\n !withLoop\n ) {\n lastItemReached.current = false\n }\n if (currentFromValue > getTotalScrollValue() && !withLoop) {\n const val = -getTotalScrollValue()\n lastItemReached.current = true\n prevSlidedValue.current = val\n setSpring.start({\n immediate: true,\n val,\n })\n return\n }\n\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 if (!freeScroll && slideType === 'fixed') {\n const val = -(getSlideValue() * activeItem.current)\n prevSlidedValue.current = val\n setSpring.start({\n immediate: true,\n val,\n })\n }\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 function slideToPrevItem(\n type: Exclude<SlideMode, 'initial'> = 'click',\n index?: number,\n immediate?: boolean,\n ) {\n if (!init || (firstItemReached.current && !withLoop)) return\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) {\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(\n type: Exclude<SlideMode, 'initial'> = 'click',\n index?: number,\n immediate?: boolean,\n ) {\n if (!init || (lastItemReached.current && !withLoop)) return\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) {\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\n useEffect(() => {\n internalSlideToItem(initialActiveItem, !animateWhenActiveItemChange)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialActiveItem, animateWhenActiveItemChange])\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 adjustCarouselWrapperPosition()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n initialStartingPosition,\n itemsPerSlide,\n withLoop,\n startEndGutter,\n gutter,\n freeScroll,\n slideType,\n init,\n ])\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 if (_draggingSlideTreshold) {\n draggingSlideTreshold.current = _draggingSlideTreshold\n } else {\n draggingSlideTreshold.current = Math.floor(getSlideValue() / 2 / 2)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [_draggingSlideTreshold])\n useEffect(() => {\n function handleResize() {\n if (window.innerWidth === prevWindowWidth.current) return\n prevWindowWidth.current = window.innerWidth\n adjustCarouselWrapperPosition()\n }\n if ('ResizeObserver' in window && mainCarouselWrapperRef.current) {\n const observer = new ResizeObserver(() => {\n prevWindowWidth.current = window.innerWidth\n adjustCarouselWrapperPosition()\n })\n observer.observe(mainCarouselWrapperRef.current)\n return () => {\n observer.disconnect()\n }\n } else {\n window.addEventListener('resize', handleResize)\n return () => {\n window.removeEventListener('resize', handleResize)\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n carouselSlideAxis,\n initialStartingPosition,\n itemsPerSlide,\n withLoop,\n startEndGutter,\n gutter,\n freeScroll,\n slideType,\n init,\n ])\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 > draggingSlideTreshold.current\n const nextItemTreshold = currentMovement < -draggingSlideTreshold.current\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 (slideActionType.current === 'prev' && movement > 0) {\n state.cancel()\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\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('drag')\n state.cancel()\n } else if (slideWhenThresholdIsReached && prevItemTreshold) {\n slideToPrevItem('drag')\n state.cancel()\n }\n return\n }\n\n if (state.last && !state.canceled && freeScroll) {\n if (slideActionType.current === 'prev') {\n slideToPrevItem('drag')\n }\n if (slideActionType.current === 'next') {\n slideToNextItem('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('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('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 function internalSlideToItem(id: string | number, immediate = false) {\n if (!init) 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) {\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('click', newActiveItem, immediate)\n } else {\n slideToPrevItem('click', newActiveItem, immediate)\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: () => slideToPrevItem(),\n slideToNextItem: () => slideToNextItem(),\n }\n : {\n useListenToCustomEvent,\n enterFullscreen,\n exitFullscreen,\n getIsFullscreen,\n slideToPrevItem: () => slideToPrevItem(),\n slideToNextItem: () => slideToNextItem(),\n slideToItem: internalSlideToItem,\n getIsNextItem,\n getIsPrevItem,\n getIsActiveItem,\n }\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 && 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 =\n createContext<ContextProps | ContextProps<'free-scroll'> | undefined>(undefined)\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","import { a, config, useTransition } from '@react-spring/web'\nimport { useEffect, useRef, useState, createContext, useContext } from 'react'\nimport { useEventsModule } from './modules/useEventsModule'\nimport { useDrag } from '@use-gesture/react'\nimport { useThumbsModule } from './modules'\nimport {\n ItemWithThumb,\n UseTransitionCarouselProps,\n UseTransitionCarouselReturnProps,\n SlideActionType,\n TransitionSlideMode,\n} from './types'\n\nconst defaultAnimationProps = {\n initial: {\n opacity: 1,\n position: 'relative',\n },\n from: {\n opacity: 0,\n position: 'relative',\n },\n enter: {\n position: 'relative',\n opacity: 1,\n },\n leave: {\n opacity: 1,\n position: 'absolute',\n },\n}\n\nfunction useTransitionCarousel({\n init = true,\n disableGestures = false,\n items,\n springConfig = config.default,\n exitBeforeEnter = false,\n trail,\n withLoop = false,\n activeItem: externalActiveItem,\n toPrevItemSpringProps = defaultAnimationProps,\n toNextItemSpringProps = defaultAnimationProps,\n draggingSlideTreshold = 50,\n thumbsSlideAxis = 'x',\n}: UseTransitionCarouselProps): UseTransitionCarouselReturnProps {\n const slideActionType = useRef<SlideActionType>('next')\n const slideModeType = useRef<TransitionSlideMode>('initial')\n const mainCarouselWrapperRef = useRef<HTMLDivElement | null>(null)\n const [activeItem, setActiveItem] = useState(externalActiveItem ?? 0)\n const { emitEvent, useListenToCustomEvent } = useEventsModule<'use-transition'>()\n const { handleScroll, thumbsFragment } = useThumbsModule({\n thumbsSlideAxis,\n items: items as ItemWithThumb[],\n })\n\n function getConfig() {\n if (slideActionType.current === 'prev') {\n return {\n initial: {\n ...toPrevItemSpringProps.initial,\n },\n from: {\n ...toPrevItemSpringProps.from,\n },\n enter: {\n ...toPrevItemSpringProps.enter,\n },\n leave: {\n ...toPrevItemSpringProps.leave,\n },\n }\n }\n if (slideActionType.current === 'next') {\n return {\n initial: {\n ...toNextItemSpringProps.initial,\n },\n from: {\n ...toNextItemSpringProps.from,\n },\n enter: {\n ...toNextItemSpringProps.enter,\n },\n leave: {\n ...toNextItemSpringProps.leave,\n },\n }\n }\n return {\n initial: {\n ...defaultAnimationProps.initial,\n },\n from: {\n ...defaultAnimationProps.from,\n },\n enter: {\n ...defaultAnimationProps.enter,\n },\n leave: {\n ...defaultAnimationProps.leave,\n },\n }\n }\n\n useEffect(() => {\n if (typeof externalActiveItem === 'number' && externalActiveItem !== activeItem) {\n setActiveItem(externalActiveItem)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [externalActiveItem])\n\n type SlideToItem = {\n to: number\n slideType: SlideActionType\n slideMode: TransitionSlideMode\n }\n\n function slideToItem({ to, slideType, slideMode }: SlideToItem) {\n slideActionType.current = slideType\n slideModeType.current = slideMode\n emitEvent({\n eventName: 'onSlideStartChange',\n slideActionType: slideActionType.current,\n slideMode: slideModeType.current,\n nextItem: {\n index: to,\n id: items[to].id,\n startReached: to === 0,\n endReached: to === items.length - 1,\n },\n })\n setActiveItem(to)\n handleScroll(activeItem)\n }\n\n function slideToPrevItem(slideMode: TransitionSlideMode) {\n if (!init) return\n const isFirstItem = activeItem === 0\n\n if (!withLoop && isFirstItem) return\n\n if (withLoop && isFirstItem) {\n slideToItem({\n to: items.length - 1,\n slideType: 'prev',\n slideMode,\n })\n } else {\n slideToItem({\n to: activeItem - 1,\n slideType: 'prev',\n slideMode,\n })\n }\n }\n function slideToNextItem(slideMode: TransitionSlideMode) {\n if (!init) return\n const isLastItem = activeItem === items.length - 1\n\n if (!withLoop && isLastItem) return\n\n if (withLoop && isLastItem) {\n slideToItem({\n to: 0,\n slideType: 'next',\n slideMode,\n })\n } else {\n slideToItem({\n to: activeItem + 1,\n slideType: 'next',\n slideMode,\n })\n }\n }\n\n const transitions = useTransition(activeItem, {\n config: springConfig,\n key: null,\n trail,\n exitBeforeEnter,\n ...getConfig(),\n onRest(value, _, index) {\n if (value.finished && index === activeItem) {\n emitEvent({\n eventName: 'onSlideChange',\n slideActionType: slideActionType.current,\n slideMode: slideModeType.current,\n currentItem: {\n index: activeItem,\n id: items[activeItem].id,\n startReached: activeItem === 0,\n endReached: activeItem === items.length - 1,\n },\n })\n }\n },\n })\n\n const bindSwipe = useDrag(\n ({ last, movement: [mx] }) => {\n if (last) {\n const prevItemTreshold = mx > draggingSlideTreshold\n const nextItemTreshold = mx < -draggingSlideTreshold\n const isFirstItem = activeItem === 0\n const isLastItem = activeItem === items.length - 1\n\n if (nextItemTreshold) {\n if (!withLoop && isLastItem) return\n\n emitEvent({\n eventName: 'onLeftSwipe',\n })\n slideToNextItem('swipe')\n } else if (prevItemTreshold) {\n if (!withLoop && isFirstItem) return\n\n emitEvent({\n eventName: 'onRightSwipe',\n })\n slideToPrevItem('swipe')\n }\n }\n },\n {\n enabled: !disableGestures,\n },\n )\n\n const itemsFragment = transitions((styles, item, _, indx) => {\n return (\n <a.div\n id={`use-transition-carousel-item-${indx}`}\n className=\"use-transition-carousel-item\"\n style={{\n ...styles,\n flex: '1 0 100%',\n width: '100%',\n height: '100%',\n }}\n >\n {items[item].renderItem}\n </a.div>\n )\n })\n\n const res = {\n useListenToCustomEvent,\n slideToPrevItem: () => slideToPrevItem('click'),\n slideToNextItem: () => slideToNextItem('click'),\n }\n\n const _thumbsFragment = (\n <Context.Provider value={res}>{thumbsFragment}</Context.Provider>\n )\n const carouselFragment = (\n <Context.Provider value={res}>\n <div\n ref={mainCarouselWrapperRef}\n {...bindSwipe()}\n style={{\n display: 'flex',\n position: 'relative',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n {itemsFragment}\n </div>\n </Context.Provider>\n )\n\n return {\n ...res,\n carouselFragment,\n thumbsFragment: _thumbsFragment,\n }\n}\n\ntype ContextProps = Omit<\n UseTransitionCarouselReturnProps,\n 'carouselFragment' | 'thumbsFragment'\n>\n\nconst Context = createContext<ContextProps | undefined>(undefined)\n\nfunction useTransitionCarouselContext() {\n const context = useContext(Context)\n if (!context) {\n throw new Error('useTransitionCarouselContext must be used within the carousel.')\n }\n return context\n}\n\nexport { useTransitionCarousel, useTransitionCarouselContext }\n"],"names":["eventLabel","useEventsModule","targetEvent","useRef","useListenToCustomEvent","eventHandler","useEffect","handleEvent","event","detail","current","document","createElement","addEventListener","_a","removeEventListener","emitEvent","newEvent","CustomEvent","dispatchEvent","useFullscreenModule","mainCarouselWrapperRef","onFullScreenChange","handleResize","isFullscreen","setIsFullscreen","_isFullscreen","handleFullscreenChange","fullscreenElement","screenfull","isEnabled","on","off","enterFullscreen","elementRef","request","exitFullscreen","exit","getIsFullscreen","useThumbsModule","thumbsSlideAxis","withThumbs","prepareThumbsData","items","wrapperRef","spring","setSpring","useSpring","val","getTotalScrollValue","Math","round","Number","getBoundingClientRect","thumbsFragment","_jsx","jsx","Object","assign","className","ref","onWheel","stop","style","display","flex","position","width","height","flexDirection","overflowX","overflowY","maxHeight","children","getPreparedItems","_items","map","i","id","renderThumb","handlePrepareThumbsData","thumbId","handleScroll","activeItem","thumbNode","querySelector","el","rect","top","left","bottom","window","innerHeight","documentElement","clientHeight","right","innerWidth","clientWidth","isInViewport","offset","offsetLeft","start","from","to","onChange","value","abs","Context","createContext","undefined","defaultAnimationProps","initial","opacity","enter","leave","init","itemsPerSlide","_itemsPerSlide","slideType","gutter","withLoop","startEndGutter","carouselSlideAxis","disableGestures","draggingSlideTreshold","_draggingSlideTreshold","slideWhenThresholdIsReached","freeScroll","enableFreeScrollDrag","initialStartingPosition","initialActiveItem","animateWhenActiveItemChange","length","prevWindowWidth","slideActionType","slideModeType","prevSlidedValue","pause","scrollLeft","scrollTop","setStartEndItemReachedOnFreeScroll","carouselTrackWrapperRef","transform","firstItemReached","lastItemReached","internalItems","useCallback","getItems","adjustCarouselWrapperPosition","eventName","getSlideValue","carouselItem","Error","slideToItem","nextActiveItem","immediate","slideMode","nextItem","startReached","endReached","index","config","default","velocity","onRest","finished","currentItem","getCarouselItemWidth","positionProperty","setPosition","v","currentFromValue","getFromValue","get","getToValue","type","next","slideToPrevItem","nextItemWillExceed","slideToNextItem","internalSlideToItem","console","warn","useLayoutEffect","floor","observer","ResizeObserver","observe","disconnect","bindDrag","useDrag","state","isDragging","dragging","movement","currentMovement","direction","prevItemTreshold","nextItemTreshold","cancel","friction","tension","last","canceled","enabled","axis","findItemIndex","error","itemIndex","findIndex","item","newActiveItem","getIsNextItem","_activeItem","getIsPrevItem","getIsActiveItem","res","_thumbsFragment","Provider","carouselFragment","_jsxs","touchAction","percentValue","getAnimatedWrapperStyles","flexShrink","isLastItem","marginRight","renderItem","context","useContext","springConfig","exitBeforeEnter","trail","externalActiveItem","toPrevItemSpringProps","toNextItemSpringProps","setActiveItem","useState","isFirstItem","transitions","useTransition","key","_","bindSwipe","mx","itemsFragment","styles","indx","a","div","overflow"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-spring-carousel",
3
- "version": "3.0.0-beta028",
3
+ "version": "3.0.0-beta030",
4
4
  "description": "A new <Carousel /> experience for the web",
5
5
  "homepage": "https://react-spring-carousel.emilianobucci.com",
6
6
  "repository": "https://github.com/Emiliano-Bucci/react-spring-carousel",