react-spring-carousel 3.0.0-beta090.5 → 3.0.0-beta090.51

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,18 +1,12 @@
1
- import { UseSpringCarouselWithFixedItems, UseSpringCarouselWithFreeScroll, UseSpringCarouselWithNoFixedItems, UseSpringCarouselWithNoThumbs, UseSpringCarouselWithThumbs, UseSpringFreeScrollReturnType, UseSpringReturnType } from './types';
1
+ import { UseSpringFreeScrollReturnType, UseSpringReturnType } from './types';
2
+ import { Complete, FixedWithLoop, FixedWithNoLoop, FluidWithFreeScroll, FluidWithNoFreeScroll } from './types/useSpringCarousel.types';
2
3
  type ReturnType<T> = T extends true ? UseSpringFreeScrollReturnType : UseSpringReturnType;
3
- /**
4
- * With free scroll
5
- */
6
- declare function useSpringCarousel(props: UseSpringCarouselWithFreeScroll): ReturnType<true>;
7
- declare function useSpringCarousel(props: UseSpringCarouselWithThumbs<true>): ReturnType<true>;
8
- declare function useSpringCarousel(props: UseSpringCarouselWithNoThumbs<true>): ReturnType<true>;
9
- /**
10
- * No free scroll
11
- */
12
- declare function useSpringCarousel(props: UseSpringCarouselWithThumbs<false>): ReturnType<false>;
13
- declare function useSpringCarousel(props: UseSpringCarouselWithNoThumbs<false>): ReturnType<false>;
14
- declare function useSpringCarousel(props: UseSpringCarouselWithFixedItems<false>): ReturnType<false>;
15
- declare function useSpringCarousel(props: UseSpringCarouselWithNoFixedItems<false>): ReturnType<false>;
4
+ declare function useSpringCarousel(props: FixedWithLoop): ReturnType<false>;
5
+ declare function useSpringCarousel(props: FixedWithNoLoop): ReturnType<false>;
6
+ declare function useSpringCarousel(props: FluidWithFreeScroll): ReturnType<true>;
7
+ declare function useSpringCarousel(props: FluidWithNoFreeScroll): ReturnType<false>;
8
+ declare function useSpringCarousel(props: Complete): ReturnType<true>;
9
+ declare function useSpringCarousel(props: Complete): ReturnType<false>;
16
10
  type ContextProps<T = undefined> = Omit<ReturnType<T extends 'free-scroll' ? true : false>, 'carouselFragment' | 'thumbsFragment'>;
17
11
  declare function useSpringCarouselContext<T>(): ContextProps<T>;
18
12
  export { useSpringCarousel, useSpringCarouselContext };
package/package.json CHANGED
@@ -1,12 +1,11 @@
1
1
  {
2
2
  "name": "react-spring-carousel",
3
- "version": "3.0.0-beta090.5",
3
+ "version": "3.0.0-beta090.51",
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",
7
7
  "author": "Emiliano Bucci",
8
8
  "license": "MIT",
9
- "type": "module",
10
9
  "main": "./dist/index.cjs.js",
11
10
  "module": "./dist/index.es.js",
12
11
  "types": "./dist/types/index.d.ts",
@@ -16,7 +15,8 @@
16
15
  "exports": {
17
16
  ".": {
18
17
  "import": "./dist/index.es.js",
19
- "require": "./dist/index.cjs",
18
+ "module": "./dist/index.es.js",
19
+ "require": "./dist/index.cjs.js",
20
20
  "types": "./dist/types/index.d.ts"
21
21
  }
22
22
  },
@@ -44,16 +44,15 @@
44
44
  "animated"
45
45
  ],
46
46
  "devDependencies": {
47
- "@react-spring/web": "^9.7.2",
48
- "@storybook/addon-essentials": "^7.0.6",
49
- "@storybook/addon-interactions": "^7.0.6",
50
- "@storybook/addon-links": "^7.0.6",
51
- "@storybook/blocks": "^7.0.6",
52
- "@storybook/manager-api": "^7.0.6",
53
- "@storybook/react": "^7.0.6",
54
- "@storybook/react-vite": "^7.0.6",
55
- "@storybook/testing-library": "^0.0.14-next.2",
56
- "@storybook/theming": "^7.0.6",
47
+ "@storybook/addon-essentials": "^7.5.0",
48
+ "@storybook/addon-interactions": "^7.5.0",
49
+ "@storybook/addon-links": "^7.5.0",
50
+ "@storybook/blocks": "^7.5.0",
51
+ "@storybook/manager-api": "^7.5.0",
52
+ "@storybook/react": "^7.5.0",
53
+ "@storybook/react-vite": "^7.5.0",
54
+ "@storybook/testing-library": "^0.2.2",
55
+ "@storybook/theming": "^7.5.0",
57
56
  "@types/react": "^18.0.28",
58
57
  "@types/react-dom": "^18.0.11",
59
58
  "@typescript-eslint/eslint-plugin": "^5.59.0",
@@ -66,20 +65,22 @@
66
65
  "eslint-plugin-react-hooks": "^4.6.0",
67
66
  "eslint-plugin-react-refresh": "^0.3.4",
68
67
  "eslint-plugin-simple-import-sort": "^10.0.0",
69
- "eslint-plugin-storybook": "^0.6.11",
68
+ "eslint-plugin-storybook": "^0.6.15",
70
69
  "husky": "^8.0.3",
71
70
  "lint-staged": "^13.2.1",
72
71
  "prettier": "^2.8.8",
73
72
  "prop-types": "^15.8.1",
73
+ "react": "^18.2.0",
74
+ "react-dom": "^18.2.0",
74
75
  "react-hooks": "^1.0.1",
75
- "storybook": "^7.0.6",
76
+ "storybook": "^7.5.0",
76
77
  "typescript": "^5.0.2",
77
78
  "vite": "^4.3.0",
78
79
  "vite-plugin-dts": "^2.3.0",
79
80
  "vite-tsconfig-paths": "^4.2.0"
80
81
  },
