react-spring-carousel 3.0.0-beta066 → 3.0.0-beta068
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.
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index2.js +1 -1
- package/dist/esm/useFullscreenModule-519d337d.js +2 -0
- package/dist/esm/useFullscreenModule-519d337d.js.map +1 -0
- package/dist/esm/useSpringCarousel.js +1 -1
- package/dist/esm/useSpringCarousel.js.map +1 -1
- package/dist/esm/useThumbsModule-faa196f9.js +2 -0
- package/dist/esm/useThumbsModule-faa196f9.js.map +1 -0
- package/dist/esm/useTransitionCarousel.js +1 -1
- package/dist/esm/useTransitionCarousel.js.map +1 -1
- package/dist/umd/index.js +1 -1
- package/dist/umd/index.js.map +1 -1
- package/package.json +3 -2
- package/dist/esm/useFullscreenModule-b981f90a.js +0 -2
- package/dist/esm/useFullscreenModule-b981f90a.js.map +0 -1
- package/dist/esm/useThumbsModule-f880a8fc.js +0 -2
- package/dist/esm/useThumbsModule-f880a8fc.js.map +0 -1
- package/dist/types/modules/screenfull.d.ts +0 -139
package/dist/umd/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/modules/useEventsModule.ts","../../src/modules/screenfull.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","export type RawEventNames = {\n readonly requestFullscreen: string\n readonly exitFullscreen: string\n readonly fullscreenElement: string\n readonly fullscreenEnabled: string\n readonly fullscreenchange: string\n readonly fullscreenerror: string\n}\n\nexport type EventName = 'change' | 'error'\n\n/**\nSimple wrapper for cross-browser usage of the JavaScript [Fullscreen API](https://developer.mozilla.org/en/DOM/Using_full-screen_mode), which lets you bring the page or any element into fullscreen. Smoothens out the browser implementation differences, so you don't have to.\n*/\ndeclare const screenfull: {\n /**\n\tWhether fullscreen is active.\n\t*/\n readonly isFullscreen: boolean\n\n /**\n\tThe element currently in fullscreen, otherwise `undefined`.\n\t*/\n readonly element: Element | undefined\n\n /**\n\tWhether you are allowed to enter fullscreen. If your page is inside an `<iframe>` you will need to add a `allowfullscreen` attribute (+ `webkitallowfullscreen` and `mozallowfullscreen`).\n\t@example\n\t```\n\timport screenfull from 'screenfull';\n\tif (screenfull.isEnabled) {\n\t\tscreenfull.request();\n\t}\n\t```\n\t*/\n readonly isEnabled: boolean\n\n /**\n\tExposes the raw properties (prefixed if needed) used internally.\n\t*/\n raw: RawEventNames\n\n /**\n\tMake an element fullscreen.\n\tIf your page is inside an `<iframe>` you will need to add a `allowfullscreen` attribute (+ `webkitallowfullscreen` and `mozallowfullscreen`).\n\tKeep in mind that the browser will only enter fullscreen when initiated by user events like click, touch, key.\n\t@param element - Default is `<html>`. If called with another element than the currently active, it will switch to that if it's a descendant.\n\t@param options - [`FullscreenOptions`](https://developer.mozilla.org/en-US/docs/Web/API/FullscreenOptions).\n\t@returns A promise that resolves after the element enters fullscreen.\n\t@example\n\t```\n\timport screenfull from 'screenfull';\n\t// Fullscreen the page\n\tdocument.getElementById('button').addEventListener('click', () => {\n\t\tif (screenfull.isEnabled) {\n\t\t\tscreenfull.request();\n\t\t} else {\n\t\t\t// Ignore or do something else\n\t\t}\n\t});\n\t// Fullscreen an element\n\tconst element = document.getElementById('target');\n\tdocument.getElementById('button').addEventListener('click', () => {\n\t\tif (screenfull.isEnabled) {\n\t\t\tscreenfull.request(element);\n\t\t}\n\t});\n\t// Fullscreen an element with options\n\tconst element = document.getElementById('target');\n\tdocument.getElementById('button').addEventListener('click', () => {\n\t\tif (screenfull.isEnabled) {\n\t\t\tscreenfull.request(element, {navigationUI: 'hide'});\n\t\t}\n\t});\n\t// Fullscreen an element with jQuery\n\tconst element = $('#target')[0]; // Get DOM element from jQuery collection\n\t$('#button').on('click', () => {\n\t\tif (screenfull.isEnabled) {\n\t\t\tscreenfull.request(element);\n\t\t}\n\t});\n\t```\n\t*/\n request(element?: Element, options?: FullscreenOptions): Promise<void>\n\n /**\n\tBrings you out of fullscreen.\n\t@returns A promise that resolves after the element exits fullscreen.\n\t*/\n exit(): Promise<void>\n\n /**\n\tRequests fullscreen if not active, otherwise exits.\n\t@param element - The default is `<html>`. If called with another element than the currently active, it will switch to that if it's a descendant.\n\t@param options - [`FullscreenOptions`](https://developer.mozilla.org/en-US/docs/Web/API/FullscreenOptions).\n\t@returns A promise that resolves after the element enters/exits fullscreen.\n\t@example\n\t```\n\timport screenfull from 'screenfull';\n\t// Toggle fullscreen on a image with jQuery\n\t$('img').on('click', event => {\n\t\tif (screenfull.isEnabled) {\n\t\t\tscreenfull.toggle(event.target);\n\t\t}\n\t});\n\t```\n\t*/\n toggle(element?: Element, options?: FullscreenOptions): Promise<void>\n\n /**\n\tAdd a listener for when the browser switches in and out of fullscreen or when there is an error.\n\t@example\n\t```\n\timport screenfull from 'screenfull';\n\t// Detect fullscreen change\n\tif (screenfull.isEnabled) {\n\t\tscreenfull.on('change', () => {\n\t\t\tconsole.log('Am I fullscreen?', screenfull.isFullscreen ? 'Yes' : 'No');\n\t\t});\n\t}\n\t// Detect fullscreen error\n\tif (screenfull.isEnabled) {\n\t\tscreenfull.on('error', event => {\n\t\t\tconsole.error('Failed to enable fullscreen', event);\n\t\t});\n\t}\n\t```\n\t*/\n on(name: EventName, handler: (event: Event) => void): void\n\n /**\n\tRemove a previously registered event listener.\n\t@example\n\t```\n\timport screenfull from 'screenfull';\n\tscreenfull.off('change', callback);\n\t```\n\t*/\n off(name: EventName, handler: (event: Event) => void): void\n\n /**\n\tAlias for `.on('change', function)`.\n\t*/\n onchange(handler: (event: Event) => void): void\n\n /**\n\tAlias for `.on('error', function)`.\n\t*/\n onerror(handler: (event: Event) => void): void\n}\n\nexport default screenfull\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 {\n ItemWithThumb,\n PrepareThumbsData,\n RenderItemProps,\n SpringCarouselWithThumbs,\n} from '../types'\n\ntype Props<T extends 'use-spring' | 'use-transition'> = {\n withThumbs?: boolean\n thumbsSlideAxis: SpringCarouselWithThumbs['thumbsSlideAxis']\n prepareThumbsData?: PrepareThumbsData<T>\n items: ItemWithThumb<T>[]\n renderThumbFnProps: RenderItemProps<T>\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<T extends 'use-spring' | 'use-transition'>({\n thumbsSlideAxis = 'x',\n withThumbs = false,\n prepareThumbsData,\n items,\n renderThumbFnProps,\n}: Props<T>) {\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<T>>,\n ): ReturnType<PrepareThumbsData<T>> {\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 {typeof renderThumb === 'function'\n ? renderThumb(renderThumbFnProps)\n : renderThumb}\n </div>\n )\n })}\n </div>\n ) : null\n\n return {\n thumbsFragment,\n handleScroll,\n }\n}\n","import { config, useIsomorphicLayoutEffect, useSpring } from '@react-spring/web'\nimport React, { createContext, useCallback, useContext, useEffect, useRef } 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 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 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 function setPosition(v: number) {\n const positionProperty = carouselSlideAxis === 'x' ? 'left' : 'top'\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 // eslint-disable-next-line react-hooks/exhaustive-deps\n function adjustCarouselWrapperPosition(shouldResetPosition = false) {\n if (carouselTrackWrapperRef.current && shouldResetPosition) {\n carouselTrackWrapperRef.current.style.transform = `translate3d(0px, 0px,0px)`\n carouselTrackWrapperRef.current.style.left = `0`\n carouselTrackWrapperRef.current.style.top = `0`\n }\n\n if (slideType === 'fixed') {\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 (freeScroll) {\n setStartEndItemReachedOnFreeScroll()\n }\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 (freeScroll) {\n setStartEndItemReachedOnFreeScroll()\n }\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 setDraggingSliderTreshold() {\n if (_draggingSlideTreshold) {\n draggingSlideTreshold.current = _draggingSlideTreshold\n } else {\n draggingSlideTreshold.current = Math.floor(getSlideValue() / 2 / 2)\n }\n }\n function initializeCarousel() {\n if (!isFirstMount.current && carouselTrackWrapperRef.current) {\n prevTotalScrollValue.current = getTotalScrollValue()\n prevWithLoop.current = withLoop\n prevSlideType.current = slideType\n prevFreeScroll.current = freeScroll\n prevWindowWidth.current = window.innerWidth\n prevSlidedValue.current = 0\n\n internalSlideToItem({ id: 0, immediate: true, shouldReset: true })\n setDraggingSliderTreshold()\n adjustCarouselWrapperPosition()\n }\n }\n\n const enableDrag =\n (init && !disableGestures && !freeScroll) || (!!freeScroll && !!enableFreeScrollDrag)\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 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 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: enableDrag,\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 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 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 function getTouchAction() {\n if (disableGestures) {\n return 'unset'\n }\n\n if (carouselSlideAxis === 'x') {\n return 'pan-y'\n }\n return 'pan-x'\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 // uwc-debug-below\n useIsomorphicLayoutEffect(() => {\n /**\n * Set initial track position\n */\n if (carouselTrackWrapperRef.current && init) {\n resizeByPropChange.current = true\n initializeCarousel()\n }\n }, [init])\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.length, itemsPerSlide, init])\n useEffect(() => {\n prevWindowWidth.current = window.innerWidth\n }, [])\n useEffect(() => {\n /**\n * When these props change we reset the carousel\n */\n if (init) {\n resizeByPropChange.current = true\n initializeCarousel()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialStartingPosition, itemsPerSlide, startEndGutter, gutter, init, withLoop])\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 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 (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: getTouchAction(),\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(\n index ===\n internalItems.findIndex(\n i => i.id === internalItems[internalItems.length - 1].id,\n ),\n ),\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","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<'use-transition'>({\n thumbsSlideAxis,\n items: items as ItemWithThumb<'use-transition'>[],\n renderThumbFnProps: {\n getIsNextItem,\n getIsPrevItem,\n useListenToCustomEvent,\n activeItem: {\n index: activeItem,\n id: items[activeItem].id,\n },\n },\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 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 getIsNextItem(id: string | number) {\n const itemIndex = findItemIndex(id, \"The item doesn't exist; check the provided id.\")\n const _activeItem = activeItem\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\n if (withLoop && _activeItem === 0) {\n return itemIndex === items.length - 1\n }\n return itemIndex === _activeItem - 1\n }\n\n const itemsFragment = transitions((styles, item, _, indx) => {\n const renderItem = items[item].renderItem\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 {typeof renderItem === 'function'\n ? renderItem({\n useListenToCustomEvent,\n getIsNextItem,\n getIsPrevItem,\n activeItem: {\n index: activeItem,\n id: items[activeItem].id,\n },\n })\n : renderItem}\n </a.div>\n )\n })\n\n const result = {\n useListenToCustomEvent,\n slideToPrevItem: () => slideToPrevItem('click'),\n slideToNextItem: () => slideToNextItem('click'),\n }\n\n const _thumbsFragment = (\n <Context.Provider value={result}>{thumbsFragment}</Context.Provider>\n )\n const carouselFragment = (\n <Context.Provider value={result}>\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 ...result,\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","screenfull$1","screenfull","useFullscreenModule","mainCarouselWrapperRef","onFullScreenChange","handleResize","isFullscreen","setIsFullscreen","_isFullscreen","handleFullscreenChange","fullscreenElement","isEnabled","on","off","enterFullscreen","elementRef","request","exitFullscreen","exit","getIsFullscreen","useThumbsModule","thumbsSlideAxis","withThumbs","prepareThumbsData","items","renderThumbFnProps","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","getControllerRef","length","resizeByPropChange","slideActionType","slideModeType","directionAfterReachingEdges","firstItemReached","lastItemReached","carouselTrackWrapperRef","isFirstMount","prevTotalScrollValue","prevWindowWidth","prevSlidedValue","prevWithLoop","prevSlideType","prevFreeScroll","windowIsHidden","internalItems","useCallback","getItems","pause","scrollLeft","scrollTop","setStartEndItemReachedOnFreeScroll","transform","getIsActiveItem","getIsPrevItem","getIsNextItem","adjustCarouselWrapperPosition","eventName","getSlideValue","carouselItem","Error","slideToItem","nextActiveItem","immediate","slideMode","nextItem","startReached","endReached","index","config","default","velocity","onRest","finished","currentItem","getCarouselItemWidth","setPosition","v","positionProperty","shouldResetPosition","nextValue","setTimeout","newVal","diff","next","getFromValue","get","getToValue","type","slideToPrevItem","nextItemWillExceed","slideToNextItem","initializeCarousel","internalSlideToItem","shouldReset","floor","enableDrag","bindDrag","useDrag","state","isDragging","dragging","movement","currentMovement","direction","prevItemTreshold","nextItemTreshold","tot","friction","tension","cancel","last","canceled","enabled","axis","findItemIndex","error","itemIndex","findIndex","item","console","newActiveItem","_activeItem","res","animate","useIsomorphicLayoutEffect","warn","handleVisibilityChange","hidden","timer","observer","ResizeObserver","cb","clearTimeout","observe","disconnect","_thumbsFragment","Provider","carouselFragment","_jsxs","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","result","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 {\n ItemWithThumb,\n PrepareThumbsData,\n RenderItemProps,\n SpringCarouselWithThumbs,\n} from '../types'\n\ntype Props<T extends 'use-spring' | 'use-transition'> = {\n withThumbs?: boolean\n thumbsSlideAxis: SpringCarouselWithThumbs['thumbsSlideAxis']\n prepareThumbsData?: PrepareThumbsData<T>\n items: ItemWithThumb<T>[]\n renderThumbFnProps: RenderItemProps<T>\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<T extends 'use-spring' | 'use-transition'>({\n thumbsSlideAxis = 'x',\n withThumbs = false,\n prepareThumbsData,\n items,\n renderThumbFnProps,\n}: Props<T>) {\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<T>>,\n ): ReturnType<PrepareThumbsData<T>> {\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 {typeof renderThumb === 'function'\n ? renderThumb(renderThumbFnProps)\n : renderThumb}\n </div>\n )\n })}\n </div>\n ) : null\n\n return {\n thumbsFragment,\n handleScroll,\n }\n}\n","import { config, useIsomorphicLayoutEffect, useSpring } from '@react-spring/web'\nimport React, { createContext, useCallback, useContext, useEffect, useRef } 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 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 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 function setPosition(v: number) {\n const positionProperty = carouselSlideAxis === 'x' ? 'left' : 'top'\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 // eslint-disable-next-line react-hooks/exhaustive-deps\n function adjustCarouselWrapperPosition(shouldResetPosition = false) {\n if (carouselTrackWrapperRef.current && shouldResetPosition) {\n carouselTrackWrapperRef.current.style.transform = `translate3d(0px, 0px,0px)`\n carouselTrackWrapperRef.current.style.left = `0`\n carouselTrackWrapperRef.current.style.top = `0`\n }\n\n if (slideType === 'fixed') {\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 (freeScroll) {\n setStartEndItemReachedOnFreeScroll()\n }\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 (freeScroll) {\n setStartEndItemReachedOnFreeScroll()\n }\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 setDraggingSliderTreshold() {\n if (_draggingSlideTreshold) {\n draggingSlideTreshold.current = _draggingSlideTreshold\n } else {\n draggingSlideTreshold.current = Math.floor(getSlideValue() / 2 / 2)\n }\n }\n function initializeCarousel() {\n if (!isFirstMount.current && carouselTrackWrapperRef.current) {\n prevTotalScrollValue.current = getTotalScrollValue()\n prevWithLoop.current = withLoop\n prevSlideType.current = slideType\n prevFreeScroll.current = freeScroll\n prevWindowWidth.current = window.innerWidth\n prevSlidedValue.current = 0\n\n internalSlideToItem({ id: 0, immediate: true, shouldReset: true })\n setDraggingSliderTreshold()\n adjustCarouselWrapperPosition()\n }\n }\n\n const enableDrag =\n (init && !disableGestures && !freeScroll) || (!!freeScroll && !!enableFreeScrollDrag)\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 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 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: enableDrag,\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 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 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 function getTouchAction() {\n if (disableGestures) {\n return 'unset'\n }\n\n if (carouselSlideAxis === 'x') {\n return 'pan-y'\n }\n return 'pan-x'\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 // uwc-debug-below\n useIsomorphicLayoutEffect(() => {\n /**\n * Set initial track position\n */\n if (carouselTrackWrapperRef.current && init) {\n resizeByPropChange.current = true\n initializeCarousel()\n }\n }, [init])\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.length, itemsPerSlide, init])\n useEffect(() => {\n prevWindowWidth.current = window.innerWidth\n }, [])\n useEffect(() => {\n /**\n * When these props change we reset the carousel\n */\n if (init) {\n resizeByPropChange.current = true\n initializeCarousel()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialStartingPosition, itemsPerSlide, startEndGutter, gutter, init, withLoop])\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 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 (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: getTouchAction(),\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(\n index ===\n internalItems.findIndex(\n i => i.id === internalItems[internalItems.length - 1].id,\n ),\n ),\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","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<'use-transition'>({\n thumbsSlideAxis,\n items: items as ItemWithThumb<'use-transition'>[],\n renderThumbFnProps: {\n getIsNextItem,\n getIsPrevItem,\n useListenToCustomEvent,\n activeItem: {\n index: activeItem,\n id: items[activeItem].id,\n },\n },\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 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 getIsNextItem(id: string | number) {\n const itemIndex = findItemIndex(id, \"The item doesn't exist; check the provided id.\")\n const _activeItem = activeItem\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\n if (withLoop && _activeItem === 0) {\n return itemIndex === items.length - 1\n }\n return itemIndex === _activeItem - 1\n }\n\n const itemsFragment = transitions((styles, item, _, indx) => {\n const renderItem = items[item].renderItem\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 {typeof renderItem === 'function'\n ? renderItem({\n useListenToCustomEvent,\n getIsNextItem,\n getIsPrevItem,\n activeItem: {\n index: activeItem,\n id: items[activeItem].id,\n },\n })\n : renderItem}\n </a.div>\n )\n })\n\n const result = {\n useListenToCustomEvent,\n slideToPrevItem: () => slideToPrevItem('click'),\n slideToNextItem: () => slideToNextItem('click'),\n }\n\n const _thumbsFragment = (\n <Context.Provider value={result}>{thumbsFragment}</Context.Provider>\n )\n const carouselFragment = (\n <Context.Provider value={result}>\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 ...result,\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","renderThumbFnProps","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","getControllerRef","length","resizeByPropChange","slideActionType","slideModeType","directionAfterReachingEdges","firstItemReached","lastItemReached","carouselTrackWrapperRef","isFirstMount","prevTotalScrollValue","prevWindowWidth","prevSlidedValue","prevWithLoop","prevSlideType","prevFreeScroll","windowIsHidden","internalItems","useCallback","getItems","pause","scrollLeft","scrollTop","setStartEndItemReachedOnFreeScroll","transform","getIsActiveItem","getIsPrevItem","getIsNextItem","adjustCarouselWrapperPosition","eventName","getSlideValue","carouselItem","Error","slideToItem","nextActiveItem","immediate","slideMode","nextItem","startReached","endReached","index","config","default","velocity","onRest","finished","currentItem","getCarouselItemWidth","setPosition","v","positionProperty","shouldResetPosition","nextValue","setTimeout","newVal","diff","next","getFromValue","get","getToValue","type","slideToPrevItem","nextItemWillExceed","slideToNextItem","initializeCarousel","internalSlideToItem","shouldReset","floor","enableDrag","bindDrag","useDrag","state","isDragging","dragging","movement","currentMovement","direction","prevItemTreshold","nextItemTreshold","tot","friction","tension","cancel","last","canceled","enabled","axis","findItemIndex","error","itemIndex","findIndex","item","console","newActiveItem","_activeItem","res","animate","useIsomorphicLayoutEffect","warn","handleVisibilityChange","hidden","timer","observer","ResizeObserver","cb","clearTimeout","observe","disconnect","_thumbsFragment","Provider","carouselFragment","_jsxs","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","result","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-
|
|
3
|
+
"version": "3.0.0-beta068",
|
|
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",
|
|
@@ -84,6 +84,7 @@
|
|
|
84
84
|
},
|
|
85
85
|
"dependencies": {
|
|
86
86
|
"@use-gesture/react": "^10.2.24",
|
|
87
|
-
"resize-observer-polyfill": "^1.5.1"
|
|
87
|
+
"resize-observer-polyfill": "^1.5.1",
|
|
88
|
+
"screenfull": "^5.2.0"
|
|
88
89
|
}
|
|
89
90
|
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{useRef as e,useEffect as n}from"react";import{s as r}from"./useThumbsModule-f880a8fc.js";function t({mainCarouselWrapperRef:t,onFullScreenChange:u,handleResize:c}){const l=e(!1);function s(e){l.current=e}return n((()=>{function e(){document.fullscreenElement&&(s(!0),u(!0),c&&c()),document.fullscreenElement||(s(!1),u(!1),c&&c())}if(r.isEnabled)return r.on("change",e),()=>{r.isEnabled&&r.off("change",e)}}),[]),{enterFullscreen:function(e){r.isEnabled&&r.request(e||t.current)},exitFullscreen:function(){r.isEnabled&&r.exit()},getIsFullscreen:function(){return l.current}}}export{t as u};
|
|
2
|
-
//# sourceMappingURL=useFullscreenModule-b981f90a.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useFullscreenModule-b981f90a.js","sources":["../../src/modules/useFullscreenModule.ts"],"sourcesContent":["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"],"names":["useFullscreenModule","mainCarouselWrapperRef","onFullScreenChange","handleResize","isFullscreen","useRef","setIsFullscreen","_isFullscreen","current","useEffect","handleFullscreenChange","document","fullscreenElement","screenfull","isEnabled","on","off","enterFullscreen","elementRef","request","exitFullscreen","exit","getIsFullscreen"],"mappings":"gGASM,SAAUA,GAAoBC,uBAClCA,EAAsBC,mBACtBA,EAAkBC,aAClBA,IAEA,MAAMC,EAAeC,GAAO,GA4B5B,SAASC,EAAgBC,GACvBH,EAAaI,QAAUD,CACxB,CAgBD,OA5CAE,GAAU,KACR,SAASC,IACHC,SAASC,oBACXN,GAAgB,GAChBJ,GAAmB,GACnBC,GAAgBA,KAGbQ,SAASC,oBACZN,GAAgB,GAChBJ,GAAmB,GACnBC,GAAgBA,IAEnB,CAED,GAAIU,EAAWC,UAEb,OADAD,EAAWE,GAAG,SAAUL,GACjB,KACDG,EAAWC,WACbD,EAAWG,IAAI,SAAUN,EAC1B,CAEJ,GAEA,IAoBI,CACLO,gBAXF,SAAyBC,GACnBL,EAAWC,WACbD,EAAWM,QAASD,GAAcjB,EAAuBO,QAE5D,EAQCY,eANF,WACEP,EAAWC,WAAaD,EAAWQ,MACpC,EAKCC,gBAjBF,WACE,OAAOlB,EAAaI,OACrB,EAiBH"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{useRef as t,useEffect as e}from"react";import{jsx as n}from"react/jsx-runtime";import{useSpring as r}from"@react-spring/web";const i="RSC::Event";function o(){const n=t(null);return{useListenToCustomEvent:function(t){e((()=>{function e(e){t(e.detail)}if(n.current||(n.current=document.createElement("div")),n.current)return n.current.addEventListener(i,e,!1),()=>{var t;null===(t=n.current)||void 0===t||t.removeEventListener(i,e,!1)}}),[t])},emitEvent:function(t){if(n.current){const e=new CustomEvent(i,{detail:t});n.current.dispatchEvent(e)}}}}var u=screenfull;function c({thumbsSlideAxis:e="x",withThumbs:i=!1,prepareThumbsData:o,items:u,renderThumbFnProps:c}){const l=t(null),[s,a]=r((()=>({val:0})));function m(){var t;return Math.round(Number(null===(t=l.current)||void 0===t?void 0:t["x"===e?"scrollWidth":"scrollHeight"])-l.current.getBoundingClientRect()["x"===e?"width":"height"])}return{thumbsFragment:i?n("div",Object.assign({className:"use-spring-carousel-thumbs-wrapper",ref:l,onWheel:()=>s.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 t(t){return t.map((t=>({id:t.id,renderThumb:t.renderThumb})))}return o?o(t(u)):t(u)}().map((({id:t,renderThumb:e})=>{const r=`thumb-item-${t}`;return n("div",Object.assign({id:r,className:"thumb-item"},{children:"function"==typeof e?e(c):e}),r)}))})):null,handleScroll:function(t){var n,r;const i=l.current?l.current.querySelector(`#thumb-item-${u[t].id}`):null;if(i&&l.current&&!function(t){const e=t.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&e.right<=(window.innerWidth||document.documentElement.clientWidth)}(i)){const t=i.offsetLeft,o=t>m()?m():t;a.start({from:{val:null!==(r=null===(n=l.current)||void 0===n?void 0:n["x"===e?"scrollLeft":"scrollTop"])&&void 0!==r?r:0},to:{val:o},onChange:({value:t})=>{l.current&&(l.current["x"===e?"scrollLeft":"scrollTop"]=Math.abs(t.val))}})}}}}export{c as a,u as s,o as u};
|
|
2
|
-
//# sourceMappingURL=useThumbsModule-f880a8fc.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useThumbsModule-f880a8fc.js","sources":["../../src/modules/useEventsModule.ts","../../src/modules/screenfull.ts","../../src/modules/useThumbsModule.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","export type RawEventNames = {\n readonly requestFullscreen: string\n readonly exitFullscreen: string\n readonly fullscreenElement: string\n readonly fullscreenEnabled: string\n readonly fullscreenchange: string\n readonly fullscreenerror: string\n}\n\nexport type EventName = 'change' | 'error'\n\n/**\nSimple wrapper for cross-browser usage of the JavaScript [Fullscreen API](https://developer.mozilla.org/en/DOM/Using_full-screen_mode), which lets you bring the page or any element into fullscreen. Smoothens out the browser implementation differences, so you don't have to.\n*/\ndeclare const screenfull: {\n /**\n\tWhether fullscreen is active.\n\t*/\n readonly isFullscreen: boolean\n\n /**\n\tThe element currently in fullscreen, otherwise `undefined`.\n\t*/\n readonly element: Element | undefined\n\n /**\n\tWhether you are allowed to enter fullscreen. If your page is inside an `<iframe>` you will need to add a `allowfullscreen` attribute (+ `webkitallowfullscreen` and `mozallowfullscreen`).\n\t@example\n\t```\n\timport screenfull from 'screenfull';\n\tif (screenfull.isEnabled) {\n\t\tscreenfull.request();\n\t}\n\t```\n\t*/\n readonly isEnabled: boolean\n\n /**\n\tExposes the raw properties (prefixed if needed) used internally.\n\t*/\n raw: RawEventNames\n\n /**\n\tMake an element fullscreen.\n\tIf your page is inside an `<iframe>` you will need to add a `allowfullscreen` attribute (+ `webkitallowfullscreen` and `mozallowfullscreen`).\n\tKeep in mind that the browser will only enter fullscreen when initiated by user events like click, touch, key.\n\t@param element - Default is `<html>`. If called with another element than the currently active, it will switch to that if it's a descendant.\n\t@param options - [`FullscreenOptions`](https://developer.mozilla.org/en-US/docs/Web/API/FullscreenOptions).\n\t@returns A promise that resolves after the element enters fullscreen.\n\t@example\n\t```\n\timport screenfull from 'screenfull';\n\t// Fullscreen the page\n\tdocument.getElementById('button').addEventListener('click', () => {\n\t\tif (screenfull.isEnabled) {\n\t\t\tscreenfull.request();\n\t\t} else {\n\t\t\t// Ignore or do something else\n\t\t}\n\t});\n\t// Fullscreen an element\n\tconst element = document.getElementById('target');\n\tdocument.getElementById('button').addEventListener('click', () => {\n\t\tif (screenfull.isEnabled) {\n\t\t\tscreenfull.request(element);\n\t\t}\n\t});\n\t// Fullscreen an element with options\n\tconst element = document.getElementById('target');\n\tdocument.getElementById('button').addEventListener('click', () => {\n\t\tif (screenfull.isEnabled) {\n\t\t\tscreenfull.request(element, {navigationUI: 'hide'});\n\t\t}\n\t});\n\t// Fullscreen an element with jQuery\n\tconst element = $('#target')[0]; // Get DOM element from jQuery collection\n\t$('#button').on('click', () => {\n\t\tif (screenfull.isEnabled) {\n\t\t\tscreenfull.request(element);\n\t\t}\n\t});\n\t```\n\t*/\n request(element?: Element, options?: FullscreenOptions): Promise<void>\n\n /**\n\tBrings you out of fullscreen.\n\t@returns A promise that resolves after the element exits fullscreen.\n\t*/\n exit(): Promise<void>\n\n /**\n\tRequests fullscreen if not active, otherwise exits.\n\t@param element - The default is `<html>`. If called with another element than the currently active, it will switch to that if it's a descendant.\n\t@param options - [`FullscreenOptions`](https://developer.mozilla.org/en-US/docs/Web/API/FullscreenOptions).\n\t@returns A promise that resolves after the element enters/exits fullscreen.\n\t@example\n\t```\n\timport screenfull from 'screenfull';\n\t// Toggle fullscreen on a image with jQuery\n\t$('img').on('click', event => {\n\t\tif (screenfull.isEnabled) {\n\t\t\tscreenfull.toggle(event.target);\n\t\t}\n\t});\n\t```\n\t*/\n toggle(element?: Element, options?: FullscreenOptions): Promise<void>\n\n /**\n\tAdd a listener for when the browser switches in and out of fullscreen or when there is an error.\n\t@example\n\t```\n\timport screenfull from 'screenfull';\n\t// Detect fullscreen change\n\tif (screenfull.isEnabled) {\n\t\tscreenfull.on('change', () => {\n\t\t\tconsole.log('Am I fullscreen?', screenfull.isFullscreen ? 'Yes' : 'No');\n\t\t});\n\t}\n\t// Detect fullscreen error\n\tif (screenfull.isEnabled) {\n\t\tscreenfull.on('error', event => {\n\t\t\tconsole.error('Failed to enable fullscreen', event);\n\t\t});\n\t}\n\t```\n\t*/\n on(name: EventName, handler: (event: Event) => void): void\n\n /**\n\tRemove a previously registered event listener.\n\t@example\n\t```\n\timport screenfull from 'screenfull';\n\tscreenfull.off('change', callback);\n\t```\n\t*/\n off(name: EventName, handler: (event: Event) => void): void\n\n /**\n\tAlias for `.on('change', function)`.\n\t*/\n onchange(handler: (event: Event) => void): void\n\n /**\n\tAlias for `.on('error', function)`.\n\t*/\n onerror(handler: (event: Event) => void): void\n}\n\nexport default screenfull\n","import { useSpring } from '@react-spring/web'\nimport { useRef } from 'react'\n\nimport {\n ItemWithThumb,\n PrepareThumbsData,\n RenderItemProps,\n SpringCarouselWithThumbs,\n} from '../types'\n\ntype Props<T extends 'use-spring' | 'use-transition'> = {\n withThumbs?: boolean\n thumbsSlideAxis: SpringCarouselWithThumbs['thumbsSlideAxis']\n prepareThumbsData?: PrepareThumbsData<T>\n items: ItemWithThumb<T>[]\n renderThumbFnProps: RenderItemProps<T>\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<T extends 'use-spring' | 'use-transition'>({\n thumbsSlideAxis = 'x',\n withThumbs = false,\n prepareThumbsData,\n items,\n renderThumbFnProps,\n}: Props<T>) {\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<T>>,\n ): ReturnType<PrepareThumbsData<T>> {\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 {typeof renderThumb === 'function'\n ? renderThumb(renderThumbFnProps)\n : renderThumb}\n </div>\n )\n })}\n </div>\n ) : null\n\n return {\n thumbsFragment,\n handleScroll,\n }\n}\n"],"names":["eventLabel","useEventsModule","targetEvent","useRef","useListenToCustomEvent","eventHandler","useEffect","handleEvent","event","detail","current","document","createElement","addEventListener","_a","removeEventListener","emitEvent","newEvent","CustomEvent","dispatchEvent","screenfull$1","screenfull","useThumbsModule","thumbsSlideAxis","withThumbs","prepareThumbsData","items","renderThumbFnProps","wrapperRef","spring","setSpring","useSpring","val","getTotalScrollValue","Math","round","Number","getBoundingClientRect","thumbsFragment","_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"],"mappings":"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"}
|