81
82
  "peerDependencies": {
82
- "@react-spring/web": "^9.5.5",
83
+ "@react-spring/web": "^9.5.4",
83
84
  "@use-gesture/react": "^10.2.26",
84
85
  "react": "^18.0.0",
85
86
  "react-dom": "^18.0.0",
@@ -1,2 +0,0 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const k=require("./useThumbsModule-09d1d442.cjs"),j=require("@react-spring/web"),Ve=require("@use-gesture/react"),u=require("react"),De=require("resize-observer-polyfill"),F=require("screenfull");function Be({mainCarouselWrapperRef:n,onFullScreenChange:m,handleResize:$}){const K=u.useRef(!1);u.useEffect(()=>{function v(){document.fullscreenElement&&(O(!0),m(!0),$&&$()),document.fullscreenElement||(O(!1),m(!1),$&&$())}if(F.isEnabled)return F.on("change",v),()=>{F.isEnabled&&F.off("change",v)}},[]);function O(v){K.current=v}function I(){return K.current}function T(v){F.isEnabled&&F.request(v||n.current)}function o(){F.isEnabled&&F.exit()}return{enterFullscreen:T,exitFullscreen:o,getIsFullscreen:I}}function He({items:n,init:m=!0,withThumbs:$,thumbsSlideAxis:K="x",itemsPerSlide:O=1,slideType:I="fixed",gutter:T=0,withLoop:o=!1,startEndGutter:v=0,carouselSlideAxis:i="x",disableGestures:de=!1,draggingSlideTreshold:ee,slideWhenThresholdIsReached:ge=!1,freeScroll:c,enableFreeScrollDrag:te,initialStartingPosition:Q,prepareThumbsData:pe,initialActiveItem:w=0,animateWhenActiveItemChange:ye=!0,getControllerRef:re,slideGroupOfItems:U=!1}){const R=O>n.length?n.length:O,z=u.useRef(!1),Z=u.useRef(ee??0),C=u.useRef("initial"),ne=u.useRef("initial"),ce=u.useRef("initial"),x=u.useRef(w),d=u.useRef(w===0),l=u.useRef(I==="fixed"&&w===n.length-1),a=u.useRef(null),p=u.useRef(null),ue=u.useRef(0),oe=u.useRef(0),g=u.useRef(0),Ie=u.useRef(o),be=u.useRef(I),Te=u.useRef(c),W=u.useRef(!1),_=u.useCallback(()=>o?[...n.map(e=>({...e,id:`prev-repeated-item-${e.id}`})),...n,...n.map(e=>({...e,id:`next-repeated-item-${e.id}`}))]:[...n],[n,o])(),[N,y]=j.useSpring(()=>({val:0,pause:!m,onChange:({value:e})=>{c&&a.current?(i==="x"?a.current.scrollLeft=Math.abs(e.val):a.current.scrollTop=Math.abs(e.val),S()):p.current&&(i==="x"?p.current.style.transform=`translate3d(${e.val}px, 0px,0px)`:p.current.style.transform=`translate3d(0px,${e.val}px,0px)`)}}),[c]),{emitEvent:G,useListenToCustomEvent:L}=k.useEventsModule(),{thumbsFragment:Re,handleScroll:Ee}=k.useThumbsModule({withThumbs:!!$,thumbsSlideAxis:K,prepareThumbsData:pe,items:n,renderThumbFnProps:{getIsActiveItem:fe,getIsPrevItem:le,useListenToCustomEvent:L,getIsNextItem:se}}),{enterFullscreen:he,exitFullscreen:ve,getIsFullscreen:me}=Be({mainCarouselWrapperRef:a,handleResize:()=>A(),onFullScreenChange:e=>{G({eventName:"onFullscreenChange",isFullscreen:e})}});function we(e){return I==="fixed"&&!c?{marginRight:`${e?0:T}px`,flex:`1 0 calc(100% / ${R} - ${T*(R-1)/R}px)`}:{marginRight:`${e?0:T}px`}}const f=u.useCallback(()=>{var r;const e=U?a.current:(r=a.current)==null?void 0:r.querySelector(".use-spring-carousel-item");if(!e)throw Error("No carousel items available!");return e.getBoundingClientRect()[i==="x"?"width":"height"]+T},[i,T,U]);function P({from:e,to:r,nextActiveItem:t,immediate:s=!1,slideMode:E}){ne.current=E,typeof t=="number"&&(c||(x.current=t),G({eventName:"onSlideStartChange",slideActionType:C.current,slideMode:ne.current,nextItem:{startReached:d.current,endReached:l.current,index:c?-1:x.current,id:c?"":n[x.current].id}})),g.current=r,y.start({immediate:s,from:{val:e},to:{val:r},config:{...j.config.default,velocity:N.val.velocity},onRest(B){!s&&B.finished&&G({eventName:"onSlideChange",slideActionType:C.current,slideMode:ne.current,currentItem:{startReached:d.current,endReached:l.current,index:c?-1:x.current,id:c?"":n[x.current].id}})}}),$&&!s&&Ee(x.current)}const h=u.useCallback(()=>{var e;return p.current?o?f()*n.length:Math.round(Number((e=p.current)==null?void 0:e[i==="x"?"scrollWidth":"scrollHeight"])-p.current.getBoundingClientRect()[i==="x"?"width":"height"]-v*2):0},[i,f,n.length,v,o]);function Ce(){const e=`calc(100% - ${v*2}px)`;return{width:i==="x"?e:"100%",height:i==="y"?e:"100%"}}const X=u.useCallback(()=>{var r;const e=(r=p.current)==null?void 0:r.querySelector(".use-spring-carousel-item");if(!e)throw Error("No carousel items available!");return e.getBoundingClientRect()[i==="x"?"width":"height"]+T},[i,T]),Y=u.useCallback(e=>{const r=i==="x"?"left":"top",t=p.current;t&&(o?(t.style.top="0px",t.style.left="0px",t.style[r]=`-${e-v}px`,d.current=!1,l.current=!1):(t.style.left="0px",t.style.top="0px"))},[i,v,o]),A=u.useCallback((e=!1)=>{if(p.current&&e&&(p.current.style.transform="translate3d(0px, 0px,0px)",p.current.style.left="0",p.current.style.top="0"),I==="fixed"&&Y(Q==="center"?X()*n.length-f()*Math.round((R-1)/2):Q==="end"?X()*n.length-f()*Math.round(R-1):X()*n.length),I==="fluid"){if(Y(X()*n.length),l.current&&h()!==Math.abs(g.current)&&!o){const r=-h();g.current=r,y.start({immediate:!0,val:g.current});return}if(Math.abs(g.current)>0&&h()!==Math.abs(g.current)&&!o&&!c&&ce.current==="backward"){const r=ue.current-h(),t=g.current+r;return y.start({immediate:!0,val:t}),()=>{g.current=t}}console.log("here");return}if(!c&&I==="fixed"){const r=-(f()*x.current);if(Math.abs(r)>h()&&!o){const t=-h();l.current=!0,g.current=t,y.start({immediate:!0,val:g.current})}else g.current=r,y.start({immediate:!0,val:r});setTimeout(()=>{z.current=!1},0)}},[c,X,f,h,Q,n.length,R,Y,y,I,o]);function M(){return c&&a.current?a.current[i==="x"?"scrollLeft":"scrollTop"]:N.val.get()}function J(e,r){if(c&&e==="next"){const t=g.current+f();return t>h()?h():t}if(c&&e==="prev"){const t=g.current-f();return t<0?0:t}return e==="next"?typeof r=="number"?-(r*f()):g.current-f():typeof r=="number"?-(r*f()):g.current+f()}function q({type:e,index:r,immediate:t}){if(!m||W.current||d.current&&!o)return;l.current&&(ce.current="backward"),C.current="prev",l.current=!1;const s=typeof r=="number"?r:x.current-1;if(c&&S(),!o){const E=c?J("prev",r)-f()/3<0:J("prev",r)+f()/3>0;if(d.current)return;if(E){d.current=!0,l.current=!1,P({slideMode:e,from:M(),to:0,nextActiveItem:0,immediate:t});return}}if(o&&(d.current||s<0)){d.current=!1,l.current=!0,P({slideMode:e,from:M()-f()*n.length,to:-(f()*n.length)+f(),nextActiveItem:n.length-1,immediate:t});return}s===0&&(d.current=!0),(s===n.length-1||s===-1)&&(l.current=!0),P({slideMode:e,from:M(),to:J("prev",r),nextActiveItem:s,immediate:t})}function V({type:e,index:r,immediate:t}){if(!m||W.current||l.current&&!o)return;d.current&&(ce.current="forward"),C.current="next",d.current=!1;const s=r||x.current+1;if(c&&S(),!o){const E=Math.abs(J("next",r))>h()-f()/3;if(l.current)return;if(E){d.current=!1,l.current=!0,P({slideMode:e,from:M(),to:c?h():-h(),nextActiveItem:s,immediate:t});return}}if(o&&(l.current||s>n.length-1)){l.current=!1,d.current=!0,P({slideMode:e,from:M()+f()*n.length,to:0,nextActiveItem:0,immediate:t});return}s===0&&(d.current=!0),s===n.length-1&&(l.current=!0),P({slideMode:e,from:M(),to:J("next",r),nextActiveItem:s,immediate:t})}function Me(){ee?Z.current=ee:Z.current=Math.floor(f()/2/2)}function xe(){p.current&&(ue.current=h(),Ie.current=o,be.current=I,Te.current=c,oe.current=window.innerWidth,g.current=0,ie({id:0,immediate:!0,shouldReset:!0}),Me(),A())}const ke=m&&!de&&!c||!!c&&!!te,Fe=Ve.useDrag(e=>{const r=e.dragging,t=e.offset[i==="x"?0:1],s=e.movement[i==="x"?0:1],E=e.direction[i==="x"?0:1],B=s>Z.current,H=s<-Z.current,qe=h();if(r){if(E>0?C.current="prev":C.current="next",G({...e,eventName:"onDrag",slideActionType:C.current}),c){if(t>0){y.start({from:{val:M()},to:{val:0},config:{velocity:e.velocity,friction:50,tension:1e3}}),e.cancel();return}y.start({from:{val:M()},to:{val:-t},config:{velocity:e.velocity,friction:50,tension:1e3}});return}y.start({val:t,config:{velocity:e.velocity,friction:50,tension:1e3}}),ge&&H?(V({type:"drag"}),e.cancel()):ge&&B&&(q({type:"drag"}),e.cancel()),qe-Math.abs(t)<-(f()*2)&&e.cancel();return}if(e.last&&c&&t>0){y.start({from:{val:M()},to:{val:0},config:{velocity:e.velocity,friction:50,tension:1e3}});return}e.last&&!e.canceled&&c&&(C.current==="prev"&&q({type:"drag"}),C.current==="next"&&V({type:"drag"})),e.last&&!e.canceled&&!c&&(H?!o&&l.current?y.start({val:-h(),config:{...j.config.default,velocity:e.velocity}}):V({type:"drag"}):B?!o&&d.current?y.start({val:0,config:{...j.config.default,velocity:e.velocity}}):q({type:"drag"}):y.start({val:g.current,config:{...j.config.default,velocity:e.velocity}})),e.last&&e.canceled&&y.start({val:g.current,config:{...j.config.default,velocity:e.velocity}})},{enabled:ke,axis:i,from:()=>c&&a.current?[-a.current.scrollLeft,-a.current.scrollTop]:i==="x"?[N.val.get(),N.val.get()]:[N.val.get(),N.val.get()]});function $e(){return c?i==="x"?{overflowX:"auto"}:{overflowY:"auto"}:{}}function S(){a.current&&(g.current=a.current[i==="x"?"scrollLeft":"scrollTop"],a.current[i==="x"?"scrollLeft":"scrollTop"]===0&&(d.current=!0,l.current=!1),a.current[i==="x"?"scrollLeft":"scrollTop"]>0&&a.current[i==="x"?"scrollLeft":"scrollTop"]<h()&&(d.current=!1,l.current=!1),a.current[i==="x"?"scrollLeft":"scrollTop"]===h()&&(d.current=!1,l.current=!0))}function Ne(){return c?{onWheel(){N.val.stop(),S()}}:{}}function D(e,r){let t=0;if(typeof e=="string"?t=n.findIndex(s=>s.id===e):t=e,t<0||t>=n.length){if(r)throw new Error(r);console.error(`The item doesn't exist; check that the id provided - ${e} - is correct.`),t=-1}return t}function ie({id:e,immediate:r,shouldReset:t,type:s}){if(!m||W.current)return;d.current=!1,l.current=!1;const E=D(e,"The item you want to slide to doesn't exist; check the provided id.");if(E===x.current&&!t)return;const B=D(n[x.current].id),H=D(n[E].id);H>B?V({type:s||t?"initial":"click",index:H,immediate:r}):q({type:s||t?"initial":"click",index:H,immediate:r})}function se(e){const r=D(e,"The item doesn't exist; check the provided id."),t=x.current;return o&&t===n.length-1?r===0:r===t+1}function le(e){const r=D(e,"The item doesn't exist; check the provided id."),t=x.current;return o&&t===0?r===n.length-1:r===t-1}function fe(e){return D(e,"The item you want to check doesn't exist; check the provided id.")===x.current}function je(){return de?"unset":i==="x"?"pan-y":"pan-x"}const b=c?{useListenToCustomEvent:L,enterFullscreen:he,exitFullscreen:ve,getIsFullscreen:me,slideToPrevItem:(e=!0)=>{q({type:"click",immediate:!e})},slideToNextItem:(e=!0)=>{V({type:"click",immediate:!e})}}:{useListenToCustomEvent:L,enterFullscreen:he,exitFullscreen:ve,getIsFullscreen:me,slideToPrevItem:(e=!0)=>{q({type:"click",immediate:!e})},slideToNextItem:(e=!0)=>{V({type:"click",immediate:!e})},slideToItem:(e,r=!0)=>{ie({id:e,immediate:!r})},getIsNextItem:se,getIsPrevItem:le,getIsActiveItem:fe};j.useIsomorphicLayoutEffect(()=>{p.current&&m&&(z.current=!0,xe())},[m]),u.useEffect(()=>{x.current!==w&&(z.current=!0,ie({id:w,immediate:!ye}))},[w]),u.useEffect(()=>{if(m){if(w>n.length-1)throw new Error(`initialActiveItem (${w}) is greater than the total quantity available items (${n.length}).`);R>n.length&&console.warn(`itemsPerSlide (${R}) is greater than the total quantity available items (${n.length}). Fallback to ${n.length})`)}},[w,n.length,R,m]),u.useEffect(()=>{oe.current=window.innerWidth},[]),u.useEffect(()=>{if(m){if(o&&c)throw new Error("`withLoop` and `freeScroll` can't be used together.");if(c&&I==="fixed")throw new Error("`freeScroll` can't be used when `scrollType=fixed`.");if(te&&(I!=="fluid"||!c))throw new Error("`enableFreeScrollDrag` must be used with `slideType=fluid` and `freeScroll=true`");if(U&&c)throw new Error("`slideGroupOfItems` and `freeScroll` can't be used together.");z.current=!0,xe()}},[Q,R,v,T,m,o,I,c,te,U]),u.useEffect(()=>{if(!m)return;function e(){document.hidden?W.current=!0:W.current=!1}return document.addEventListener("visibilitychange",e),()=>{document.removeEventListener("visibilitychange",e)}},[m]),u.useEffect(()=>{if(a.current){let e;const r=new De(()=>{if(!W.current&&!z.current){oe.current=window.innerWidth;const t=A();window.clearTimeout(e),e=setTimeout(()=>{ue.current=h(),typeof t=="function"&&t()},100)}});return r.observe(a.current),()=>{r.disconnect()}}},[A,h]),u.useEffect(()=>{re&&re({slideToNextItem:b.slideToNextItem,slideToPrevItem:b.slideToPrevItem,slideToItem:b==null?void 0:b.slideToItem})},[re,b.slideToItem,b.slideToNextItem,b.slideToPrevItem]);const We=k.jsxRuntimeExports.jsx(ae.Provider,{value:b,children:Re}),Pe=k.jsxRuntimeExports.jsx(ae.Provider,{value:b,children:k.jsxRuntimeExports.jsx("div",{className:"use-spring-carousel-main-wrapper",ref:a,...Ne(),style:{display:"flex",position:"relative",width:"100%",height:"100%",...$e()},children:k.jsxRuntimeExports.jsxs("div",{className:"use-spring-carousel-track-wrapper",ref:p,...Fe(),style:{position:"relative",display:"flex",flexDirection:i==="x"?"row":"column",touchAction:je(),...Ce()},children:[(c||!o)&&v?k.jsxRuntimeExports.jsx("div",{style:{flexShrink:0,width:v}}):null,_.map((e,r)=>k.jsxRuntimeExports.jsx("div",{className:"use-spring-carousel-item","data-testid":"use-spring-carousel-item-wrapper",style:{display:"flex",position:"relative",flex:"1",...we(r===_.findIndex(t=>t.id===_[_.length-1].id))},children:typeof e.renderItem=="function"?e.renderItem({getIsActiveItem:fe,getIsNextItem:se,getIsPrevItem:le,useListenToCustomEvent:L}):e.renderItem},`${e.id}-${r}`)),(c||!o)&&v?k.jsxRuntimeExports.jsx("div",{style:{flexShrink:0,width:v}}):null]})})});return{...b,carouselFragment:Pe,thumbsFragment:We}}const ae=u.createContext(void 0);function Oe(){const n=u.useContext(ae);if(!n)throw new Error("useSpringCarouselContext must be used within the carousel.");return n}exports.useSpringCarousel=He;exports.useSpringCarouselContext=Oe;
2
- //# sourceMappingURL=index.cjs2.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.cjs2.js","sources":["../src/modules/useFullscreenModule.ts","../src/useSpringCarousel.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react'\nimport screenfull from 'screenfull'\n\nimport { FullscreenModule } from '../types/useFullscreenModule.types'\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 { config, useIsomorphicLayoutEffect, useSpring } from '@react-spring/web'\nimport { useDrag } from '@use-gesture/react'\nimport React, { createContext, useCallback, useContext, useEffect, useRef } from 'react'\nimport ResizeObserver from 'resize-observer-polyfill'\n\nimport { useEventsModule } from './modules/useEventsModule'\nimport { useFullscreenModule } from './modules/useFullscreenModule'\nimport { useThumbsModule } from './modules/useThumbsModule'\nimport {\n ItemWithThumb,\n SlideActionType,\n SlideMode,\n SlideType,\n UseSpringCarouselComplete,\n UseSpringCarouselWithFixedItems,\n UseSpringCarouselWithFreeScroll,\n UseSpringCarouselWithNoFixedItems,\n UseSpringCarouselWithNoThumbs,\n UseSpringCarouselWithThumbs,\n UseSpringFreeScrollReturnType,\n UseSpringReturnType,\n} from './types'\n\ntype ReturnType<T> = T extends true ? UseSpringFreeScrollReturnType : UseSpringReturnType\n\n/**\n * With free scroll\n */\nfunction useSpringCarousel(props: UseSpringCarouselWithFreeScroll): ReturnType<true>\nfunction useSpringCarousel(props: UseSpringCarouselWithThumbs<true>): ReturnType<true>\nfunction useSpringCarousel(props: UseSpringCarouselWithNoThumbs<true>): ReturnType<true>\n/**\n * No free scroll\n */\nfunction useSpringCarousel(props: UseSpringCarouselWithThumbs<false>): ReturnType<false>\nfunction useSpringCarousel(props: UseSpringCarouselWithNoThumbs<false>): ReturnType<false>\nfunction useSpringCarousel(props: UseSpringCarouselWithFixedItems<false>): ReturnType<false>\nfunction useSpringCarousel(props: UseSpringCarouselWithNoFixedItems<false>): 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 slideGroupOfItems = false,\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'>('initial')\n\n const activeItem = useRef(initialActiveItem)\n const firstItemReached = useRef(initialActiveItem === 0)\n const lastItemReached = useRef(slideType === 'fixed' && initialActiveItem === items.length - 1)\n const mainCarouselWrapperRef = useRef<HTMLDivElement | null>(null)\n const carouselTrackWrapperRef = useRef<HTMLDivElement | null>(null)\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 const getSlideValue = useCallback(() => {\n const carouselItem = slideGroupOfItems\n ? mainCarouselWrapperRef.current\n : mainCarouselWrapperRef.current?.querySelector('.use-spring-carousel-item')\n\n if (!carouselItem) {\n throw Error('No carousel items available!')\n }\n\n return (\n carouselItem.getBoundingClientRect()[carouselSlideAxis === 'x' ? 'width' : 'height'] + gutter\n )\n }, [carouselSlideAxis, gutter, slideGroupOfItems])\n\n type SlideToItem = {\n from: number\n to: number\n nextActiveItem?: number\n immediate?: boolean\n slideMode: SlideMode\n }\n\n function slideToItem({ from, to, nextActiveItem, immediate = false, slideMode }: 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 const getTotalScrollValue = useCallback(() => {\n if (!carouselTrackWrapperRef.current) return 0\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 }, [carouselSlideAxis, getSlideValue, items.length, startEndGutter, withLoop])\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 const getCarouselItemWidth = useCallback(() => {\n const carouselItem = carouselTrackWrapperRef.current?.querySelector('.use-spring-carousel-item')\n if (!carouselItem) {\n throw Error('No carousel items available!')\n }\n return (\n carouselItem.getBoundingClientRect()[carouselSlideAxis === 'x' ? 'width' : 'height'] + gutter\n )\n }, [carouselSlideAxis, gutter])\n\n const setPosition = useCallback(\n (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 [carouselSlideAxis, startEndGutter, withLoop],\n )\n\n const adjustCarouselWrapperPosition = useCallback(\n (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 - getSlideValue() * Math.round(itemsPerSlide - 1),\n )\n } else {\n setPosition(getCarouselItemWidth() * items.length)\n }\n }\n\n if (slideType === 'fluid') {\n setPosition(getCarouselItemWidth() * items.length)\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 console.log('here')\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 [\n freeScroll,\n getCarouselItemWidth,\n getSlideValue,\n getTotalScrollValue,\n initialStartingPosition,\n items.length,\n itemsPerSlide,\n setPosition,\n setSpring,\n slideType,\n withLoop,\n ],\n )\n function getFromValue() {\n if (freeScroll && mainCarouselWrapperRef.current) {\n return mainCarouselWrapperRef.current[carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop']\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 (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[carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop']\n if (\n mainCarouselWrapperRef.current[carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'] === 0\n ) {\n firstItemReached.current = true\n lastItemReached.current = false\n }\n if (\n mainCarouselWrapperRef.current[carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'] >\n 0 &&\n mainCarouselWrapperRef.current[carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'] <\n getTotalScrollValue()\n ) {\n firstItemReached.current = false\n lastItemReached.current = false\n }\n\n if (\n mainCarouselWrapperRef.current[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(`The item doesn't exist; check that the id provided - ${id} - is correct.`)\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({ id, immediate, shouldReset, type }: 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(id, \"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 when carousel is initialized\n */\n if (carouselTrackWrapperRef.current && init) {\n resizeByPropChange.current = true\n initializeCarousel()\n }\n }, [init])\n useEffect(() => {\n if (activeItem.current !== initialActiveItem) {\n resizeByPropChange.current = true\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\n /**\n * When these props change we reset the carousel\n */\n useEffect(() => {\n if (init) {\n if (withLoop && freeScroll) {\n throw new Error(\"`withLoop` and `freeScroll` can't be used together.\")\n }\n if (freeScroll && slideType === 'fixed') {\n throw new Error(\"`freeScroll` can't be used when `scrollType=fixed`.\")\n }\n if (enableFreeScrollDrag && (slideType !== 'fluid' || !freeScroll)) {\n throw new Error(\n '`enableFreeScrollDrag` must be used with `slideType=fluid` and `freeScroll=true`',\n )\n }\n if (slideGroupOfItems && freeScroll) {\n throw new Error(\"`slideGroupOfItems` and `freeScroll` can't be used together.\")\n }\n\n resizeByPropChange.current = true\n initializeCarousel()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n initialStartingPosition,\n itemsPerSlide,\n startEndGutter,\n gutter,\n init,\n withLoop,\n slideType,\n freeScroll,\n enableFreeScrollDrag,\n slideGroupOfItems,\n ])\n\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 (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 = <Context.Provider value={res}>{thumbsFragment}</Context.Provider>\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>(undefined)\n\nfunction useSpringCarouselContext<T>() {\n const context = useContext(Context)\n if (!context) {\n throw new Error('useSpringCarouselContext must be used within the carousel.')\n }\n return context as ContextProps<T>\n}\n\nexport { useSpringCarousel, useSpringCarouselContext }\n"],"names":["useFullscreenModule","mainCarouselWrapperRef","onFullScreenChange","handleResize","isFullscreen","useRef","useEffect","handleFullscreenChange","setIsFullscreen","screenfull","_isFullscreen","getIsFullscreen","enterFullscreen","elementRef","exitFullscreen","useSpringCarousel","items","init","withThumbs","thumbsSlideAxis","_itemsPerSlide","slideType","gutter","withLoop","startEndGutter","carouselSlideAxis","disableGestures","_draggingSlideTreshold","slideWhenThresholdIsReached","freeScroll","enableFreeScrollDrag","initialStartingPosition","prepareThumbsData","initialActiveItem","animateWhenActiveItemChange","getControllerRef","slideGroupOfItems","itemsPerSlide","resizeByPropChange","draggingSlideTreshold","slideActionType","slideModeType","directionAfterReachingEdges","activeItem","firstItemReached","lastItemReached","carouselTrackWrapperRef","prevTotalScrollValue","prevWindowWidth","prevSlidedValue","prevWithLoop","prevSlideType","prevFreeScroll","windowIsHidden","internalItems","useCallback","i","spring","setSpring","useSpring","value","setStartEndItemReachedOnFreeScroll","emitEvent","useListenToCustomEvent","useEventsModule","thumbsFragment","handleScroll","useThumbsModule","getIsActiveItem","getIsPrevItem","getIsNextItem","adjustCarouselWrapperPosition","val","getItemStyles","isLastItem","getSlideValue","carouselItem","_a","slideToItem","from","to","nextActiveItem","immediate","slideMode","config","getTotalScrollValue","getAnimatedWrapperStyles","percentValue","getCarouselItemWidth","setPosition","v","positionProperty","ref","shouldResetPosition","newVal","diff","next","nextValue","getFromValue","getToValue","type","index","slideToPrevItem","nextItem","nextItemWillExceed","slideToNextItem","setDraggingSliderTreshold","initializeCarousel","internalSlideToItem","enableDrag","bindDrag","useDrag","state","isDragging","movement","currentMovement","direction","prevItemTreshold","nextItemTreshold","tot","getWrapperOverflowStyles","getScrollHandlers","findItemIndex","id","error","itemIndex","item","shouldReset","currentItem","newActiveItem","_activeItem","getTouchAction","res","animate","useIsomorphicLayoutEffect","handleVisibilityChange","timer","observer","ResizeObserver","cb","_thumbsFragment","jsx","Context","carouselFragment","jsxs","createContext","useSpringCarouselContext","context","useContext"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=require("./useThumbsModule-09d1d442.cjs"),g=require("@react-spring/web"),K=require("@use-gesture/react"),o=require("react"),c={initial:{opacity:1,position:"relative"},from:{opacity:0,position:"relative"},enter:{position:"relative",opacity:1},leave:{opacity:1,position:"absolute"}};function Q({init:l=!0,disableGestures:q=!1,items:r,springConfig:M=g.config.default,exitBeforeEnter:N=!1,trail:_,withLoop:s=!1,activeItem:a,toPrevItemSpringProps:h=c,toNextItemSpringProps:v=c,draggingSlideTreshold:b=50,thumbsSlideAxis:$="x"}){const d=o.useRef("next"),p=o.useRef("initial"),S=o.useRef(null),[n,R]=o.useState(a??0),{emitEvent:x,useListenToCustomEvent:I}=u.useEventsModule(),{handleScroll:A,thumbsFragment:D}=u.useThumbsModule({thumbsSlideAxis:$,items:r,renderThumbFnProps:{getIsNextItem:w,getIsPrevItem:k,useListenToCustomEvent:I,activeItem:{index:n,id:r[n].id}}});function O(){return d.current==="prev"?{initial:{...h.initial},from:{...h.from},enter:{...h.enter},leave:{...h.leave}}:d.current==="next"?{initial:{...v.initial},from:{...v.from},enter:{...v.enter},leave:{...v.leave}}:{initial:{...c.initial},from:{...c.from},enter:{...c.enter},leave:{...c.leave}}}o.useEffect(()=>{typeof a=="number"&&a!==n&&R(a)},[a]);function T({to:e,slideType:t,slideMode:i}){d.current=t,p.current=i,x({eventName:"onSlideStartChange",slideActionType:d.current,slideMode:p.current,nextItem:{index:e,id:r[e].id,startReached:e===0,endReached:e===r.length-1}}),R(e),A(n)}function E(e){if(!l)return;const t=n===0;!s&&t||T(s&&t?{to:r.length-1,slideType:"prev",slideMode:e}:{to:n-1,slideType:"prev",slideMode:e})}function j(e){if(!l)return;const t=n===r.length-1;!s&&t||T(s&&t?{to:0,slideType:"next",slideMode:e}:{to:n+1,slideType:"next",slideMode:e})}const W=g.useTransition(n,{config:M,key:null,trail:_,exitBeforeEnter:N,...O(),onRest(e,t,i){e.finished&&i===n&&x({eventName:"onSlideChange",slideActionType:d.current,slideMode:p.current,currentItem:{index:n,id:r[n].id,startReached:n===0,endReached:n===r.length-1}})}}),z=K.useDrag(({last:e,movement:[t]})=>{if(e){const i=t>b,f=t<-b,m=n===0,J=n===r.length-1;if(f){if(!s&&J)return;x({eventName:"onLeftSwipe"}),j("swipe")}else if(i){if(!s&&m)return;x({eventName:"onRightSwipe"}),E("swipe")}}},{enabled:!q});function F(e,t){let i=0;if(typeof e=="string"?i=r.findIndex(f=>f.id===e):i=e,i<0||i>=r.length){if(t)throw new Error(t);console.error(`The item doesn't exist; check that the id provided - ${e} - is correct.`),i=-1}return i}function w(e){const t=F(e,"The item doesn't exist; check the provided id."),i=n;return s&&i===r.length-1?t===0:t===i+1}function k(e){const t=F(e,"The item doesn't exist; check the provided id."),i=n;return s&&i===0?t===r.length-1:t===i-1}const B=W((e,t,i,f)=>{const m=r[t].renderItem;return u.jsxRuntimeExports.jsx(g.a.div,{id:`use-transition-carousel-item-${f}`,className:"use-transition-carousel-item",style:{...e,flex:"1 0 100%",width:"100%",height:"100%"},children:typeof m=="function"?m({useListenToCustomEvent:I,getIsNextItem:w,getIsPrevItem:k,activeItem:{index:n,id:r[n].id}}):m})}),y={useListenToCustomEvent:I,slideToPrevItem:()=>E("click"),slideToNextItem:()=>j("click")},G=u.jsxRuntimeExports.jsx(C.Provider,{value:y,children:D}),H=u.jsxRuntimeExports.jsx(C.Provider,{value:y,children:u.jsxRuntimeExports.jsx("div",{ref:S,...z(),style:{display:"flex",position:"relative",width:"100%",height:"100%",overflow:"hidden"},children:B})});return{...y,carouselFragment:H,thumbsFragment:G}}const C=o.createContext(void 0);function U(){const l=o.useContext(C);if(!l)throw new Error("useTransitionCarouselContext must be used within the carousel.");return l}exports.useTransitionCarousel=Q;exports.useTransitionCarouselContext=U;
2
- //# sourceMappingURL=index.cjs3.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.cjs3.js","sources":["../src/useTransitionCarousel.tsx"],"sourcesContent":["import { a, config, useTransition } from '@react-spring/web'\nimport { useDrag } from '@use-gesture/react'\nimport { createContext, useContext, useEffect, useRef, useState } from 'react'\n\nimport { useThumbsModule } from './modules'\nimport { useEventsModule } from './modules/useEventsModule'\nimport {\n ItemWithThumb,\n SlideActionType,\n TransitionSlideMode,\n UseTransitionCarouselProps,\n UseTransitionCarouselReturnProps,\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(`The item doesn't exist; check that the id provided - ${id} - is correct.`)\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 = <Context.Provider value={result}>{thumbsFragment}</Context.Provider>\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<UseTransitionCarouselReturnProps, 'carouselFragment' | 'thumbsFragment'>\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":["defaultAnimationProps","useTransitionCarousel","init","disableGestures","items","springConfig","config","exitBeforeEnter","trail","withLoop","externalActiveItem","toPrevItemSpringProps","toNextItemSpringProps","draggingSlideTreshold","thumbsSlideAxis","slideActionType","useRef","slideModeType","mainCarouselWrapperRef","activeItem","setActiveItem","useState","emitEvent","useListenToCustomEvent","useEventsModule","handleScroll","thumbsFragment","useThumbsModule","getIsNextItem","getIsPrevItem","getConfig","useEffect","slideToItem","to","slideType","slideMode","slideToPrevItem","isFirstItem","slideToNextItem","isLastItem","transitions","useTransition","value","_","index","bindSwipe","useDrag","last","mx","prevItemTreshold","nextItemTreshold","findItemIndex","id","error","itemIndex","item","_activeItem","itemsFragment","styles","indx","renderItem","jsx","a","result","_thumbsFragment","Context","carouselFragment","createContext","useTransitionCarouselContext","context","useContext"],"mappings":"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"}