react-spring-carousel 3.0.0-beta034 → 3.0.0-beta035

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 CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var e=require("react/jsx-runtime"),t=require("@react-spring/web"),n=require("react"),r=require("@use-gesture/react"),i=require("screenfull");function s(){const e=n.useRef(null);return{useListenToCustomEvent:function(t){n.useEffect((()=>{function n(e){t(e.detail)}if(e.current||(e.current=document.createElement("div")),e.current)return e.current.addEventListener("RSC::Event",n,!1),()=>{var t;null===(t=e.current)||void 0===t||t.removeEventListener("RSC::Event",n,!1)}}),[t])},emitEvent:function(t){if(e.current){const n=new CustomEvent("RSC::Event",{detail:t});e.current.dispatchEvent(n)}}}}function c({mainCarouselWrapperRef:e,onFullScreenChange:t,handleResize:r}){const s=n.useRef(!1);function c(e){s.current=e}return n.useEffect((()=>{function e(){document.fullscreenElement&&(c(!0),t(!0),r&&r()),document.fullscreenElement||(c(!1),t(!1),r&&r())}if(i.isEnabled)return i.on("change",e),()=>{i.isEnabled&&i.off("change",e)}}),[]),{enterFullscreen:function(t){i.isEnabled&&i.request(t||e.current)},exitFullscreen:function(){i.isEnabled&&i.exit()},getIsFullscreen:function(){return s.current}}}function o({thumbsSlideAxis:r="x",withThumbs:i=!1,prepareThumbsData:s,items:c}){const o=n.useRef(null),[l,u]=t.useSpring((()=>({val:0})));function a(){var e;return Math.round(Number(null===(e=o.current)||void 0===e?void 0:e["x"===r?"scrollWidth":"scrollHeight"])-o.current.getBoundingClientRect()["x"===r?"width":"height"])}return{thumbsFragment:i?e.jsx("div",Object.assign({className:"use-spring-carousel-thumbs-wrapper",ref:o,onWheel:()=>l.val.stop(),style:Object.assign({display:"flex",flex:"1",position:"relative",width:"100%",height:"100%",flexDirection:"x"===r?"row":"column"},"x"===r?{overflowX:"auto"}:{overflowY:"auto",maxHeight:"100%"})},{children:function(){function e(e){return e.map((e=>({id:e.id,renderThumb:e.renderThumb})))}return s?s(e(c)):e(c)}().map((({id:t,renderThumb:n})=>{const r=`thumb-item-${t}`;return e.jsx("div",Object.assign({id:r,className:"thumb-item"},{children:n}),r)}))})):null,handleScroll:function(e){var t,n;const i=o.current?o.current.querySelector(`#thumb-item-${c[e].id}`):null;if(i&&o.current&&!function(e){const t=e.getBoundingClientRect();return t.top>=0&&t.left>=0&&t.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&t.right<=(window.innerWidth||document.documentElement.clientWidth)}(i)){const e=i.offsetLeft,s=e>a()?a():e;u.start({from:{val:null!==(n=null===(t=o.current)||void 0===t?void 0:t["x"===r?"scrollLeft":"scrollTop"])&&void 0!==n?n:0},to:{val:s},onChange:({value:e})=>{o.current&&(o.current["x"===r?"scrollLeft":"scrollTop"]=Math.abs(e.val))}})}}}}const l=n.createContext(void 0);const u={initial:{opacity:1,position:"relative"},from:{opacity:0,position:"relative"},enter:{position:"relative",opacity:1},leave:{opacity:1,position:"absolute"}};const a=n.createContext(void 0);exports.useEventsModule=s,exports.useFullscreenModule=c,exports.useSpringCarousel=function({items:i,init:u=!0,withThumbs:a,thumbsSlideAxis:d="x",itemsPerSlide:f=1,slideType:m="fixed",gutter:g=0,withLoop:h=!1,startEndGutter:v=0,carouselSlideAxis:p="x",disableGestures:x=!1,draggingSlideTreshold:b,slideWhenThresholdIsReached:w=!1,freeScroll:y,enableFreeScrollDrag:j,initialStartingPosition:T,prepareThumbsData:O,initialActiveItem:E=0,animateWhenActiveItemChange:I=!0}){const R=n.useRef(!1),C=f>i.length?i.length:f,S=n.useRef(0),M=n.useRef(null!=b?b:0),F=n.useRef("initial"),L=n.useRef("initial"),A=n.useRef(0),[N,$]=t.useSpring((()=>({val:0,pause:!u,onChange({value:e}){y&&q.current?("x"===p?q.current.scrollLeft=Math.abs(e.val):q.current.scrollTop=Math.abs(e.val),ce()):D.current&&(D.current.style.transform="x"===p?`translate3d(${e.val}px, 0px,0px)`:`translate3d(0px,${e.val}px,0px)`)}}))),k=n.useRef(E),P=n.useRef(0===E),W=n.useRef(!1),q=n.useRef(null),D=n.useRef(null),B=n.useRef(h),z=n.useCallback((()=>h?[...i.map((e=>Object.assign(Object.assign({},e),{id:`prev-repeated-item-${e.id}`}))),...i,...i.map((e=>Object.assign(Object.assign({},e),{id:`next-repeated-item-${e.id}`})))]:[...i]),[i,h])(),{emitEvent:H,useListenToCustomEvent:G}=s(),{thumbsFragment:X,handleScroll:Y}=o({withThumbs:!!a,thumbsSlideAxis:d,prepareThumbsData:O,items:i}),{enterFullscreen:J,exitFullscreen:K,getIsFullscreen:Q}=c({mainCarouselWrapperRef:q,handleResize:()=>ee(),onFullScreenChange:e=>{H({eventName:"onFullscreenChange",isFullscreen:e})}});function U(){var e;const t=null===(e=q.current)||void 0===e?void 0:e.querySelector(".use-spring-carousel-item");if(!t)throw Error("No carousel items available!");return t.getBoundingClientRect()["x"===p?"width":"height"]+g}function V({from:e,to:n,nextActiveItem:r,immediate:s=!1,slideMode:c}){L.current=c,"number"==typeof r&&(y||(k.current=r),H({eventName:"onSlideStartChange",slideActionType:F.current,slideMode:L.current,nextItem:{startReached:P.current,endReached:W.current,index:y?-1:k.current,id:y?"":i[k.current].id}})),A.current=n,$.start({immediate:s,from:{val:e},to:{val:n},config:Object.assign(Object.assign({},t.config.default),{velocity:N.val.velocity}),onRest(e){!s&&e.finished&&H({eventName:"onSlideChange",slideActionType:F.current,slideMode:L.current,currentItem:{startReached:P.current,endReached:W.current,index:y?-1:k.current,id:y?"":i[k.current].id}})}}),a&&!s&&Y(k.current)}function Z(){var e;return h?U()*i.length:Math.round(Number(null===(e=D.current)||void 0===e?void 0:e["x"===p?"scrollWidth":"scrollHeight"])-D.current.getBoundingClientRect()["x"===p?"width":"height"]-v)}function _(){var e;const t=null===(e=D.current)||void 0===e?void 0:e.querySelector(".use-spring-carousel-item");if(!t)throw Error("No carousel items available!");return t.getBoundingClientRect()["x"===p?"width":"height"]+g}function ee(){const e="x"===p?"left":"top";function t(t){const n=D.current;n&&(h?(n.style.top="0px",n.style.left="0px",n.style[e]=`-${t-v}px`,P.current=!1,W.current=!1):(n.style.left="0px",n.style.top="0px"))}const n=Math.abs(te());if(t("center"===T?_()*i.length-U()*Math.round((C-1)/2):"end"===T?_()*i.length-U()*Math.round(C-1):_()*i.length),n<Z()&&"fluid"===m&&W.current&&!h&&(W.current=!1),n>Z()&&!h){const e=-Z();W.current=!0,A.current=e,$.start({immediate:!0,val:A.current}),setTimeout((()=>{R.current=!1}),0)}if(!y&&"fixed"===m){const e=-U()*k.current;A.current=e,$.start({immediate:!0,val:e})}setTimeout((()=>{R.current=!1}),0)}function te(){return y&&q.current?q.current["x"===p?"scrollLeft":"scrollTop"]:N.val.get()}function ne(e,t){if(y&&"next"===e){const e=A.current+U();return e>Z()?Z():e}if(y&&"prev"===e){const e=A.current-U();return e<0?0:e}return"next"===e?"number"==typeof t?-t*U():A.current-U():"number"==typeof t?-t*U():A.current+U()}function re(e="click",t,n){if(!u||P.current&&!h)return;F.current="prev",W.current=!1;const r="number"==typeof t?t:k.current-1;if(!h){const r=y?ne("prev",t)-U()/3<0:ne("prev",t)+U()/3>0;if(P.current)return;if(r)return P.current=!0,W.current=!1,void V({slideMode:e,from:te(),to:0,nextActiveItem:0,immediate:n})}if(h&&(P.current||r<0))return P.current=!1,W.current=!0,void V({slideMode:e,from:te()-U()*i.length,to:-U()*i.length+U(),nextActiveItem:i.length-1,immediate:n});0===r&&(P.current=!0),r!==i.length-1&&-1!==r||(W.current=!0),V({slideMode:e,from:te(),to:ne("prev",t),nextActiveItem:r,immediate:n})}function ie(e="click",t,n){if(!u||W.current&&!h)return;F.current="next",P.current=!1;const r=t||k.current+1;if(!h){const i=Math.abs(ne("next",t))>Z()-U()/3;if(W.current)return;if(i)return P.current=!1,W.current=!0,void V({slideMode:e,from:te(),to:y?Z():-Z(),nextActiveItem:r,immediate:n})}if(h&&(W.current||r>i.length-1))return W.current=!1,P.current=!0,void V({slideMode:e,from:te()+U()*i.length,to:0,nextActiveItem:0,immediate:n});0===r&&(P.current=!0),r===i.length-1&&(W.current=!0),V({slideMode:e,from:te(),to:ne("next",t),nextActiveItem:r,immediate:n})}n.useEffect((()=>{k.current!==E&&le(E,!I)}),[E,I]),n.useEffect((()=>{if(u){if(E>i.length-1)throw new Error(`initialActiveItem (${E}) is greater than the total quantity available items (${i.length}).`);C>i.length&&console.warn(`itemsPerSlide (${C}) is greater than the total quantity available items (${i.length}). Fallback to ${i.length})`)}}),[E,i,C,u]),n.useEffect((()=>{S.current=window.innerWidth}),[]),n.useEffect((()=>{R.current=!0,ee()}),[T,C,v,g,y,m,u]),n.useEffect((()=>{h!==B.current&&(B.current=h,ee(),le(0,!0,!0))}),[h]),n.useLayoutEffect((()=>{D.current&&ee()}),[]),n.useEffect((()=>{M.current=b||Math.floor(U()/2/2)}),[b]),n.useEffect((()=>{function e(){window.innerWidth!==S.current&&(S.current=window.innerWidth,ee())}if("ResizeObserver"in window&&q.current){const e=new ResizeObserver((()=>{R.current||(S.current=window.innerWidth,ee())}));return e.observe(q.current),()=>{e.disconnect()}}return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[p,T,C,h,v,g,y,m,u]);const se=r.useDrag((e=>{const n=e.dragging,r=e.offset["x"===p?0:1],i=e.movement["x"===p?0:1],s=e.direction["x"===p?0:1],c=i>M.current,o=i<-M.current;if(n)return F.current=s>0?"prev":"next",H(Object.assign(Object.assign({},e),{eventName:"onDrag",slideActionType:F.current})),y?"prev"===F.current&&r>0?(e.cancel(),void $.start({from:{val:te()},to:{val:0},config:{velocity:e.velocity,friction:50,tension:1e3}})):void $.start({from:{val:te()},to:{val:-r},config:{velocity:e.velocity,friction:50,tension:1e3}}):($.start({val:r,config:{velocity:e.velocity,friction:50,tension:1e3}}),void(w&&o?(ie("drag"),e.cancel()):w&&c&&(re("drag"),e.cancel())));e.last&&!e.canceled&&y&&("prev"===F.current&&re("drag"),"next"===F.current&&ie("drag")),!e.last||e.canceled||y||(o?!h&&W.current?$.start({val:-Z(),config:Object.assign(Object.assign({},t.config.default),{velocity:e.velocity})}):ie("drag"):c?!h&&P.current?$.start({val:0,config:Object.assign(Object.assign({},t.config.default),{velocity:e.velocity})}):re("drag"):$.start({val:A.current,config:Object.assign(Object.assign({},t.config.default),{velocity:e.velocity})})),e.last&&e.canceled&&$.start({val:A.current,config:Object.assign(Object.assign({},t.config.default),{velocity:e.velocity})})}),{enabled:u&&!x&&!y||!!y&&!!j,axis:p,from:()=>y&&q.current?[-q.current.scrollLeft,-q.current.scrollTop]:[N.val.get(),N.val.get()]});function ce(){q.current&&(A.current=q.current["x"===p?"scrollLeft":"scrollTop"],0===q.current["x"===p?"scrollLeft":"scrollTop"]&&(P.current=!0,W.current=!1),q.current["x"===p?"scrollLeft":"scrollTop"]>0&&q.current["x"===p?"scrollLeft":"scrollTop"]<Z()&&(P.current=!1,W.current=!1),q.current["x"===p?"scrollLeft":"scrollTop"]===Z()&&(P.current=!1,W.current=!0))}function oe(e,t){let n=0;if(n="string"==typeof e?i.findIndex((t=>t.id===e)):e,n<0||n>=i.length){if(t)throw new Error(t);console.error(`The item doesn't exist; check that the id provided - ${e} - is correct.`),n=-1}return n}function le(e,t=!1,n=!1){if(!u)return;P.current=!1,W.current=!1;const r=oe(e,"The item you want to slide to doesn't exist; check the provided id.");if(r===k.current&&!n)return;const s=oe(i[k.current].id),c=oe(i[r].id);c>s?ie("click",c,t):re("click",c,t)}function ue(e){const t=oe(e,"The item doesn't exist; check the provided id."),n=k.current;return h&&n===i.length-1?0===t:t===n+1}function ae(e){const t=oe(e,"The item doesn't exist; check the provided id."),n=k.current;return h&&0===n?t===i.length-1:t===n-1}function de(e){return oe(e,"The item you want to check doesn't exist; check the provided id.")===k.current}const fe=y?{useListenToCustomEvent:G,enterFullscreen:J,exitFullscreen:K,getIsFullscreen:Q,slideToPrevItem:()=>re(),slideToNextItem:()=>ie()}:{useListenToCustomEvent:G,enterFullscreen:J,exitFullscreen:K,getIsFullscreen:Q,slideToPrevItem:()=>re(),slideToNextItem:()=>ie(),slideToItem:e=>le(e),getIsNextItem:ue,getIsPrevItem:ae,getIsActiveItem:de},me=e.jsx(l.Provider,Object.assign({value:fe},{children:X})),ge=e.jsx(l.Provider,Object.assign({value:fe},{children:e.jsx("div",Object.assign({className:"use-spring-carousel-main-wrapper",ref:q},y?{onWheel(){N.val.stop(),ce()}}:{},{style:Object.assign({display:"flex",position:"relative",width:"100%",height:"100%"},y?"x"===p?{overflowX:"auto"}:{overflowY:"auto"}:{})},{children:e.jsxs("div",Object.assign({className:"use-spring-carousel-track-wrapper",ref:D},se(),{style:Object.assign({position:"relative",display:"flex",flexDirection:"x"===p?"row":"column",touchAction:"none"},function(){const e=`calc(100% - ${2*v}px)`;return{width:"x"===p?e:"100%",height:"y"===p?e:"100%"}}())},{children:[!y&&h||!v?null:e.jsx("div",{style:{flexShrink:0,width:v}}),z.map(((t,n)=>{return e.jsx("div",Object.assign({className:"use-spring-carousel-item","data-testid":"use-spring-carousel-item-wrapper",style:Object.assign({display:"flex",position:"relative",flex:"1"},(r=!!y&&n===i.length-1,"fixed"!==m||y?Object.assign({marginRight:`${r?0:g}px`}):{marginRight:`${r?0:g}px`,flex:`1 0 calc(100% / ${C} - ${g*(C-1)/C}px)`}))},{children:"function"==typeof t.renderItem?t.renderItem({getIsActiveItem:de,getIsNextItem:ue,getIsPrevItem:ae,useListenToCustomEvent:G}):t.renderItem}),`${t.id}-${n}`);var r})),y&&v?e.jsx("div",{style:{flexShrink:0,width:v}}):null]}))}))}));return Object.assign(Object.assign({},fe),{carouselFragment:ge,thumbsFragment:me})},exports.useSpringCarouselContext=function(){const e=n.useContext(l);if(!e)throw new Error("useSpringCarouselContext must be used within the carousel.");return e},exports.useThumbsModule=o,exports.useTransitionCarousel=function({init:i=!0,disableGestures:c=!1,items:l,springConfig:d=t.config.default,exitBeforeEnter:f=!1,trail:m,withLoop:g=!1,activeItem:h,toPrevItemSpringProps:v=u,toNextItemSpringProps:p=u,draggingSlideTreshold:x=50,thumbsSlideAxis:b="x"}){const w=n.useRef("next"),y=n.useRef("initial"),j=n.useRef(null),[T,O]=n.useState(null!=h?h:0),{emitEvent:E,useListenToCustomEvent:I}=s(),{handleScroll:R,thumbsFragment:C}=o({thumbsSlideAxis:b,items:l});function S({to:e,slideType:t,slideMode:n}){w.current=t,y.current=n,E({eventName:"onSlideStartChange",slideActionType:w.current,slideMode:y.current,nextItem:{index:e,id:l[e].id,startReached:0===e,endReached:e===l.length-1}}),O(e),R(T)}function M(e){if(!i)return;const t=0===T;!g&&t||S(g&&t?{to:l.length-1,slideType:"prev",slideMode:e}:{to:T-1,slideType:"prev",slideMode:e})}function F(e){if(!i)return;const t=T===l.length-1;!g&&t||S(g&&t?{to:0,slideType:"next",slideMode:e}:{to:T+1,slideType:"next",slideMode:e})}n.useEffect((()=>{"number"==typeof h&&h!==T&&O(h)}),[h]);const L=t.useTransition(T,Object.assign(Object.assign({config:d,key:null,trail:m,exitBeforeEnter:f},"prev"===w.current?{initial:Object.assign({},v.initial),from:Object.assign({},v.from),enter:Object.assign({},v.enter),leave:Object.assign({},v.leave)}:"next"===w.current?{initial:Object.assign({},p.initial),from:Object.assign({},p.from),enter:Object.assign({},p.enter),leave:Object.assign({},p.leave)}:{initial:Object.assign({},u.initial),from:Object.assign({},u.from),enter:Object.assign({},u.enter),leave:Object.assign({},u.leave)}),{onRest(e,t,n){e.finished&&n===T&&E({eventName:"onSlideChange",slideActionType:w.current,slideMode:y.current,currentItem:{index:T,id:l[T].id,startReached:0===T,endReached:T===l.length-1}})}})),A=r.useDrag((({last:e,movement:[t]})=>{if(e){const e=t>x,n=t<-x,r=0===T,i=T===l.length-1;if(n){if(!g&&i)return;E({eventName:"onLeftSwipe"}),F("swipe")}else if(e){if(!g&&r)return;E({eventName:"onRightSwipe"}),M("swipe")}}}),{enabled:!c}),N=L(((n,r,i,s)=>e.jsx(t.a.div,Object.assign({id:`use-transition-carousel-item-${s}`,className:"use-transition-carousel-item",style:Object.assign(Object.assign({},n),{flex:"1 0 100%",width:"100%",height:"100%"})},{children:l[r].renderItem})))),$={useListenToCustomEvent:I,slideToPrevItem:()=>M("click"),slideToNextItem:()=>F("click")},k=e.jsx(a.Provider,Object.assign({value:$},{children:C})),P=e.jsx(a.Provider,Object.assign({value:$},{children:e.jsx("div",Object.assign({ref:j},A(),{style:{display:"flex",position:"relative",width:"100%",height:"100%",overflow:"hidden"}},{children:N}))}));return Object.assign(Object.assign({},$),{carouselFragment:P,thumbsFragment:k})},exports.useTransitionCarouselContext=function(){const e=n.useContext(a);if(!e)throw new Error("useTransitionCarouselContext must be used within the carousel.");return e};
1
+ "use strict";var e=require("react/jsx-runtime"),t=require("@react-spring/web"),n=require("react"),r=require("@use-gesture/react"),i=require("screenfull");function s(){const e=n.useRef(null);return{useListenToCustomEvent:function(t){n.useEffect((()=>{function n(e){t(e.detail)}if(e.current||(e.current=document.createElement("div")),e.current)return e.current.addEventListener("RSC::Event",n,!1),()=>{var t;null===(t=e.current)||void 0===t||t.removeEventListener("RSC::Event",n,!1)}}),[t])},emitEvent:function(t){if(e.current){const n=new CustomEvent("RSC::Event",{detail:t});e.current.dispatchEvent(n)}}}}function c({mainCarouselWrapperRef:e,onFullScreenChange:t,handleResize:r}){const s=n.useRef(!1);function c(e){s.current=e}return n.useEffect((()=>{function e(){document.fullscreenElement&&(c(!0),t(!0),r&&r()),document.fullscreenElement||(c(!1),t(!1),r&&r())}if(i.isEnabled)return i.on("change",e),()=>{i.isEnabled&&i.off("change",e)}}),[]),{enterFullscreen:function(t){i.isEnabled&&i.request(t||e.current)},exitFullscreen:function(){i.isEnabled&&i.exit()},getIsFullscreen:function(){return s.current}}}function o({thumbsSlideAxis:r="x",withThumbs:i=!1,prepareThumbsData:s,items:c}){const o=n.useRef(null),[l,u]=t.useSpring((()=>({val:0})));function a(){var e;return Math.round(Number(null===(e=o.current)||void 0===e?void 0:e["x"===r?"scrollWidth":"scrollHeight"])-o.current.getBoundingClientRect()["x"===r?"width":"height"])}return{thumbsFragment:i?e.jsx("div",Object.assign({className:"use-spring-carousel-thumbs-wrapper",ref:o,onWheel:()=>l.val.stop(),style:Object.assign({display:"flex",flex:"1",position:"relative",width:"100%",height:"100%",flexDirection:"x"===r?"row":"column"},"x"===r?{overflowX:"auto"}:{overflowY:"auto",maxHeight:"100%"})},{children:function(){function e(e){return e.map((e=>({id:e.id,renderThumb:e.renderThumb})))}return s?s(e(c)):e(c)}().map((({id:t,renderThumb:n})=>{const r=`thumb-item-${t}`;return e.jsx("div",Object.assign({id:r,className:"thumb-item"},{children:n}),r)}))})):null,handleScroll:function(e){var t,n;const i=o.current?o.current.querySelector(`#thumb-item-${c[e].id}`):null;if(i&&o.current&&!function(e){const t=e.getBoundingClientRect();return t.top>=0&&t.left>=0&&t.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&t.right<=(window.innerWidth||document.documentElement.clientWidth)}(i)){const e=i.offsetLeft,s=e>a()?a():e;u.start({from:{val:null!==(n=null===(t=o.current)||void 0===t?void 0:t["x"===r?"scrollLeft":"scrollTop"])&&void 0!==n?n:0},to:{val:s},onChange:({value:e})=>{o.current&&(o.current["x"===r?"scrollLeft":"scrollTop"]=Math.abs(e.val))}})}}}}const l=n.createContext(void 0);const u={initial:{opacity:1,position:"relative"},from:{opacity:0,position:"relative"},enter:{position:"relative",opacity:1},leave:{opacity:1,position:"absolute"}};const a=n.createContext(void 0);exports.useEventsModule=s,exports.useFullscreenModule=c,exports.useSpringCarousel=function({items:i,init:u=!0,withThumbs:a,thumbsSlideAxis:d="x",itemsPerSlide:f=1,slideType:m="fixed",gutter:g=0,withLoop:h=!1,startEndGutter:v=0,carouselSlideAxis:p="x",disableGestures:x=!1,draggingSlideTreshold:b,slideWhenThresholdIsReached:y=!1,freeScroll:w,enableFreeScrollDrag:j,initialStartingPosition:T,prepareThumbsData:O,initialActiveItem:E=0,animateWhenActiveItemChange:R=!0}){const I=n.useRef(!1),C=f>i.length?i.length:f,S=n.useRef(0),M=n.useRef(null!=b?b:0),F=n.useRef("initial"),L=n.useRef("initial"),A=n.useRef(0),[N,$]=t.useSpring((()=>({val:0,pause:!u,onChange({value:e}){w&&q.current?("x"===p?q.current.scrollLeft=Math.abs(e.val):q.current.scrollTop=Math.abs(e.val),ce()):D.current&&(D.current.style.transform="x"===p?`translate3d(${e.val}px, 0px,0px)`:`translate3d(0px,${e.val}px,0px)`)}}))),k=n.useRef(E),P=n.useRef(0===E),W=n.useRef(!1),q=n.useRef(null),D=n.useRef(null),B=n.useRef(h),z=n.useCallback((()=>h?[...i.map((e=>Object.assign(Object.assign({},e),{id:`prev-repeated-item-${e.id}`}))),...i,...i.map((e=>Object.assign(Object.assign({},e),{id:`next-repeated-item-${e.id}`})))]:[...i]),[i,h])(),{emitEvent:H,useListenToCustomEvent:G}=s(),{thumbsFragment:X,handleScroll:Y}=o({withThumbs:!!a,thumbsSlideAxis:d,prepareThumbsData:O,items:i}),{enterFullscreen:J,exitFullscreen:K,getIsFullscreen:Q}=c({mainCarouselWrapperRef:q,handleResize:()=>ee(),onFullScreenChange:e=>{H({eventName:"onFullscreenChange",isFullscreen:e})}});function U(){var e;const t=null===(e=q.current)||void 0===e?void 0:e.querySelector(".use-spring-carousel-item");if(!t)throw Error("No carousel items available!");return t.getBoundingClientRect()["x"===p?"width":"height"]+g}function V({from:e,to:n,nextActiveItem:r,immediate:s=!1,slideMode:c}){L.current=c,"number"==typeof r&&(w||(k.current=r),H({eventName:"onSlideStartChange",slideActionType:F.current,slideMode:L.current,nextItem:{startReached:P.current,endReached:W.current,index:w?-1:k.current,id:w?"":i[k.current].id}})),A.current=n,$.start({immediate:s,from:{val:e},to:{val:n},config:Object.assign(Object.assign({},t.config.default),{velocity:N.val.velocity}),onRest(e){!s&&e.finished&&H({eventName:"onSlideChange",slideActionType:F.current,slideMode:L.current,currentItem:{startReached:P.current,endReached:W.current,index:w?-1:k.current,id:w?"":i[k.current].id}})}}),a&&!s&&Y(k.current)}function Z(){var e;return h?U()*i.length:Math.round(Number(null===(e=D.current)||void 0===e?void 0:e["x"===p?"scrollWidth":"scrollHeight"])-D.current.getBoundingClientRect()["x"===p?"width":"height"]-v)}function _(){var e;const t=null===(e=D.current)||void 0===e?void 0:e.querySelector(".use-spring-carousel-item");if(!t)throw Error("No carousel items available!");return t.getBoundingClientRect()["x"===p?"width":"height"]+g}function ee(){const e="x"===p?"left":"top";function t(t){const n=D.current;n&&(h?(n.style.top="0px",n.style.left="0px",n.style[e]=`-${t-v}px`,P.current=!1,W.current=!1):(n.style.left="0px",n.style.top="0px"))}const n=Math.abs(te());if(t("center"===T?_()*i.length-U()*Math.round((C-1)/2):"end"===T?_()*i.length-U()*Math.round(C-1):_()*i.length),n<Z()&&"fluid"===m&&W.current&&!h&&(W.current=!1),n>Z()&&!h){const e=-Z();W.current=!0,A.current=e,$.start({immediate:!0,val:A.current}),setTimeout((()=>{I.current=!1}),0)}if(!w&&"fixed"===m){const e=-U()*k.current;A.current=e,$.start({immediate:!0,val:e})}setTimeout((()=>{I.current=!1}),0)}function te(){return w&&q.current?q.current["x"===p?"scrollLeft":"scrollTop"]:N.val.get()}function ne(e,t){if(w&&"next"===e){const e=A.current+U();return e>Z()?Z():e}if(w&&"prev"===e){const e=A.current-U();return e<0?0:e}return"next"===e?"number"==typeof t?-t*U():A.current-U():"number"==typeof t?-t*U():A.current+U()}function re({type:e,index:t,immediate:n}){if(!u||P.current&&!h)return;F.current="prev",W.current=!1;const r="number"==typeof t?t:k.current-1;if(!h){const r=w?ne("prev",t)-U()/3<0:ne("prev",t)+U()/3>0;if(P.current)return;if(r)return P.current=!0,W.current=!1,void V({slideMode:e,from:te(),to:0,nextActiveItem:0,immediate:n})}if(h&&(P.current||r<0))return P.current=!1,W.current=!0,void V({slideMode:e,from:te()-U()*i.length,to:-U()*i.length+U(),nextActiveItem:i.length-1,immediate:n});0===r&&(P.current=!0),r!==i.length-1&&-1!==r||(W.current=!0),V({slideMode:e,from:te(),to:ne("prev",t),nextActiveItem:r,immediate:n})}function ie({type:e,index:t,immediate:n}){if(!u||W.current&&!h)return;F.current="next",P.current=!1;const r=t||k.current+1;if(!h){const i=Math.abs(ne("next",t))>Z()-U()/3;if(W.current)return;if(i)return P.current=!1,W.current=!0,void V({slideMode:e,from:te(),to:w?Z():-Z(),nextActiveItem:r,immediate:n})}if(h&&(W.current||r>i.length-1))return W.current=!1,P.current=!0,void V({slideMode:e,from:te()+U()*i.length,to:0,nextActiveItem:0,immediate:n});0===r&&(P.current=!0),r===i.length-1&&(W.current=!0),V({slideMode:e,from:te(),to:ne("next",t),nextActiveItem:r,immediate:n})}n.useEffect((()=>{k.current!==E&&le({id:E,immediate:!R})}),[E,R]),n.useEffect((()=>{if(u){if(E>i.length-1)throw new Error(`initialActiveItem (${E}) is greater than the total quantity available items (${i.length}).`);C>i.length&&console.warn(`itemsPerSlide (${C}) is greater than the total quantity available items (${i.length}). Fallback to ${i.length})`)}}),[E,i,C,u]),n.useEffect((()=>{S.current=window.innerWidth}),[]),n.useEffect((()=>{I.current=!0,ee()}),[T,C,v,g,w,m,u]),n.useEffect((()=>{h!==B.current&&(B.current=h,le({id:0,immediate:!0,shouldReset:!0}))}),[h]),n.useLayoutEffect((()=>{D.current&&ee()}),[]),n.useEffect((()=>{M.current=b||Math.floor(U()/2/2)}),[b]),n.useEffect((()=>{function e(){window.innerWidth!==S.current&&(S.current=window.innerWidth,ee())}if("ResizeObserver"in window&&q.current){const e=new ResizeObserver((()=>{I.current||(S.current=window.innerWidth,ee())}));return e.observe(q.current),()=>{e.disconnect()}}return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[p,T,C,h,v,g,w,m,u]);const se=r.useDrag((e=>{const n=e.dragging,r=e.offset["x"===p?0:1],i=e.movement["x"===p?0:1],s=e.direction["x"===p?0:1],c=i>M.current,o=i<-M.current;if(n)return F.current=s>0?"prev":"next",H(Object.assign(Object.assign({},e),{eventName:"onDrag",slideActionType:F.current})),w?"prev"===F.current&&r>0?(e.cancel(),void $.start({from:{val:te()},to:{val:0},config:{velocity:e.velocity,friction:50,tension:1e3}})):void $.start({from:{val:te()},to:{val:-r},config:{velocity:e.velocity,friction:50,tension:1e3}}):($.start({val:r,config:{velocity:e.velocity,friction:50,tension:1e3}}),void(y&&o?(ie({type:"drag"}),e.cancel()):y&&c&&(re({type:"drag"}),e.cancel())));e.last&&!e.canceled&&w&&("prev"===F.current&&re({type:"drag"}),"next"===F.current&&ie({type:"drag"})),!e.last||e.canceled||w||(o?!h&&W.current?$.start({val:-Z(),config:Object.assign(Object.assign({},t.config.default),{velocity:e.velocity})}):ie({type:"drag"}):c?!h&&P.current?$.start({val:0,config:Object.assign(Object.assign({},t.config.default),{velocity:e.velocity})}):re({type:"drag"}):$.start({val:A.current,config:Object.assign(Object.assign({},t.config.default),{velocity:e.velocity})})),e.last&&e.canceled&&$.start({val:A.current,config:Object.assign(Object.assign({},t.config.default),{velocity:e.velocity})})}),{enabled:u&&!x&&!w||!!w&&!!j,axis:p,from:()=>w&&q.current?[-q.current.scrollLeft,-q.current.scrollTop]:[N.val.get(),N.val.get()]});function ce(){q.current&&(A.current=q.current["x"===p?"scrollLeft":"scrollTop"],0===q.current["x"===p?"scrollLeft":"scrollTop"]&&(P.current=!0,W.current=!1),q.current["x"===p?"scrollLeft":"scrollTop"]>0&&q.current["x"===p?"scrollLeft":"scrollTop"]<Z()&&(P.current=!1,W.current=!1),q.current["x"===p?"scrollLeft":"scrollTop"]===Z()&&(P.current=!1,W.current=!0))}function oe(e,t){let n=0;if(n="string"==typeof e?i.findIndex((t=>t.id===e)):e,n<0||n>=i.length){if(t)throw new Error(t);console.error(`The item doesn't exist; check that the id provided - ${e} - is correct.`),n=-1}return n}function le({id:e,immediate:t,shouldReset:n}){if(!u)return;P.current=!1,W.current=!1;const r=oe(e,"The item you want to slide to doesn't exist; check the provided id.");if(r===k.current&&!n)return;const s=oe(i[k.current].id),c=oe(i[r].id);c>s?ie({type:n?"initial":"click",index:c,immediate:t}):re({type:n?"initial":"click",index:c,immediate:t})}function ue(e){const t=oe(e,"The item doesn't exist; check the provided id."),n=k.current;return h&&n===i.length-1?0===t:t===n+1}function ae(e){const t=oe(e,"The item doesn't exist; check the provided id."),n=k.current;return h&&0===n?t===i.length-1:t===n-1}function de(e){return oe(e,"The item you want to check doesn't exist; check the provided id.")===k.current}const fe=w?{useListenToCustomEvent:G,enterFullscreen:J,exitFullscreen:K,getIsFullscreen:Q,slideToPrevItem:()=>{re({type:"click"})},slideToNextItem:()=>{ie({type:"click"})}}:{useListenToCustomEvent:G,enterFullscreen:J,exitFullscreen:K,getIsFullscreen:Q,slideToPrevItem:()=>{re({type:"click"})},slideToNextItem:()=>{ie({type:"click"})},slideToItem:e=>le({id:e}),getIsNextItem:ue,getIsPrevItem:ae,getIsActiveItem:de},me=e.jsx(l.Provider,Object.assign({value:fe},{children:X})),ge=e.jsx(l.Provider,Object.assign({value:fe},{children:e.jsx("div",Object.assign({className:"use-spring-carousel-main-wrapper",ref:q},w?{onWheel(){N.val.stop(),ce()}}:{},{style:Object.assign({display:"flex",position:"relative",width:"100%",height:"100%"},w?"x"===p?{overflowX:"auto"}:{overflowY:"auto"}:{})},{children:e.jsxs("div",Object.assign({className:"use-spring-carousel-track-wrapper",ref:D},se(),{style:Object.assign({position:"relative",display:"flex",flexDirection:"x"===p?"row":"column",touchAction:"none"},function(){const e=`calc(100% - ${2*v}px)`;return{width:"x"===p?e:"100%",height:"y"===p?e:"100%"}}())},{children:[!w&&h||!v?null:e.jsx("div",{style:{flexShrink:0,width:v}}),z.map(((t,n)=>{return e.jsx("div",Object.assign({className:"use-spring-carousel-item","data-testid":"use-spring-carousel-item-wrapper",style:Object.assign({display:"flex",position:"relative",flex:"1"},(r=!!w&&n===i.length-1,"fixed"!==m||w?Object.assign({marginRight:`${r?0:g}px`}):{marginRight:`${r?0:g}px`,flex:`1 0 calc(100% / ${C} - ${g*(C-1)/C}px)`}))},{children:"function"==typeof t.renderItem?t.renderItem({getIsActiveItem:de,getIsNextItem:ue,getIsPrevItem:ae,useListenToCustomEvent:G}):t.renderItem}),`${t.id}-${n}`);var r})),w&&v?e.jsx("div",{style:{flexShrink:0,width:v}}):null]}))}))}));return Object.assign(Object.assign({},fe),{carouselFragment:ge,thumbsFragment:me})},exports.useSpringCarouselContext=function(){const e=n.useContext(l);if(!e)throw new Error("useSpringCarouselContext must be used within the carousel.");return e},exports.useThumbsModule=o,exports.useTransitionCarousel=function({init:i=!0,disableGestures:c=!1,items:l,springConfig:d=t.config.default,exitBeforeEnter:f=!1,trail:m,withLoop:g=!1,activeItem:h,toPrevItemSpringProps:v=u,toNextItemSpringProps:p=u,draggingSlideTreshold:x=50,thumbsSlideAxis:b="x"}){const y=n.useRef("next"),w=n.useRef("initial"),j=n.useRef(null),[T,O]=n.useState(null!=h?h:0),{emitEvent:E,useListenToCustomEvent:R}=s(),{handleScroll:I,thumbsFragment:C}=o({thumbsSlideAxis:b,items:l});function S({to:e,slideType:t,slideMode:n}){y.current=t,w.current=n,E({eventName:"onSlideStartChange",slideActionType:y.current,slideMode:w.current,nextItem:{index:e,id:l[e].id,startReached:0===e,endReached:e===l.length-1}}),O(e),I(T)}function M(e){if(!i)return;const t=0===T;!g&&t||S(g&&t?{to:l.length-1,slideType:"prev",slideMode:e}:{to:T-1,slideType:"prev",slideMode:e})}function F(e){if(!i)return;const t=T===l.length-1;!g&&t||S(g&&t?{to:0,slideType:"next",slideMode:e}:{to:T+1,slideType:"next",slideMode:e})}n.useEffect((()=>{"number"==typeof h&&h!==T&&O(h)}),[h]);const L=t.useTransition(T,Object.assign(Object.assign({config:d,key:null,trail:m,exitBeforeEnter:f},"prev"===y.current?{initial:Object.assign({},v.initial),from:Object.assign({},v.from),enter:Object.assign({},v.enter),leave:Object.assign({},v.leave)}:"next"===y.current?{initial:Object.assign({},p.initial),from:Object.assign({},p.from),enter:Object.assign({},p.enter),leave:Object.assign({},p.leave)}:{initial:Object.assign({},u.initial),from:Object.assign({},u.from),enter:Object.assign({},u.enter),leave:Object.assign({},u.leave)}),{onRest(e,t,n){e.finished&&n===T&&E({eventName:"onSlideChange",slideActionType:y.current,slideMode:w.current,currentItem:{index:T,id:l[T].id,startReached:0===T,endReached:T===l.length-1}})}})),A=r.useDrag((({last:e,movement:[t]})=>{if(e){const e=t>x,n=t<-x,r=0===T,i=T===l.length-1;if(n){if(!g&&i)return;E({eventName:"onLeftSwipe"}),F("swipe")}else if(e){if(!g&&r)return;E({eventName:"onRightSwipe"}),M("swipe")}}}),{enabled:!c}),N=L(((n,r,i,s)=>e.jsx(t.a.div,Object.assign({id:`use-transition-carousel-item-${s}`,className:"use-transition-carousel-item",style:Object.assign(Object.assign({},n),{flex:"1 0 100%",width:"100%",height:"100%"})},{children:l[r].renderItem})))),$={useListenToCustomEvent:R,slideToPrevItem:()=>M("click"),slideToNextItem:()=>F("click")},k=e.jsx(a.Provider,Object.assign({value:$},{children:C})),P=e.jsx(a.Provider,Object.assign({value:$},{children:e.jsx("div",Object.assign({ref:j},A(),{style:{display:"flex",position:"relative",width:"100%",height:"100%",overflow:"hidden"}},{children:N}))}));return Object.assign(Object.assign({},$),{carouselFragment:P,thumbsFragment:k})},exports.useTransitionCarouselContext=function(){const e=n.useContext(a);if(!e)throw new Error("useTransitionCarouselContext must be used within the carousel.");return e};
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/modules/useEventsModule.ts","../../src/modules/useFullscreenModule.ts","../../src/modules/useThumbsModule.tsx","../../src/useSpringCarousel.tsx","../../src/useTransitionCarousel.tsx"],"sourcesContent":["import { FullGestureState } from '@use-gesture/react'\nimport { useEffect, useRef } from 'react'\nimport { SlideActionType, SlideMode, TransitionSlideMode } from '../types/common'\n\nconst eventLabel = 'RSC::Event'\n\ntype OnSlideStartChange<T> = {\n eventName: 'onSlideStartChange'\n slideActionType: SlideActionType\n slideMode: T extends 'use-spring' ? SlideMode : TransitionSlideMode\n nextItem: {\n index: number\n id: string\n startReached: boolean\n endReached: boolean\n }\n}\ntype OnSlideChange<T> = {\n eventName: 'onSlideChange'\n slideActionType: SlideActionType\n slideMode: T extends 'use-spring' ? SlideMode : TransitionSlideMode\n currentItem: {\n index: number\n id: string\n startReached: boolean\n endReached: boolean\n }\n}\ntype OnFullscreenChange = {\n eventName: 'onFullscreenChange'\n isFullscreen: boolean\n}\ntype OnDrag = Omit<FullGestureState<'drag'>, 'event'> & {\n eventName: 'onDrag'\n slideActionType: SlideActionType\n}\n\ntype OnLeftSwipe = {\n eventName: 'onLeftSwipe'\n}\n\ntype OnRightSwipe = {\n eventName: 'onRightSwipe'\n}\n\ntype SpringCarouselEvents<T> =\n | OnSlideStartChange<T>\n | OnSlideChange<T>\n | OnDrag\n | OnFullscreenChange\n\ntype TransitionCarouselEvents<T> =\n | OnSlideStartChange<T>\n | OnSlideChange<T>\n | OnFullscreenChange\n | OnLeftSwipe\n | OnRightSwipe\n\ntype Events<T> = T extends 'use-spring'\n ? SpringCarouselEvents<'use-spring'>\n : TransitionCarouselEvents<'use-transition'>\n\ntype EventHandler<T> = (props: Events<T>) => void\n\nexport type UseListenToCustomEvent<T> = {\n useListenToCustomEvent: (eventHandler: EventHandler<T>) => void\n emitEvent: (event: Events<T>) => void\n}\n\nexport function useEventsModule<T extends 'use-spring' | 'use-transition'>() {\n const targetEvent = useRef<HTMLDivElement | null>(null)\n\n function useListenToCustomEvent(eventHandler: EventHandler<T>) {\n useEffect(() => {\n if (!targetEvent.current) {\n targetEvent.current = document.createElement('div')\n }\n\n function handleEvent(event: CustomEvent<Events<T>>) {\n eventHandler(event.detail)\n }\n\n if (targetEvent.current) {\n // @ts-ignore\n targetEvent.current.addEventListener(eventLabel, handleEvent, false)\n return () => {\n // @ts-ignore\n targetEvent.current?.removeEventListener(eventLabel, handleEvent, false)\n }\n }\n }, [eventHandler])\n }\n function emitEvent(event: Events<T>) {\n if (targetEvent.current) {\n const newEvent = new CustomEvent(eventLabel, {\n detail: event,\n })\n targetEvent.current.dispatchEvent(newEvent)\n }\n }\n\n return {\n useListenToCustomEvent,\n emitEvent,\n }\n}\n","import { useRef, MutableRefObject, useEffect } from 'react'\nimport screenfull from 'screenfull'\n\ntype FullscreenModule = {\n mainCarouselWrapperRef: MutableRefObject<HTMLDivElement | null>\n handleResize?(): void\n onFullScreenChange(isFullscreen: boolean): void\n}\n\nexport function useFullscreenModule({\n mainCarouselWrapperRef,\n onFullScreenChange,\n handleResize,\n}: FullscreenModule) {\n const isFullscreen = useRef(false)\n\n useEffect(() => {\n function handleFullscreenChange() {\n if (document.fullscreenElement) {\n setIsFullscreen(true)\n onFullScreenChange(true)\n handleResize && handleResize()\n }\n\n if (!document.fullscreenElement) {\n setIsFullscreen(false)\n onFullScreenChange(false)\n handleResize && handleResize()\n }\n }\n\n if (screenfull.isEnabled) {\n screenfull.on('change', handleFullscreenChange)\n return () => {\n if (screenfull.isEnabled) {\n screenfull.off('change', handleFullscreenChange)\n }\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n function setIsFullscreen(_isFullscreen: boolean) {\n isFullscreen.current = _isFullscreen\n }\n\n function getIsFullscreen() {\n return isFullscreen.current\n }\n\n function enterFullscreen(elementRef?: HTMLElement) {\n if (screenfull.isEnabled) {\n screenfull.request((elementRef || mainCarouselWrapperRef.current) as Element)\n }\n }\n\n function exitFullscreen() {\n screenfull.isEnabled && screenfull.exit()\n }\n\n return {\n enterFullscreen,\n exitFullscreen,\n getIsFullscreen,\n }\n}\n","import { useSpring } from '@react-spring/web'\nimport { useRef } from 'react'\n\nimport { ItemWithThumb, PrepareThumbsData, SpringCarouselWithThumbs } from '../types'\n\ntype Props = {\n withThumbs?: boolean\n thumbsSlideAxis: SpringCarouselWithThumbs['thumbsSlideAxis']\n prepareThumbsData?: PrepareThumbsData\n items: ItemWithThumb[]\n}\n\nfunction isInViewport(el: HTMLElement) {\n const rect = el.getBoundingClientRect()\n return (\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&\n rect.right <= (window.innerWidth || document.documentElement.clientWidth)\n )\n}\n\nexport function useThumbsModule({\n thumbsSlideAxis = 'x',\n withThumbs = false,\n prepareThumbsData,\n items,\n}: Props) {\n const wrapperRef = useRef<HTMLDivElement | null>(null)\n const [spring, setSpring] = useSpring(() => ({\n val: 0,\n }))\n\n function getTotalScrollValue() {\n return Math.round(\n Number(\n wrapperRef.current?.[thumbsSlideAxis === 'x' ? 'scrollWidth' : 'scrollHeight'],\n ) -\n wrapperRef.current!.getBoundingClientRect()[\n thumbsSlideAxis === 'x' ? 'width' : 'height'\n ],\n )\n }\n\n function handleScroll(activeItem: number) {\n function getThumbNode() {\n if (wrapperRef.current) {\n return wrapperRef.current.querySelector(\n `#thumb-item-${items[activeItem].id}`,\n ) as HTMLElement\n }\n return null\n }\n\n const thumbNode = getThumbNode()\n if (thumbNode && wrapperRef.current) {\n if (!isInViewport(thumbNode)) {\n const offset = thumbNode.offsetLeft\n const val = offset > getTotalScrollValue() ? getTotalScrollValue() : offset\n\n setSpring.start({\n from: {\n val:\n wrapperRef.current?.[\n thumbsSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] ?? 0,\n },\n to: {\n val,\n },\n onChange: ({ value }) => {\n if (wrapperRef.current) {\n wrapperRef.current[thumbsSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'] =\n Math.abs(value.val)\n }\n },\n })\n }\n }\n }\n\n function handlePrepareThumbsData() {\n function getPreparedItems(\n _items: ReturnType<PrepareThumbsData>,\n ): ReturnType<PrepareThumbsData> {\n return _items.map(i => ({\n id: i.id,\n renderThumb: i.renderThumb,\n }))\n }\n\n if (prepareThumbsData) {\n return prepareThumbsData(getPreparedItems(items))\n }\n return getPreparedItems(items)\n }\n\n const thumbsFragment = withThumbs ? (\n <div\n className=\"use-spring-carousel-thumbs-wrapper\"\n ref={wrapperRef}\n onWheel={() => spring.val.stop()}\n style={{\n display: 'flex',\n flex: '1',\n position: 'relative',\n width: '100%',\n height: '100%',\n flexDirection: thumbsSlideAxis === 'x' ? 'row' : 'column',\n ...(thumbsSlideAxis === 'x'\n ? { overflowX: 'auto' }\n : {\n overflowY: 'auto',\n maxHeight: '100%',\n }),\n }}\n >\n {handlePrepareThumbsData().map(({ id, renderThumb }) => {\n const thumbId = `thumb-item-${id}`\n return (\n <div key={thumbId} id={thumbId} className=\"thumb-item\">\n {renderThumb}\n </div>\n )\n })}\n </div>\n ) : null\n\n return {\n thumbsFragment,\n handleScroll,\n }\n}\n","import { config, useSpring } from '@react-spring/web'\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useRef,\n} from 'react'\n\nimport { useEventsModule } from './modules/useEventsModule'\nimport { useDrag } from '@use-gesture/react'\nimport { useFullscreenModule } from './modules/useFullscreenModule'\nimport { useThumbsModule } from './modules/useThumbsModule'\nimport {\n SlideActionType,\n SlideMode,\n UseSpringCarouselComplete,\n SpringCarouselWithThumbs,\n UseSpringCarouselWithFreeScroll,\n UseSpringCarouselWithThumbs,\n UseSpringCarouselWithNoThumbs,\n UseSpringCarouselWithNoFixedItems,\n UseSpringCarouselWithFixedItems,\n UseSpringFreeScrollReturnType,\n UseSpringReturnType,\n} from './types'\n\ntype ReturnType<T> = T extends true ? UseSpringFreeScrollReturnType : UseSpringReturnType\n\n/**\n * With free scroll\n */\nfunction useSpringCarousel(props: UseSpringCarouselWithFreeScroll): ReturnType<true>\nfunction useSpringCarousel(props: UseSpringCarouselWithThumbs<true>): ReturnType<true>\nfunction useSpringCarousel(props: UseSpringCarouselWithNoThumbs<true>): ReturnType<true>\n/**\n * No free scroll\n */\nfunction useSpringCarousel(props: UseSpringCarouselWithThumbs<false>): ReturnType<false>\nfunction useSpringCarousel(props: UseSpringCarouselWithNoThumbs<false>): ReturnType<false>\nfunction useSpringCarousel(\n props: UseSpringCarouselWithFixedItems<false>,\n): ReturnType<false>\nfunction useSpringCarousel(\n props: UseSpringCarouselWithNoFixedItems<false>,\n): ReturnType<false>\n\nfunction useSpringCarousel({\n items,\n init = true,\n withThumbs,\n thumbsSlideAxis = 'x',\n itemsPerSlide: _itemsPerSlide = 1,\n slideType = 'fixed',\n gutter = 0,\n withLoop = false,\n startEndGutter = 0,\n carouselSlideAxis = 'x',\n disableGestures = false,\n draggingSlideTreshold: _draggingSlideTreshold,\n slideWhenThresholdIsReached = false,\n freeScroll,\n enableFreeScrollDrag,\n initialStartingPosition,\n prepareThumbsData,\n initialActiveItem = 0,\n animateWhenActiveItemChange = true,\n}: UseSpringCarouselComplete): ReturnType<typeof freeScroll> {\n const resizeByPropChange = useRef(false)\n const itemsPerSlide = _itemsPerSlide > items.length ? items.length : _itemsPerSlide\n const prevWindowWidth = useRef(0)\n const draggingSlideTreshold = useRef(_draggingSlideTreshold ?? 0)\n const slideActionType = useRef<SlideActionType>('initial')\n const slideModeType = useRef<SlideMode>('initial')\n const prevSlidedValue = useRef(0)\n const [spring, setSpring] = useSpring(() => ({\n val: 0,\n pause: !init,\n onChange({ value }) {\n if (freeScroll && mainCarouselWrapperRef.current) {\n if (carouselSlideAxis === 'x') {\n mainCarouselWrapperRef.current.scrollLeft = Math.abs(value.val)\n } else {\n mainCarouselWrapperRef.current.scrollTop = Math.abs(value.val)\n }\n setStartEndItemReachedOnFreeScroll()\n } else if (carouselTrackWrapperRef.current) {\n if (carouselSlideAxis === 'x') {\n carouselTrackWrapperRef.current.style.transform = `translate3d(${value.val}px, 0px,0px)`\n } else {\n carouselTrackWrapperRef.current.style.transform = `translate3d(0px,${value.val}px,0px)`\n }\n }\n },\n }))\n const activeItem = useRef(initialActiveItem)\n const firstItemReached = useRef(initialActiveItem === 0)\n const lastItemReached = useRef(false)\n const mainCarouselWrapperRef = useRef<HTMLDivElement | null>(null)\n const carouselTrackWrapperRef = useRef<HTMLDivElement | null>(null)\n\n const prevWithLoop = useRef(withLoop)\n\n const getItems = useCallback(() => {\n if (withLoop) {\n return [\n ...items.map(i => ({\n ...i,\n id: `prev-repeated-item-${i.id}`,\n })),\n ...items,\n ...items.map(i => ({\n ...i,\n id: `next-repeated-item-${i.id}`,\n })),\n ]\n }\n return [...items]\n }, [items, withLoop])\n const internalItems = getItems()\n\n const { emitEvent, useListenToCustomEvent } = useEventsModule<'use-spring'>()\n const { thumbsFragment, handleScroll } = useThumbsModule({\n withThumbs: !!withThumbs,\n thumbsSlideAxis,\n prepareThumbsData,\n items: items as SpringCarouselWithThumbs['items'],\n })\n const { enterFullscreen, exitFullscreen, getIsFullscreen } = useFullscreenModule({\n mainCarouselWrapperRef,\n handleResize: () => adjustCarouselWrapperPosition(),\n onFullScreenChange: val => {\n emitEvent({\n eventName: 'onFullscreenChange',\n isFullscreen: val,\n })\n },\n })\n\n function getItemStyles(isLastItem: boolean) {\n if (slideType === 'fixed' && !freeScroll) {\n return {\n marginRight: `${isLastItem ? 0 : gutter}px`,\n flex: `1 0 calc(100% / ${itemsPerSlide} - ${\n (gutter * (itemsPerSlide - 1)) / itemsPerSlide\n }px)`,\n }\n }\n return {\n ...{ marginRight: `${isLastItem ? 0 : gutter}px` },\n }\n }\n\n function getSlideValue() {\n const carouselItem = mainCarouselWrapperRef.current?.querySelector(\n '.use-spring-carousel-item',\n )\n\n if (!carouselItem) {\n throw Error('No carousel items available!')\n }\n\n return (\n carouselItem.getBoundingClientRect()[\n carouselSlideAxis === 'x' ? 'width' : 'height'\n ] + gutter\n )\n }\n\n type SlideToItem = {\n from: number\n to: number\n nextActiveItem?: number\n immediate?: boolean\n slideMode: 'click' | 'drag'\n }\n\n function slideToItem({\n from,\n to,\n nextActiveItem,\n immediate = false,\n slideMode,\n }: SlideToItem) {\n slideModeType.current = slideMode\n\n if (typeof nextActiveItem === 'number') {\n if (!freeScroll) {\n activeItem.current = nextActiveItem\n }\n emitEvent({\n eventName: 'onSlideStartChange',\n slideActionType: slideActionType.current,\n slideMode: slideModeType.current,\n nextItem: {\n startReached: firstItemReached.current,\n endReached: lastItemReached.current,\n index: freeScroll ? -1 : activeItem.current,\n id: freeScroll ? '' : items[activeItem.current].id,\n },\n })\n }\n\n prevSlidedValue.current = to\n setSpring.start({\n immediate,\n from: {\n val: from,\n },\n to: {\n val: to,\n },\n config: {\n ...config.default,\n velocity: spring.val.velocity,\n },\n onRest(value) {\n if (!immediate && value.finished) {\n emitEvent({\n eventName: 'onSlideChange',\n slideActionType: slideActionType.current,\n slideMode: slideModeType.current,\n currentItem: {\n startReached: firstItemReached.current,\n endReached: lastItemReached.current,\n index: freeScroll ? -1 : activeItem.current,\n id: freeScroll ? '' : items[activeItem.current].id,\n },\n })\n }\n },\n })\n if (withThumbs && !immediate) {\n handleScroll(activeItem.current)\n }\n }\n function getTotalScrollValue() {\n if (withLoop) {\n return getSlideValue() * items.length\n }\n return Math.round(\n Number(\n carouselTrackWrapperRef.current?.[\n carouselSlideAxis === 'x' ? 'scrollWidth' : 'scrollHeight'\n ],\n ) -\n carouselTrackWrapperRef.current!.getBoundingClientRect()[\n carouselSlideAxis === 'x' ? 'width' : 'height'\n ] -\n startEndGutter,\n )\n }\n function getAnimatedWrapperStyles() {\n const percentValue = `calc(100% - ${startEndGutter * 2}px)`\n return {\n width: carouselSlideAxis === 'x' ? percentValue : '100%',\n height: carouselSlideAxis === 'y' ? percentValue : '100%',\n }\n }\n\n function getCarouselItemWidth() {\n const carouselItem = carouselTrackWrapperRef.current?.querySelector(\n '.use-spring-carousel-item',\n )\n if (!carouselItem) {\n throw Error('No carousel items available!')\n }\n return (\n carouselItem.getBoundingClientRect()[\n carouselSlideAxis === 'x' ? 'width' : 'height'\n ] + gutter\n )\n }\n function adjustCarouselWrapperPosition() {\n const positionProperty = carouselSlideAxis === 'x' ? 'left' : 'top'\n\n function setPosition(v: number) {\n const ref = carouselTrackWrapperRef.current\n if (!ref) return\n\n if (withLoop) {\n ref.style.top = '0px'\n ref.style.left = '0px'\n ref.style[positionProperty] = `-${v - startEndGutter}px`\n\n firstItemReached.current = false\n lastItemReached.current = false\n } else {\n ref.style.left = '0px'\n ref.style.top = '0px'\n }\n }\n\n const currentFromValue = Math.abs(getFromValue())\n\n if (initialStartingPosition === 'center') {\n setPosition(\n getCarouselItemWidth() * items.length -\n getSlideValue() * Math.round((itemsPerSlide - 1) / 2),\n )\n } else if (initialStartingPosition === 'end') {\n setPosition(\n getCarouselItemWidth() * items.length -\n getSlideValue() * Math.round(itemsPerSlide - 1),\n )\n } else {\n setPosition(getCarouselItemWidth() * items.length)\n }\n\n if (\n currentFromValue < getTotalScrollValue() &&\n slideType === 'fluid' &&\n lastItemReached.current &&\n !withLoop\n ) {\n lastItemReached.current = false\n }\n if (currentFromValue > getTotalScrollValue() && !withLoop) {\n const val = -getTotalScrollValue()\n lastItemReached.current = true\n prevSlidedValue.current = val\n setSpring.start({\n immediate: true,\n val: prevSlidedValue.current,\n })\n setTimeout(() => {\n resizeByPropChange.current = false\n }, 0)\n }\n\n if (!freeScroll && slideType === 'fixed') {\n const val = -(getSlideValue() * activeItem.current)\n prevSlidedValue.current = val\n setSpring.start({\n immediate: true,\n val,\n })\n }\n\n 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 function slideToPrevItem(\n type: Exclude<SlideMode, 'initial'> = 'click',\n index?: number,\n immediate?: boolean,\n ) {\n if (!init || (firstItemReached.current && !withLoop)) return\n\n slideActionType.current = 'prev'\n lastItemReached.current = false\n\n const nextItem = typeof index === 'number' ? index : activeItem.current - 1\n\n if (!withLoop) {\n const nextItemWillExceed = freeScroll\n ? getToValue('prev', index) - getSlideValue() / 3 < 0\n : getToValue('prev', index) + getSlideValue() / 3 > 0\n\n if (firstItemReached.current) return\n if (nextItemWillExceed) {\n firstItemReached.current = true\n lastItemReached.current = false\n\n slideToItem({\n slideMode: type,\n from: getFromValue(),\n to: 0,\n nextActiveItem: 0,\n immediate,\n })\n return\n }\n }\n if (withLoop && (firstItemReached.current || 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(\n type: Exclude<SlideMode, 'initial'> = 'click',\n index?: number,\n immediate?: boolean,\n ) {\n if (!init || (lastItemReached.current && !withLoop)) return\n\n slideActionType.current = 'next'\n firstItemReached.current = false\n\n const nextItem = index || activeItem.current + 1\n\n if (!withLoop) {\n const nextItemWillExceed =\n Math.abs(getToValue('next', index)) > getTotalScrollValue() - getSlideValue() / 3\n\n if (lastItemReached.current) return\n if (nextItemWillExceed) {\n firstItemReached.current = false\n lastItemReached.current = true\n\n slideToItem({\n slideMode: type,\n from: getFromValue(),\n to: freeScroll ? getTotalScrollValue() : -getTotalScrollValue(),\n nextActiveItem: nextItem,\n immediate,\n })\n return\n }\n }\n if (withLoop && (lastItemReached.current || 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\n useEffect(() => {\n if (activeItem.current !== initialActiveItem) {\n internalSlideToItem(initialActiveItem, !animateWhenActiveItemChange)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialActiveItem, animateWhenActiveItemChange])\n useEffect(() => {\n if (init) {\n if (initialActiveItem > items.length - 1) {\n throw new Error(\n `initialActiveItem (${initialActiveItem}) is greater than the total quantity available items (${items.length}).`,\n )\n }\n if (itemsPerSlide > items.length) {\n console.warn(\n `itemsPerSlide (${itemsPerSlide}) is greater than the total quantity available items (${items.length}). Fallback to ${items.length})`,\n )\n }\n }\n }, [initialActiveItem, items, itemsPerSlide, init])\n useEffect(() => {\n prevWindowWidth.current = window.innerWidth\n }, [])\n useEffect(() => {\n resizeByPropChange.current = true\n adjustCarouselWrapperPosition()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n initialStartingPosition,\n itemsPerSlide,\n startEndGutter,\n gutter,\n freeScroll,\n slideType,\n init,\n ])\n useEffect(() => {\n if (withLoop !== prevWithLoop.current) {\n prevWithLoop.current = withLoop\n adjustCarouselWrapperPosition()\n internalSlideToItem(0, true, true)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [withLoop])\n useLayoutEffect(() => {\n /**\n * Set initial track position\n */\n if (carouselTrackWrapperRef.current) {\n adjustCarouselWrapperPosition()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n useEffect(() => {\n if (_draggingSlideTreshold) {\n draggingSlideTreshold.current = _draggingSlideTreshold\n } else {\n draggingSlideTreshold.current = Math.floor(getSlideValue() / 2 / 2)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [_draggingSlideTreshold])\n useEffect(() => {\n function handleResize() {\n if (window.innerWidth === prevWindowWidth.current) return\n prevWindowWidth.current = window.innerWidth\n adjustCarouselWrapperPosition()\n }\n if ('ResizeObserver' in window && mainCarouselWrapperRef.current) {\n const observer = new ResizeObserver(() => {\n if (!resizeByPropChange.current) {\n prevWindowWidth.current = window.innerWidth\n adjustCarouselWrapperPosition()\n }\n })\n observer.observe(mainCarouselWrapperRef.current)\n return () => {\n observer.disconnect()\n }\n } else {\n window.addEventListener('resize', handleResize)\n return () => {\n window.removeEventListener('resize', handleResize)\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n carouselSlideAxis,\n initialStartingPosition,\n itemsPerSlide,\n withLoop,\n startEndGutter,\n gutter,\n freeScroll,\n slideType,\n init,\n ])\n\n const bindDrag = useDrag(\n state => {\n const isDragging = state.dragging\n const movement = state.offset[carouselSlideAxis === 'x' ? 0 : 1]\n const currentMovement = state.movement[carouselSlideAxis === 'x' ? 0 : 1]\n const direction = state.direction[carouselSlideAxis === 'x' ? 0 : 1]\n\n const prevItemTreshold = currentMovement > draggingSlideTreshold.current\n const nextItemTreshold = currentMovement < -draggingSlideTreshold.current\n\n if (isDragging) {\n if (direction > 0) {\n slideActionType.current = 'prev'\n } else {\n slideActionType.current = 'next'\n }\n\n emitEvent({\n ...state,\n eventName: 'onDrag',\n slideActionType: slideActionType.current,\n })\n\n if (freeScroll) {\n if (slideActionType.current === 'prev' && movement > 0) {\n state.cancel()\n setSpring.start({\n from: {\n val: getFromValue(),\n },\n to: {\n val: 0,\n },\n config: {\n velocity: state.velocity,\n friction: 50,\n tension: 1000,\n },\n })\n return\n }\n\n setSpring.start({\n from: {\n val: getFromValue(),\n },\n to: {\n val: -movement,\n },\n config: {\n velocity: state.velocity,\n friction: 50,\n tension: 1000,\n },\n })\n return\n }\n\n setSpring.start({\n val: movement,\n config: {\n velocity: state.velocity,\n friction: 50,\n tension: 1000,\n },\n })\n\n if (slideWhenThresholdIsReached && nextItemTreshold) {\n slideToNextItem('drag')\n state.cancel()\n } else if (slideWhenThresholdIsReached && prevItemTreshold) {\n slideToPrevItem('drag')\n state.cancel()\n }\n return\n }\n\n if (state.last && !state.canceled && freeScroll) {\n if (slideActionType.current === 'prev') {\n slideToPrevItem('drag')\n }\n if (slideActionType.current === 'next') {\n slideToNextItem('drag')\n }\n }\n\n if (state.last && !state.canceled && !freeScroll) {\n if (nextItemTreshold) {\n if (!withLoop && lastItemReached.current) {\n setSpring.start({\n val: -getTotalScrollValue(),\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n } else {\n slideToNextItem('drag')\n }\n } else if (prevItemTreshold) {\n if (!withLoop && firstItemReached.current) {\n setSpring.start({\n val: 0,\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n } else {\n slideToPrevItem('drag')\n }\n } else {\n setSpring.start({\n val: prevSlidedValue.current,\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n }\n }\n if (state.last && state.canceled) {\n setSpring.start({\n val: prevSlidedValue.current,\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n }\n },\n {\n enabled:\n (init && !disableGestures && !freeScroll) ||\n (!!freeScroll && !!enableFreeScrollDrag),\n axis: carouselSlideAxis,\n from: () => {\n if (freeScroll && mainCarouselWrapperRef.current) {\n return [\n -mainCarouselWrapperRef.current.scrollLeft,\n -mainCarouselWrapperRef.current.scrollTop,\n ]\n }\n if (carouselSlideAxis === 'x') {\n return [spring.val.get(), spring.val.get()]\n }\n return [spring.val.get(), spring.val.get()]\n },\n },\n )\n\n function getWrapperOverflowStyles() {\n if (freeScroll) {\n if (carouselSlideAxis === 'x') {\n return {\n overflowX: 'auto',\n }\n }\n return {\n overflowY: 'auto',\n }\n }\n return {}\n }\n\n function setStartEndItemReachedOnFreeScroll() {\n if (mainCarouselWrapperRef.current) {\n prevSlidedValue.current =\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ]\n if (\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] === 0\n ) {\n firstItemReached.current = true\n lastItemReached.current = false\n }\n if (\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] > 0 &&\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] < getTotalScrollValue()\n ) {\n firstItemReached.current = false\n lastItemReached.current = false\n }\n\n if (\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] === getTotalScrollValue()\n ) {\n firstItemReached.current = false\n lastItemReached.current = true\n }\n }\n }\n function getScrollHandlers() {\n if (freeScroll) {\n return {\n onWheel() {\n spring.val.stop()\n setStartEndItemReachedOnFreeScroll()\n },\n }\n }\n return {}\n }\n\n function findItemIndex(id: string | number, error?: string) {\n let itemIndex = 0\n\n if (typeof id === 'string') {\n itemIndex = items.findIndex(item => item.id === id)\n } else {\n itemIndex = id\n }\n if (itemIndex < 0 || itemIndex >= items.length) {\n if (error) {\n throw new Error(error)\n }\n console.error(\n `The item doesn't exist; check that the id provided - ${id} - is correct.`,\n )\n itemIndex = -1\n }\n\n return itemIndex\n }\n function internalSlideToItem(\n id: string | number,\n immediate = false,\n shouldReset = false,\n ) {\n if (!init) return\n\n firstItemReached.current = false\n lastItemReached.current = false\n\n const itemIndex = findItemIndex(\n id,\n \"The item you want to slide to doesn't exist; check the provided id.\",\n )\n\n if (itemIndex === activeItem.current && !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('click', newActiveItem, immediate)\n } else {\n slideToPrevItem('click', newActiveItem, immediate)\n }\n }\n function getIsNextItem(id: string | number) {\n const itemIndex = findItemIndex(id, \"The item doesn't exist; check the provided id.\")\n const _activeItem = activeItem.current\n if (withLoop && _activeItem === items.length - 1) {\n return itemIndex === 0\n }\n return itemIndex === _activeItem + 1\n }\n function getIsPrevItem(id: string | number) {\n const itemIndex = findItemIndex(id, \"The item doesn't exist; check the provided id.\")\n const _activeItem = activeItem.current\n if (withLoop && _activeItem === 0) {\n return itemIndex === items.length - 1\n }\n return itemIndex === _activeItem - 1\n }\n function getIsActiveItem(id: string | number) {\n return (\n findItemIndex(\n id,\n \"The item you want to check doesn't exist; check the provided id.\",\n ) === activeItem.current\n )\n }\n\n const res = freeScroll\n ? {\n useListenToCustomEvent,\n enterFullscreen,\n exitFullscreen,\n getIsFullscreen,\n slideToPrevItem: () => slideToPrevItem(),\n slideToNextItem: () => slideToNextItem(),\n }\n : {\n useListenToCustomEvent,\n enterFullscreen,\n exitFullscreen,\n getIsFullscreen,\n slideToPrevItem: () => slideToPrevItem(),\n slideToNextItem: () => slideToNextItem(),\n slideToItem: (id: string | number) => internalSlideToItem(id),\n getIsNextItem,\n getIsPrevItem,\n getIsActiveItem,\n }\n\n const _thumbsFragment = (\n <Context.Provider value={res}>{thumbsFragment}</Context.Provider>\n )\n const carouselFragment = (\n <Context.Provider value={res}>\n <div\n className=\"use-spring-carousel-main-wrapper\"\n ref={mainCarouselWrapperRef}\n {...getScrollHandlers()}\n style={{\n display: 'flex',\n position: 'relative',\n width: '100%',\n height: '100%',\n ...(getWrapperOverflowStyles() as React.CSSProperties),\n }}\n >\n <div\n className=\"use-spring-carousel-track-wrapper\"\n ref={carouselTrackWrapperRef}\n {...bindDrag()}\n style={{\n position: 'relative',\n display: 'flex',\n flexDirection: carouselSlideAxis === 'x' ? 'row' : 'column',\n touchAction: 'none',\n ...getAnimatedWrapperStyles(),\n }}\n >\n {(freeScroll || !withLoop) && startEndGutter ? (\n <div\n style={{\n flexShrink: 0,\n width: startEndGutter,\n }}\n />\n ) : null}\n {internalItems.map((item, index) => {\n return (\n <div\n key={`${item.id}-${index}`}\n className=\"use-spring-carousel-item\"\n data-testid=\"use-spring-carousel-item-wrapper\"\n style={{\n display: 'flex',\n position: 'relative',\n flex: '1',\n ...getItemStyles(!!freeScroll && index === items.length - 1),\n }}\n >\n {typeof item.renderItem === 'function'\n ? item.renderItem({\n getIsActiveItem,\n getIsNextItem,\n getIsPrevItem,\n useListenToCustomEvent,\n })\n : item.renderItem}\n </div>\n )\n })}\n {freeScroll && startEndGutter ? (\n <div\n style={{\n flexShrink: 0,\n width: startEndGutter,\n }}\n />\n ) : null}\n </div>\n </div>\n </Context.Provider>\n )\n\n return { ...res, carouselFragment, thumbsFragment: _thumbsFragment }\n}\n\ntype ContextProps<T = undefined> = Omit<\n ReturnType<T extends 'free-scroll' ? true : false>,\n 'carouselFragment' | 'thumbsFragment'\n>\n\nconst Context =\n createContext<ContextProps | ContextProps<'free-scroll'> | undefined>(undefined)\n\nfunction useSpringCarouselContext<T>() {\n const context = useContext(Context)\n if (!context) {\n throw new Error('useSpringCarouselContext must be used within the carousel.')\n }\n return context as ContextProps<T>\n}\n\nexport { useSpringCarousel, useSpringCarouselContext }\n","import { a, config, useTransition } from '@react-spring/web'\nimport { useEffect, useRef, useState, createContext, useContext } from 'react'\nimport { useEventsModule } from './modules/useEventsModule'\nimport { useDrag } from '@use-gesture/react'\nimport { useThumbsModule } from './modules'\nimport {\n ItemWithThumb,\n UseTransitionCarouselProps,\n UseTransitionCarouselReturnProps,\n SlideActionType,\n TransitionSlideMode,\n} from './types'\n\nconst defaultAnimationProps = {\n initial: {\n opacity: 1,\n position: 'relative',\n },\n from: {\n opacity: 0,\n position: 'relative',\n },\n enter: {\n position: 'relative',\n opacity: 1,\n },\n leave: {\n opacity: 1,\n position: 'absolute',\n },\n}\n\nfunction useTransitionCarousel({\n init = true,\n disableGestures = false,\n items,\n springConfig = config.default,\n exitBeforeEnter = false,\n trail,\n withLoop = false,\n activeItem: externalActiveItem,\n toPrevItemSpringProps = defaultAnimationProps,\n toNextItemSpringProps = defaultAnimationProps,\n draggingSlideTreshold = 50,\n thumbsSlideAxis = 'x',\n}: UseTransitionCarouselProps): UseTransitionCarouselReturnProps {\n const slideActionType = useRef<SlideActionType>('next')\n const slideModeType = useRef<TransitionSlideMode>('initial')\n const mainCarouselWrapperRef = useRef<HTMLDivElement | null>(null)\n const [activeItem, setActiveItem] = useState(externalActiveItem ?? 0)\n const { emitEvent, useListenToCustomEvent } = useEventsModule<'use-transition'>()\n const { handleScroll, thumbsFragment } = useThumbsModule({\n thumbsSlideAxis,\n items: items as ItemWithThumb[],\n })\n\n function getConfig() {\n if (slideActionType.current === 'prev') {\n return {\n initial: {\n ...toPrevItemSpringProps.initial,\n },\n from: {\n ...toPrevItemSpringProps.from,\n },\n enter: {\n ...toPrevItemSpringProps.enter,\n },\n leave: {\n ...toPrevItemSpringProps.leave,\n },\n }\n }\n if (slideActionType.current === 'next') {\n return {\n initial: {\n ...toNextItemSpringProps.initial,\n },\n from: {\n ...toNextItemSpringProps.from,\n },\n enter: {\n ...toNextItemSpringProps.enter,\n },\n leave: {\n ...toNextItemSpringProps.leave,\n },\n }\n }\n return {\n initial: {\n ...defaultAnimationProps.initial,\n },\n from: {\n ...defaultAnimationProps.from,\n },\n enter: {\n ...defaultAnimationProps.enter,\n },\n leave: {\n ...defaultAnimationProps.leave,\n },\n }\n }\n\n useEffect(() => {\n if (typeof externalActiveItem === 'number' && externalActiveItem !== activeItem) {\n setActiveItem(externalActiveItem)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [externalActiveItem])\n\n type SlideToItem = {\n to: number\n slideType: SlideActionType\n slideMode: TransitionSlideMode\n }\n\n function slideToItem({ to, slideType, slideMode }: SlideToItem) {\n slideActionType.current = slideType\n slideModeType.current = slideMode\n emitEvent({\n eventName: 'onSlideStartChange',\n slideActionType: slideActionType.current,\n slideMode: slideModeType.current,\n nextItem: {\n index: to,\n id: items[to].id,\n startReached: to === 0,\n endReached: to === items.length - 1,\n },\n })\n setActiveItem(to)\n handleScroll(activeItem)\n }\n\n function slideToPrevItem(slideMode: TransitionSlideMode) {\n if (!init) return\n const isFirstItem = activeItem === 0\n\n if (!withLoop && isFirstItem) return\n\n if (withLoop && isFirstItem) {\n slideToItem({\n to: items.length - 1,\n slideType: 'prev',\n slideMode,\n })\n } else {\n slideToItem({\n to: activeItem - 1,\n slideType: 'prev',\n slideMode,\n })\n }\n }\n function slideToNextItem(slideMode: TransitionSlideMode) {\n if (!init) return\n const isLastItem = activeItem === items.length - 1\n\n if (!withLoop && isLastItem) return\n\n if (withLoop && isLastItem) {\n slideToItem({\n to: 0,\n slideType: 'next',\n slideMode,\n })\n } else {\n slideToItem({\n to: activeItem + 1,\n slideType: 'next',\n slideMode,\n })\n }\n }\n\n const transitions = useTransition(activeItem, {\n config: springConfig,\n key: null,\n trail,\n exitBeforeEnter,\n ...getConfig(),\n onRest(value, _, index) {\n if (value.finished && index === activeItem) {\n emitEvent({\n eventName: 'onSlideChange',\n slideActionType: slideActionType.current,\n slideMode: slideModeType.current,\n currentItem: {\n index: activeItem,\n id: items[activeItem].id,\n startReached: activeItem === 0,\n endReached: activeItem === items.length - 1,\n },\n })\n }\n },\n })\n\n const bindSwipe = useDrag(\n ({ last, movement: [mx] }) => {\n if (last) {\n const prevItemTreshold = mx > draggingSlideTreshold\n const nextItemTreshold = mx < -draggingSlideTreshold\n const isFirstItem = activeItem === 0\n const isLastItem = activeItem === items.length - 1\n\n if (nextItemTreshold) {\n if (!withLoop && isLastItem) return\n\n emitEvent({\n eventName: 'onLeftSwipe',\n })\n slideToNextItem('swipe')\n } else if (prevItemTreshold) {\n if (!withLoop && isFirstItem) return\n\n emitEvent({\n eventName: 'onRightSwipe',\n })\n slideToPrevItem('swipe')\n }\n }\n },\n {\n enabled: !disableGestures,\n },\n )\n\n const itemsFragment = transitions((styles, item, _, indx) => {\n return (\n <a.div\n id={`use-transition-carousel-item-${indx}`}\n className=\"use-transition-carousel-item\"\n style={{\n ...styles,\n flex: '1 0 100%',\n width: '100%',\n height: '100%',\n }}\n >\n {items[item].renderItem}\n </a.div>\n )\n })\n\n const res = {\n useListenToCustomEvent,\n slideToPrevItem: () => slideToPrevItem('click'),\n slideToNextItem: () => slideToNextItem('click'),\n }\n\n const _thumbsFragment = (\n <Context.Provider value={res}>{thumbsFragment}</Context.Provider>\n )\n const carouselFragment = (\n <Context.Provider value={res}>\n <div\n ref={mainCarouselWrapperRef}\n {...bindSwipe()}\n style={{\n display: 'flex',\n position: 'relative',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n {itemsFragment}\n </div>\n </Context.Provider>\n )\n\n return {\n ...res,\n carouselFragment,\n thumbsFragment: _thumbsFragment,\n }\n}\n\ntype ContextProps = Omit<\n UseTransitionCarouselReturnProps,\n 'carouselFragment' | 'thumbsFragment'\n>\n\nconst Context = createContext<ContextProps | undefined>(undefined)\n\nfunction useTransitionCarouselContext() {\n const context = useContext(Context)\n if (!context) {\n throw new Error('useTransitionCarouselContext must be used within the carousel.')\n }\n return context\n}\n\nexport { useTransitionCarousel, useTransitionCarouselContext }\n"],"names":["useEventsModule","targetEvent","useRef","useListenToCustomEvent","eventHandler","useEffect","handleEvent","event","detail","current","document","createElement","addEventListener","_a","removeEventListener","emitEvent","newEvent","CustomEvent","dispatchEvent","useFullscreenModule","mainCarouselWrapperRef","onFullScreenChange","handleResize","isFullscreen","setIsFullscreen","_isFullscreen","handleFullscreenChange","fullscreenElement","screenfull","isEnabled","on","off","enterFullscreen","elementRef","request","exitFullscreen","exit","getIsFullscreen","useThumbsModule","thumbsSlideAxis","withThumbs","prepareThumbsData","items","wrapperRef","spring","setSpring","useSpring","val","getTotalScrollValue","Math","round","Number","getBoundingClientRect","thumbsFragment","_jsx","jsx","Object","assign","className","ref","onWheel","stop","style","display","flex","position","width","height","flexDirection","overflowX","overflowY","maxHeight","children","getPreparedItems","_items","map","i","id","renderThumb","handlePrepareThumbsData","thumbId","handleScroll","activeItem","thumbNode","querySelector","el","rect","top","left","bottom","window","innerHeight","documentElement","clientHeight","right","innerWidth","clientWidth","isInViewport","offset","offsetLeft","start","from","to","onChange","value","abs","Context","createContext","undefined","defaultAnimationProps","initial","opacity","enter","leave","init","itemsPerSlide","_itemsPerSlide","slideType","gutter","withLoop","startEndGutter","carouselSlideAxis","disableGestures","draggingSlideTreshold","_draggingSlideTreshold","slideWhenThresholdIsReached","freeScroll","enableFreeScrollDrag","initialStartingPosition","initialActiveItem","animateWhenActiveItemChange","resizeByPropChange","length","prevWindowWidth","slideActionType","slideModeType","prevSlidedValue","pause","scrollLeft","scrollTop","setStartEndItemReachedOnFreeScroll","carouselTrackWrapperRef","transform","firstItemReached","lastItemReached","prevWithLoop","internalItems","useCallback","getItems","adjustCarouselWrapperPosition","eventName","getSlideValue","carouselItem","Error","slideToItem","nextActiveItem","immediate","slideMode","nextItem","startReached","endReached","index","config","default","velocity","onRest","finished","currentItem","getCarouselItemWidth","positionProperty","setPosition","v","currentFromValue","getFromValue","setTimeout","get","getToValue","type","next","slideToPrevItem","nextItemWillExceed","slideToNextItem","internalSlideToItem","console","warn","useLayoutEffect","floor","observer","ResizeObserver","observe","disconnect","bindDrag","useDrag","state","isDragging","dragging","movement","currentMovement","direction","prevItemTreshold","nextItemTreshold","cancel","friction","tension","last","canceled","enabled","axis","findItemIndex","error","itemIndex","findIndex","item","shouldReset","newActiveItem","getIsNextItem","_activeItem","getIsPrevItem","getIsActiveItem","res","_thumbsFragment","Provider","carouselFragment","_jsxs","touchAction","percentValue","getAnimatedWrapperStyles","flexShrink","isLastItem","marginRight","renderItem","context","useContext","springConfig","exitBeforeEnter","trail","externalActiveItem","toPrevItemSpringProps","toNextItemSpringProps","setActiveItem","useState","isFirstItem","transitions","useTransition","key","_","bindSwipe","mx","itemsFragment","styles","indx","a","div","overflow"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/modules/useEventsModule.ts","../../src/modules/useFullscreenModule.ts","../../src/modules/useThumbsModule.tsx","../../src/useSpringCarousel.tsx","../../src/useTransitionCarousel.tsx"],"sourcesContent":["import { FullGestureState } from '@use-gesture/react'\nimport { useEffect, useRef } from 'react'\nimport { SlideActionType, SlideMode, TransitionSlideMode } from '../types/common'\n\nconst eventLabel = 'RSC::Event'\n\ntype OnSlideStartChange<T> = {\n eventName: 'onSlideStartChange'\n slideActionType: SlideActionType\n slideMode: T extends 'use-spring' ? SlideMode : TransitionSlideMode\n nextItem: {\n index: number\n id: string\n startReached: boolean\n endReached: boolean\n }\n}\ntype OnSlideChange<T> = {\n eventName: 'onSlideChange'\n slideActionType: SlideActionType\n slideMode: T extends 'use-spring' ? SlideMode : TransitionSlideMode\n currentItem: {\n index: number\n id: string\n startReached: boolean\n endReached: boolean\n }\n}\ntype OnFullscreenChange = {\n eventName: 'onFullscreenChange'\n isFullscreen: boolean\n}\ntype OnDrag = Omit<FullGestureState<'drag'>, 'event'> & {\n eventName: 'onDrag'\n slideActionType: SlideActionType\n}\n\ntype OnLeftSwipe = {\n eventName: 'onLeftSwipe'\n}\n\ntype OnRightSwipe = {\n eventName: 'onRightSwipe'\n}\n\ntype SpringCarouselEvents<T> =\n | OnSlideStartChange<T>\n | OnSlideChange<T>\n | OnDrag\n | OnFullscreenChange\n\ntype TransitionCarouselEvents<T> =\n | OnSlideStartChange<T>\n | OnSlideChange<T>\n | OnFullscreenChange\n | OnLeftSwipe\n | OnRightSwipe\n\ntype Events<T> = T extends 'use-spring'\n ? SpringCarouselEvents<'use-spring'>\n : TransitionCarouselEvents<'use-transition'>\n\ntype EventHandler<T> = (props: Events<T>) => void\n\nexport type UseListenToCustomEvent<T> = {\n useListenToCustomEvent: (eventHandler: EventHandler<T>) => void\n emitEvent: (event: Events<T>) => void\n}\n\nexport function useEventsModule<T extends 'use-spring' | 'use-transition'>() {\n const targetEvent = useRef<HTMLDivElement | null>(null)\n\n function useListenToCustomEvent(eventHandler: EventHandler<T>) {\n useEffect(() => {\n if (!targetEvent.current) {\n targetEvent.current = document.createElement('div')\n }\n\n function handleEvent(event: CustomEvent<Events<T>>) {\n eventHandler(event.detail)\n }\n\n if (targetEvent.current) {\n // @ts-ignore\n targetEvent.current.addEventListener(eventLabel, handleEvent, false)\n return () => {\n // @ts-ignore\n targetEvent.current?.removeEventListener(eventLabel, handleEvent, false)\n }\n }\n }, [eventHandler])\n }\n function emitEvent(event: Events<T>) {\n if (targetEvent.current) {\n const newEvent = new CustomEvent(eventLabel, {\n detail: event,\n })\n targetEvent.current.dispatchEvent(newEvent)\n }\n }\n\n return {\n useListenToCustomEvent,\n emitEvent,\n }\n}\n","import { useRef, MutableRefObject, useEffect } from 'react'\nimport screenfull from 'screenfull'\n\ntype FullscreenModule = {\n mainCarouselWrapperRef: MutableRefObject<HTMLDivElement | null>\n handleResize?(): void\n onFullScreenChange(isFullscreen: boolean): void\n}\n\nexport function useFullscreenModule({\n mainCarouselWrapperRef,\n onFullScreenChange,\n handleResize,\n}: FullscreenModule) {\n const isFullscreen = useRef(false)\n\n useEffect(() => {\n function handleFullscreenChange() {\n if (document.fullscreenElement) {\n setIsFullscreen(true)\n onFullScreenChange(true)\n handleResize && handleResize()\n }\n\n if (!document.fullscreenElement) {\n setIsFullscreen(false)\n onFullScreenChange(false)\n handleResize && handleResize()\n }\n }\n\n if (screenfull.isEnabled) {\n screenfull.on('change', handleFullscreenChange)\n return () => {\n if (screenfull.isEnabled) {\n screenfull.off('change', handleFullscreenChange)\n }\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n function setIsFullscreen(_isFullscreen: boolean) {\n isFullscreen.current = _isFullscreen\n }\n\n function getIsFullscreen() {\n return isFullscreen.current\n }\n\n function enterFullscreen(elementRef?: HTMLElement) {\n if (screenfull.isEnabled) {\n screenfull.request((elementRef || mainCarouselWrapperRef.current) as Element)\n }\n }\n\n function exitFullscreen() {\n screenfull.isEnabled && screenfull.exit()\n }\n\n return {\n enterFullscreen,\n exitFullscreen,\n getIsFullscreen,\n }\n}\n","import { useSpring } from '@react-spring/web'\nimport { useRef } from 'react'\n\nimport { ItemWithThumb, PrepareThumbsData, SpringCarouselWithThumbs } from '../types'\n\ntype Props = {\n withThumbs?: boolean\n thumbsSlideAxis: SpringCarouselWithThumbs['thumbsSlideAxis']\n prepareThumbsData?: PrepareThumbsData\n items: ItemWithThumb[]\n}\n\nfunction isInViewport(el: HTMLElement) {\n const rect = el.getBoundingClientRect()\n return (\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&\n rect.right <= (window.innerWidth || document.documentElement.clientWidth)\n )\n}\n\nexport function useThumbsModule({\n thumbsSlideAxis = 'x',\n withThumbs = false,\n prepareThumbsData,\n items,\n}: Props) {\n const wrapperRef = useRef<HTMLDivElement | null>(null)\n const [spring, setSpring] = useSpring(() => ({\n val: 0,\n }))\n\n function getTotalScrollValue() {\n return Math.round(\n Number(\n wrapperRef.current?.[thumbsSlideAxis === 'x' ? 'scrollWidth' : 'scrollHeight'],\n ) -\n wrapperRef.current!.getBoundingClientRect()[\n thumbsSlideAxis === 'x' ? 'width' : 'height'\n ],\n )\n }\n\n function handleScroll(activeItem: number) {\n function getThumbNode() {\n if (wrapperRef.current) {\n return wrapperRef.current.querySelector(\n `#thumb-item-${items[activeItem].id}`,\n ) as HTMLElement\n }\n return null\n }\n\n const thumbNode = getThumbNode()\n if (thumbNode && wrapperRef.current) {\n if (!isInViewport(thumbNode)) {\n const offset = thumbNode.offsetLeft\n const val = offset > getTotalScrollValue() ? getTotalScrollValue() : offset\n\n setSpring.start({\n from: {\n val:\n wrapperRef.current?.[\n thumbsSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] ?? 0,\n },\n to: {\n val,\n },\n onChange: ({ value }) => {\n if (wrapperRef.current) {\n wrapperRef.current[thumbsSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'] =\n Math.abs(value.val)\n }\n },\n })\n }\n }\n }\n\n function handlePrepareThumbsData() {\n function getPreparedItems(\n _items: ReturnType<PrepareThumbsData>,\n ): ReturnType<PrepareThumbsData> {\n return _items.map(i => ({\n id: i.id,\n renderThumb: i.renderThumb,\n }))\n }\n\n if (prepareThumbsData) {\n return prepareThumbsData(getPreparedItems(items))\n }\n return getPreparedItems(items)\n }\n\n const thumbsFragment = withThumbs ? (\n <div\n className=\"use-spring-carousel-thumbs-wrapper\"\n ref={wrapperRef}\n onWheel={() => spring.val.stop()}\n style={{\n display: 'flex',\n flex: '1',\n position: 'relative',\n width: '100%',\n height: '100%',\n flexDirection: thumbsSlideAxis === 'x' ? 'row' : 'column',\n ...(thumbsSlideAxis === 'x'\n ? { overflowX: 'auto' }\n : {\n overflowY: 'auto',\n maxHeight: '100%',\n }),\n }}\n >\n {handlePrepareThumbsData().map(({ id, renderThumb }) => {\n const thumbId = `thumb-item-${id}`\n return (\n <div key={thumbId} id={thumbId} className=\"thumb-item\">\n {renderThumb}\n </div>\n )\n })}\n </div>\n ) : null\n\n return {\n thumbsFragment,\n handleScroll,\n }\n}\n","import { config, useSpring } from '@react-spring/web'\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useRef,\n} from 'react'\n\nimport { useEventsModule } from './modules/useEventsModule'\nimport { useDrag } from '@use-gesture/react'\nimport { useFullscreenModule } from './modules/useFullscreenModule'\nimport { useThumbsModule } from './modules/useThumbsModule'\nimport {\n SlideActionType,\n SlideMode,\n UseSpringCarouselComplete,\n SpringCarouselWithThumbs,\n UseSpringCarouselWithFreeScroll,\n UseSpringCarouselWithThumbs,\n UseSpringCarouselWithNoThumbs,\n UseSpringCarouselWithNoFixedItems,\n UseSpringCarouselWithFixedItems,\n UseSpringFreeScrollReturnType,\n UseSpringReturnType,\n} from './types'\n\ntype ReturnType<T> = T extends true ? UseSpringFreeScrollReturnType : UseSpringReturnType\n\n/**\n * With free scroll\n */\nfunction useSpringCarousel(props: UseSpringCarouselWithFreeScroll): ReturnType<true>\nfunction useSpringCarousel(props: UseSpringCarouselWithThumbs<true>): ReturnType<true>\nfunction useSpringCarousel(props: UseSpringCarouselWithNoThumbs<true>): ReturnType<true>\n/**\n * No free scroll\n */\nfunction useSpringCarousel(props: UseSpringCarouselWithThumbs<false>): ReturnType<false>\nfunction useSpringCarousel(props: UseSpringCarouselWithNoThumbs<false>): ReturnType<false>\nfunction useSpringCarousel(\n props: UseSpringCarouselWithFixedItems<false>,\n): ReturnType<false>\nfunction useSpringCarousel(\n props: UseSpringCarouselWithNoFixedItems<false>,\n): ReturnType<false>\n\nfunction useSpringCarousel({\n items,\n init = true,\n withThumbs,\n thumbsSlideAxis = 'x',\n itemsPerSlide: _itemsPerSlide = 1,\n slideType = 'fixed',\n gutter = 0,\n withLoop = false,\n startEndGutter = 0,\n carouselSlideAxis = 'x',\n disableGestures = false,\n draggingSlideTreshold: _draggingSlideTreshold,\n slideWhenThresholdIsReached = false,\n freeScroll,\n enableFreeScrollDrag,\n initialStartingPosition,\n prepareThumbsData,\n initialActiveItem = 0,\n animateWhenActiveItemChange = true,\n}: UseSpringCarouselComplete): ReturnType<typeof freeScroll> {\n const resizeByPropChange = useRef(false)\n const itemsPerSlide = _itemsPerSlide > items.length ? items.length : _itemsPerSlide\n const prevWindowWidth = useRef(0)\n const draggingSlideTreshold = useRef(_draggingSlideTreshold ?? 0)\n const slideActionType = useRef<SlideActionType>('initial')\n const slideModeType = useRef<SlideMode>('initial')\n const prevSlidedValue = useRef(0)\n const [spring, setSpring] = useSpring(() => ({\n val: 0,\n pause: !init,\n onChange({ value }) {\n if (freeScroll && mainCarouselWrapperRef.current) {\n if (carouselSlideAxis === 'x') {\n mainCarouselWrapperRef.current.scrollLeft = Math.abs(value.val)\n } else {\n mainCarouselWrapperRef.current.scrollTop = Math.abs(value.val)\n }\n setStartEndItemReachedOnFreeScroll()\n } else if (carouselTrackWrapperRef.current) {\n if (carouselSlideAxis === 'x') {\n carouselTrackWrapperRef.current.style.transform = `translate3d(${value.val}px, 0px,0px)`\n } else {\n carouselTrackWrapperRef.current.style.transform = `translate3d(0px,${value.val}px,0px)`\n }\n }\n },\n }))\n const activeItem = useRef(initialActiveItem)\n const firstItemReached = useRef(initialActiveItem === 0)\n const lastItemReached = useRef(false)\n const mainCarouselWrapperRef = useRef<HTMLDivElement | null>(null)\n const carouselTrackWrapperRef = useRef<HTMLDivElement | null>(null)\n\n const prevWithLoop = useRef(withLoop)\n\n const getItems = useCallback(() => {\n if (withLoop) {\n return [\n ...items.map(i => ({\n ...i,\n id: `prev-repeated-item-${i.id}`,\n })),\n ...items,\n ...items.map(i => ({\n ...i,\n id: `next-repeated-item-${i.id}`,\n })),\n ]\n }\n return [...items]\n }, [items, withLoop])\n const internalItems = getItems()\n\n const { emitEvent, useListenToCustomEvent } = useEventsModule<'use-spring'>()\n const { thumbsFragment, handleScroll } = useThumbsModule({\n withThumbs: !!withThumbs,\n thumbsSlideAxis,\n prepareThumbsData,\n items: items as SpringCarouselWithThumbs['items'],\n })\n const { enterFullscreen, exitFullscreen, getIsFullscreen } = useFullscreenModule({\n mainCarouselWrapperRef,\n handleResize: () => adjustCarouselWrapperPosition(),\n onFullScreenChange: val => {\n emitEvent({\n eventName: 'onFullscreenChange',\n isFullscreen: val,\n })\n },\n })\n\n function getItemStyles(isLastItem: boolean) {\n if (slideType === 'fixed' && !freeScroll) {\n return {\n marginRight: `${isLastItem ? 0 : gutter}px`,\n flex: `1 0 calc(100% / ${itemsPerSlide} - ${\n (gutter * (itemsPerSlide - 1)) / itemsPerSlide\n }px)`,\n }\n }\n return {\n ...{ marginRight: `${isLastItem ? 0 : gutter}px` },\n }\n }\n\n function getSlideValue() {\n const carouselItem = mainCarouselWrapperRef.current?.querySelector(\n '.use-spring-carousel-item',\n )\n\n if (!carouselItem) {\n throw Error('No carousel items available!')\n }\n\n return (\n carouselItem.getBoundingClientRect()[\n carouselSlideAxis === 'x' ? 'width' : 'height'\n ] + gutter\n )\n }\n\n type SlideToItem = {\n from: number\n to: number\n nextActiveItem?: number\n immediate?: boolean\n slideMode: 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 function getTotalScrollValue() {\n if (withLoop) {\n return getSlideValue() * items.length\n }\n return Math.round(\n Number(\n carouselTrackWrapperRef.current?.[\n carouselSlideAxis === 'x' ? 'scrollWidth' : 'scrollHeight'\n ],\n ) -\n carouselTrackWrapperRef.current!.getBoundingClientRect()[\n carouselSlideAxis === 'x' ? 'width' : 'height'\n ] -\n startEndGutter,\n )\n }\n function getAnimatedWrapperStyles() {\n const percentValue = `calc(100% - ${startEndGutter * 2}px)`\n return {\n width: carouselSlideAxis === 'x' ? percentValue : '100%',\n height: carouselSlideAxis === 'y' ? percentValue : '100%',\n }\n }\n\n function getCarouselItemWidth() {\n const carouselItem = carouselTrackWrapperRef.current?.querySelector(\n '.use-spring-carousel-item',\n )\n if (!carouselItem) {\n throw Error('No carousel items available!')\n }\n return (\n carouselItem.getBoundingClientRect()[\n carouselSlideAxis === 'x' ? 'width' : 'height'\n ] + gutter\n )\n }\n function adjustCarouselWrapperPosition() {\n const positionProperty = carouselSlideAxis === 'x' ? 'left' : 'top'\n\n function setPosition(v: number) {\n const ref = carouselTrackWrapperRef.current\n if (!ref) return\n\n if (withLoop) {\n ref.style.top = '0px'\n ref.style.left = '0px'\n ref.style[positionProperty] = `-${v - startEndGutter}px`\n\n firstItemReached.current = false\n lastItemReached.current = false\n } else {\n ref.style.left = '0px'\n ref.style.top = '0px'\n }\n }\n\n const currentFromValue = Math.abs(getFromValue())\n\n if (initialStartingPosition === 'center') {\n setPosition(\n getCarouselItemWidth() * items.length -\n getSlideValue() * Math.round((itemsPerSlide - 1) / 2),\n )\n } else if (initialStartingPosition === 'end') {\n setPosition(\n getCarouselItemWidth() * items.length -\n getSlideValue() * Math.round(itemsPerSlide - 1),\n )\n } else {\n setPosition(getCarouselItemWidth() * items.length)\n }\n\n if (\n currentFromValue < getTotalScrollValue() &&\n slideType === 'fluid' &&\n lastItemReached.current &&\n !withLoop\n ) {\n lastItemReached.current = false\n }\n if (currentFromValue > getTotalScrollValue() && !withLoop) {\n const val = -getTotalScrollValue()\n lastItemReached.current = true\n prevSlidedValue.current = val\n setSpring.start({\n immediate: true,\n val: prevSlidedValue.current,\n })\n setTimeout(() => {\n resizeByPropChange.current = false\n }, 0)\n }\n\n if (!freeScroll && slideType === 'fixed') {\n const val = -(getSlideValue() * activeItem.current)\n prevSlidedValue.current = val\n setSpring.start({\n immediate: true,\n val,\n })\n }\n\n 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 || (firstItemReached.current && !withLoop)) return\n\n slideActionType.current = 'prev'\n lastItemReached.current = false\n\n const nextItem = typeof index === 'number' ? index : activeItem.current - 1\n\n if (!withLoop) {\n const nextItemWillExceed = freeScroll\n ? getToValue('prev', index) - getSlideValue() / 3 < 0\n : getToValue('prev', index) + getSlideValue() / 3 > 0\n\n if (firstItemReached.current) return\n if (nextItemWillExceed) {\n firstItemReached.current = true\n lastItemReached.current = false\n\n slideToItem({\n slideMode: type,\n from: getFromValue(),\n to: 0,\n nextActiveItem: 0,\n immediate,\n })\n return\n }\n }\n if (withLoop && (firstItemReached.current || 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 || (lastItemReached.current && !withLoop)) return\n\n slideActionType.current = 'next'\n firstItemReached.current = false\n\n const nextItem = index || activeItem.current + 1\n\n if (!withLoop) {\n const nextItemWillExceed =\n Math.abs(getToValue('next', index)) > getTotalScrollValue() - getSlideValue() / 3\n\n if (lastItemReached.current) return\n if (nextItemWillExceed) {\n firstItemReached.current = false\n lastItemReached.current = true\n\n slideToItem({\n slideMode: type,\n from: getFromValue(),\n to: freeScroll ? getTotalScrollValue() : -getTotalScrollValue(),\n nextActiveItem: nextItem,\n immediate,\n })\n return\n }\n }\n if (withLoop && (lastItemReached.current || 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\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, animateWhenActiveItemChange])\n useEffect(() => {\n if (init) {\n if (initialActiveItem > items.length - 1) {\n throw new Error(\n `initialActiveItem (${initialActiveItem}) is greater than the total quantity available items (${items.length}).`,\n )\n }\n if (itemsPerSlide > items.length) {\n console.warn(\n `itemsPerSlide (${itemsPerSlide}) is greater than the total quantity available items (${items.length}). Fallback to ${items.length})`,\n )\n }\n }\n }, [initialActiveItem, items, itemsPerSlide, init])\n useEffect(() => {\n prevWindowWidth.current = window.innerWidth\n }, [])\n useEffect(() => {\n resizeByPropChange.current = true\n adjustCarouselWrapperPosition()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n initialStartingPosition,\n itemsPerSlide,\n startEndGutter,\n gutter,\n freeScroll,\n slideType,\n init,\n ])\n useEffect(() => {\n if (withLoop !== prevWithLoop.current) {\n prevWithLoop.current = withLoop\n internalSlideToItem({ id: 0, immediate: true, shouldReset: true })\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [withLoop])\n useLayoutEffect(() => {\n /**\n * Set initial track position\n */\n if (carouselTrackWrapperRef.current) {\n adjustCarouselWrapperPosition()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n useEffect(() => {\n if (_draggingSlideTreshold) {\n draggingSlideTreshold.current = _draggingSlideTreshold\n } else {\n draggingSlideTreshold.current = Math.floor(getSlideValue() / 2 / 2)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [_draggingSlideTreshold])\n useEffect(() => {\n function handleResize() {\n if (window.innerWidth === prevWindowWidth.current) return\n prevWindowWidth.current = window.innerWidth\n adjustCarouselWrapperPosition()\n }\n if ('ResizeObserver' in window && mainCarouselWrapperRef.current) {\n const observer = new ResizeObserver(() => {\n if (!resizeByPropChange.current) {\n prevWindowWidth.current = window.innerWidth\n adjustCarouselWrapperPosition()\n }\n })\n observer.observe(mainCarouselWrapperRef.current)\n return () => {\n observer.disconnect()\n }\n } else {\n window.addEventListener('resize', handleResize)\n return () => {\n window.removeEventListener('resize', handleResize)\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n carouselSlideAxis,\n initialStartingPosition,\n itemsPerSlide,\n withLoop,\n startEndGutter,\n gutter,\n freeScroll,\n slideType,\n init,\n ])\n\n const bindDrag = useDrag(\n state => {\n const isDragging = state.dragging\n const movement = state.offset[carouselSlideAxis === 'x' ? 0 : 1]\n const currentMovement = state.movement[carouselSlideAxis === 'x' ? 0 : 1]\n const direction = state.direction[carouselSlideAxis === 'x' ? 0 : 1]\n\n const prevItemTreshold = currentMovement > draggingSlideTreshold.current\n const nextItemTreshold = currentMovement < -draggingSlideTreshold.current\n\n if (isDragging) {\n if (direction > 0) {\n slideActionType.current = 'prev'\n } else {\n slideActionType.current = 'next'\n }\n\n emitEvent({\n ...state,\n eventName: 'onDrag',\n slideActionType: slideActionType.current,\n })\n\n if (freeScroll) {\n if (slideActionType.current === 'prev' && movement > 0) {\n state.cancel()\n setSpring.start({\n from: {\n val: getFromValue(),\n },\n to: {\n val: 0,\n },\n config: {\n velocity: state.velocity,\n friction: 50,\n tension: 1000,\n },\n })\n return\n }\n\n setSpring.start({\n from: {\n val: getFromValue(),\n },\n to: {\n val: -movement,\n },\n config: {\n velocity: state.velocity,\n friction: 50,\n tension: 1000,\n },\n })\n return\n }\n\n setSpring.start({\n val: movement,\n config: {\n velocity: state.velocity,\n friction: 50,\n tension: 1000,\n },\n })\n\n if (slideWhenThresholdIsReached && nextItemTreshold) {\n slideToNextItem({ type: 'drag' })\n state.cancel()\n } else if (slideWhenThresholdIsReached && prevItemTreshold) {\n slideToPrevItem({ type: 'drag' })\n state.cancel()\n }\n return\n }\n\n if (state.last && !state.canceled && freeScroll) {\n if (slideActionType.current === 'prev') {\n slideToPrevItem({ type: 'drag' })\n }\n if (slideActionType.current === 'next') {\n slideToNextItem({ type: 'drag' })\n }\n }\n\n if (state.last && !state.canceled && !freeScroll) {\n if (nextItemTreshold) {\n if (!withLoop && lastItemReached.current) {\n setSpring.start({\n val: -getTotalScrollValue(),\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n } else {\n slideToNextItem({ type: 'drag' })\n }\n } else if (prevItemTreshold) {\n if (!withLoop && firstItemReached.current) {\n setSpring.start({\n val: 0,\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n } else {\n slideToPrevItem({ type: 'drag' })\n }\n } else {\n setSpring.start({\n val: prevSlidedValue.current,\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n }\n }\n if (state.last && state.canceled) {\n setSpring.start({\n val: prevSlidedValue.current,\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n }\n },\n {\n enabled:\n (init && !disableGestures && !freeScroll) ||\n (!!freeScroll && !!enableFreeScrollDrag),\n axis: carouselSlideAxis,\n from: () => {\n if (freeScroll && mainCarouselWrapperRef.current) {\n return [\n -mainCarouselWrapperRef.current.scrollLeft,\n -mainCarouselWrapperRef.current.scrollTop,\n ]\n }\n if (carouselSlideAxis === 'x') {\n return [spring.val.get(), spring.val.get()]\n }\n return [spring.val.get(), spring.val.get()]\n },\n },\n )\n\n function getWrapperOverflowStyles() {\n if (freeScroll) {\n if (carouselSlideAxis === 'x') {\n return {\n overflowX: 'auto',\n }\n }\n return {\n overflowY: 'auto',\n }\n }\n return {}\n }\n\n function setStartEndItemReachedOnFreeScroll() {\n if (mainCarouselWrapperRef.current) {\n prevSlidedValue.current =\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ]\n if (\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] === 0\n ) {\n firstItemReached.current = true\n lastItemReached.current = false\n }\n if (\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] > 0 &&\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] < getTotalScrollValue()\n ) {\n firstItemReached.current = false\n lastItemReached.current = false\n }\n\n if (\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] === getTotalScrollValue()\n ) {\n firstItemReached.current = false\n lastItemReached.current = true\n }\n }\n }\n function getScrollHandlers() {\n if (freeScroll) {\n return {\n onWheel() {\n spring.val.stop()\n setStartEndItemReachedOnFreeScroll()\n },\n }\n }\n return {}\n }\n\n function findItemIndex(id: string | number, error?: string) {\n let itemIndex = 0\n\n if (typeof id === 'string') {\n itemIndex = items.findIndex(item => item.id === id)\n } else {\n itemIndex = id\n }\n if (itemIndex < 0 || itemIndex >= items.length) {\n if (error) {\n throw new Error(error)\n }\n console.error(\n `The item doesn't exist; check that the id provided - ${id} - is correct.`,\n )\n itemIndex = -1\n }\n\n return itemIndex\n }\n type InternalSlideToItem = {\n id: string | number\n immediate?: boolean\n shouldReset?: boolean\n }\n function internalSlideToItem({ id, immediate, shouldReset }: InternalSlideToItem) {\n if (!init) return\n\n firstItemReached.current = false\n lastItemReached.current = false\n\n const itemIndex = findItemIndex(\n id,\n \"The item you want to slide to doesn't exist; check the provided id.\",\n )\n\n if (itemIndex === activeItem.current && !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: shouldReset ? 'initial' : 'click',\n index: newActiveItem,\n immediate,\n })\n } else {\n slideToPrevItem({\n type: shouldReset ? 'initial' : 'click',\n index: newActiveItem,\n immediate,\n })\n }\n }\n function getIsNextItem(id: string | number) {\n const itemIndex = findItemIndex(id, \"The item doesn't exist; check the provided id.\")\n const _activeItem = activeItem.current\n if (withLoop && _activeItem === items.length - 1) {\n return itemIndex === 0\n }\n return itemIndex === _activeItem + 1\n }\n function getIsPrevItem(id: string | number) {\n const itemIndex = findItemIndex(id, \"The item doesn't exist; check the provided id.\")\n const _activeItem = activeItem.current\n if (withLoop && _activeItem === 0) {\n return itemIndex === items.length - 1\n }\n return itemIndex === _activeItem - 1\n }\n function getIsActiveItem(id: string | number) {\n return (\n findItemIndex(\n id,\n \"The item you want to check doesn't exist; check the provided id.\",\n ) === activeItem.current\n )\n }\n\n const res = freeScroll\n ? {\n useListenToCustomEvent,\n enterFullscreen,\n exitFullscreen,\n getIsFullscreen,\n slideToPrevItem: () => {\n slideToPrevItem({\n type: 'click',\n })\n },\n slideToNextItem: () => {\n slideToNextItem({\n type: 'click',\n })\n },\n }\n : {\n useListenToCustomEvent,\n enterFullscreen,\n exitFullscreen,\n getIsFullscreen,\n slideToPrevItem: () => {\n slideToPrevItem({\n type: 'click',\n })\n },\n slideToNextItem: () => {\n slideToNextItem({\n type: 'click',\n })\n },\n slideToItem: (id: string | number) => internalSlideToItem({ id }),\n getIsNextItem,\n getIsPrevItem,\n getIsActiveItem,\n }\n\n const _thumbsFragment = (\n <Context.Provider value={res}>{thumbsFragment}</Context.Provider>\n )\n const carouselFragment = (\n <Context.Provider value={res}>\n <div\n className=\"use-spring-carousel-main-wrapper\"\n ref={mainCarouselWrapperRef}\n {...getScrollHandlers()}\n style={{\n display: 'flex',\n position: 'relative',\n width: '100%',\n height: '100%',\n ...(getWrapperOverflowStyles() as React.CSSProperties),\n }}\n >\n <div\n className=\"use-spring-carousel-track-wrapper\"\n ref={carouselTrackWrapperRef}\n {...bindDrag()}\n style={{\n position: 'relative',\n display: 'flex',\n flexDirection: carouselSlideAxis === 'x' ? 'row' : 'column',\n touchAction: 'none',\n ...getAnimatedWrapperStyles(),\n }}\n >\n {(freeScroll || !withLoop) && startEndGutter ? (\n <div\n style={{\n flexShrink: 0,\n width: startEndGutter,\n }}\n />\n ) : null}\n {internalItems.map((item, index) => {\n return (\n <div\n key={`${item.id}-${index}`}\n className=\"use-spring-carousel-item\"\n data-testid=\"use-spring-carousel-item-wrapper\"\n style={{\n display: 'flex',\n position: 'relative',\n flex: '1',\n ...getItemStyles(!!freeScroll && index === items.length - 1),\n }}\n >\n {typeof item.renderItem === 'function'\n ? item.renderItem({\n getIsActiveItem,\n getIsNextItem,\n getIsPrevItem,\n useListenToCustomEvent,\n })\n : item.renderItem}\n </div>\n )\n })}\n {freeScroll && startEndGutter ? (\n <div\n style={{\n flexShrink: 0,\n width: startEndGutter,\n }}\n />\n ) : null}\n </div>\n </div>\n </Context.Provider>\n )\n\n return { ...res, carouselFragment, thumbsFragment: _thumbsFragment }\n}\n\ntype ContextProps<T = undefined> = Omit<\n ReturnType<T extends 'free-scroll' ? true : false>,\n 'carouselFragment' | 'thumbsFragment'\n>\n\nconst Context =\n createContext<ContextProps | ContextProps<'free-scroll'> | undefined>(undefined)\n\nfunction useSpringCarouselContext<T>() {\n const context = useContext(Context)\n if (!context) {\n throw new Error('useSpringCarouselContext must be used within the carousel.')\n }\n return context as ContextProps<T>\n}\n\nexport { useSpringCarousel, useSpringCarouselContext }\n","import { a, config, useTransition } from '@react-spring/web'\nimport { useEffect, useRef, useState, createContext, useContext } from 'react'\nimport { useEventsModule } from './modules/useEventsModule'\nimport { useDrag } from '@use-gesture/react'\nimport { useThumbsModule } from './modules'\nimport {\n ItemWithThumb,\n UseTransitionCarouselProps,\n UseTransitionCarouselReturnProps,\n SlideActionType,\n TransitionSlideMode,\n} from './types'\n\nconst defaultAnimationProps = {\n initial: {\n opacity: 1,\n position: 'relative',\n },\n from: {\n opacity: 0,\n position: 'relative',\n },\n enter: {\n position: 'relative',\n opacity: 1,\n },\n leave: {\n opacity: 1,\n position: 'absolute',\n },\n}\n\nfunction useTransitionCarousel({\n init = true,\n disableGestures = false,\n items,\n springConfig = config.default,\n exitBeforeEnter = false,\n trail,\n withLoop = false,\n activeItem: externalActiveItem,\n toPrevItemSpringProps = defaultAnimationProps,\n toNextItemSpringProps = defaultAnimationProps,\n draggingSlideTreshold = 50,\n thumbsSlideAxis = 'x',\n}: UseTransitionCarouselProps): UseTransitionCarouselReturnProps {\n const slideActionType = useRef<SlideActionType>('next')\n const slideModeType = useRef<TransitionSlideMode>('initial')\n const mainCarouselWrapperRef = useRef<HTMLDivElement | null>(null)\n const [activeItem, setActiveItem] = useState(externalActiveItem ?? 0)\n const { emitEvent, useListenToCustomEvent } = useEventsModule<'use-transition'>()\n const { handleScroll, thumbsFragment } = useThumbsModule({\n thumbsSlideAxis,\n items: items as ItemWithThumb[],\n })\n\n function getConfig() {\n if (slideActionType.current === 'prev') {\n return {\n initial: {\n ...toPrevItemSpringProps.initial,\n },\n from: {\n ...toPrevItemSpringProps.from,\n },\n enter: {\n ...toPrevItemSpringProps.enter,\n },\n leave: {\n ...toPrevItemSpringProps.leave,\n },\n }\n }\n if (slideActionType.current === 'next') {\n return {\n initial: {\n ...toNextItemSpringProps.initial,\n },\n from: {\n ...toNextItemSpringProps.from,\n },\n enter: {\n ...toNextItemSpringProps.enter,\n },\n leave: {\n ...toNextItemSpringProps.leave,\n },\n }\n }\n return {\n initial: {\n ...defaultAnimationProps.initial,\n },\n from: {\n ...defaultAnimationProps.from,\n },\n enter: {\n ...defaultAnimationProps.enter,\n },\n leave: {\n ...defaultAnimationProps.leave,\n },\n }\n }\n\n useEffect(() => {\n if (typeof externalActiveItem === 'number' && externalActiveItem !== activeItem) {\n setActiveItem(externalActiveItem)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [externalActiveItem])\n\n type SlideToItem = {\n to: number\n slideType: SlideActionType\n slideMode: TransitionSlideMode\n }\n\n function slideToItem({ to, slideType, slideMode }: SlideToItem) {\n slideActionType.current = slideType\n slideModeType.current = slideMode\n emitEvent({\n eventName: 'onSlideStartChange',\n slideActionType: slideActionType.current,\n slideMode: slideModeType.current,\n nextItem: {\n index: to,\n id: items[to].id,\n startReached: to === 0,\n endReached: to === items.length - 1,\n },\n })\n setActiveItem(to)\n handleScroll(activeItem)\n }\n\n function slideToPrevItem(slideMode: TransitionSlideMode) {\n if (!init) return\n const isFirstItem = activeItem === 0\n\n if (!withLoop && isFirstItem) return\n\n if (withLoop && isFirstItem) {\n slideToItem({\n to: items.length - 1,\n slideType: 'prev',\n slideMode,\n })\n } else {\n slideToItem({\n to: activeItem - 1,\n slideType: 'prev',\n slideMode,\n })\n }\n }\n function slideToNextItem(slideMode: TransitionSlideMode) {\n if (!init) return\n const isLastItem = activeItem === items.length - 1\n\n if (!withLoop && isLastItem) return\n\n if (withLoop && isLastItem) {\n slideToItem({\n to: 0,\n slideType: 'next',\n slideMode,\n })\n } else {\n slideToItem({\n to: activeItem + 1,\n slideType: 'next',\n slideMode,\n })\n }\n }\n\n const transitions = useTransition(activeItem, {\n config: springConfig,\n key: null,\n trail,\n exitBeforeEnter,\n ...getConfig(),\n onRest(value, _, index) {\n if (value.finished && index === activeItem) {\n emitEvent({\n eventName: 'onSlideChange',\n slideActionType: slideActionType.current,\n slideMode: slideModeType.current,\n currentItem: {\n index: activeItem,\n id: items[activeItem].id,\n startReached: activeItem === 0,\n endReached: activeItem === items.length - 1,\n },\n })\n }\n },\n })\n\n const bindSwipe = useDrag(\n ({ last, movement: [mx] }) => {\n if (last) {\n const prevItemTreshold = mx > draggingSlideTreshold\n const nextItemTreshold = mx < -draggingSlideTreshold\n const isFirstItem = activeItem === 0\n const isLastItem = activeItem === items.length - 1\n\n if (nextItemTreshold) {\n if (!withLoop && isLastItem) return\n\n emitEvent({\n eventName: 'onLeftSwipe',\n })\n slideToNextItem('swipe')\n } else if (prevItemTreshold) {\n if (!withLoop && isFirstItem) return\n\n emitEvent({\n eventName: 'onRightSwipe',\n })\n slideToPrevItem('swipe')\n }\n }\n },\n {\n enabled: !disableGestures,\n },\n )\n\n const itemsFragment = transitions((styles, item, _, indx) => {\n return (\n <a.div\n id={`use-transition-carousel-item-${indx}`}\n className=\"use-transition-carousel-item\"\n style={{\n ...styles,\n flex: '1 0 100%',\n width: '100%',\n height: '100%',\n }}\n >\n {items[item].renderItem}\n </a.div>\n )\n })\n\n const res = {\n useListenToCustomEvent,\n slideToPrevItem: () => slideToPrevItem('click'),\n slideToNextItem: () => slideToNextItem('click'),\n }\n\n const _thumbsFragment = (\n <Context.Provider value={res}>{thumbsFragment}</Context.Provider>\n )\n const carouselFragment = (\n <Context.Provider value={res}>\n <div\n ref={mainCarouselWrapperRef}\n {...bindSwipe()}\n style={{\n display: 'flex',\n position: 'relative',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n {itemsFragment}\n </div>\n </Context.Provider>\n )\n\n return {\n ...res,\n carouselFragment,\n thumbsFragment: _thumbsFragment,\n }\n}\n\ntype ContextProps = Omit<\n UseTransitionCarouselReturnProps,\n 'carouselFragment' | 'thumbsFragment'\n>\n\nconst Context = createContext<ContextProps | undefined>(undefined)\n\nfunction useTransitionCarouselContext() {\n const context = useContext(Context)\n if (!context) {\n throw new Error('useTransitionCarouselContext must be used within the carousel.')\n }\n return context\n}\n\nexport { useTransitionCarousel, useTransitionCarouselContext }\n"],"names":["useEventsModule","targetEvent","useRef","useListenToCustomEvent","eventHandler","useEffect","handleEvent","event","detail","current","document","createElement","addEventListener","_a","removeEventListener","emitEvent","newEvent","CustomEvent","dispatchEvent","useFullscreenModule","mainCarouselWrapperRef","onFullScreenChange","handleResize","isFullscreen","setIsFullscreen","_isFullscreen","handleFullscreenChange","fullscreenElement","screenfull","isEnabled","on","off","enterFullscreen","elementRef","request","exitFullscreen","exit","getIsFullscreen","useThumbsModule","thumbsSlideAxis","withThumbs","prepareThumbsData","items","wrapperRef","spring","setSpring","useSpring","val","getTotalScrollValue","Math","round","Number","getBoundingClientRect","thumbsFragment","_jsx","jsx","Object","assign","className","ref","onWheel","stop","style","display","flex","position","width","height","flexDirection","overflowX","overflowY","maxHeight","children","getPreparedItems","_items","map","i","id","renderThumb","handlePrepareThumbsData","thumbId","handleScroll","activeItem","thumbNode","querySelector","el","rect","top","left","bottom","window","innerHeight","documentElement","clientHeight","right","innerWidth","clientWidth","isInViewport","offset","offsetLeft","start","from","to","onChange","value","abs","Context","createContext","undefined","defaultAnimationProps","initial","opacity","enter","leave","init","itemsPerSlide","_itemsPerSlide","slideType","gutter","withLoop","startEndGutter","carouselSlideAxis","disableGestures","draggingSlideTreshold","_draggingSlideTreshold","slideWhenThresholdIsReached","freeScroll","enableFreeScrollDrag","initialStartingPosition","initialActiveItem","animateWhenActiveItemChange","resizeByPropChange","length","prevWindowWidth","slideActionType","slideModeType","prevSlidedValue","pause","scrollLeft","scrollTop","setStartEndItemReachedOnFreeScroll","carouselTrackWrapperRef","transform","firstItemReached","lastItemReached","prevWithLoop","internalItems","useCallback","getItems","adjustCarouselWrapperPosition","eventName","getSlideValue","carouselItem","Error","slideToItem","nextActiveItem","immediate","slideMode","nextItem","startReached","endReached","index","config","default","velocity","onRest","finished","currentItem","getCarouselItemWidth","positionProperty","setPosition","v","currentFromValue","getFromValue","setTimeout","get","getToValue","type","next","slideToPrevItem","nextItemWillExceed","slideToNextItem","internalSlideToItem","console","warn","shouldReset","useLayoutEffect","floor","observer","ResizeObserver","observe","disconnect","bindDrag","useDrag","state","isDragging","dragging","movement","currentMovement","direction","prevItemTreshold","nextItemTreshold","cancel","friction","tension","last","canceled","enabled","axis","findItemIndex","error","itemIndex","findIndex","item","newActiveItem","getIsNextItem","_activeItem","getIsPrevItem","getIsActiveItem","res","_thumbsFragment","Provider","carouselFragment","_jsxs","touchAction","percentValue","getAnimatedWrapperStyles","flexShrink","isLastItem","marginRight","renderItem","context","useContext","springConfig","exitBeforeEnter","trail","externalActiveItem","toPrevItemSpringProps","toNextItemSpringProps","setActiveItem","useState","isFirstItem","transitions","useTransition","key","_","bindSwipe","mx","itemsFragment","styles","indx","a","div","overflow"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{jsx as e,jsxs as t}from"react/jsx-runtime";import{useSpring as r,config as n}from"@react-spring/web";import{createContext as i,useRef as c,useCallback as s,useEffect as o,useLayoutEffect as l,useContext as u}from"react";import{u as a,a as d}from"./useThumbsModule-f4421f49.js";import{useDrag as m}from"@use-gesture/react";import{u as h}from"./useFullscreenModule-519d337d.js";import"screenfull";function g({items:i,init:u=!0,withThumbs:g,thumbsSlideAxis:f="x",itemsPerSlide:p=1,slideType:x="fixed",gutter:b=0,withLoop:y=!1,startEndGutter:w=0,carouselSlideAxis:I="x",disableGestures:T=!1,draggingSlideTreshold:j,slideWhenThresholdIsReached:O=!1,freeScroll:A,enableFreeScrollDrag:M,initialStartingPosition:S,prepareThumbsData:F,initialActiveItem:$=0,animateWhenActiveItemChange:C=!0}){const L=c(!1),R=p>i.length?i.length:p,k=c(0),N=c(null!=j?j:0),E=c("initial"),P=c("initial"),W=c(0),[z,D]=r((()=>({val:0,pause:!u,onChange({value:e}){A&&H.current?("x"===I?H.current.scrollLeft=Math.abs(e.val):H.current.scrollTop=Math.abs(e.val),de()):X.current&&(X.current.style.transform="x"===I?`translate3d(${e.val}px, 0px,0px)`:`translate3d(0px,${e.val}px,0px)`)}}))),q=c($),B=c(0===$),G=c(!1),H=c(null),X=c(null),Y=c(y),J=s((()=>y?[...i.map((e=>Object.assign(Object.assign({},e),{id:`prev-repeated-item-${e.id}`}))),...i,...i.map((e=>Object.assign(Object.assign({},e),{id:`next-repeated-item-${e.id}`})))]:[...i]),[i,y])(),{emitEvent:K,useListenToCustomEvent:Q}=a(),{thumbsFragment:U,handleScroll:V}=d({withThumbs:!!g,thumbsSlideAxis:f,prepareThumbsData:F,items:i}),{enterFullscreen:Z,exitFullscreen:_,getIsFullscreen:ee}=h({mainCarouselWrapperRef:H,handleResize:()=>ce(),onFullScreenChange:e=>{K({eventName:"onFullscreenChange",isFullscreen:e})}});function te(){var e;const t=null===(e=H.current)||void 0===e?void 0:e.querySelector(".use-spring-carousel-item");if(!t)throw Error("No carousel items available!");return t.getBoundingClientRect()["x"===I?"width":"height"]+b}function re({from:e,to:t,nextActiveItem:r,immediate:c=!1,slideMode:s}){P.current=s,"number"==typeof r&&(A||(q.current=r),K({eventName:"onSlideStartChange",slideActionType:E.current,slideMode:P.current,nextItem:{startReached:B.current,endReached:G.current,index:A?-1:q.current,id:A?"":i[q.current].id}})),W.current=t,D.start({immediate:c,from:{val:e},to:{val:t},config:Object.assign(Object.assign({},n.default),{velocity:z.val.velocity}),onRest(e){!c&&e.finished&&K({eventName:"onSlideChange",slideActionType:E.current,slideMode:P.current,currentItem:{startReached:B.current,endReached:G.current,index:A?-1:q.current,id:A?"":i[q.current].id}})}}),g&&!c&&V(q.current)}function ne(){var e;return y?te()*i.length:Math.round(Number(null===(e=X.current)||void 0===e?void 0:e["x"===I?"scrollWidth":"scrollHeight"])-X.current.getBoundingClientRect()["x"===I?"width":"height"]-w)}function ie(){var e;const t=null===(e=X.current)||void 0===e?void 0:e.querySelector(".use-spring-carousel-item");if(!t)throw Error("No carousel items available!");return t.getBoundingClientRect()["x"===I?"width":"height"]+b}function ce(){const e="x"===I?"left":"top";function t(t){const r=X.current;r&&(y?(r.style.top="0px",r.style.left="0px",r.style[e]=`-${t-w}px`,B.current=!1,G.current=!1):(r.style.left="0px",r.style.top="0px"))}const r=Math.abs(se());if(t("center"===S?ie()*i.length-te()*Math.round((R-1)/2):"end"===S?ie()*i.length-te()*Math.round(R-1):ie()*i.length),r<ne()&&"fluid"===x&&G.current&&!y&&(G.current=!1),r>ne()&&!y){const e=-ne();G.current=!0,W.current=e,D.start({immediate:!0,val:W.current}),setTimeout((()=>{L.current=!1}),0)}if(!A&&"fixed"===x){const e=-te()*q.current;W.current=e,D.start({immediate:!0,val:e})}setTimeout((()=>{L.current=!1}),0)}function se(){return A&&H.current?H.current["x"===I?"scrollLeft":"scrollTop"]:z.val.get()}function oe(e,t){if(A&&"next"===e){const e=W.current+te();return e>ne()?ne():e}if(A&&"prev"===e){const e=W.current-te();return e<0?0:e}return"next"===e?"number"==typeof t?-t*te():W.current-te():"number"==typeof t?-t*te():W.current+te()}function le(e="click",t,r){if(!u||B.current&&!y)return;E.current="prev",G.current=!1;const n="number"==typeof t?t:q.current-1;if(!y){const n=A?oe("prev",t)-te()/3<0:oe("prev",t)+te()/3>0;if(B.current)return;if(n)return B.current=!0,G.current=!1,void re({slideMode:e,from:se(),to:0,nextActiveItem:0,immediate:r})}if(y&&(B.current||n<0))return B.current=!1,G.current=!0,void re({slideMode:e,from:se()-te()*i.length,to:-te()*i.length+te(),nextActiveItem:i.length-1,immediate:r});0===n&&(B.current=!0),n!==i.length-1&&-1!==n||(G.current=!0),re({slideMode:e,from:se(),to:oe("prev",t),nextActiveItem:n,immediate:r})}function ue(e="click",t,r){if(!u||G.current&&!y)return;E.current="next",B.current=!1;const n=t||q.current+1;if(!y){const i=Math.abs(oe("next",t))>ne()-te()/3;if(G.current)return;if(i)return B.current=!1,G.current=!0,void re({slideMode:e,from:se(),to:A?ne():-ne(),nextActiveItem:n,immediate:r})}if(y&&(G.current||n>i.length-1))return G.current=!1,B.current=!0,void re({slideMode:e,from:se()+te()*i.length,to:0,nextActiveItem:0,immediate:r});0===n&&(B.current=!0),n===i.length-1&&(G.current=!0),re({slideMode:e,from:se(),to:oe("next",t),nextActiveItem:n,immediate:r})}o((()=>{q.current!==$&&he($,!C)}),[$,C]),o((()=>{if(u){if($>i.length-1)throw new Error(`initialActiveItem (${$}) is greater than the total quantity available items (${i.length}).`);R>i.length&&console.warn(`itemsPerSlide (${R}) is greater than the total quantity available items (${i.length}). Fallback to ${i.length})`)}}),[$,i,R,u]),o((()=>{k.current=window.innerWidth}),[]),o((()=>{L.current=!0,ce()}),[S,R,w,b,A,x,u]),o((()=>{y!==Y.current&&(Y.current=y,ce(),he(0,!0,!0))}),[y]),l((()=>{X.current&&ce()}),[]),o((()=>{N.current=j||Math.floor(te()/2/2)}),[j]),o((()=>{function e(){window.innerWidth!==k.current&&(k.current=window.innerWidth,ce())}if("ResizeObserver"in window&&H.current){const e=new ResizeObserver((()=>{L.current||(k.current=window.innerWidth,ce())}));return e.observe(H.current),()=>{e.disconnect()}}return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[I,S,R,y,w,b,A,x,u]);const ae=m((e=>{const t=e.dragging,r=e.offset["x"===I?0:1],i=e.movement["x"===I?0:1],c=e.direction["x"===I?0:1],s=i>N.current,o=i<-N.current;if(t)return E.current=c>0?"prev":"next",K(Object.assign(Object.assign({},e),{eventName:"onDrag",slideActionType:E.current})),A?"prev"===E.current&&r>0?(e.cancel(),void D.start({from:{val:se()},to:{val:0},config:{velocity:e.velocity,friction:50,tension:1e3}})):void D.start({from:{val:se()},to:{val:-r},config:{velocity:e.velocity,friction:50,tension:1e3}}):(D.start({val:r,config:{velocity:e.velocity,friction:50,tension:1e3}}),void(O&&o?(ue("drag"),e.cancel()):O&&s&&(le("drag"),e.cancel())));e.last&&!e.canceled&&A&&("prev"===E.current&&le("drag"),"next"===E.current&&ue("drag")),!e.last||e.canceled||A||(o?!y&&G.current?D.start({val:-ne(),config:Object.assign(Object.assign({},n.default),{velocity:e.velocity})}):ue("drag"):s?!y&&B.current?D.start({val:0,config:Object.assign(Object.assign({},n.default),{velocity:e.velocity})}):le("drag"):D.start({val:W.current,config:Object.assign(Object.assign({},n.default),{velocity:e.velocity})})),e.last&&e.canceled&&D.start({val:W.current,config:Object.assign(Object.assign({},n.default),{velocity:e.velocity})})}),{enabled:u&&!T&&!A||!!A&&!!M,axis:I,from:()=>A&&H.current?[-H.current.scrollLeft,-H.current.scrollTop]:[z.val.get(),z.val.get()]});function de(){H.current&&(W.current=H.current["x"===I?"scrollLeft":"scrollTop"],0===H.current["x"===I?"scrollLeft":"scrollTop"]&&(B.current=!0,G.current=!1),H.current["x"===I?"scrollLeft":"scrollTop"]>0&&H.current["x"===I?"scrollLeft":"scrollTop"]<ne()&&(B.current=!1,G.current=!1),H.current["x"===I?"scrollLeft":"scrollTop"]===ne()&&(B.current=!1,G.current=!0))}function me(e,t){let r=0;if(r="string"==typeof e?i.findIndex((t=>t.id===e)):e,r<0||r>=i.length){if(t)throw new Error(t);console.error(`The item doesn't exist; check that the id provided - ${e} - is correct.`),r=-1}return r}function he(e,t=!1,r=!1){if(!u)return;B.current=!1,G.current=!1;const n=me(e,"The item you want to slide to doesn't exist; check the provided id.");if(n===q.current&&!r)return;const c=me(i[q.current].id),s=me(i[n].id);s>c?ue("click",s,t):le("click",s,t)}function ge(e){const t=me(e,"The item doesn't exist; check the provided id."),r=q.current;return y&&r===i.length-1?0===t:t===r+1}function ve(e){const t=me(e,"The item doesn't exist; check the provided id."),r=q.current;return y&&0===r?t===i.length-1:t===r-1}function fe(e){return me(e,"The item you want to check doesn't exist; check the provided id.")===q.current}const pe=A?{useListenToCustomEvent:Q,enterFullscreen:Z,exitFullscreen:_,getIsFullscreen:ee,slideToPrevItem:()=>le(),slideToNextItem:()=>ue()}:{useListenToCustomEvent:Q,enterFullscreen:Z,exitFullscreen:_,getIsFullscreen:ee,slideToPrevItem:()=>le(),slideToNextItem:()=>ue(),slideToItem:e=>he(e),getIsNextItem:ge,getIsPrevItem:ve,getIsActiveItem:fe},xe=e(v.Provider,Object.assign({value:pe},{children:U})),be=e(v.Provider,Object.assign({value:pe},{children:e("div",Object.assign({className:"use-spring-carousel-main-wrapper",ref:H},A?{onWheel(){z.val.stop(),de()}}:{},{style:Object.assign({display:"flex",position:"relative",width:"100%",height:"100%"},A?"x"===I?{overflowX:"auto"}:{overflowY:"auto"}:{})},{children:t("div",Object.assign({className:"use-spring-carousel-track-wrapper",ref:X},ae(),{style:Object.assign({position:"relative",display:"flex",flexDirection:"x"===I?"row":"column",touchAction:"none"},function(){const e=`calc(100% - ${2*w}px)`;return{width:"x"===I?e:"100%",height:"y"===I?e:"100%"}}())},{children:[!A&&y||!w?null:e("div",{style:{flexShrink:0,width:w}}),J.map(((t,r)=>{return e("div",Object.assign({className:"use-spring-carousel-item","data-testid":"use-spring-carousel-item-wrapper",style:Object.assign({display:"flex",position:"relative",flex:"1"},(n=!!A&&r===i.length-1,"fixed"!==x||A?Object.assign({marginRight:`${n?0:b}px`}):{marginRight:`${n?0:b}px`,flex:`1 0 calc(100% / ${R} - ${b*(R-1)/R}px)`}))},{children:"function"==typeof t.renderItem?t.renderItem({getIsActiveItem:fe,getIsNextItem:ge,getIsPrevItem:ve,useListenToCustomEvent:Q}):t.renderItem}),`${t.id}-${r}`);var n})),A&&w?e("div",{style:{flexShrink:0,width:w}}):null]}))}))}));return Object.assign(Object.assign({},pe),{carouselFragment:be,thumbsFragment:xe})}const v=i(void 0);function f(){const e=u(v);if(!e)throw new Error("useSpringCarouselContext must be used within the carousel.");return e}export{g as useSpringCarousel,f as useSpringCarouselContext};
1
+ import{jsx as e,jsxs as t}from"react/jsx-runtime";import{useSpring as r,config as n}from"@react-spring/web";import{createContext as i,useRef as c,useCallback as s,useEffect as o,useLayoutEffect as l,useContext as u}from"react";import{u as a,a as d}from"./useThumbsModule-f4421f49.js";import{useDrag as m}from"@use-gesture/react";import{u as h}from"./useFullscreenModule-519d337d.js";import"screenfull";function g({items:i,init:u=!0,withThumbs:g,thumbsSlideAxis:f="x",itemsPerSlide:p=1,slideType:x="fixed",gutter:y=0,withLoop:b=!1,startEndGutter:w=0,carouselSlideAxis:I="x",disableGestures:T=!1,draggingSlideTreshold:j,slideWhenThresholdIsReached:O=!1,freeScroll:A,enableFreeScrollDrag:M,initialStartingPosition:S,prepareThumbsData:F,initialActiveItem:$=0,animateWhenActiveItemChange:R=!0}){const k=c(!1),C=p>i.length?i.length:p,L=c(0),N=c(null!=j?j:0),E=c("initial"),P=c("initial"),W=c(0),[z,D]=r((()=>({val:0,pause:!u,onChange({value:e}){A&&H.current?("x"===I?H.current.scrollLeft=Math.abs(e.val):H.current.scrollTop=Math.abs(e.val),de()):X.current&&(X.current.style.transform="x"===I?`translate3d(${e.val}px, 0px,0px)`:`translate3d(0px,${e.val}px,0px)`)}}))),q=c($),B=c(0===$),G=c(!1),H=c(null),X=c(null),Y=c(b),J=s((()=>b?[...i.map((e=>Object.assign(Object.assign({},e),{id:`prev-repeated-item-${e.id}`}))),...i,...i.map((e=>Object.assign(Object.assign({},e),{id:`next-repeated-item-${e.id}`})))]:[...i]),[i,b])(),{emitEvent:K,useListenToCustomEvent:Q}=a(),{thumbsFragment:U,handleScroll:V}=d({withThumbs:!!g,thumbsSlideAxis:f,prepareThumbsData:F,items:i}),{enterFullscreen:Z,exitFullscreen:_,getIsFullscreen:ee}=h({mainCarouselWrapperRef:H,handleResize:()=>ce(),onFullScreenChange:e=>{K({eventName:"onFullscreenChange",isFullscreen:e})}});function te(){var e;const t=null===(e=H.current)||void 0===e?void 0:e.querySelector(".use-spring-carousel-item");if(!t)throw Error("No carousel items available!");return t.getBoundingClientRect()["x"===I?"width":"height"]+y}function re({from:e,to:t,nextActiveItem:r,immediate:c=!1,slideMode:s}){P.current=s,"number"==typeof r&&(A||(q.current=r),K({eventName:"onSlideStartChange",slideActionType:E.current,slideMode:P.current,nextItem:{startReached:B.current,endReached:G.current,index:A?-1:q.current,id:A?"":i[q.current].id}})),W.current=t,D.start({immediate:c,from:{val:e},to:{val:t},config:Object.assign(Object.assign({},n.default),{velocity:z.val.velocity}),onRest(e){!c&&e.finished&&K({eventName:"onSlideChange",slideActionType:E.current,slideMode:P.current,currentItem:{startReached:B.current,endReached:G.current,index:A?-1:q.current,id:A?"":i[q.current].id}})}}),g&&!c&&V(q.current)}function ne(){var e;return b?te()*i.length:Math.round(Number(null===(e=X.current)||void 0===e?void 0:e["x"===I?"scrollWidth":"scrollHeight"])-X.current.getBoundingClientRect()["x"===I?"width":"height"]-w)}function ie(){var e;const t=null===(e=X.current)||void 0===e?void 0:e.querySelector(".use-spring-carousel-item");if(!t)throw Error("No carousel items available!");return t.getBoundingClientRect()["x"===I?"width":"height"]+y}function ce(){const e="x"===I?"left":"top";function t(t){const r=X.current;r&&(b?(r.style.top="0px",r.style.left="0px",r.style[e]=`-${t-w}px`,B.current=!1,G.current=!1):(r.style.left="0px",r.style.top="0px"))}const r=Math.abs(se());if(t("center"===S?ie()*i.length-te()*Math.round((C-1)/2):"end"===S?ie()*i.length-te()*Math.round(C-1):ie()*i.length),r<ne()&&"fluid"===x&&G.current&&!b&&(G.current=!1),r>ne()&&!b){const e=-ne();G.current=!0,W.current=e,D.start({immediate:!0,val:W.current}),setTimeout((()=>{k.current=!1}),0)}if(!A&&"fixed"===x){const e=-te()*q.current;W.current=e,D.start({immediate:!0,val:e})}setTimeout((()=>{k.current=!1}),0)}function se(){return A&&H.current?H.current["x"===I?"scrollLeft":"scrollTop"]:z.val.get()}function oe(e,t){if(A&&"next"===e){const e=W.current+te();return e>ne()?ne():e}if(A&&"prev"===e){const e=W.current-te();return e<0?0:e}return"next"===e?"number"==typeof t?-t*te():W.current-te():"number"==typeof t?-t*te():W.current+te()}function le({type:e,index:t,immediate:r}){if(!u||B.current&&!b)return;E.current="prev",G.current=!1;const n="number"==typeof t?t:q.current-1;if(!b){const n=A?oe("prev",t)-te()/3<0:oe("prev",t)+te()/3>0;if(B.current)return;if(n)return B.current=!0,G.current=!1,void re({slideMode:e,from:se(),to:0,nextActiveItem:0,immediate:r})}if(b&&(B.current||n<0))return B.current=!1,G.current=!0,void re({slideMode:e,from:se()-te()*i.length,to:-te()*i.length+te(),nextActiveItem:i.length-1,immediate:r});0===n&&(B.current=!0),n!==i.length-1&&-1!==n||(G.current=!0),re({slideMode:e,from:se(),to:oe("prev",t),nextActiveItem:n,immediate:r})}function ue({type:e,index:t,immediate:r}){if(!u||G.current&&!b)return;E.current="next",B.current=!1;const n=t||q.current+1;if(!b){const i=Math.abs(oe("next",t))>ne()-te()/3;if(G.current)return;if(i)return B.current=!1,G.current=!0,void re({slideMode:e,from:se(),to:A?ne():-ne(),nextActiveItem:n,immediate:r})}if(b&&(G.current||n>i.length-1))return G.current=!1,B.current=!0,void re({slideMode:e,from:se()+te()*i.length,to:0,nextActiveItem:0,immediate:r});0===n&&(B.current=!0),n===i.length-1&&(G.current=!0),re({slideMode:e,from:se(),to:oe("next",t),nextActiveItem:n,immediate:r})}o((()=>{q.current!==$&&he({id:$,immediate:!R})}),[$,R]),o((()=>{if(u){if($>i.length-1)throw new Error(`initialActiveItem (${$}) is greater than the total quantity available items (${i.length}).`);C>i.length&&console.warn(`itemsPerSlide (${C}) is greater than the total quantity available items (${i.length}). Fallback to ${i.length})`)}}),[$,i,C,u]),o((()=>{L.current=window.innerWidth}),[]),o((()=>{k.current=!0,ce()}),[S,C,w,y,A,x,u]),o((()=>{b!==Y.current&&(Y.current=b,he({id:0,immediate:!0,shouldReset:!0}))}),[b]),l((()=>{X.current&&ce()}),[]),o((()=>{N.current=j||Math.floor(te()/2/2)}),[j]),o((()=>{function e(){window.innerWidth!==L.current&&(L.current=window.innerWidth,ce())}if("ResizeObserver"in window&&H.current){const e=new ResizeObserver((()=>{k.current||(L.current=window.innerWidth,ce())}));return e.observe(H.current),()=>{e.disconnect()}}return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[I,S,C,b,w,y,A,x,u]);const ae=m((e=>{const t=e.dragging,r=e.offset["x"===I?0:1],i=e.movement["x"===I?0:1],c=e.direction["x"===I?0:1],s=i>N.current,o=i<-N.current;if(t)return E.current=c>0?"prev":"next",K(Object.assign(Object.assign({},e),{eventName:"onDrag",slideActionType:E.current})),A?"prev"===E.current&&r>0?(e.cancel(),void D.start({from:{val:se()},to:{val:0},config:{velocity:e.velocity,friction:50,tension:1e3}})):void D.start({from:{val:se()},to:{val:-r},config:{velocity:e.velocity,friction:50,tension:1e3}}):(D.start({val:r,config:{velocity:e.velocity,friction:50,tension:1e3}}),void(O&&o?(ue({type:"drag"}),e.cancel()):O&&s&&(le({type:"drag"}),e.cancel())));e.last&&!e.canceled&&A&&("prev"===E.current&&le({type:"drag"}),"next"===E.current&&ue({type:"drag"})),!e.last||e.canceled||A||(o?!b&&G.current?D.start({val:-ne(),config:Object.assign(Object.assign({},n.default),{velocity:e.velocity})}):ue({type:"drag"}):s?!b&&B.current?D.start({val:0,config:Object.assign(Object.assign({},n.default),{velocity:e.velocity})}):le({type:"drag"}):D.start({val:W.current,config:Object.assign(Object.assign({},n.default),{velocity:e.velocity})})),e.last&&e.canceled&&D.start({val:W.current,config:Object.assign(Object.assign({},n.default),{velocity:e.velocity})})}),{enabled:u&&!T&&!A||!!A&&!!M,axis:I,from:()=>A&&H.current?[-H.current.scrollLeft,-H.current.scrollTop]:[z.val.get(),z.val.get()]});function de(){H.current&&(W.current=H.current["x"===I?"scrollLeft":"scrollTop"],0===H.current["x"===I?"scrollLeft":"scrollTop"]&&(B.current=!0,G.current=!1),H.current["x"===I?"scrollLeft":"scrollTop"]>0&&H.current["x"===I?"scrollLeft":"scrollTop"]<ne()&&(B.current=!1,G.current=!1),H.current["x"===I?"scrollLeft":"scrollTop"]===ne()&&(B.current=!1,G.current=!0))}function me(e,t){let r=0;if(r="string"==typeof e?i.findIndex((t=>t.id===e)):e,r<0||r>=i.length){if(t)throw new Error(t);console.error(`The item doesn't exist; check that the id provided - ${e} - is correct.`),r=-1}return r}function he({id:e,immediate:t,shouldReset:r}){if(!u)return;B.current=!1,G.current=!1;const n=me(e,"The item you want to slide to doesn't exist; check the provided id.");if(n===q.current&&!r)return;const c=me(i[q.current].id),s=me(i[n].id);s>c?ue({type:r?"initial":"click",index:s,immediate:t}):le({type:r?"initial":"click",index:s,immediate:t})}function ge(e){const t=me(e,"The item doesn't exist; check the provided id."),r=q.current;return b&&r===i.length-1?0===t:t===r+1}function ve(e){const t=me(e,"The item doesn't exist; check the provided id."),r=q.current;return b&&0===r?t===i.length-1:t===r-1}function fe(e){return me(e,"The item you want to check doesn't exist; check the provided id.")===q.current}const pe=A?{useListenToCustomEvent:Q,enterFullscreen:Z,exitFullscreen:_,getIsFullscreen:ee,slideToPrevItem:()=>{le({type:"click"})},slideToNextItem:()=>{ue({type:"click"})}}:{useListenToCustomEvent:Q,enterFullscreen:Z,exitFullscreen:_,getIsFullscreen:ee,slideToPrevItem:()=>{le({type:"click"})},slideToNextItem:()=>{ue({type:"click"})},slideToItem:e=>he({id:e}),getIsNextItem:ge,getIsPrevItem:ve,getIsActiveItem:fe},xe=e(v.Provider,Object.assign({value:pe},{children:U})),ye=e(v.Provider,Object.assign({value:pe},{children:e("div",Object.assign({className:"use-spring-carousel-main-wrapper",ref:H},A?{onWheel(){z.val.stop(),de()}}:{},{style:Object.assign({display:"flex",position:"relative",width:"100%",height:"100%"},A?"x"===I?{overflowX:"auto"}:{overflowY:"auto"}:{})},{children:t("div",Object.assign({className:"use-spring-carousel-track-wrapper",ref:X},ae(),{style:Object.assign({position:"relative",display:"flex",flexDirection:"x"===I?"row":"column",touchAction:"none"},function(){const e=`calc(100% - ${2*w}px)`;return{width:"x"===I?e:"100%",height:"y"===I?e:"100%"}}())},{children:[!A&&b||!w?null:e("div",{style:{flexShrink:0,width:w}}),J.map(((t,r)=>{return e("div",Object.assign({className:"use-spring-carousel-item","data-testid":"use-spring-carousel-item-wrapper",style:Object.assign({display:"flex",position:"relative",flex:"1"},(n=!!A&&r===i.length-1,"fixed"!==x||A?Object.assign({marginRight:`${n?0:y}px`}):{marginRight:`${n?0:y}px`,flex:`1 0 calc(100% / ${C} - ${y*(C-1)/C}px)`}))},{children:"function"==typeof t.renderItem?t.renderItem({getIsActiveItem:fe,getIsNextItem:ge,getIsPrevItem:ve,useListenToCustomEvent:Q}):t.renderItem}),`${t.id}-${r}`);var n})),A&&w?e("div",{style:{flexShrink:0,width:w}}):null]}))}))}));return Object.assign(Object.assign({},pe),{carouselFragment:ye,thumbsFragment:xe})}const v=i(void 0);function f(){const e=u(v);if(!e)throw new Error("useSpringCarouselContext must be used within the carousel.");return e}export{g as useSpringCarousel,f as useSpringCarouselContext};
2
2
  //# sourceMappingURL=useSpringCarousel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSpringCarousel.js","sources":["../../src/useSpringCarousel.tsx"],"sourcesContent":["import { config, useSpring } from '@react-spring/web'\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useRef,\n} from 'react'\n\nimport { useEventsModule } from './modules/useEventsModule'\nimport { useDrag } from '@use-gesture/react'\nimport { useFullscreenModule } from './modules/useFullscreenModule'\nimport { useThumbsModule } from './modules/useThumbsModule'\nimport {\n SlideActionType,\n SlideMode,\n UseSpringCarouselComplete,\n SpringCarouselWithThumbs,\n UseSpringCarouselWithFreeScroll,\n UseSpringCarouselWithThumbs,\n UseSpringCarouselWithNoThumbs,\n UseSpringCarouselWithNoFixedItems,\n UseSpringCarouselWithFixedItems,\n UseSpringFreeScrollReturnType,\n UseSpringReturnType,\n} from './types'\n\ntype ReturnType<T> = T extends true ? UseSpringFreeScrollReturnType : UseSpringReturnType\n\n/**\n * With free scroll\n */\nfunction useSpringCarousel(props: UseSpringCarouselWithFreeScroll): ReturnType<true>\nfunction useSpringCarousel(props: UseSpringCarouselWithThumbs<true>): ReturnType<true>\nfunction useSpringCarousel(props: UseSpringCarouselWithNoThumbs<true>): ReturnType<true>\n/**\n * No free scroll\n */\nfunction useSpringCarousel(props: UseSpringCarouselWithThumbs<false>): ReturnType<false>\nfunction useSpringCarousel(props: UseSpringCarouselWithNoThumbs<false>): ReturnType<false>\nfunction useSpringCarousel(\n props: UseSpringCarouselWithFixedItems<false>,\n): ReturnType<false>\nfunction useSpringCarousel(\n props: UseSpringCarouselWithNoFixedItems<false>,\n): ReturnType<false>\n\nfunction useSpringCarousel({\n items,\n init = true,\n withThumbs,\n thumbsSlideAxis = 'x',\n itemsPerSlide: _itemsPerSlide = 1,\n slideType = 'fixed',\n gutter = 0,\n withLoop = false,\n startEndGutter = 0,\n carouselSlideAxis = 'x',\n disableGestures = false,\n draggingSlideTreshold: _draggingSlideTreshold,\n slideWhenThresholdIsReached = false,\n freeScroll,\n enableFreeScrollDrag,\n initialStartingPosition,\n prepareThumbsData,\n initialActiveItem = 0,\n animateWhenActiveItemChange = true,\n}: UseSpringCarouselComplete): ReturnType<typeof freeScroll> {\n const resizeByPropChange = useRef(false)\n const itemsPerSlide = _itemsPerSlide > items.length ? items.length : _itemsPerSlide\n const prevWindowWidth = useRef(0)\n const draggingSlideTreshold = useRef(_draggingSlideTreshold ?? 0)\n const slideActionType = useRef<SlideActionType>('initial')\n const slideModeType = useRef<SlideMode>('initial')\n const prevSlidedValue = useRef(0)\n const [spring, setSpring] = useSpring(() => ({\n val: 0,\n pause: !init,\n onChange({ value }) {\n if (freeScroll && mainCarouselWrapperRef.current) {\n if (carouselSlideAxis === 'x') {\n mainCarouselWrapperRef.current.scrollLeft = Math.abs(value.val)\n } else {\n mainCarouselWrapperRef.current.scrollTop = Math.abs(value.val)\n }\n setStartEndItemReachedOnFreeScroll()\n } else if (carouselTrackWrapperRef.current) {\n if (carouselSlideAxis === 'x') {\n carouselTrackWrapperRef.current.style.transform = `translate3d(${value.val}px, 0px,0px)`\n } else {\n carouselTrackWrapperRef.current.style.transform = `translate3d(0px,${value.val}px,0px)`\n }\n }\n },\n }))\n const activeItem = useRef(initialActiveItem)\n const firstItemReached = useRef(initialActiveItem === 0)\n const lastItemReached = useRef(false)\n const mainCarouselWrapperRef = useRef<HTMLDivElement | null>(null)\n const carouselTrackWrapperRef = useRef<HTMLDivElement | null>(null)\n\n const prevWithLoop = useRef(withLoop)\n\n const getItems = useCallback(() => {\n if (withLoop) {\n return [\n ...items.map(i => ({\n ...i,\n id: `prev-repeated-item-${i.id}`,\n })),\n ...items,\n ...items.map(i => ({\n ...i,\n id: `next-repeated-item-${i.id}`,\n })),\n ]\n }\n return [...items]\n }, [items, withLoop])\n const internalItems = getItems()\n\n const { emitEvent, useListenToCustomEvent } = useEventsModule<'use-spring'>()\n const { thumbsFragment, handleScroll } = useThumbsModule({\n withThumbs: !!withThumbs,\n thumbsSlideAxis,\n prepareThumbsData,\n items: items as SpringCarouselWithThumbs['items'],\n })\n const { enterFullscreen, exitFullscreen, getIsFullscreen } = useFullscreenModule({\n mainCarouselWrapperRef,\n handleResize: () => adjustCarouselWrapperPosition(),\n onFullScreenChange: val => {\n emitEvent({\n eventName: 'onFullscreenChange',\n isFullscreen: val,\n })\n },\n })\n\n function getItemStyles(isLastItem: boolean) {\n if (slideType === 'fixed' && !freeScroll) {\n return {\n marginRight: `${isLastItem ? 0 : gutter}px`,\n flex: `1 0 calc(100% / ${itemsPerSlide} - ${\n (gutter * (itemsPerSlide - 1)) / itemsPerSlide\n }px)`,\n }\n }\n return {\n ...{ marginRight: `${isLastItem ? 0 : gutter}px` },\n }\n }\n\n function getSlideValue() {\n const carouselItem = mainCarouselWrapperRef.current?.querySelector(\n '.use-spring-carousel-item',\n )\n\n if (!carouselItem) {\n throw Error('No carousel items available!')\n }\n\n return (\n carouselItem.getBoundingClientRect()[\n carouselSlideAxis === 'x' ? 'width' : 'height'\n ] + gutter\n )\n }\n\n type SlideToItem = {\n from: number\n to: number\n nextActiveItem?: number\n immediate?: boolean\n slideMode: 'click' | 'drag'\n }\n\n function slideToItem({\n from,\n to,\n nextActiveItem,\n immediate = false,\n slideMode,\n }: SlideToItem) {\n slideModeType.current = slideMode\n\n if (typeof nextActiveItem === 'number') {\n if (!freeScroll) {\n activeItem.current = nextActiveItem\n }\n emitEvent({\n eventName: 'onSlideStartChange',\n slideActionType: slideActionType.current,\n slideMode: slideModeType.current,\n nextItem: {\n startReached: firstItemReached.current,\n endReached: lastItemReached.current,\n index: freeScroll ? -1 : activeItem.current,\n id: freeScroll ? '' : items[activeItem.current].id,\n },\n })\n }\n\n prevSlidedValue.current = to\n setSpring.start({\n immediate,\n from: {\n val: from,\n },\n to: {\n val: to,\n },\n config: {\n ...config.default,\n velocity: spring.val.velocity,\n },\n onRest(value) {\n if (!immediate && value.finished) {\n emitEvent({\n eventName: 'onSlideChange',\n slideActionType: slideActionType.current,\n slideMode: slideModeType.current,\n currentItem: {\n startReached: firstItemReached.current,\n endReached: lastItemReached.current,\n index: freeScroll ? -1 : activeItem.current,\n id: freeScroll ? '' : items[activeItem.current].id,\n },\n })\n }\n },\n })\n if (withThumbs && !immediate) {\n handleScroll(activeItem.current)\n }\n }\n function getTotalScrollValue() {\n if (withLoop) {\n return getSlideValue() * items.length\n }\n return Math.round(\n Number(\n carouselTrackWrapperRef.current?.[\n carouselSlideAxis === 'x' ? 'scrollWidth' : 'scrollHeight'\n ],\n ) -\n carouselTrackWrapperRef.current!.getBoundingClientRect()[\n carouselSlideAxis === 'x' ? 'width' : 'height'\n ] -\n startEndGutter,\n )\n }\n function getAnimatedWrapperStyles() {\n const percentValue = `calc(100% - ${startEndGutter * 2}px)`\n return {\n width: carouselSlideAxis === 'x' ? percentValue : '100%',\n height: carouselSlideAxis === 'y' ? percentValue : '100%',\n }\n }\n\n function getCarouselItemWidth() {\n const carouselItem = carouselTrackWrapperRef.current?.querySelector(\n '.use-spring-carousel-item',\n )\n if (!carouselItem) {\n throw Error('No carousel items available!')\n }\n return (\n carouselItem.getBoundingClientRect()[\n carouselSlideAxis === 'x' ? 'width' : 'height'\n ] + gutter\n )\n }\n function adjustCarouselWrapperPosition() {\n const positionProperty = carouselSlideAxis === 'x' ? 'left' : 'top'\n\n function setPosition(v: number) {\n const ref = carouselTrackWrapperRef.current\n if (!ref) return\n\n if (withLoop) {\n ref.style.top = '0px'\n ref.style.left = '0px'\n ref.style[positionProperty] = `-${v - startEndGutter}px`\n\n firstItemReached.current = false\n lastItemReached.current = false\n } else {\n ref.style.left = '0px'\n ref.style.top = '0px'\n }\n }\n\n const currentFromValue = Math.abs(getFromValue())\n\n if (initialStartingPosition === 'center') {\n setPosition(\n getCarouselItemWidth() * items.length -\n getSlideValue() * Math.round((itemsPerSlide - 1) / 2),\n )\n } else if (initialStartingPosition === 'end') {\n setPosition(\n getCarouselItemWidth() * items.length -\n getSlideValue() * Math.round(itemsPerSlide - 1),\n )\n } else {\n setPosition(getCarouselItemWidth() * items.length)\n }\n\n if (\n currentFromValue < getTotalScrollValue() &&\n slideType === 'fluid' &&\n lastItemReached.current &&\n !withLoop\n ) {\n lastItemReached.current = false\n }\n if (currentFromValue > getTotalScrollValue() && !withLoop) {\n const val = -getTotalScrollValue()\n lastItemReached.current = true\n prevSlidedValue.current = val\n setSpring.start({\n immediate: true,\n val: prevSlidedValue.current,\n })\n setTimeout(() => {\n resizeByPropChange.current = false\n }, 0)\n }\n\n if (!freeScroll && slideType === 'fixed') {\n const val = -(getSlideValue() * activeItem.current)\n prevSlidedValue.current = val\n setSpring.start({\n immediate: true,\n val,\n })\n }\n\n 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 function slideToPrevItem(\n type: Exclude<SlideMode, 'initial'> = 'click',\n index?: number,\n immediate?: boolean,\n ) {\n if (!init || (firstItemReached.current && !withLoop)) return\n\n slideActionType.current = 'prev'\n lastItemReached.current = false\n\n const nextItem = typeof index === 'number' ? index : activeItem.current - 1\n\n if (!withLoop) {\n const nextItemWillExceed = freeScroll\n ? getToValue('prev', index) - getSlideValue() / 3 < 0\n : getToValue('prev', index) + getSlideValue() / 3 > 0\n\n if (firstItemReached.current) return\n if (nextItemWillExceed) {\n firstItemReached.current = true\n lastItemReached.current = false\n\n slideToItem({\n slideMode: type,\n from: getFromValue(),\n to: 0,\n nextActiveItem: 0,\n immediate,\n })\n return\n }\n }\n if (withLoop && (firstItemReached.current || 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(\n type: Exclude<SlideMode, 'initial'> = 'click',\n index?: number,\n immediate?: boolean,\n ) {\n if (!init || (lastItemReached.current && !withLoop)) return\n\n slideActionType.current = 'next'\n firstItemReached.current = false\n\n const nextItem = index || activeItem.current + 1\n\n if (!withLoop) {\n const nextItemWillExceed =\n Math.abs(getToValue('next', index)) > getTotalScrollValue() - getSlideValue() / 3\n\n if (lastItemReached.current) return\n if (nextItemWillExceed) {\n firstItemReached.current = false\n lastItemReached.current = true\n\n slideToItem({\n slideMode: type,\n from: getFromValue(),\n to: freeScroll ? getTotalScrollValue() : -getTotalScrollValue(),\n nextActiveItem: nextItem,\n immediate,\n })\n return\n }\n }\n if (withLoop && (lastItemReached.current || 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\n useEffect(() => {\n if (activeItem.current !== initialActiveItem) {\n internalSlideToItem(initialActiveItem, !animateWhenActiveItemChange)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialActiveItem, animateWhenActiveItemChange])\n useEffect(() => {\n if (init) {\n if (initialActiveItem > items.length - 1) {\n throw new Error(\n `initialActiveItem (${initialActiveItem}) is greater than the total quantity available items (${items.length}).`,\n )\n }\n if (itemsPerSlide > items.length) {\n console.warn(\n `itemsPerSlide (${itemsPerSlide}) is greater than the total quantity available items (${items.length}). Fallback to ${items.length})`,\n )\n }\n }\n }, [initialActiveItem, items, itemsPerSlide, init])\n useEffect(() => {\n prevWindowWidth.current = window.innerWidth\n }, [])\n useEffect(() => {\n resizeByPropChange.current = true\n adjustCarouselWrapperPosition()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n initialStartingPosition,\n itemsPerSlide,\n startEndGutter,\n gutter,\n freeScroll,\n slideType,\n init,\n ])\n useEffect(() => {\n if (withLoop !== prevWithLoop.current) {\n prevWithLoop.current = withLoop\n adjustCarouselWrapperPosition()\n internalSlideToItem(0, true, true)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [withLoop])\n useLayoutEffect(() => {\n /**\n * Set initial track position\n */\n if (carouselTrackWrapperRef.current) {\n adjustCarouselWrapperPosition()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n useEffect(() => {\n if (_draggingSlideTreshold) {\n draggingSlideTreshold.current = _draggingSlideTreshold\n } else {\n draggingSlideTreshold.current = Math.floor(getSlideValue() / 2 / 2)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [_draggingSlideTreshold])\n useEffect(() => {\n function handleResize() {\n if (window.innerWidth === prevWindowWidth.current) return\n prevWindowWidth.current = window.innerWidth\n adjustCarouselWrapperPosition()\n }\n if ('ResizeObserver' in window && mainCarouselWrapperRef.current) {\n const observer = new ResizeObserver(() => {\n if (!resizeByPropChange.current) {\n prevWindowWidth.current = window.innerWidth\n adjustCarouselWrapperPosition()\n }\n })\n observer.observe(mainCarouselWrapperRef.current)\n return () => {\n observer.disconnect()\n }\n } else {\n window.addEventListener('resize', handleResize)\n return () => {\n window.removeEventListener('resize', handleResize)\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n carouselSlideAxis,\n initialStartingPosition,\n itemsPerSlide,\n withLoop,\n startEndGutter,\n gutter,\n freeScroll,\n slideType,\n init,\n ])\n\n const bindDrag = useDrag(\n state => {\n const isDragging = state.dragging\n const movement = state.offset[carouselSlideAxis === 'x' ? 0 : 1]\n const currentMovement = state.movement[carouselSlideAxis === 'x' ? 0 : 1]\n const direction = state.direction[carouselSlideAxis === 'x' ? 0 : 1]\n\n const prevItemTreshold = currentMovement > draggingSlideTreshold.current\n const nextItemTreshold = currentMovement < -draggingSlideTreshold.current\n\n if (isDragging) {\n if (direction > 0) {\n slideActionType.current = 'prev'\n } else {\n slideActionType.current = 'next'\n }\n\n emitEvent({\n ...state,\n eventName: 'onDrag',\n slideActionType: slideActionType.current,\n })\n\n if (freeScroll) {\n if (slideActionType.current === 'prev' && movement > 0) {\n state.cancel()\n setSpring.start({\n from: {\n val: getFromValue(),\n },\n to: {\n val: 0,\n },\n config: {\n velocity: state.velocity,\n friction: 50,\n tension: 1000,\n },\n })\n return\n }\n\n setSpring.start({\n from: {\n val: getFromValue(),\n },\n to: {\n val: -movement,\n },\n config: {\n velocity: state.velocity,\n friction: 50,\n tension: 1000,\n },\n })\n return\n }\n\n setSpring.start({\n val: movement,\n config: {\n velocity: state.velocity,\n friction: 50,\n tension: 1000,\n },\n })\n\n if (slideWhenThresholdIsReached && nextItemTreshold) {\n slideToNextItem('drag')\n state.cancel()\n } else if (slideWhenThresholdIsReached && prevItemTreshold) {\n slideToPrevItem('drag')\n state.cancel()\n }\n return\n }\n\n if (state.last && !state.canceled && freeScroll) {\n if (slideActionType.current === 'prev') {\n slideToPrevItem('drag')\n }\n if (slideActionType.current === 'next') {\n slideToNextItem('drag')\n }\n }\n\n if (state.last && !state.canceled && !freeScroll) {\n if (nextItemTreshold) {\n if (!withLoop && lastItemReached.current) {\n setSpring.start({\n val: -getTotalScrollValue(),\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n } else {\n slideToNextItem('drag')\n }\n } else if (prevItemTreshold) {\n if (!withLoop && firstItemReached.current) {\n setSpring.start({\n val: 0,\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n } else {\n slideToPrevItem('drag')\n }\n } else {\n setSpring.start({\n val: prevSlidedValue.current,\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n }\n }\n if (state.last && state.canceled) {\n setSpring.start({\n val: prevSlidedValue.current,\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n }\n },\n {\n enabled:\n (init && !disableGestures && !freeScroll) ||\n (!!freeScroll && !!enableFreeScrollDrag),\n axis: carouselSlideAxis,\n from: () => {\n if (freeScroll && mainCarouselWrapperRef.current) {\n return [\n -mainCarouselWrapperRef.current.scrollLeft,\n -mainCarouselWrapperRef.current.scrollTop,\n ]\n }\n if (carouselSlideAxis === 'x') {\n return [spring.val.get(), spring.val.get()]\n }\n return [spring.val.get(), spring.val.get()]\n },\n },\n )\n\n function getWrapperOverflowStyles() {\n if (freeScroll) {\n if (carouselSlideAxis === 'x') {\n return {\n overflowX: 'auto',\n }\n }\n return {\n overflowY: 'auto',\n }\n }\n return {}\n }\n\n function setStartEndItemReachedOnFreeScroll() {\n if (mainCarouselWrapperRef.current) {\n prevSlidedValue.current =\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ]\n if (\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] === 0\n ) {\n firstItemReached.current = true\n lastItemReached.current = false\n }\n if (\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] > 0 &&\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] < getTotalScrollValue()\n ) {\n firstItemReached.current = false\n lastItemReached.current = false\n }\n\n if (\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] === getTotalScrollValue()\n ) {\n firstItemReached.current = false\n lastItemReached.current = true\n }\n }\n }\n function getScrollHandlers() {\n if (freeScroll) {\n return {\n onWheel() {\n spring.val.stop()\n setStartEndItemReachedOnFreeScroll()\n },\n }\n }\n return {}\n }\n\n function findItemIndex(id: string | number, error?: string) {\n let itemIndex = 0\n\n if (typeof id === 'string') {\n itemIndex = items.findIndex(item => item.id === id)\n } else {\n itemIndex = id\n }\n if (itemIndex < 0 || itemIndex >= items.length) {\n if (error) {\n throw new Error(error)\n }\n console.error(\n `The item doesn't exist; check that the id provided - ${id} - is correct.`,\n )\n itemIndex = -1\n }\n\n return itemIndex\n }\n function internalSlideToItem(\n id: string | number,\n immediate = false,\n shouldReset = false,\n ) {\n if (!init) return\n\n firstItemReached.current = false\n lastItemReached.current = false\n\n const itemIndex = findItemIndex(\n id,\n \"The item you want to slide to doesn't exist; check the provided id.\",\n )\n\n if (itemIndex === activeItem.current && !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('click', newActiveItem, immediate)\n } else {\n slideToPrevItem('click', newActiveItem, immediate)\n }\n }\n function getIsNextItem(id: string | number) {\n const itemIndex = findItemIndex(id, \"The item doesn't exist; check the provided id.\")\n const _activeItem = activeItem.current\n if (withLoop && _activeItem === items.length - 1) {\n return itemIndex === 0\n }\n return itemIndex === _activeItem + 1\n }\n function getIsPrevItem(id: string | number) {\n const itemIndex = findItemIndex(id, \"The item doesn't exist; check the provided id.\")\n const _activeItem = activeItem.current\n if (withLoop && _activeItem === 0) {\n return itemIndex === items.length - 1\n }\n return itemIndex === _activeItem - 1\n }\n function getIsActiveItem(id: string | number) {\n return (\n findItemIndex(\n id,\n \"The item you want to check doesn't exist; check the provided id.\",\n ) === activeItem.current\n )\n }\n\n const res = freeScroll\n ? {\n useListenToCustomEvent,\n enterFullscreen,\n exitFullscreen,\n getIsFullscreen,\n slideToPrevItem: () => slideToPrevItem(),\n slideToNextItem: () => slideToNextItem(),\n }\n : {\n useListenToCustomEvent,\n enterFullscreen,\n exitFullscreen,\n getIsFullscreen,\n slideToPrevItem: () => slideToPrevItem(),\n slideToNextItem: () => slideToNextItem(),\n slideToItem: (id: string | number) => internalSlideToItem(id),\n getIsNextItem,\n getIsPrevItem,\n getIsActiveItem,\n }\n\n const _thumbsFragment = (\n <Context.Provider value={res}>{thumbsFragment}</Context.Provider>\n )\n const carouselFragment = (\n <Context.Provider value={res}>\n <div\n className=\"use-spring-carousel-main-wrapper\"\n ref={mainCarouselWrapperRef}\n {...getScrollHandlers()}\n style={{\n display: 'flex',\n position: 'relative',\n width: '100%',\n height: '100%',\n ...(getWrapperOverflowStyles() as React.CSSProperties),\n }}\n >\n <div\n className=\"use-spring-carousel-track-wrapper\"\n ref={carouselTrackWrapperRef}\n {...bindDrag()}\n style={{\n position: 'relative',\n display: 'flex',\n flexDirection: carouselSlideAxis === 'x' ? 'row' : 'column',\n touchAction: 'none',\n ...getAnimatedWrapperStyles(),\n }}\n >\n {(freeScroll || !withLoop) && startEndGutter ? (\n <div\n style={{\n flexShrink: 0,\n width: startEndGutter,\n }}\n />\n ) : null}\n {internalItems.map((item, index) => {\n return (\n <div\n key={`${item.id}-${index}`}\n className=\"use-spring-carousel-item\"\n data-testid=\"use-spring-carousel-item-wrapper\"\n style={{\n display: 'flex',\n position: 'relative',\n flex: '1',\n ...getItemStyles(!!freeScroll && index === items.length - 1),\n }}\n >\n {typeof item.renderItem === 'function'\n ? item.renderItem({\n getIsActiveItem,\n getIsNextItem,\n getIsPrevItem,\n useListenToCustomEvent,\n })\n : item.renderItem}\n </div>\n )\n })}\n {freeScroll && startEndGutter ? (\n <div\n style={{\n flexShrink: 0,\n width: startEndGutter,\n }}\n />\n ) : null}\n </div>\n </div>\n </Context.Provider>\n )\n\n return { ...res, carouselFragment, thumbsFragment: _thumbsFragment }\n}\n\ntype ContextProps<T = undefined> = Omit<\n ReturnType<T extends 'free-scroll' ? true : false>,\n 'carouselFragment' | 'thumbsFragment'\n>\n\nconst Context =\n createContext<ContextProps | ContextProps<'free-scroll'> | undefined>(undefined)\n\nfunction useSpringCarouselContext<T>() {\n const context = useContext(Context)\n if (!context) {\n throw new Error('useSpringCarouselContext must be used within the carousel.')\n }\n return context as ContextProps<T>\n}\n\nexport { useSpringCarousel, useSpringCarouselContext }\n"],"names":["useSpringCarousel","items","init","withThumbs","thumbsSlideAxis","itemsPerSlide","_itemsPerSlide","slideType","gutter","withLoop","startEndGutter","carouselSlideAxis","disableGestures","draggingSlideTreshold","_draggingSlideTreshold","slideWhenThresholdIsReached","freeScroll","enableFreeScrollDrag","initialStartingPosition","prepareThumbsData","initialActiveItem","animateWhenActiveItemChange","resizeByPropChange","useRef","length","prevWindowWidth","slideActionType","slideModeType","prevSlidedValue","spring","setSpring","useSpring","val","pause","onChange","value","mainCarouselWrapperRef","current","scrollLeft","Math","abs","scrollTop","setStartEndItemReachedOnFreeScroll","carouselTrackWrapperRef","style","transform","activeItem","firstItemReached","lastItemReached","prevWithLoop","internalItems","useCallback","map","i","Object","assign","id","getItems","emitEvent","useListenToCustomEvent","useEventsModule","thumbsFragment","handleScroll","useThumbsModule","enterFullscreen","exitFullscreen","getIsFullscreen","useFullscreenModule","handleResize","adjustCarouselWrapperPosition","onFullScreenChange","eventName","isFullscreen","getSlideValue","carouselItem","_a","querySelector","Error","getBoundingClientRect","slideToItem","from","to","nextActiveItem","immediate","slideMode","nextItem","startReached","endReached","index","start","config","default","velocity","onRest","finished","currentItem","getTotalScrollValue","round","Number","getCarouselItemWidth","positionProperty","setPosition","v","ref","top","left","currentFromValue","getFromValue","setTimeout","get","getToValue","type","next","slideToPrevItem","nextItemWillExceed","slideToNextItem","useEffect","internalSlideToItem","console","warn","window","innerWidth","useLayoutEffect","floor","observer","ResizeObserver","observe","disconnect","addEventListener","removeEventListener","bindDrag","useDrag","state","isDragging","dragging","movement","offset","currentMovement","direction","prevItemTreshold","nextItemTreshold","cancel","friction","tension","last","canceled","enabled","axis","findItemIndex","error","itemIndex","findIndex","item","shouldReset","newActiveItem","getIsNextItem","_activeItem","getIsPrevItem","getIsActiveItem","res","_thumbsFragment","_jsx","Context","Provider","children","carouselFragment","className","onWheel","stop","display","position","width","height","overflowX","overflowY","_jsxs","flexDirection","touchAction","percentValue","getAnimatedWrapperStyles","flexShrink","flex","isLastItem","marginRight","renderItem","createContext","undefined","useSpringCarouselContext","context","useContext"],"mappings":"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"}
1
+ {"version":3,"file":"useSpringCarousel.js","sources":["../../src/useSpringCarousel.tsx"],"sourcesContent":["import { config, useSpring } from '@react-spring/web'\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useRef,\n} from 'react'\n\nimport { useEventsModule } from './modules/useEventsModule'\nimport { useDrag } from '@use-gesture/react'\nimport { useFullscreenModule } from './modules/useFullscreenModule'\nimport { useThumbsModule } from './modules/useThumbsModule'\nimport {\n SlideActionType,\n SlideMode,\n UseSpringCarouselComplete,\n SpringCarouselWithThumbs,\n UseSpringCarouselWithFreeScroll,\n UseSpringCarouselWithThumbs,\n UseSpringCarouselWithNoThumbs,\n UseSpringCarouselWithNoFixedItems,\n UseSpringCarouselWithFixedItems,\n UseSpringFreeScrollReturnType,\n UseSpringReturnType,\n} from './types'\n\ntype ReturnType<T> = T extends true ? UseSpringFreeScrollReturnType : UseSpringReturnType\n\n/**\n * With free scroll\n */\nfunction useSpringCarousel(props: UseSpringCarouselWithFreeScroll): ReturnType<true>\nfunction useSpringCarousel(props: UseSpringCarouselWithThumbs<true>): ReturnType<true>\nfunction useSpringCarousel(props: UseSpringCarouselWithNoThumbs<true>): ReturnType<true>\n/**\n * No free scroll\n */\nfunction useSpringCarousel(props: UseSpringCarouselWithThumbs<false>): ReturnType<false>\nfunction useSpringCarousel(props: UseSpringCarouselWithNoThumbs<false>): ReturnType<false>\nfunction useSpringCarousel(\n props: UseSpringCarouselWithFixedItems<false>,\n): ReturnType<false>\nfunction useSpringCarousel(\n props: UseSpringCarouselWithNoFixedItems<false>,\n): ReturnType<false>\n\nfunction useSpringCarousel({\n items,\n init = true,\n withThumbs,\n thumbsSlideAxis = 'x',\n itemsPerSlide: _itemsPerSlide = 1,\n slideType = 'fixed',\n gutter = 0,\n withLoop = false,\n startEndGutter = 0,\n carouselSlideAxis = 'x',\n disableGestures = false,\n draggingSlideTreshold: _draggingSlideTreshold,\n slideWhenThresholdIsReached = false,\n freeScroll,\n enableFreeScrollDrag,\n initialStartingPosition,\n prepareThumbsData,\n initialActiveItem = 0,\n animateWhenActiveItemChange = true,\n}: UseSpringCarouselComplete): ReturnType<typeof freeScroll> {\n const resizeByPropChange = useRef(false)\n const itemsPerSlide = _itemsPerSlide > items.length ? items.length : _itemsPerSlide\n const prevWindowWidth = useRef(0)\n const draggingSlideTreshold = useRef(_draggingSlideTreshold ?? 0)\n const slideActionType = useRef<SlideActionType>('initial')\n const slideModeType = useRef<SlideMode>('initial')\n const prevSlidedValue = useRef(0)\n const [spring, setSpring] = useSpring(() => ({\n val: 0,\n pause: !init,\n onChange({ value }) {\n if (freeScroll && mainCarouselWrapperRef.current) {\n if (carouselSlideAxis === 'x') {\n mainCarouselWrapperRef.current.scrollLeft = Math.abs(value.val)\n } else {\n mainCarouselWrapperRef.current.scrollTop = Math.abs(value.val)\n }\n setStartEndItemReachedOnFreeScroll()\n } else if (carouselTrackWrapperRef.current) {\n if (carouselSlideAxis === 'x') {\n carouselTrackWrapperRef.current.style.transform = `translate3d(${value.val}px, 0px,0px)`\n } else {\n carouselTrackWrapperRef.current.style.transform = `translate3d(0px,${value.val}px,0px)`\n }\n }\n },\n }))\n const activeItem = useRef(initialActiveItem)\n const firstItemReached = useRef(initialActiveItem === 0)\n const lastItemReached = useRef(false)\n const mainCarouselWrapperRef = useRef<HTMLDivElement | null>(null)\n const carouselTrackWrapperRef = useRef<HTMLDivElement | null>(null)\n\n const prevWithLoop = useRef(withLoop)\n\n const getItems = useCallback(() => {\n if (withLoop) {\n return [\n ...items.map(i => ({\n ...i,\n id: `prev-repeated-item-${i.id}`,\n })),\n ...items,\n ...items.map(i => ({\n ...i,\n id: `next-repeated-item-${i.id}`,\n })),\n ]\n }\n return [...items]\n }, [items, withLoop])\n const internalItems = getItems()\n\n const { emitEvent, useListenToCustomEvent } = useEventsModule<'use-spring'>()\n const { thumbsFragment, handleScroll } = useThumbsModule({\n withThumbs: !!withThumbs,\n thumbsSlideAxis,\n prepareThumbsData,\n items: items as SpringCarouselWithThumbs['items'],\n })\n const { enterFullscreen, exitFullscreen, getIsFullscreen } = useFullscreenModule({\n mainCarouselWrapperRef,\n handleResize: () => adjustCarouselWrapperPosition(),\n onFullScreenChange: val => {\n emitEvent({\n eventName: 'onFullscreenChange',\n isFullscreen: val,\n })\n },\n })\n\n function getItemStyles(isLastItem: boolean) {\n if (slideType === 'fixed' && !freeScroll) {\n return {\n marginRight: `${isLastItem ? 0 : gutter}px`,\n flex: `1 0 calc(100% / ${itemsPerSlide} - ${\n (gutter * (itemsPerSlide - 1)) / itemsPerSlide\n }px)`,\n }\n }\n return {\n ...{ marginRight: `${isLastItem ? 0 : gutter}px` },\n }\n }\n\n function getSlideValue() {\n const carouselItem = mainCarouselWrapperRef.current?.querySelector(\n '.use-spring-carousel-item',\n )\n\n if (!carouselItem) {\n throw Error('No carousel items available!')\n }\n\n return (\n carouselItem.getBoundingClientRect()[\n carouselSlideAxis === 'x' ? 'width' : 'height'\n ] + gutter\n )\n }\n\n type SlideToItem = {\n from: number\n to: number\n nextActiveItem?: number\n immediate?: boolean\n slideMode: 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 function getTotalScrollValue() {\n if (withLoop) {\n return getSlideValue() * items.length\n }\n return Math.round(\n Number(\n carouselTrackWrapperRef.current?.[\n carouselSlideAxis === 'x' ? 'scrollWidth' : 'scrollHeight'\n ],\n ) -\n carouselTrackWrapperRef.current!.getBoundingClientRect()[\n carouselSlideAxis === 'x' ? 'width' : 'height'\n ] -\n startEndGutter,\n )\n }\n function getAnimatedWrapperStyles() {\n const percentValue = `calc(100% - ${startEndGutter * 2}px)`\n return {\n width: carouselSlideAxis === 'x' ? percentValue : '100%',\n height: carouselSlideAxis === 'y' ? percentValue : '100%',\n }\n }\n\n function getCarouselItemWidth() {\n const carouselItem = carouselTrackWrapperRef.current?.querySelector(\n '.use-spring-carousel-item',\n )\n if (!carouselItem) {\n throw Error('No carousel items available!')\n }\n return (\n carouselItem.getBoundingClientRect()[\n carouselSlideAxis === 'x' ? 'width' : 'height'\n ] + gutter\n )\n }\n function adjustCarouselWrapperPosition() {\n const positionProperty = carouselSlideAxis === 'x' ? 'left' : 'top'\n\n function setPosition(v: number) {\n const ref = carouselTrackWrapperRef.current\n if (!ref) return\n\n if (withLoop) {\n ref.style.top = '0px'\n ref.style.left = '0px'\n ref.style[positionProperty] = `-${v - startEndGutter}px`\n\n firstItemReached.current = false\n lastItemReached.current = false\n } else {\n ref.style.left = '0px'\n ref.style.top = '0px'\n }\n }\n\n const currentFromValue = Math.abs(getFromValue())\n\n if (initialStartingPosition === 'center') {\n setPosition(\n getCarouselItemWidth() * items.length -\n getSlideValue() * Math.round((itemsPerSlide - 1) / 2),\n )\n } else if (initialStartingPosition === 'end') {\n setPosition(\n getCarouselItemWidth() * items.length -\n getSlideValue() * Math.round(itemsPerSlide - 1),\n )\n } else {\n setPosition(getCarouselItemWidth() * items.length)\n }\n\n if (\n currentFromValue < getTotalScrollValue() &&\n slideType === 'fluid' &&\n lastItemReached.current &&\n !withLoop\n ) {\n lastItemReached.current = false\n }\n if (currentFromValue > getTotalScrollValue() && !withLoop) {\n const val = -getTotalScrollValue()\n lastItemReached.current = true\n prevSlidedValue.current = val\n setSpring.start({\n immediate: true,\n val: prevSlidedValue.current,\n })\n setTimeout(() => {\n resizeByPropChange.current = false\n }, 0)\n }\n\n if (!freeScroll && slideType === 'fixed') {\n const val = -(getSlideValue() * activeItem.current)\n prevSlidedValue.current = val\n setSpring.start({\n immediate: true,\n val,\n })\n }\n\n 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 || (firstItemReached.current && !withLoop)) return\n\n slideActionType.current = 'prev'\n lastItemReached.current = false\n\n const nextItem = typeof index === 'number' ? index : activeItem.current - 1\n\n if (!withLoop) {\n const nextItemWillExceed = freeScroll\n ? getToValue('prev', index) - getSlideValue() / 3 < 0\n : getToValue('prev', index) + getSlideValue() / 3 > 0\n\n if (firstItemReached.current) return\n if (nextItemWillExceed) {\n firstItemReached.current = true\n lastItemReached.current = false\n\n slideToItem({\n slideMode: type,\n from: getFromValue(),\n to: 0,\n nextActiveItem: 0,\n immediate,\n })\n return\n }\n }\n if (withLoop && (firstItemReached.current || 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 || (lastItemReached.current && !withLoop)) return\n\n slideActionType.current = 'next'\n firstItemReached.current = false\n\n const nextItem = index || activeItem.current + 1\n\n if (!withLoop) {\n const nextItemWillExceed =\n Math.abs(getToValue('next', index)) > getTotalScrollValue() - getSlideValue() / 3\n\n if (lastItemReached.current) return\n if (nextItemWillExceed) {\n firstItemReached.current = false\n lastItemReached.current = true\n\n slideToItem({\n slideMode: type,\n from: getFromValue(),\n to: freeScroll ? getTotalScrollValue() : -getTotalScrollValue(),\n nextActiveItem: nextItem,\n immediate,\n })\n return\n }\n }\n if (withLoop && (lastItemReached.current || 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\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, animateWhenActiveItemChange])\n useEffect(() => {\n if (init) {\n if (initialActiveItem > items.length - 1) {\n throw new Error(\n `initialActiveItem (${initialActiveItem}) is greater than the total quantity available items (${items.length}).`,\n )\n }\n if (itemsPerSlide > items.length) {\n console.warn(\n `itemsPerSlide (${itemsPerSlide}) is greater than the total quantity available items (${items.length}). Fallback to ${items.length})`,\n )\n }\n }\n }, [initialActiveItem, items, itemsPerSlide, init])\n useEffect(() => {\n prevWindowWidth.current = window.innerWidth\n }, [])\n useEffect(() => {\n resizeByPropChange.current = true\n adjustCarouselWrapperPosition()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n initialStartingPosition,\n itemsPerSlide,\n startEndGutter,\n gutter,\n freeScroll,\n slideType,\n init,\n ])\n useEffect(() => {\n if (withLoop !== prevWithLoop.current) {\n prevWithLoop.current = withLoop\n internalSlideToItem({ id: 0, immediate: true, shouldReset: true })\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [withLoop])\n useLayoutEffect(() => {\n /**\n * Set initial track position\n */\n if (carouselTrackWrapperRef.current) {\n adjustCarouselWrapperPosition()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n useEffect(() => {\n if (_draggingSlideTreshold) {\n draggingSlideTreshold.current = _draggingSlideTreshold\n } else {\n draggingSlideTreshold.current = Math.floor(getSlideValue() / 2 / 2)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [_draggingSlideTreshold])\n useEffect(() => {\n function handleResize() {\n if (window.innerWidth === prevWindowWidth.current) return\n prevWindowWidth.current = window.innerWidth\n adjustCarouselWrapperPosition()\n }\n if ('ResizeObserver' in window && mainCarouselWrapperRef.current) {\n const observer = new ResizeObserver(() => {\n if (!resizeByPropChange.current) {\n prevWindowWidth.current = window.innerWidth\n adjustCarouselWrapperPosition()\n }\n })\n observer.observe(mainCarouselWrapperRef.current)\n return () => {\n observer.disconnect()\n }\n } else {\n window.addEventListener('resize', handleResize)\n return () => {\n window.removeEventListener('resize', handleResize)\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n carouselSlideAxis,\n initialStartingPosition,\n itemsPerSlide,\n withLoop,\n startEndGutter,\n gutter,\n freeScroll,\n slideType,\n init,\n ])\n\n const bindDrag = useDrag(\n state => {\n const isDragging = state.dragging\n const movement = state.offset[carouselSlideAxis === 'x' ? 0 : 1]\n const currentMovement = state.movement[carouselSlideAxis === 'x' ? 0 : 1]\n const direction = state.direction[carouselSlideAxis === 'x' ? 0 : 1]\n\n const prevItemTreshold = currentMovement > draggingSlideTreshold.current\n const nextItemTreshold = currentMovement < -draggingSlideTreshold.current\n\n if (isDragging) {\n if (direction > 0) {\n slideActionType.current = 'prev'\n } else {\n slideActionType.current = 'next'\n }\n\n emitEvent({\n ...state,\n eventName: 'onDrag',\n slideActionType: slideActionType.current,\n })\n\n if (freeScroll) {\n if (slideActionType.current === 'prev' && movement > 0) {\n state.cancel()\n setSpring.start({\n from: {\n val: getFromValue(),\n },\n to: {\n val: 0,\n },\n config: {\n velocity: state.velocity,\n friction: 50,\n tension: 1000,\n },\n })\n return\n }\n\n setSpring.start({\n from: {\n val: getFromValue(),\n },\n to: {\n val: -movement,\n },\n config: {\n velocity: state.velocity,\n friction: 50,\n tension: 1000,\n },\n })\n return\n }\n\n setSpring.start({\n val: movement,\n config: {\n velocity: state.velocity,\n friction: 50,\n tension: 1000,\n },\n })\n\n if (slideWhenThresholdIsReached && nextItemTreshold) {\n slideToNextItem({ type: 'drag' })\n state.cancel()\n } else if (slideWhenThresholdIsReached && prevItemTreshold) {\n slideToPrevItem({ type: 'drag' })\n state.cancel()\n }\n return\n }\n\n if (state.last && !state.canceled && freeScroll) {\n if (slideActionType.current === 'prev') {\n slideToPrevItem({ type: 'drag' })\n }\n if (slideActionType.current === 'next') {\n slideToNextItem({ type: 'drag' })\n }\n }\n\n if (state.last && !state.canceled && !freeScroll) {\n if (nextItemTreshold) {\n if (!withLoop && lastItemReached.current) {\n setSpring.start({\n val: -getTotalScrollValue(),\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n } else {\n slideToNextItem({ type: 'drag' })\n }\n } else if (prevItemTreshold) {\n if (!withLoop && firstItemReached.current) {\n setSpring.start({\n val: 0,\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n } else {\n slideToPrevItem({ type: 'drag' })\n }\n } else {\n setSpring.start({\n val: prevSlidedValue.current,\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n }\n }\n if (state.last && state.canceled) {\n setSpring.start({\n val: prevSlidedValue.current,\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n }\n },\n {\n enabled:\n (init && !disableGestures && !freeScroll) ||\n (!!freeScroll && !!enableFreeScrollDrag),\n axis: carouselSlideAxis,\n from: () => {\n if (freeScroll && mainCarouselWrapperRef.current) {\n return [\n -mainCarouselWrapperRef.current.scrollLeft,\n -mainCarouselWrapperRef.current.scrollTop,\n ]\n }\n if (carouselSlideAxis === 'x') {\n return [spring.val.get(), spring.val.get()]\n }\n return [spring.val.get(), spring.val.get()]\n },\n },\n )\n\n function getWrapperOverflowStyles() {\n if (freeScroll) {\n if (carouselSlideAxis === 'x') {\n return {\n overflowX: 'auto',\n }\n }\n return {\n overflowY: 'auto',\n }\n }\n return {}\n }\n\n function setStartEndItemReachedOnFreeScroll() {\n if (mainCarouselWrapperRef.current) {\n prevSlidedValue.current =\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ]\n if (\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] === 0\n ) {\n firstItemReached.current = true\n lastItemReached.current = false\n }\n if (\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] > 0 &&\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] < getTotalScrollValue()\n ) {\n firstItemReached.current = false\n lastItemReached.current = false\n }\n\n if (\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] === getTotalScrollValue()\n ) {\n firstItemReached.current = false\n lastItemReached.current = true\n }\n }\n }\n function getScrollHandlers() {\n if (freeScroll) {\n return {\n onWheel() {\n spring.val.stop()\n setStartEndItemReachedOnFreeScroll()\n },\n }\n }\n return {}\n }\n\n function findItemIndex(id: string | number, error?: string) {\n let itemIndex = 0\n\n if (typeof id === 'string') {\n itemIndex = items.findIndex(item => item.id === id)\n } else {\n itemIndex = id\n }\n if (itemIndex < 0 || itemIndex >= items.length) {\n if (error) {\n throw new Error(error)\n }\n console.error(\n `The item doesn't exist; check that the id provided - ${id} - is correct.`,\n )\n itemIndex = -1\n }\n\n return itemIndex\n }\n type InternalSlideToItem = {\n id: string | number\n immediate?: boolean\n shouldReset?: boolean\n }\n function internalSlideToItem({ id, immediate, shouldReset }: InternalSlideToItem) {\n if (!init) return\n\n firstItemReached.current = false\n lastItemReached.current = false\n\n const itemIndex = findItemIndex(\n id,\n \"The item you want to slide to doesn't exist; check the provided id.\",\n )\n\n if (itemIndex === activeItem.current && !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: shouldReset ? 'initial' : 'click',\n index: newActiveItem,\n immediate,\n })\n } else {\n slideToPrevItem({\n type: shouldReset ? 'initial' : 'click',\n index: newActiveItem,\n immediate,\n })\n }\n }\n function getIsNextItem(id: string | number) {\n const itemIndex = findItemIndex(id, \"The item doesn't exist; check the provided id.\")\n const _activeItem = activeItem.current\n if (withLoop && _activeItem === items.length - 1) {\n return itemIndex === 0\n }\n return itemIndex === _activeItem + 1\n }\n function getIsPrevItem(id: string | number) {\n const itemIndex = findItemIndex(id, \"The item doesn't exist; check the provided id.\")\n const _activeItem = activeItem.current\n if (withLoop && _activeItem === 0) {\n return itemIndex === items.length - 1\n }\n return itemIndex === _activeItem - 1\n }\n function getIsActiveItem(id: string | number) {\n return (\n findItemIndex(\n id,\n \"The item you want to check doesn't exist; check the provided id.\",\n ) === activeItem.current\n )\n }\n\n const res = freeScroll\n ? {\n useListenToCustomEvent,\n enterFullscreen,\n exitFullscreen,\n getIsFullscreen,\n slideToPrevItem: () => {\n slideToPrevItem({\n type: 'click',\n })\n },\n slideToNextItem: () => {\n slideToNextItem({\n type: 'click',\n })\n },\n }\n : {\n useListenToCustomEvent,\n enterFullscreen,\n exitFullscreen,\n getIsFullscreen,\n slideToPrevItem: () => {\n slideToPrevItem({\n type: 'click',\n })\n },\n slideToNextItem: () => {\n slideToNextItem({\n type: 'click',\n })\n },\n slideToItem: (id: string | number) => internalSlideToItem({ id }),\n getIsNextItem,\n getIsPrevItem,\n getIsActiveItem,\n }\n\n const _thumbsFragment = (\n <Context.Provider value={res}>{thumbsFragment}</Context.Provider>\n )\n const carouselFragment = (\n <Context.Provider value={res}>\n <div\n className=\"use-spring-carousel-main-wrapper\"\n ref={mainCarouselWrapperRef}\n {...getScrollHandlers()}\n style={{\n display: 'flex',\n position: 'relative',\n width: '100%',\n height: '100%',\n ...(getWrapperOverflowStyles() as React.CSSProperties),\n }}\n >\n <div\n className=\"use-spring-carousel-track-wrapper\"\n ref={carouselTrackWrapperRef}\n {...bindDrag()}\n style={{\n position: 'relative',\n display: 'flex',\n flexDirection: carouselSlideAxis === 'x' ? 'row' : 'column',\n touchAction: 'none',\n ...getAnimatedWrapperStyles(),\n }}\n >\n {(freeScroll || !withLoop) && startEndGutter ? (\n <div\n style={{\n flexShrink: 0,\n width: startEndGutter,\n }}\n />\n ) : null}\n {internalItems.map((item, index) => {\n return (\n <div\n key={`${item.id}-${index}`}\n className=\"use-spring-carousel-item\"\n data-testid=\"use-spring-carousel-item-wrapper\"\n style={{\n display: 'flex',\n position: 'relative',\n flex: '1',\n ...getItemStyles(!!freeScroll && index === items.length - 1),\n }}\n >\n {typeof item.renderItem === 'function'\n ? item.renderItem({\n getIsActiveItem,\n getIsNextItem,\n getIsPrevItem,\n useListenToCustomEvent,\n })\n : item.renderItem}\n </div>\n )\n })}\n {freeScroll && startEndGutter ? (\n <div\n style={{\n flexShrink: 0,\n width: startEndGutter,\n }}\n />\n ) : null}\n </div>\n </div>\n </Context.Provider>\n )\n\n return { ...res, carouselFragment, thumbsFragment: _thumbsFragment }\n}\n\ntype ContextProps<T = undefined> = Omit<\n ReturnType<T extends 'free-scroll' ? true : false>,\n 'carouselFragment' | 'thumbsFragment'\n>\n\nconst Context =\n createContext<ContextProps | ContextProps<'free-scroll'> | undefined>(undefined)\n\nfunction useSpringCarouselContext<T>() {\n const context = useContext(Context)\n if (!context) {\n throw new Error('useSpringCarouselContext must be used within the carousel.')\n }\n return context as ContextProps<T>\n}\n\nexport { useSpringCarousel, useSpringCarouselContext }\n"],"names":["useSpringCarousel","items","init","withThumbs","thumbsSlideAxis","itemsPerSlide","_itemsPerSlide","slideType","gutter","withLoop","startEndGutter","carouselSlideAxis","disableGestures","draggingSlideTreshold","_draggingSlideTreshold","slideWhenThresholdIsReached","freeScroll","enableFreeScrollDrag","initialStartingPosition","prepareThumbsData","initialActiveItem","animateWhenActiveItemChange","resizeByPropChange","useRef","length","prevWindowWidth","slideActionType","slideModeType","prevSlidedValue","spring","setSpring","useSpring","val","pause","onChange","value","mainCarouselWrapperRef","current","scrollLeft","Math","abs","scrollTop","setStartEndItemReachedOnFreeScroll","carouselTrackWrapperRef","style","transform","activeItem","firstItemReached","lastItemReached","prevWithLoop","internalItems","useCallback","map","i","Object","assign","id","getItems","emitEvent","useListenToCustomEvent","useEventsModule","thumbsFragment","handleScroll","useThumbsModule","enterFullscreen","exitFullscreen","getIsFullscreen","useFullscreenModule","handleResize","adjustCarouselWrapperPosition","onFullScreenChange","eventName","isFullscreen","getSlideValue","carouselItem","_a","querySelector","Error","getBoundingClientRect","slideToItem","from","to","nextActiveItem","immediate","slideMode","nextItem","startReached","endReached","index","start","config","default","velocity","onRest","finished","currentItem","getTotalScrollValue","round","Number","getCarouselItemWidth","positionProperty","setPosition","v","ref","top","left","currentFromValue","getFromValue","setTimeout","get","getToValue","type","next","slideToPrevItem","nextItemWillExceed","slideToNextItem","useEffect","internalSlideToItem","console","warn","window","innerWidth","shouldReset","useLayoutEffect","floor","observer","ResizeObserver","observe","disconnect","addEventListener","removeEventListener","bindDrag","useDrag","state","isDragging","dragging","movement","offset","currentMovement","direction","prevItemTreshold","nextItemTreshold","cancel","friction","tension","last","canceled","enabled","axis","findItemIndex","error","itemIndex","findIndex","item","newActiveItem","getIsNextItem","_activeItem","getIsPrevItem","getIsActiveItem","res","_thumbsFragment","_jsx","Context","Provider","children","carouselFragment","className","onWheel","stop","display","position","width","height","overflowX","overflowY","_jsxs","flexDirection","touchAction","percentValue","getAnimatedWrapperStyles","flexShrink","flex","isLastItem","marginRight","renderItem","createContext","undefined","useSpringCarouselContext","context","useContext"],"mappings":"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"}
package/dist/umd/index.js CHANGED
@@ -1,2 +1,2 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react/jsx-runtime"),require("@react-spring/web"),require("react"),require("@use-gesture/react"),require("screenfull")):"function"==typeof define&&define.amd?define(["exports","react/jsx-runtime","@react-spring/web","react","@use-gesture/react","screenfull"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).ReactSpringCarousel={},e.ReactJSXRuntime,e.ReactSpring,e.React,e.UseGestureReact,e.Screenfull)}(this,(function(e,t,n,r,i,s){"use strict";const c="RSC::Event";function o(){const e=r.useRef(null);return{useListenToCustomEvent:function(t){r.useEffect((()=>{function n(e){t(e.detail)}if(e.current||(e.current=document.createElement("div")),e.current)return e.current.addEventListener(c,n,!1),()=>{var t;null===(t=e.current)||void 0===t||t.removeEventListener(c,n,!1)}}),[t])},emitEvent:function(t){if(e.current){const n=new CustomEvent(c,{detail:t});e.current.dispatchEvent(n)}}}}function u({mainCarouselWrapperRef:e,onFullScreenChange:t,handleResize:n}){const i=r.useRef(!1);function c(e){i.current=e}return r.useEffect((()=>{function e(){document.fullscreenElement&&(c(!0),t(!0),n&&n()),document.fullscreenElement||(c(!1),t(!1),n&&n())}if(s.isEnabled)return s.on("change",e),()=>{s.isEnabled&&s.off("change",e)}}),[]),{enterFullscreen:function(t){s.isEnabled&&s.request(t||e.current)},exitFullscreen:function(){s.isEnabled&&s.exit()},getIsFullscreen:function(){return i.current}}}function l({thumbsSlideAxis:e="x",withThumbs:i=!1,prepareThumbsData:s,items:c}){const o=r.useRef(null),[u,l]=n.useSpring((()=>({val:0})));function a(){var t;return Math.round(Number(null===(t=o.current)||void 0===t?void 0:t["x"===e?"scrollWidth":"scrollHeight"])-o.current.getBoundingClientRect()["x"===e?"width":"height"])}return{thumbsFragment:i?t.jsx("div",Object.assign({className:"use-spring-carousel-thumbs-wrapper",ref:o,onWheel:()=>u.val.stop(),style:Object.assign({display:"flex",flex:"1",position:"relative",width:"100%",height:"100%",flexDirection:"x"===e?"row":"column"},"x"===e?{overflowX:"auto"}:{overflowY:"auto",maxHeight:"100%"})},{children:function(){function e(e){return e.map((e=>({id:e.id,renderThumb:e.renderThumb})))}return s?s(e(c)):e(c)}().map((({id:e,renderThumb:n})=>{const r=`thumb-item-${e}`;return t.jsx("div",Object.assign({id:r,className:"thumb-item"},{children:n}),r)}))})):null,handleScroll:function(t){var n,r;const i=o.current?o.current.querySelector(`#thumb-item-${c[t].id}`):null;if(i&&o.current&&!function(e){const t=e.getBoundingClientRect();return t.top>=0&&t.left>=0&&t.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&t.right<=(window.innerWidth||document.documentElement.clientWidth)}(i)){const t=i.offsetLeft,s=t>a()?a():t;l.start({from:{val:null!==(r=null===(n=o.current)||void 0===n?void 0:n["x"===e?"scrollLeft":"scrollTop"])&&void 0!==r?r:0},to:{val:s},onChange:({value:t})=>{o.current&&(o.current["x"===e?"scrollLeft":"scrollTop"]=Math.abs(t.val))}})}}}}const a=r.createContext(void 0);const d={initial:{opacity:1,position:"relative"},from:{opacity:0,position:"relative"},enter:{position:"relative",opacity:1},leave:{opacity:1,position:"absolute"}};const f=r.createContext(void 0);e.useEventsModule=o,e.useFullscreenModule=u,e.useSpringCarousel=function({items:e,init:s=!0,withThumbs:c,thumbsSlideAxis:d="x",itemsPerSlide:f=1,slideType:m="fixed",gutter:g=0,withLoop:h=!1,startEndGutter:v=0,carouselSlideAxis:p="x",disableGestures:x=!1,draggingSlideTreshold:b,slideWhenThresholdIsReached:y=!1,freeScroll:j,enableFreeScrollDrag:w,initialStartingPosition:T,prepareThumbsData:O,initialActiveItem:R=0,animateWhenActiveItemChange:E=!0}){const I=r.useRef(!1),S=f>e.length?e.length:f,C=r.useRef(0),M=r.useRef(null!=b?b:0),F=r.useRef("initial"),L=r.useRef("initial"),A=r.useRef(0),[N,$]=n.useSpring((()=>({val:0,pause:!s,onChange({value:e}){j&&q.current?("x"===p?q.current.scrollLeft=Math.abs(e.val):q.current.scrollTop=Math.abs(e.val),ce()):D.current&&(D.current.style.transform="x"===p?`translate3d(${e.val}px, 0px,0px)`:`translate3d(0px,${e.val}px,0px)`)}}))),k=r.useRef(R),P=r.useRef(0===R),W=r.useRef(!1),q=r.useRef(null),D=r.useRef(null),B=r.useRef(h),z=r.useCallback((()=>h?[...e.map((e=>Object.assign(Object.assign({},e),{id:`prev-repeated-item-${e.id}`}))),...e,...e.map((e=>Object.assign(Object.assign({},e),{id:`next-repeated-item-${e.id}`})))]:[...e]),[e,h])(),{emitEvent:H,useListenToCustomEvent:G}=o(),{thumbsFragment:X,handleScroll:Y}=l({withThumbs:!!c,thumbsSlideAxis:d,prepareThumbsData:O,items:e}),{enterFullscreen:J,exitFullscreen:U,getIsFullscreen:K}=u({mainCarouselWrapperRef:q,handleResize:()=>ee(),onFullScreenChange:e=>{H({eventName:"onFullscreenChange",isFullscreen:e})}});function Q(){var e;const t=null===(e=q.current)||void 0===e?void 0:e.querySelector(".use-spring-carousel-item");if(!t)throw Error("No carousel items available!");return t.getBoundingClientRect()["x"===p?"width":"height"]+g}function V({from:t,to:r,nextActiveItem:i,immediate:s=!1,slideMode:o}){L.current=o,"number"==typeof i&&(j||(k.current=i),H({eventName:"onSlideStartChange",slideActionType:F.current,slideMode:L.current,nextItem:{startReached:P.current,endReached:W.current,index:j?-1:k.current,id:j?"":e[k.current].id}})),A.current=r,$.start({immediate:s,from:{val:t},to:{val:r},config:Object.assign(Object.assign({},n.config.default),{velocity:N.val.velocity}),onRest(t){!s&&t.finished&&H({eventName:"onSlideChange",slideActionType:F.current,slideMode:L.current,currentItem:{startReached:P.current,endReached:W.current,index:j?-1:k.current,id:j?"":e[k.current].id}})}}),c&&!s&&Y(k.current)}function Z(){var t;return h?Q()*e.length:Math.round(Number(null===(t=D.current)||void 0===t?void 0:t["x"===p?"scrollWidth":"scrollHeight"])-D.current.getBoundingClientRect()["x"===p?"width":"height"]-v)}function _(){var e;const t=null===(e=D.current)||void 0===e?void 0:e.querySelector(".use-spring-carousel-item");if(!t)throw Error("No carousel items available!");return t.getBoundingClientRect()["x"===p?"width":"height"]+g}function ee(){const t="x"===p?"left":"top";function n(e){const n=D.current;n&&(h?(n.style.top="0px",n.style.left="0px",n.style[t]=`-${e-v}px`,P.current=!1,W.current=!1):(n.style.left="0px",n.style.top="0px"))}const r=Math.abs(te());if(n("center"===T?_()*e.length-Q()*Math.round((S-1)/2):"end"===T?_()*e.length-Q()*Math.round(S-1):_()*e.length),r<Z()&&"fluid"===m&&W.current&&!h&&(W.current=!1),r>Z()&&!h){const e=-Z();W.current=!0,A.current=e,$.start({immediate:!0,val:A.current}),setTimeout((()=>{I.current=!1}),0)}if(!j&&"fixed"===m){const e=-Q()*k.current;A.current=e,$.start({immediate:!0,val:e})}setTimeout((()=>{I.current=!1}),0)}function te(){return j&&q.current?q.current["x"===p?"scrollLeft":"scrollTop"]:N.val.get()}function ne(e,t){if(j&&"next"===e){const e=A.current+Q();return e>Z()?Z():e}if(j&&"prev"===e){const e=A.current-Q();return e<0?0:e}return"next"===e?"number"==typeof t?-t*Q():A.current-Q():"number"==typeof t?-t*Q():A.current+Q()}function re(t="click",n,r){if(!s||P.current&&!h)return;F.current="prev",W.current=!1;const i="number"==typeof n?n:k.current-1;if(!h){const e=j?ne("prev",n)-Q()/3<0:ne("prev",n)+Q()/3>0;if(P.current)return;if(e)return P.current=!0,W.current=!1,void V({slideMode:t,from:te(),to:0,nextActiveItem:0,immediate:r})}if(h&&(P.current||i<0))return P.current=!1,W.current=!0,void V({slideMode:t,from:te()-Q()*e.length,to:-Q()*e.length+Q(),nextActiveItem:e.length-1,immediate:r});0===i&&(P.current=!0),i!==e.length-1&&-1!==i||(W.current=!0),V({slideMode:t,from:te(),to:ne("prev",n),nextActiveItem:i,immediate:r})}function ie(t="click",n,r){if(!s||W.current&&!h)return;F.current="next",P.current=!1;const i=n||k.current+1;if(!h){const e=Math.abs(ne("next",n))>Z()-Q()/3;if(W.current)return;if(e)return P.current=!1,W.current=!0,void V({slideMode:t,from:te(),to:j?Z():-Z(),nextActiveItem:i,immediate:r})}if(h&&(W.current||i>e.length-1))return W.current=!1,P.current=!0,void V({slideMode:t,from:te()+Q()*e.length,to:0,nextActiveItem:0,immediate:r});0===i&&(P.current=!0),i===e.length-1&&(W.current=!0),V({slideMode:t,from:te(),to:ne("next",n),nextActiveItem:i,immediate:r})}r.useEffect((()=>{k.current!==R&&ue(R,!E)}),[R,E]),r.useEffect((()=>{if(s){if(R>e.length-1)throw new Error(`initialActiveItem (${R}) is greater than the total quantity available items (${e.length}).`);S>e.length&&console.warn(`itemsPerSlide (${S}) is greater than the total quantity available items (${e.length}). Fallback to ${e.length})`)}}),[R,e,S,s]),r.useEffect((()=>{C.current=window.innerWidth}),[]),r.useEffect((()=>{I.current=!0,ee()}),[T,S,v,g,j,m,s]),r.useEffect((()=>{h!==B.current&&(B.current=h,ee(),ue(0,!0,!0))}),[h]),r.useLayoutEffect((()=>{D.current&&ee()}),[]),r.useEffect((()=>{M.current=b||Math.floor(Q()/2/2)}),[b]),r.useEffect((()=>{function e(){window.innerWidth!==C.current&&(C.current=window.innerWidth,ee())}if("ResizeObserver"in window&&q.current){const e=new ResizeObserver((()=>{I.current||(C.current=window.innerWidth,ee())}));return e.observe(q.current),()=>{e.disconnect()}}return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[p,T,S,h,v,g,j,m,s]);const se=i.useDrag((e=>{const t=e.dragging,r=e.offset["x"===p?0:1],i=e.movement["x"===p?0:1],s=e.direction["x"===p?0:1],c=i>M.current,o=i<-M.current;if(t)return F.current=s>0?"prev":"next",H(Object.assign(Object.assign({},e),{eventName:"onDrag",slideActionType:F.current})),j?"prev"===F.current&&r>0?(e.cancel(),void $.start({from:{val:te()},to:{val:0},config:{velocity:e.velocity,friction:50,tension:1e3}})):void $.start({from:{val:te()},to:{val:-r},config:{velocity:e.velocity,friction:50,tension:1e3}}):($.start({val:r,config:{velocity:e.velocity,friction:50,tension:1e3}}),void(y&&o?(ie("drag"),e.cancel()):y&&c&&(re("drag"),e.cancel())));e.last&&!e.canceled&&j&&("prev"===F.current&&re("drag"),"next"===F.current&&ie("drag")),!e.last||e.canceled||j||(o?!h&&W.current?$.start({val:-Z(),config:Object.assign(Object.assign({},n.config.default),{velocity:e.velocity})}):ie("drag"):c?!h&&P.current?$.start({val:0,config:Object.assign(Object.assign({},n.config.default),{velocity:e.velocity})}):re("drag"):$.start({val:A.current,config:Object.assign(Object.assign({},n.config.default),{velocity:e.velocity})})),e.last&&e.canceled&&$.start({val:A.current,config:Object.assign(Object.assign({},n.config.default),{velocity:e.velocity})})}),{enabled:s&&!x&&!j||!!j&&!!w,axis:p,from:()=>j&&q.current?[-q.current.scrollLeft,-q.current.scrollTop]:[N.val.get(),N.val.get()]});function ce(){q.current&&(A.current=q.current["x"===p?"scrollLeft":"scrollTop"],0===q.current["x"===p?"scrollLeft":"scrollTop"]&&(P.current=!0,W.current=!1),q.current["x"===p?"scrollLeft":"scrollTop"]>0&&q.current["x"===p?"scrollLeft":"scrollTop"]<Z()&&(P.current=!1,W.current=!1),q.current["x"===p?"scrollLeft":"scrollTop"]===Z()&&(P.current=!1,W.current=!0))}function oe(t,n){let r=0;if(r="string"==typeof t?e.findIndex((e=>e.id===t)):t,r<0||r>=e.length){if(n)throw new Error(n);console.error(`The item doesn't exist; check that the id provided - ${t} - is correct.`),r=-1}return r}function ue(t,n=!1,r=!1){if(!s)return;P.current=!1,W.current=!1;const i=oe(t,"The item you want to slide to doesn't exist; check the provided id.");if(i===k.current&&!r)return;const c=oe(e[k.current].id),o=oe(e[i].id);o>c?ie("click",o,n):re("click",o,n)}function le(t){const n=oe(t,"The item doesn't exist; check the provided id."),r=k.current;return h&&r===e.length-1?0===n:n===r+1}function ae(t){const n=oe(t,"The item doesn't exist; check the provided id."),r=k.current;return h&&0===r?n===e.length-1:n===r-1}function de(e){return oe(e,"The item you want to check doesn't exist; check the provided id.")===k.current}const fe=j?{useListenToCustomEvent:G,enterFullscreen:J,exitFullscreen:U,getIsFullscreen:K,slideToPrevItem:()=>re(),slideToNextItem:()=>ie()}:{useListenToCustomEvent:G,enterFullscreen:J,exitFullscreen:U,getIsFullscreen:K,slideToPrevItem:()=>re(),slideToNextItem:()=>ie(),slideToItem:e=>ue(e),getIsNextItem:le,getIsPrevItem:ae,getIsActiveItem:de},me=t.jsx(a.Provider,Object.assign({value:fe},{children:X})),ge=t.jsx(a.Provider,Object.assign({value:fe},{children:t.jsx("div",Object.assign({className:"use-spring-carousel-main-wrapper",ref:q},j?{onWheel(){N.val.stop(),ce()}}:{},{style:Object.assign({display:"flex",position:"relative",width:"100%",height:"100%"},j?"x"===p?{overflowX:"auto"}:{overflowY:"auto"}:{})},{children:t.jsxs("div",Object.assign({className:"use-spring-carousel-track-wrapper",ref:D},se(),{style:Object.assign({position:"relative",display:"flex",flexDirection:"x"===p?"row":"column",touchAction:"none"},function(){const e=`calc(100% - ${2*v}px)`;return{width:"x"===p?e:"100%",height:"y"===p?e:"100%"}}())},{children:[!j&&h||!v?null:t.jsx("div",{style:{flexShrink:0,width:v}}),z.map(((n,r)=>{return t.jsx("div",Object.assign({className:"use-spring-carousel-item","data-testid":"use-spring-carousel-item-wrapper",style:Object.assign({display:"flex",position:"relative",flex:"1"},(i=!!j&&r===e.length-1,"fixed"!==m||j?Object.assign({marginRight:`${i?0:g}px`}):{marginRight:`${i?0:g}px`,flex:`1 0 calc(100% / ${S} - ${g*(S-1)/S}px)`}))},{children:"function"==typeof n.renderItem?n.renderItem({getIsActiveItem:de,getIsNextItem:le,getIsPrevItem:ae,useListenToCustomEvent:G}):n.renderItem}),`${n.id}-${r}`);var i})),j&&v?t.jsx("div",{style:{flexShrink:0,width:v}}):null]}))}))}));return Object.assign(Object.assign({},fe),{carouselFragment:ge,thumbsFragment:me})},e.useSpringCarouselContext=function(){const e=r.useContext(a);if(!e)throw new Error("useSpringCarouselContext must be used within the carousel.");return e},e.useThumbsModule=l,e.useTransitionCarousel=function({init:e=!0,disableGestures:s=!1,items:c,springConfig:u=n.config.default,exitBeforeEnter:a=!1,trail:m,withLoop:g=!1,activeItem:h,toPrevItemSpringProps:v=d,toNextItemSpringProps:p=d,draggingSlideTreshold:x=50,thumbsSlideAxis:b="x"}){const y=r.useRef("next"),j=r.useRef("initial"),w=r.useRef(null),[T,O]=r.useState(null!=h?h:0),{emitEvent:R,useListenToCustomEvent:E}=o(),{handleScroll:I,thumbsFragment:S}=l({thumbsSlideAxis:b,items:c});function C({to:e,slideType:t,slideMode:n}){y.current=t,j.current=n,R({eventName:"onSlideStartChange",slideActionType:y.current,slideMode:j.current,nextItem:{index:e,id:c[e].id,startReached:0===e,endReached:e===c.length-1}}),O(e),I(T)}function M(t){if(!e)return;const n=0===T;!g&&n||C(g&&n?{to:c.length-1,slideType:"prev",slideMode:t}:{to:T-1,slideType:"prev",slideMode:t})}function F(t){if(!e)return;const n=T===c.length-1;!g&&n||C(g&&n?{to:0,slideType:"next",slideMode:t}:{to:T+1,slideType:"next",slideMode:t})}r.useEffect((()=>{"number"==typeof h&&h!==T&&O(h)}),[h]);const L=n.useTransition(T,Object.assign(Object.assign({config:u,key:null,trail:m,exitBeforeEnter:a},"prev"===y.current?{initial:Object.assign({},v.initial),from:Object.assign({},v.from),enter:Object.assign({},v.enter),leave:Object.assign({},v.leave)}:"next"===y.current?{initial:Object.assign({},p.initial),from:Object.assign({},p.from),enter:Object.assign({},p.enter),leave:Object.assign({},p.leave)}:{initial:Object.assign({},d.initial),from:Object.assign({},d.from),enter:Object.assign({},d.enter),leave:Object.assign({},d.leave)}),{onRest(e,t,n){e.finished&&n===T&&R({eventName:"onSlideChange",slideActionType:y.current,slideMode:j.current,currentItem:{index:T,id:c[T].id,startReached:0===T,endReached:T===c.length-1}})}})),A=i.useDrag((({last:e,movement:[t]})=>{if(e){const e=t>x,n=t<-x,r=0===T,i=T===c.length-1;if(n){if(!g&&i)return;R({eventName:"onLeftSwipe"}),F("swipe")}else if(e){if(!g&&r)return;R({eventName:"onRightSwipe"}),M("swipe")}}}),{enabled:!s}),N=L(((e,r,i,s)=>t.jsx(n.a.div,Object.assign({id:`use-transition-carousel-item-${s}`,className:"use-transition-carousel-item",style:Object.assign(Object.assign({},e),{flex:"1 0 100%",width:"100%",height:"100%"})},{children:c[r].renderItem})))),$={useListenToCustomEvent:E,slideToPrevItem:()=>M("click"),slideToNextItem:()=>F("click")},k=t.jsx(f.Provider,Object.assign({value:$},{children:S})),P=t.jsx(f.Provider,Object.assign({value:$},{children:t.jsx("div",Object.assign({ref:w},A(),{style:{display:"flex",position:"relative",width:"100%",height:"100%",overflow:"hidden"}},{children:N}))}));return Object.assign(Object.assign({},$),{carouselFragment:P,thumbsFragment:k})},e.useTransitionCarouselContext=function(){const e=r.useContext(f);if(!e)throw new Error("useTransitionCarouselContext must be used within the carousel.");return e}}));
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react/jsx-runtime"),require("@react-spring/web"),require("react"),require("@use-gesture/react"),require("screenfull")):"function"==typeof define&&define.amd?define(["exports","react/jsx-runtime","@react-spring/web","react","@use-gesture/react","screenfull"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).ReactSpringCarousel={},e.ReactJSXRuntime,e.ReactSpring,e.React,e.UseGestureReact,e.Screenfull)}(this,(function(e,t,n,r,i,s){"use strict";const c="RSC::Event";function o(){const e=r.useRef(null);return{useListenToCustomEvent:function(t){r.useEffect((()=>{function n(e){t(e.detail)}if(e.current||(e.current=document.createElement("div")),e.current)return e.current.addEventListener(c,n,!1),()=>{var t;null===(t=e.current)||void 0===t||t.removeEventListener(c,n,!1)}}),[t])},emitEvent:function(t){if(e.current){const n=new CustomEvent(c,{detail:t});e.current.dispatchEvent(n)}}}}function l({mainCarouselWrapperRef:e,onFullScreenChange:t,handleResize:n}){const i=r.useRef(!1);function c(e){i.current=e}return r.useEffect((()=>{function e(){document.fullscreenElement&&(c(!0),t(!0),n&&n()),document.fullscreenElement||(c(!1),t(!1),n&&n())}if(s.isEnabled)return s.on("change",e),()=>{s.isEnabled&&s.off("change",e)}}),[]),{enterFullscreen:function(t){s.isEnabled&&s.request(t||e.current)},exitFullscreen:function(){s.isEnabled&&s.exit()},getIsFullscreen:function(){return i.current}}}function u({thumbsSlideAxis:e="x",withThumbs:i=!1,prepareThumbsData:s,items:c}){const o=r.useRef(null),[l,u]=n.useSpring((()=>({val:0})));function a(){var t;return Math.round(Number(null===(t=o.current)||void 0===t?void 0:t["x"===e?"scrollWidth":"scrollHeight"])-o.current.getBoundingClientRect()["x"===e?"width":"height"])}return{thumbsFragment:i?t.jsx("div",Object.assign({className:"use-spring-carousel-thumbs-wrapper",ref:o,onWheel:()=>l.val.stop(),style:Object.assign({display:"flex",flex:"1",position:"relative",width:"100%",height:"100%",flexDirection:"x"===e?"row":"column"},"x"===e?{overflowX:"auto"}:{overflowY:"auto",maxHeight:"100%"})},{children:function(){function e(e){return e.map((e=>({id:e.id,renderThumb:e.renderThumb})))}return s?s(e(c)):e(c)}().map((({id:e,renderThumb:n})=>{const r=`thumb-item-${e}`;return t.jsx("div",Object.assign({id:r,className:"thumb-item"},{children:n}),r)}))})):null,handleScroll:function(t){var n,r;const i=o.current?o.current.querySelector(`#thumb-item-${c[t].id}`):null;if(i&&o.current&&!function(e){const t=e.getBoundingClientRect();return t.top>=0&&t.left>=0&&t.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&t.right<=(window.innerWidth||document.documentElement.clientWidth)}(i)){const t=i.offsetLeft,s=t>a()?a():t;u.start({from:{val:null!==(r=null===(n=o.current)||void 0===n?void 0:n["x"===e?"scrollLeft":"scrollTop"])&&void 0!==r?r:0},to:{val:s},onChange:({value:t})=>{o.current&&(o.current["x"===e?"scrollLeft":"scrollTop"]=Math.abs(t.val))}})}}}}const a=r.createContext(void 0);const d={initial:{opacity:1,position:"relative"},from:{opacity:0,position:"relative"},enter:{position:"relative",opacity:1},leave:{opacity:1,position:"absolute"}};const f=r.createContext(void 0);e.useEventsModule=o,e.useFullscreenModule=l,e.useSpringCarousel=function({items:e,init:s=!0,withThumbs:c,thumbsSlideAxis:d="x",itemsPerSlide:f=1,slideType:m="fixed",gutter:g=0,withLoop:h=!1,startEndGutter:v=0,carouselSlideAxis:p="x",disableGestures:x=!1,draggingSlideTreshold:b,slideWhenThresholdIsReached:y=!1,freeScroll:j,enableFreeScrollDrag:w,initialStartingPosition:T,prepareThumbsData:O,initialActiveItem:R=0,animateWhenActiveItemChange:E=!0}){const I=r.useRef(!1),S=f>e.length?e.length:f,C=r.useRef(0),M=r.useRef(null!=b?b:0),F=r.useRef("initial"),L=r.useRef("initial"),A=r.useRef(0),[N,$]=n.useSpring((()=>({val:0,pause:!s,onChange({value:e}){j&&q.current?("x"===p?q.current.scrollLeft=Math.abs(e.val):q.current.scrollTop=Math.abs(e.val),ce()):D.current&&(D.current.style.transform="x"===p?`translate3d(${e.val}px, 0px,0px)`:`translate3d(0px,${e.val}px,0px)`)}}))),k=r.useRef(R),P=r.useRef(0===R),W=r.useRef(!1),q=r.useRef(null),D=r.useRef(null),B=r.useRef(h),z=r.useCallback((()=>h?[...e.map((e=>Object.assign(Object.assign({},e),{id:`prev-repeated-item-${e.id}`}))),...e,...e.map((e=>Object.assign(Object.assign({},e),{id:`next-repeated-item-${e.id}`})))]:[...e]),[e,h])(),{emitEvent:H,useListenToCustomEvent:G}=o(),{thumbsFragment:X,handleScroll:Y}=u({withThumbs:!!c,thumbsSlideAxis:d,prepareThumbsData:O,items:e}),{enterFullscreen:J,exitFullscreen:U,getIsFullscreen:K}=l({mainCarouselWrapperRef:q,handleResize:()=>ee(),onFullScreenChange:e=>{H({eventName:"onFullscreenChange",isFullscreen:e})}});function Q(){var e;const t=null===(e=q.current)||void 0===e?void 0:e.querySelector(".use-spring-carousel-item");if(!t)throw Error("No carousel items available!");return t.getBoundingClientRect()["x"===p?"width":"height"]+g}function V({from:t,to:r,nextActiveItem:i,immediate:s=!1,slideMode:o}){L.current=o,"number"==typeof i&&(j||(k.current=i),H({eventName:"onSlideStartChange",slideActionType:F.current,slideMode:L.current,nextItem:{startReached:P.current,endReached:W.current,index:j?-1:k.current,id:j?"":e[k.current].id}})),A.current=r,$.start({immediate:s,from:{val:t},to:{val:r},config:Object.assign(Object.assign({},n.config.default),{velocity:N.val.velocity}),onRest(t){!s&&t.finished&&H({eventName:"onSlideChange",slideActionType:F.current,slideMode:L.current,currentItem:{startReached:P.current,endReached:W.current,index:j?-1:k.current,id:j?"":e[k.current].id}})}}),c&&!s&&Y(k.current)}function Z(){var t;return h?Q()*e.length:Math.round(Number(null===(t=D.current)||void 0===t?void 0:t["x"===p?"scrollWidth":"scrollHeight"])-D.current.getBoundingClientRect()["x"===p?"width":"height"]-v)}function _(){var e;const t=null===(e=D.current)||void 0===e?void 0:e.querySelector(".use-spring-carousel-item");if(!t)throw Error("No carousel items available!");return t.getBoundingClientRect()["x"===p?"width":"height"]+g}function ee(){const t="x"===p?"left":"top";function n(e){const n=D.current;n&&(h?(n.style.top="0px",n.style.left="0px",n.style[t]=`-${e-v}px`,P.current=!1,W.current=!1):(n.style.left="0px",n.style.top="0px"))}const r=Math.abs(te());if(n("center"===T?_()*e.length-Q()*Math.round((S-1)/2):"end"===T?_()*e.length-Q()*Math.round(S-1):_()*e.length),r<Z()&&"fluid"===m&&W.current&&!h&&(W.current=!1),r>Z()&&!h){const e=-Z();W.current=!0,A.current=e,$.start({immediate:!0,val:A.current}),setTimeout((()=>{I.current=!1}),0)}if(!j&&"fixed"===m){const e=-Q()*k.current;A.current=e,$.start({immediate:!0,val:e})}setTimeout((()=>{I.current=!1}),0)}function te(){return j&&q.current?q.current["x"===p?"scrollLeft":"scrollTop"]:N.val.get()}function ne(e,t){if(j&&"next"===e){const e=A.current+Q();return e>Z()?Z():e}if(j&&"prev"===e){const e=A.current-Q();return e<0?0:e}return"next"===e?"number"==typeof t?-t*Q():A.current-Q():"number"==typeof t?-t*Q():A.current+Q()}function re({type:t,index:n,immediate:r}){if(!s||P.current&&!h)return;F.current="prev",W.current=!1;const i="number"==typeof n?n:k.current-1;if(!h){const e=j?ne("prev",n)-Q()/3<0:ne("prev",n)+Q()/3>0;if(P.current)return;if(e)return P.current=!0,W.current=!1,void V({slideMode:t,from:te(),to:0,nextActiveItem:0,immediate:r})}if(h&&(P.current||i<0))return P.current=!1,W.current=!0,void V({slideMode:t,from:te()-Q()*e.length,to:-Q()*e.length+Q(),nextActiveItem:e.length-1,immediate:r});0===i&&(P.current=!0),i!==e.length-1&&-1!==i||(W.current=!0),V({slideMode:t,from:te(),to:ne("prev",n),nextActiveItem:i,immediate:r})}function ie({type:t,index:n,immediate:r}){if(!s||W.current&&!h)return;F.current="next",P.current=!1;const i=n||k.current+1;if(!h){const e=Math.abs(ne("next",n))>Z()-Q()/3;if(W.current)return;if(e)return P.current=!1,W.current=!0,void V({slideMode:t,from:te(),to:j?Z():-Z(),nextActiveItem:i,immediate:r})}if(h&&(W.current||i>e.length-1))return W.current=!1,P.current=!0,void V({slideMode:t,from:te()+Q()*e.length,to:0,nextActiveItem:0,immediate:r});0===i&&(P.current=!0),i===e.length-1&&(W.current=!0),V({slideMode:t,from:te(),to:ne("next",n),nextActiveItem:i,immediate:r})}r.useEffect((()=>{k.current!==R&&le({id:R,immediate:!E})}),[R,E]),r.useEffect((()=>{if(s){if(R>e.length-1)throw new Error(`initialActiveItem (${R}) is greater than the total quantity available items (${e.length}).`);S>e.length&&console.warn(`itemsPerSlide (${S}) is greater than the total quantity available items (${e.length}). Fallback to ${e.length})`)}}),[R,e,S,s]),r.useEffect((()=>{C.current=window.innerWidth}),[]),r.useEffect((()=>{I.current=!0,ee()}),[T,S,v,g,j,m,s]),r.useEffect((()=>{h!==B.current&&(B.current=h,le({id:0,immediate:!0,shouldReset:!0}))}),[h]),r.useLayoutEffect((()=>{D.current&&ee()}),[]),r.useEffect((()=>{M.current=b||Math.floor(Q()/2/2)}),[b]),r.useEffect((()=>{function e(){window.innerWidth!==C.current&&(C.current=window.innerWidth,ee())}if("ResizeObserver"in window&&q.current){const e=new ResizeObserver((()=>{I.current||(C.current=window.innerWidth,ee())}));return e.observe(q.current),()=>{e.disconnect()}}return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[p,T,S,h,v,g,j,m,s]);const se=i.useDrag((e=>{const t=e.dragging,r=e.offset["x"===p?0:1],i=e.movement["x"===p?0:1],s=e.direction["x"===p?0:1],c=i>M.current,o=i<-M.current;if(t)return F.current=s>0?"prev":"next",H(Object.assign(Object.assign({},e),{eventName:"onDrag",slideActionType:F.current})),j?"prev"===F.current&&r>0?(e.cancel(),void $.start({from:{val:te()},to:{val:0},config:{velocity:e.velocity,friction:50,tension:1e3}})):void $.start({from:{val:te()},to:{val:-r},config:{velocity:e.velocity,friction:50,tension:1e3}}):($.start({val:r,config:{velocity:e.velocity,friction:50,tension:1e3}}),void(y&&o?(ie({type:"drag"}),e.cancel()):y&&c&&(re({type:"drag"}),e.cancel())));e.last&&!e.canceled&&j&&("prev"===F.current&&re({type:"drag"}),"next"===F.current&&ie({type:"drag"})),!e.last||e.canceled||j||(o?!h&&W.current?$.start({val:-Z(),config:Object.assign(Object.assign({},n.config.default),{velocity:e.velocity})}):ie({type:"drag"}):c?!h&&P.current?$.start({val:0,config:Object.assign(Object.assign({},n.config.default),{velocity:e.velocity})}):re({type:"drag"}):$.start({val:A.current,config:Object.assign(Object.assign({},n.config.default),{velocity:e.velocity})})),e.last&&e.canceled&&$.start({val:A.current,config:Object.assign(Object.assign({},n.config.default),{velocity:e.velocity})})}),{enabled:s&&!x&&!j||!!j&&!!w,axis:p,from:()=>j&&q.current?[-q.current.scrollLeft,-q.current.scrollTop]:[N.val.get(),N.val.get()]});function ce(){q.current&&(A.current=q.current["x"===p?"scrollLeft":"scrollTop"],0===q.current["x"===p?"scrollLeft":"scrollTop"]&&(P.current=!0,W.current=!1),q.current["x"===p?"scrollLeft":"scrollTop"]>0&&q.current["x"===p?"scrollLeft":"scrollTop"]<Z()&&(P.current=!1,W.current=!1),q.current["x"===p?"scrollLeft":"scrollTop"]===Z()&&(P.current=!1,W.current=!0))}function oe(t,n){let r=0;if(r="string"==typeof t?e.findIndex((e=>e.id===t)):t,r<0||r>=e.length){if(n)throw new Error(n);console.error(`The item doesn't exist; check that the id provided - ${t} - is correct.`),r=-1}return r}function le({id:t,immediate:n,shouldReset:r}){if(!s)return;P.current=!1,W.current=!1;const i=oe(t,"The item you want to slide to doesn't exist; check the provided id.");if(i===k.current&&!r)return;const c=oe(e[k.current].id),o=oe(e[i].id);o>c?ie({type:r?"initial":"click",index:o,immediate:n}):re({type:r?"initial":"click",index:o,immediate:n})}function ue(t){const n=oe(t,"The item doesn't exist; check the provided id."),r=k.current;return h&&r===e.length-1?0===n:n===r+1}function ae(t){const n=oe(t,"The item doesn't exist; check the provided id."),r=k.current;return h&&0===r?n===e.length-1:n===r-1}function de(e){return oe(e,"The item you want to check doesn't exist; check the provided id.")===k.current}const fe=j?{useListenToCustomEvent:G,enterFullscreen:J,exitFullscreen:U,getIsFullscreen:K,slideToPrevItem:()=>{re({type:"click"})},slideToNextItem:()=>{ie({type:"click"})}}:{useListenToCustomEvent:G,enterFullscreen:J,exitFullscreen:U,getIsFullscreen:K,slideToPrevItem:()=>{re({type:"click"})},slideToNextItem:()=>{ie({type:"click"})},slideToItem:e=>le({id:e}),getIsNextItem:ue,getIsPrevItem:ae,getIsActiveItem:de},me=t.jsx(a.Provider,Object.assign({value:fe},{children:X})),ge=t.jsx(a.Provider,Object.assign({value:fe},{children:t.jsx("div",Object.assign({className:"use-spring-carousel-main-wrapper",ref:q},j?{onWheel(){N.val.stop(),ce()}}:{},{style:Object.assign({display:"flex",position:"relative",width:"100%",height:"100%"},j?"x"===p?{overflowX:"auto"}:{overflowY:"auto"}:{})},{children:t.jsxs("div",Object.assign({className:"use-spring-carousel-track-wrapper",ref:D},se(),{style:Object.assign({position:"relative",display:"flex",flexDirection:"x"===p?"row":"column",touchAction:"none"},function(){const e=`calc(100% - ${2*v}px)`;return{width:"x"===p?e:"100%",height:"y"===p?e:"100%"}}())},{children:[!j&&h||!v?null:t.jsx("div",{style:{flexShrink:0,width:v}}),z.map(((n,r)=>{return t.jsx("div",Object.assign({className:"use-spring-carousel-item","data-testid":"use-spring-carousel-item-wrapper",style:Object.assign({display:"flex",position:"relative",flex:"1"},(i=!!j&&r===e.length-1,"fixed"!==m||j?Object.assign({marginRight:`${i?0:g}px`}):{marginRight:`${i?0:g}px`,flex:`1 0 calc(100% / ${S} - ${g*(S-1)/S}px)`}))},{children:"function"==typeof n.renderItem?n.renderItem({getIsActiveItem:de,getIsNextItem:ue,getIsPrevItem:ae,useListenToCustomEvent:G}):n.renderItem}),`${n.id}-${r}`);var i})),j&&v?t.jsx("div",{style:{flexShrink:0,width:v}}):null]}))}))}));return Object.assign(Object.assign({},fe),{carouselFragment:ge,thumbsFragment:me})},e.useSpringCarouselContext=function(){const e=r.useContext(a);if(!e)throw new Error("useSpringCarouselContext must be used within the carousel.");return e},e.useThumbsModule=u,e.useTransitionCarousel=function({init:e=!0,disableGestures:s=!1,items:c,springConfig:l=n.config.default,exitBeforeEnter:a=!1,trail:m,withLoop:g=!1,activeItem:h,toPrevItemSpringProps:v=d,toNextItemSpringProps:p=d,draggingSlideTreshold:x=50,thumbsSlideAxis:b="x"}){const y=r.useRef("next"),j=r.useRef("initial"),w=r.useRef(null),[T,O]=r.useState(null!=h?h:0),{emitEvent:R,useListenToCustomEvent:E}=o(),{handleScroll:I,thumbsFragment:S}=u({thumbsSlideAxis:b,items:c});function C({to:e,slideType:t,slideMode:n}){y.current=t,j.current=n,R({eventName:"onSlideStartChange",slideActionType:y.current,slideMode:j.current,nextItem:{index:e,id:c[e].id,startReached:0===e,endReached:e===c.length-1}}),O(e),I(T)}function M(t){if(!e)return;const n=0===T;!g&&n||C(g&&n?{to:c.length-1,slideType:"prev",slideMode:t}:{to:T-1,slideType:"prev",slideMode:t})}function F(t){if(!e)return;const n=T===c.length-1;!g&&n||C(g&&n?{to:0,slideType:"next",slideMode:t}:{to:T+1,slideType:"next",slideMode:t})}r.useEffect((()=>{"number"==typeof h&&h!==T&&O(h)}),[h]);const L=n.useTransition(T,Object.assign(Object.assign({config:l,key:null,trail:m,exitBeforeEnter:a},"prev"===y.current?{initial:Object.assign({},v.initial),from:Object.assign({},v.from),enter:Object.assign({},v.enter),leave:Object.assign({},v.leave)}:"next"===y.current?{initial:Object.assign({},p.initial),from:Object.assign({},p.from),enter:Object.assign({},p.enter),leave:Object.assign({},p.leave)}:{initial:Object.assign({},d.initial),from:Object.assign({},d.from),enter:Object.assign({},d.enter),leave:Object.assign({},d.leave)}),{onRest(e,t,n){e.finished&&n===T&&R({eventName:"onSlideChange",slideActionType:y.current,slideMode:j.current,currentItem:{index:T,id:c[T].id,startReached:0===T,endReached:T===c.length-1}})}})),A=i.useDrag((({last:e,movement:[t]})=>{if(e){const e=t>x,n=t<-x,r=0===T,i=T===c.length-1;if(n){if(!g&&i)return;R({eventName:"onLeftSwipe"}),F("swipe")}else if(e){if(!g&&r)return;R({eventName:"onRightSwipe"}),M("swipe")}}}),{enabled:!s}),N=L(((e,r,i,s)=>t.jsx(n.a.div,Object.assign({id:`use-transition-carousel-item-${s}`,className:"use-transition-carousel-item",style:Object.assign(Object.assign({},e),{flex:"1 0 100%",width:"100%",height:"100%"})},{children:c[r].renderItem})))),$={useListenToCustomEvent:E,slideToPrevItem:()=>M("click"),slideToNextItem:()=>F("click")},k=t.jsx(f.Provider,Object.assign({value:$},{children:S})),P=t.jsx(f.Provider,Object.assign({value:$},{children:t.jsx("div",Object.assign({ref:w},A(),{style:{display:"flex",position:"relative",width:"100%",height:"100%",overflow:"hidden"}},{children:N}))}));return Object.assign(Object.assign({},$),{carouselFragment:P,thumbsFragment:k})},e.useTransitionCarouselContext=function(){const e=r.useContext(f);if(!e)throw new Error("useTransitionCarouselContext must be used within the carousel.");return e}}));
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/modules/useEventsModule.ts","../../src/modules/useFullscreenModule.ts","../../src/modules/useThumbsModule.tsx","../../src/useSpringCarousel.tsx","../../src/useTransitionCarousel.tsx"],"sourcesContent":["import { FullGestureState } from '@use-gesture/react'\nimport { useEffect, useRef } from 'react'\nimport { SlideActionType, SlideMode, TransitionSlideMode } from '../types/common'\n\nconst eventLabel = 'RSC::Event'\n\ntype OnSlideStartChange<T> = {\n eventName: 'onSlideStartChange'\n slideActionType: SlideActionType\n slideMode: T extends 'use-spring' ? SlideMode : TransitionSlideMode\n nextItem: {\n index: number\n id: string\n startReached: boolean\n endReached: boolean\n }\n}\ntype OnSlideChange<T> = {\n eventName: 'onSlideChange'\n slideActionType: SlideActionType\n slideMode: T extends 'use-spring' ? SlideMode : TransitionSlideMode\n currentItem: {\n index: number\n id: string\n startReached: boolean\n endReached: boolean\n }\n}\ntype OnFullscreenChange = {\n eventName: 'onFullscreenChange'\n isFullscreen: boolean\n}\ntype OnDrag = Omit<FullGestureState<'drag'>, 'event'> & {\n eventName: 'onDrag'\n slideActionType: SlideActionType\n}\n\ntype OnLeftSwipe = {\n eventName: 'onLeftSwipe'\n}\n\ntype OnRightSwipe = {\n eventName: 'onRightSwipe'\n}\n\ntype SpringCarouselEvents<T> =\n | OnSlideStartChange<T>\n | OnSlideChange<T>\n | OnDrag\n | OnFullscreenChange\n\ntype TransitionCarouselEvents<T> =\n | OnSlideStartChange<T>\n | OnSlideChange<T>\n | OnFullscreenChange\n | OnLeftSwipe\n | OnRightSwipe\n\ntype Events<T> = T extends 'use-spring'\n ? SpringCarouselEvents<'use-spring'>\n : TransitionCarouselEvents<'use-transition'>\n\ntype EventHandler<T> = (props: Events<T>) => void\n\nexport type UseListenToCustomEvent<T> = {\n useListenToCustomEvent: (eventHandler: EventHandler<T>) => void\n emitEvent: (event: Events<T>) => void\n}\n\nexport function useEventsModule<T extends 'use-spring' | 'use-transition'>() {\n const targetEvent = useRef<HTMLDivElement | null>(null)\n\n function useListenToCustomEvent(eventHandler: EventHandler<T>) {\n useEffect(() => {\n if (!targetEvent.current) {\n targetEvent.current = document.createElement('div')\n }\n\n function handleEvent(event: CustomEvent<Events<T>>) {\n eventHandler(event.detail)\n }\n\n if (targetEvent.current) {\n // @ts-ignore\n targetEvent.current.addEventListener(eventLabel, handleEvent, false)\n return () => {\n // @ts-ignore\n targetEvent.current?.removeEventListener(eventLabel, handleEvent, false)\n }\n }\n }, [eventHandler])\n }\n function emitEvent(event: Events<T>) {\n if (targetEvent.current) {\n const newEvent = new CustomEvent(eventLabel, {\n detail: event,\n })\n targetEvent.current.dispatchEvent(newEvent)\n }\n }\n\n return {\n useListenToCustomEvent,\n emitEvent,\n }\n}\n","import { useRef, MutableRefObject, useEffect } from 'react'\nimport screenfull from 'screenfull'\n\ntype FullscreenModule = {\n mainCarouselWrapperRef: MutableRefObject<HTMLDivElement | null>\n handleResize?(): void\n onFullScreenChange(isFullscreen: boolean): void\n}\n\nexport function useFullscreenModule({\n mainCarouselWrapperRef,\n onFullScreenChange,\n handleResize,\n}: FullscreenModule) {\n const isFullscreen = useRef(false)\n\n useEffect(() => {\n function handleFullscreenChange() {\n if (document.fullscreenElement) {\n setIsFullscreen(true)\n onFullScreenChange(true)\n handleResize && handleResize()\n }\n\n if (!document.fullscreenElement) {\n setIsFullscreen(false)\n onFullScreenChange(false)\n handleResize && handleResize()\n }\n }\n\n if (screenfull.isEnabled) {\n screenfull.on('change', handleFullscreenChange)\n return () => {\n if (screenfull.isEnabled) {\n screenfull.off('change', handleFullscreenChange)\n }\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n function setIsFullscreen(_isFullscreen: boolean) {\n isFullscreen.current = _isFullscreen\n }\n\n function getIsFullscreen() {\n return isFullscreen.current\n }\n\n function enterFullscreen(elementRef?: HTMLElement) {\n if (screenfull.isEnabled) {\n screenfull.request((elementRef || mainCarouselWrapperRef.current) as Element)\n }\n }\n\n function exitFullscreen() {\n screenfull.isEnabled && screenfull.exit()\n }\n\n return {\n enterFullscreen,\n exitFullscreen,\n getIsFullscreen,\n }\n}\n","import { useSpring } from '@react-spring/web'\nimport { useRef } from 'react'\n\nimport { ItemWithThumb, PrepareThumbsData, SpringCarouselWithThumbs } from '../types'\n\ntype Props = {\n withThumbs?: boolean\n thumbsSlideAxis: SpringCarouselWithThumbs['thumbsSlideAxis']\n prepareThumbsData?: PrepareThumbsData\n items: ItemWithThumb[]\n}\n\nfunction isInViewport(el: HTMLElement) {\n const rect = el.getBoundingClientRect()\n return (\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&\n rect.right <= (window.innerWidth || document.documentElement.clientWidth)\n )\n}\n\nexport function useThumbsModule({\n thumbsSlideAxis = 'x',\n withThumbs = false,\n prepareThumbsData,\n items,\n}: Props) {\n const wrapperRef = useRef<HTMLDivElement | null>(null)\n const [spring, setSpring] = useSpring(() => ({\n val: 0,\n }))\n\n function getTotalScrollValue() {\n return Math.round(\n Number(\n wrapperRef.current?.[thumbsSlideAxis === 'x' ? 'scrollWidth' : 'scrollHeight'],\n ) -\n wrapperRef.current!.getBoundingClientRect()[\n thumbsSlideAxis === 'x' ? 'width' : 'height'\n ],\n )\n }\n\n function handleScroll(activeItem: number) {\n function getThumbNode() {\n if (wrapperRef.current) {\n return wrapperRef.current.querySelector(\n `#thumb-item-${items[activeItem].id}`,\n ) as HTMLElement\n }\n return null\n }\n\n const thumbNode = getThumbNode()\n if (thumbNode && wrapperRef.current) {\n if (!isInViewport(thumbNode)) {\n const offset = thumbNode.offsetLeft\n const val = offset > getTotalScrollValue() ? getTotalScrollValue() : offset\n\n setSpring.start({\n from: {\n val:\n wrapperRef.current?.[\n thumbsSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] ?? 0,\n },\n to: {\n val,\n },\n onChange: ({ value }) => {\n if (wrapperRef.current) {\n wrapperRef.current[thumbsSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'] =\n Math.abs(value.val)\n }\n },\n })\n }\n }\n }\n\n function handlePrepareThumbsData() {\n function getPreparedItems(\n _items: ReturnType<PrepareThumbsData>,\n ): ReturnType<PrepareThumbsData> {\n return _items.map(i => ({\n id: i.id,\n renderThumb: i.renderThumb,\n }))\n }\n\n if (prepareThumbsData) {\n return prepareThumbsData(getPreparedItems(items))\n }\n return getPreparedItems(items)\n }\n\n const thumbsFragment = withThumbs ? (\n <div\n className=\"use-spring-carousel-thumbs-wrapper\"\n ref={wrapperRef}\n onWheel={() => spring.val.stop()}\n style={{\n display: 'flex',\n flex: '1',\n position: 'relative',\n width: '100%',\n height: '100%',\n flexDirection: thumbsSlideAxis === 'x' ? 'row' : 'column',\n ...(thumbsSlideAxis === 'x'\n ? { overflowX: 'auto' }\n : {\n overflowY: 'auto',\n maxHeight: '100%',\n }),\n }}\n >\n {handlePrepareThumbsData().map(({ id, renderThumb }) => {\n const thumbId = `thumb-item-${id}`\n return (\n <div key={thumbId} id={thumbId} className=\"thumb-item\">\n {renderThumb}\n </div>\n )\n })}\n </div>\n ) : null\n\n return {\n thumbsFragment,\n handleScroll,\n }\n}\n","import { config, useSpring } from '@react-spring/web'\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useRef,\n} from 'react'\n\nimport { useEventsModule } from './modules/useEventsModule'\nimport { useDrag } from '@use-gesture/react'\nimport { useFullscreenModule } from './modules/useFullscreenModule'\nimport { useThumbsModule } from './modules/useThumbsModule'\nimport {\n SlideActionType,\n SlideMode,\n UseSpringCarouselComplete,\n SpringCarouselWithThumbs,\n UseSpringCarouselWithFreeScroll,\n UseSpringCarouselWithThumbs,\n UseSpringCarouselWithNoThumbs,\n UseSpringCarouselWithNoFixedItems,\n UseSpringCarouselWithFixedItems,\n UseSpringFreeScrollReturnType,\n UseSpringReturnType,\n} from './types'\n\ntype ReturnType<T> = T extends true ? UseSpringFreeScrollReturnType : UseSpringReturnType\n\n/**\n * With free scroll\n */\nfunction useSpringCarousel(props: UseSpringCarouselWithFreeScroll): ReturnType<true>\nfunction useSpringCarousel(props: UseSpringCarouselWithThumbs<true>): ReturnType<true>\nfunction useSpringCarousel(props: UseSpringCarouselWithNoThumbs<true>): ReturnType<true>\n/**\n * No free scroll\n */\nfunction useSpringCarousel(props: UseSpringCarouselWithThumbs<false>): ReturnType<false>\nfunction useSpringCarousel(props: UseSpringCarouselWithNoThumbs<false>): ReturnType<false>\nfunction useSpringCarousel(\n props: UseSpringCarouselWithFixedItems<false>,\n): ReturnType<false>\nfunction useSpringCarousel(\n props: UseSpringCarouselWithNoFixedItems<false>,\n): ReturnType<false>\n\nfunction useSpringCarousel({\n items,\n init = true,\n withThumbs,\n thumbsSlideAxis = 'x',\n itemsPerSlide: _itemsPerSlide = 1,\n slideType = 'fixed',\n gutter = 0,\n withLoop = false,\n startEndGutter = 0,\n carouselSlideAxis = 'x',\n disableGestures = false,\n draggingSlideTreshold: _draggingSlideTreshold,\n slideWhenThresholdIsReached = false,\n freeScroll,\n enableFreeScrollDrag,\n initialStartingPosition,\n prepareThumbsData,\n initialActiveItem = 0,\n animateWhenActiveItemChange = true,\n}: UseSpringCarouselComplete): ReturnType<typeof freeScroll> {\n const resizeByPropChange = useRef(false)\n const itemsPerSlide = _itemsPerSlide > items.length ? items.length : _itemsPerSlide\n const prevWindowWidth = useRef(0)\n const draggingSlideTreshold = useRef(_draggingSlideTreshold ?? 0)\n const slideActionType = useRef<SlideActionType>('initial')\n const slideModeType = useRef<SlideMode>('initial')\n const prevSlidedValue = useRef(0)\n const [spring, setSpring] = useSpring(() => ({\n val: 0,\n pause: !init,\n onChange({ value }) {\n if (freeScroll && mainCarouselWrapperRef.current) {\n if (carouselSlideAxis === 'x') {\n mainCarouselWrapperRef.current.scrollLeft = Math.abs(value.val)\n } else {\n mainCarouselWrapperRef.current.scrollTop = Math.abs(value.val)\n }\n setStartEndItemReachedOnFreeScroll()\n } else if (carouselTrackWrapperRef.current) {\n if (carouselSlideAxis === 'x') {\n carouselTrackWrapperRef.current.style.transform = `translate3d(${value.val}px, 0px,0px)`\n } else {\n carouselTrackWrapperRef.current.style.transform = `translate3d(0px,${value.val}px,0px)`\n }\n }\n },\n }))\n const activeItem = useRef(initialActiveItem)\n const firstItemReached = useRef(initialActiveItem === 0)\n const lastItemReached = useRef(false)\n const mainCarouselWrapperRef = useRef<HTMLDivElement | null>(null)\n const carouselTrackWrapperRef = useRef<HTMLDivElement | null>(null)\n\n const prevWithLoop = useRef(withLoop)\n\n const getItems = useCallback(() => {\n if (withLoop) {\n return [\n ...items.map(i => ({\n ...i,\n id: `prev-repeated-item-${i.id}`,\n })),\n ...items,\n ...items.map(i => ({\n ...i,\n id: `next-repeated-item-${i.id}`,\n })),\n ]\n }\n return [...items]\n }, [items, withLoop])\n const internalItems = getItems()\n\n const { emitEvent, useListenToCustomEvent } = useEventsModule<'use-spring'>()\n const { thumbsFragment, handleScroll } = useThumbsModule({\n withThumbs: !!withThumbs,\n thumbsSlideAxis,\n prepareThumbsData,\n items: items as SpringCarouselWithThumbs['items'],\n })\n const { enterFullscreen, exitFullscreen, getIsFullscreen } = useFullscreenModule({\n mainCarouselWrapperRef,\n handleResize: () => adjustCarouselWrapperPosition(),\n onFullScreenChange: val => {\n emitEvent({\n eventName: 'onFullscreenChange',\n isFullscreen: val,\n })\n },\n })\n\n function getItemStyles(isLastItem: boolean) {\n if (slideType === 'fixed' && !freeScroll) {\n return {\n marginRight: `${isLastItem ? 0 : gutter}px`,\n flex: `1 0 calc(100% / ${itemsPerSlide} - ${\n (gutter * (itemsPerSlide - 1)) / itemsPerSlide\n }px)`,\n }\n }\n return {\n ...{ marginRight: `${isLastItem ? 0 : gutter}px` },\n }\n }\n\n function getSlideValue() {\n const carouselItem = mainCarouselWrapperRef.current?.querySelector(\n '.use-spring-carousel-item',\n )\n\n if (!carouselItem) {\n throw Error('No carousel items available!')\n }\n\n return (\n carouselItem.getBoundingClientRect()[\n carouselSlideAxis === 'x' ? 'width' : 'height'\n ] + gutter\n )\n }\n\n type SlideToItem = {\n from: number\n to: number\n nextActiveItem?: number\n immediate?: boolean\n slideMode: 'click' | 'drag'\n }\n\n function slideToItem({\n from,\n to,\n nextActiveItem,\n immediate = false,\n slideMode,\n }: SlideToItem) {\n slideModeType.current = slideMode\n\n if (typeof nextActiveItem === 'number') {\n if (!freeScroll) {\n activeItem.current = nextActiveItem\n }\n emitEvent({\n eventName: 'onSlideStartChange',\n slideActionType: slideActionType.current,\n slideMode: slideModeType.current,\n nextItem: {\n startReached: firstItemReached.current,\n endReached: lastItemReached.current,\n index: freeScroll ? -1 : activeItem.current,\n id: freeScroll ? '' : items[activeItem.current].id,\n },\n })\n }\n\n prevSlidedValue.current = to\n setSpring.start({\n immediate,\n from: {\n val: from,\n },\n to: {\n val: to,\n },\n config: {\n ...config.default,\n velocity: spring.val.velocity,\n },\n onRest(value) {\n if (!immediate && value.finished) {\n emitEvent({\n eventName: 'onSlideChange',\n slideActionType: slideActionType.current,\n slideMode: slideModeType.current,\n currentItem: {\n startReached: firstItemReached.current,\n endReached: lastItemReached.current,\n index: freeScroll ? -1 : activeItem.current,\n id: freeScroll ? '' : items[activeItem.current].id,\n },\n })\n }\n },\n })\n if (withThumbs && !immediate) {\n handleScroll(activeItem.current)\n }\n }\n function getTotalScrollValue() {\n if (withLoop) {\n return getSlideValue() * items.length\n }\n return Math.round(\n Number(\n carouselTrackWrapperRef.current?.[\n carouselSlideAxis === 'x' ? 'scrollWidth' : 'scrollHeight'\n ],\n ) -\n carouselTrackWrapperRef.current!.getBoundingClientRect()[\n carouselSlideAxis === 'x' ? 'width' : 'height'\n ] -\n startEndGutter,\n )\n }\n function getAnimatedWrapperStyles() {\n const percentValue = `calc(100% - ${startEndGutter * 2}px)`\n return {\n width: carouselSlideAxis === 'x' ? percentValue : '100%',\n height: carouselSlideAxis === 'y' ? percentValue : '100%',\n }\n }\n\n function getCarouselItemWidth() {\n const carouselItem = carouselTrackWrapperRef.current?.querySelector(\n '.use-spring-carousel-item',\n )\n if (!carouselItem) {\n throw Error('No carousel items available!')\n }\n return (\n carouselItem.getBoundingClientRect()[\n carouselSlideAxis === 'x' ? 'width' : 'height'\n ] + gutter\n )\n }\n function adjustCarouselWrapperPosition() {\n const positionProperty = carouselSlideAxis === 'x' ? 'left' : 'top'\n\n function setPosition(v: number) {\n const ref = carouselTrackWrapperRef.current\n if (!ref) return\n\n if (withLoop) {\n ref.style.top = '0px'\n ref.style.left = '0px'\n ref.style[positionProperty] = `-${v - startEndGutter}px`\n\n firstItemReached.current = false\n lastItemReached.current = false\n } else {\n ref.style.left = '0px'\n ref.style.top = '0px'\n }\n }\n\n const currentFromValue = Math.abs(getFromValue())\n\n if (initialStartingPosition === 'center') {\n setPosition(\n getCarouselItemWidth() * items.length -\n getSlideValue() * Math.round((itemsPerSlide - 1) / 2),\n )\n } else if (initialStartingPosition === 'end') {\n setPosition(\n getCarouselItemWidth() * items.length -\n getSlideValue() * Math.round(itemsPerSlide - 1),\n )\n } else {\n setPosition(getCarouselItemWidth() * items.length)\n }\n\n if (\n currentFromValue < getTotalScrollValue() &&\n slideType === 'fluid' &&\n lastItemReached.current &&\n !withLoop\n ) {\n lastItemReached.current = false\n }\n if (currentFromValue > getTotalScrollValue() && !withLoop) {\n const val = -getTotalScrollValue()\n lastItemReached.current = true\n prevSlidedValue.current = val\n setSpring.start({\n immediate: true,\n val: prevSlidedValue.current,\n })\n setTimeout(() => {\n resizeByPropChange.current = false\n }, 0)\n }\n\n if (!freeScroll && slideType === 'fixed') {\n const val = -(getSlideValue() * activeItem.current)\n prevSlidedValue.current = val\n setSpring.start({\n immediate: true,\n val,\n })\n }\n\n 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 function slideToPrevItem(\n type: Exclude<SlideMode, 'initial'> = 'click',\n index?: number,\n immediate?: boolean,\n ) {\n if (!init || (firstItemReached.current && !withLoop)) return\n\n slideActionType.current = 'prev'\n lastItemReached.current = false\n\n const nextItem = typeof index === 'number' ? index : activeItem.current - 1\n\n if (!withLoop) {\n const nextItemWillExceed = freeScroll\n ? getToValue('prev', index) - getSlideValue() / 3 < 0\n : getToValue('prev', index) + getSlideValue() / 3 > 0\n\n if (firstItemReached.current) return\n if (nextItemWillExceed) {\n firstItemReached.current = true\n lastItemReached.current = false\n\n slideToItem({\n slideMode: type,\n from: getFromValue(),\n to: 0,\n nextActiveItem: 0,\n immediate,\n })\n return\n }\n }\n if (withLoop && (firstItemReached.current || 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(\n type: Exclude<SlideMode, 'initial'> = 'click',\n index?: number,\n immediate?: boolean,\n ) {\n if (!init || (lastItemReached.current && !withLoop)) return\n\n slideActionType.current = 'next'\n firstItemReached.current = false\n\n const nextItem = index || activeItem.current + 1\n\n if (!withLoop) {\n const nextItemWillExceed =\n Math.abs(getToValue('next', index)) > getTotalScrollValue() - getSlideValue() / 3\n\n if (lastItemReached.current) return\n if (nextItemWillExceed) {\n firstItemReached.current = false\n lastItemReached.current = true\n\n slideToItem({\n slideMode: type,\n from: getFromValue(),\n to: freeScroll ? getTotalScrollValue() : -getTotalScrollValue(),\n nextActiveItem: nextItem,\n immediate,\n })\n return\n }\n }\n if (withLoop && (lastItemReached.current || 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\n useEffect(() => {\n if (activeItem.current !== initialActiveItem) {\n internalSlideToItem(initialActiveItem, !animateWhenActiveItemChange)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialActiveItem, animateWhenActiveItemChange])\n useEffect(() => {\n if (init) {\n if (initialActiveItem > items.length - 1) {\n throw new Error(\n `initialActiveItem (${initialActiveItem}) is greater than the total quantity available items (${items.length}).`,\n )\n }\n if (itemsPerSlide > items.length) {\n console.warn(\n `itemsPerSlide (${itemsPerSlide}) is greater than the total quantity available items (${items.length}). Fallback to ${items.length})`,\n )\n }\n }\n }, [initialActiveItem, items, itemsPerSlide, init])\n useEffect(() => {\n prevWindowWidth.current = window.innerWidth\n }, [])\n useEffect(() => {\n resizeByPropChange.current = true\n adjustCarouselWrapperPosition()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n initialStartingPosition,\n itemsPerSlide,\n startEndGutter,\n gutter,\n freeScroll,\n slideType,\n init,\n ])\n useEffect(() => {\n if (withLoop !== prevWithLoop.current) {\n prevWithLoop.current = withLoop\n adjustCarouselWrapperPosition()\n internalSlideToItem(0, true, true)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [withLoop])\n useLayoutEffect(() => {\n /**\n * Set initial track position\n */\n if (carouselTrackWrapperRef.current) {\n adjustCarouselWrapperPosition()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n useEffect(() => {\n if (_draggingSlideTreshold) {\n draggingSlideTreshold.current = _draggingSlideTreshold\n } else {\n draggingSlideTreshold.current = Math.floor(getSlideValue() / 2 / 2)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [_draggingSlideTreshold])\n useEffect(() => {\n function handleResize() {\n if (window.innerWidth === prevWindowWidth.current) return\n prevWindowWidth.current = window.innerWidth\n adjustCarouselWrapperPosition()\n }\n if ('ResizeObserver' in window && mainCarouselWrapperRef.current) {\n const observer = new ResizeObserver(() => {\n if (!resizeByPropChange.current) {\n prevWindowWidth.current = window.innerWidth\n adjustCarouselWrapperPosition()\n }\n })\n observer.observe(mainCarouselWrapperRef.current)\n return () => {\n observer.disconnect()\n }\n } else {\n window.addEventListener('resize', handleResize)\n return () => {\n window.removeEventListener('resize', handleResize)\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n carouselSlideAxis,\n initialStartingPosition,\n itemsPerSlide,\n withLoop,\n startEndGutter,\n gutter,\n freeScroll,\n slideType,\n init,\n ])\n\n const bindDrag = useDrag(\n state => {\n const isDragging = state.dragging\n const movement = state.offset[carouselSlideAxis === 'x' ? 0 : 1]\n const currentMovement = state.movement[carouselSlideAxis === 'x' ? 0 : 1]\n const direction = state.direction[carouselSlideAxis === 'x' ? 0 : 1]\n\n const prevItemTreshold = currentMovement > draggingSlideTreshold.current\n const nextItemTreshold = currentMovement < -draggingSlideTreshold.current\n\n if (isDragging) {\n if (direction > 0) {\n slideActionType.current = 'prev'\n } else {\n slideActionType.current = 'next'\n }\n\n emitEvent({\n ...state,\n eventName: 'onDrag',\n slideActionType: slideActionType.current,\n })\n\n if (freeScroll) {\n if (slideActionType.current === 'prev' && movement > 0) {\n state.cancel()\n setSpring.start({\n from: {\n val: getFromValue(),\n },\n to: {\n val: 0,\n },\n config: {\n velocity: state.velocity,\n friction: 50,\n tension: 1000,\n },\n })\n return\n }\n\n setSpring.start({\n from: {\n val: getFromValue(),\n },\n to: {\n val: -movement,\n },\n config: {\n velocity: state.velocity,\n friction: 50,\n tension: 1000,\n },\n })\n return\n }\n\n setSpring.start({\n val: movement,\n config: {\n velocity: state.velocity,\n friction: 50,\n tension: 1000,\n },\n })\n\n if (slideWhenThresholdIsReached && nextItemTreshold) {\n slideToNextItem('drag')\n state.cancel()\n } else if (slideWhenThresholdIsReached && prevItemTreshold) {\n slideToPrevItem('drag')\n state.cancel()\n }\n return\n }\n\n if (state.last && !state.canceled && freeScroll) {\n if (slideActionType.current === 'prev') {\n slideToPrevItem('drag')\n }\n if (slideActionType.current === 'next') {\n slideToNextItem('drag')\n }\n }\n\n if (state.last && !state.canceled && !freeScroll) {\n if (nextItemTreshold) {\n if (!withLoop && lastItemReached.current) {\n setSpring.start({\n val: -getTotalScrollValue(),\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n } else {\n slideToNextItem('drag')\n }\n } else if (prevItemTreshold) {\n if (!withLoop && firstItemReached.current) {\n setSpring.start({\n val: 0,\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n } else {\n slideToPrevItem('drag')\n }\n } else {\n setSpring.start({\n val: prevSlidedValue.current,\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n }\n }\n if (state.last && state.canceled) {\n setSpring.start({\n val: prevSlidedValue.current,\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n }\n },\n {\n enabled:\n (init && !disableGestures && !freeScroll) ||\n (!!freeScroll && !!enableFreeScrollDrag),\n axis: carouselSlideAxis,\n from: () => {\n if (freeScroll && mainCarouselWrapperRef.current) {\n return [\n -mainCarouselWrapperRef.current.scrollLeft,\n -mainCarouselWrapperRef.current.scrollTop,\n ]\n }\n if (carouselSlideAxis === 'x') {\n return [spring.val.get(), spring.val.get()]\n }\n return [spring.val.get(), spring.val.get()]\n },\n },\n )\n\n function getWrapperOverflowStyles() {\n if (freeScroll) {\n if (carouselSlideAxis === 'x') {\n return {\n overflowX: 'auto',\n }\n }\n return {\n overflowY: 'auto',\n }\n }\n return {}\n }\n\n function setStartEndItemReachedOnFreeScroll() {\n if (mainCarouselWrapperRef.current) {\n prevSlidedValue.current =\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ]\n if (\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] === 0\n ) {\n firstItemReached.current = true\n lastItemReached.current = false\n }\n if (\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] > 0 &&\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] < getTotalScrollValue()\n ) {\n firstItemReached.current = false\n lastItemReached.current = false\n }\n\n if (\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] === getTotalScrollValue()\n ) {\n firstItemReached.current = false\n lastItemReached.current = true\n }\n }\n }\n function getScrollHandlers() {\n if (freeScroll) {\n return {\n onWheel() {\n spring.val.stop()\n setStartEndItemReachedOnFreeScroll()\n },\n }\n }\n return {}\n }\n\n function findItemIndex(id: string | number, error?: string) {\n let itemIndex = 0\n\n if (typeof id === 'string') {\n itemIndex = items.findIndex(item => item.id === id)\n } else {\n itemIndex = id\n }\n if (itemIndex < 0 || itemIndex >= items.length) {\n if (error) {\n throw new Error(error)\n }\n console.error(\n `The item doesn't exist; check that the id provided - ${id} - is correct.`,\n )\n itemIndex = -1\n }\n\n return itemIndex\n }\n function internalSlideToItem(\n id: string | number,\n immediate = false,\n shouldReset = false,\n ) {\n if (!init) return\n\n firstItemReached.current = false\n lastItemReached.current = false\n\n const itemIndex = findItemIndex(\n id,\n \"The item you want to slide to doesn't exist; check the provided id.\",\n )\n\n if (itemIndex === activeItem.current && !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('click', newActiveItem, immediate)\n } else {\n slideToPrevItem('click', newActiveItem, immediate)\n }\n }\n function getIsNextItem(id: string | number) {\n const itemIndex = findItemIndex(id, \"The item doesn't exist; check the provided id.\")\n const _activeItem = activeItem.current\n if (withLoop && _activeItem === items.length - 1) {\n return itemIndex === 0\n }\n return itemIndex === _activeItem + 1\n }\n function getIsPrevItem(id: string | number) {\n const itemIndex = findItemIndex(id, \"The item doesn't exist; check the provided id.\")\n const _activeItem = activeItem.current\n if (withLoop && _activeItem === 0) {\n return itemIndex === items.length - 1\n }\n return itemIndex === _activeItem - 1\n }\n function getIsActiveItem(id: string | number) {\n return (\n findItemIndex(\n id,\n \"The item you want to check doesn't exist; check the provided id.\",\n ) === activeItem.current\n )\n }\n\n const res = freeScroll\n ? {\n useListenToCustomEvent,\n enterFullscreen,\n exitFullscreen,\n getIsFullscreen,\n slideToPrevItem: () => slideToPrevItem(),\n slideToNextItem: () => slideToNextItem(),\n }\n : {\n useListenToCustomEvent,\n enterFullscreen,\n exitFullscreen,\n getIsFullscreen,\n slideToPrevItem: () => slideToPrevItem(),\n slideToNextItem: () => slideToNextItem(),\n slideToItem: (id: string | number) => internalSlideToItem(id),\n getIsNextItem,\n getIsPrevItem,\n getIsActiveItem,\n }\n\n const _thumbsFragment = (\n <Context.Provider value={res}>{thumbsFragment}</Context.Provider>\n )\n const carouselFragment = (\n <Context.Provider value={res}>\n <div\n className=\"use-spring-carousel-main-wrapper\"\n ref={mainCarouselWrapperRef}\n {...getScrollHandlers()}\n style={{\n display: 'flex',\n position: 'relative',\n width: '100%',\n height: '100%',\n ...(getWrapperOverflowStyles() as React.CSSProperties),\n }}\n >\n <div\n className=\"use-spring-carousel-track-wrapper\"\n ref={carouselTrackWrapperRef}\n {...bindDrag()}\n style={{\n position: 'relative',\n display: 'flex',\n flexDirection: carouselSlideAxis === 'x' ? 'row' : 'column',\n touchAction: 'none',\n ...getAnimatedWrapperStyles(),\n }}\n >\n {(freeScroll || !withLoop) && startEndGutter ? (\n <div\n style={{\n flexShrink: 0,\n width: startEndGutter,\n }}\n />\n ) : null}\n {internalItems.map((item, index) => {\n return (\n <div\n key={`${item.id}-${index}`}\n className=\"use-spring-carousel-item\"\n data-testid=\"use-spring-carousel-item-wrapper\"\n style={{\n display: 'flex',\n position: 'relative',\n flex: '1',\n ...getItemStyles(!!freeScroll && index === items.length - 1),\n }}\n >\n {typeof item.renderItem === 'function'\n ? item.renderItem({\n getIsActiveItem,\n getIsNextItem,\n getIsPrevItem,\n useListenToCustomEvent,\n })\n : item.renderItem}\n </div>\n )\n })}\n {freeScroll && startEndGutter ? (\n <div\n style={{\n flexShrink: 0,\n width: startEndGutter,\n }}\n />\n ) : null}\n </div>\n </div>\n </Context.Provider>\n )\n\n return { ...res, carouselFragment, thumbsFragment: _thumbsFragment }\n}\n\ntype ContextProps<T = undefined> = Omit<\n ReturnType<T extends 'free-scroll' ? true : false>,\n 'carouselFragment' | 'thumbsFragment'\n>\n\nconst Context =\n createContext<ContextProps | ContextProps<'free-scroll'> | undefined>(undefined)\n\nfunction useSpringCarouselContext<T>() {\n const context = useContext(Context)\n if (!context) {\n throw new Error('useSpringCarouselContext must be used within the carousel.')\n }\n return context as ContextProps<T>\n}\n\nexport { useSpringCarousel, useSpringCarouselContext }\n","import { a, config, useTransition } from '@react-spring/web'\nimport { useEffect, useRef, useState, createContext, useContext } from 'react'\nimport { useEventsModule } from './modules/useEventsModule'\nimport { useDrag } from '@use-gesture/react'\nimport { useThumbsModule } from './modules'\nimport {\n ItemWithThumb,\n UseTransitionCarouselProps,\n UseTransitionCarouselReturnProps,\n SlideActionType,\n TransitionSlideMode,\n} from './types'\n\nconst defaultAnimationProps = {\n initial: {\n opacity: 1,\n position: 'relative',\n },\n from: {\n opacity: 0,\n position: 'relative',\n },\n enter: {\n position: 'relative',\n opacity: 1,\n },\n leave: {\n opacity: 1,\n position: 'absolute',\n },\n}\n\nfunction useTransitionCarousel({\n init = true,\n disableGestures = false,\n items,\n springConfig = config.default,\n exitBeforeEnter = false,\n trail,\n withLoop = false,\n activeItem: externalActiveItem,\n toPrevItemSpringProps = defaultAnimationProps,\n toNextItemSpringProps = defaultAnimationProps,\n draggingSlideTreshold = 50,\n thumbsSlideAxis = 'x',\n}: UseTransitionCarouselProps): UseTransitionCarouselReturnProps {\n const slideActionType = useRef<SlideActionType>('next')\n const slideModeType = useRef<TransitionSlideMode>('initial')\n const mainCarouselWrapperRef = useRef<HTMLDivElement | null>(null)\n const [activeItem, setActiveItem] = useState(externalActiveItem ?? 0)\n const { emitEvent, useListenToCustomEvent } = useEventsModule<'use-transition'>()\n const { handleScroll, thumbsFragment } = useThumbsModule({\n thumbsSlideAxis,\n items: items as ItemWithThumb[],\n })\n\n function getConfig() {\n if (slideActionType.current === 'prev') {\n return {\n initial: {\n ...toPrevItemSpringProps.initial,\n },\n from: {\n ...toPrevItemSpringProps.from,\n },\n enter: {\n ...toPrevItemSpringProps.enter,\n },\n leave: {\n ...toPrevItemSpringProps.leave,\n },\n }\n }\n if (slideActionType.current === 'next') {\n return {\n initial: {\n ...toNextItemSpringProps.initial,\n },\n from: {\n ...toNextItemSpringProps.from,\n },\n enter: {\n ...toNextItemSpringProps.enter,\n },\n leave: {\n ...toNextItemSpringProps.leave,\n },\n }\n }\n return {\n initial: {\n ...defaultAnimationProps.initial,\n },\n from: {\n ...defaultAnimationProps.from,\n },\n enter: {\n ...defaultAnimationProps.enter,\n },\n leave: {\n ...defaultAnimationProps.leave,\n },\n }\n }\n\n useEffect(() => {\n if (typeof externalActiveItem === 'number' && externalActiveItem !== activeItem) {\n setActiveItem(externalActiveItem)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [externalActiveItem])\n\n type SlideToItem = {\n to: number\n slideType: SlideActionType\n slideMode: TransitionSlideMode\n }\n\n function slideToItem({ to, slideType, slideMode }: SlideToItem) {\n slideActionType.current = slideType\n slideModeType.current = slideMode\n emitEvent({\n eventName: 'onSlideStartChange',\n slideActionType: slideActionType.current,\n slideMode: slideModeType.current,\n nextItem: {\n index: to,\n id: items[to].id,\n startReached: to === 0,\n endReached: to === items.length - 1,\n },\n })\n setActiveItem(to)\n handleScroll(activeItem)\n }\n\n function slideToPrevItem(slideMode: TransitionSlideMode) {\n if (!init) return\n const isFirstItem = activeItem === 0\n\n if (!withLoop && isFirstItem) return\n\n if (withLoop && isFirstItem) {\n slideToItem({\n to: items.length - 1,\n slideType: 'prev',\n slideMode,\n })\n } else {\n slideToItem({\n to: activeItem - 1,\n slideType: 'prev',\n slideMode,\n })\n }\n }\n function slideToNextItem(slideMode: TransitionSlideMode) {\n if (!init) return\n const isLastItem = activeItem === items.length - 1\n\n if (!withLoop && isLastItem) return\n\n if (withLoop && isLastItem) {\n slideToItem({\n to: 0,\n slideType: 'next',\n slideMode,\n })\n } else {\n slideToItem({\n to: activeItem + 1,\n slideType: 'next',\n slideMode,\n })\n }\n }\n\n const transitions = useTransition(activeItem, {\n config: springConfig,\n key: null,\n trail,\n exitBeforeEnter,\n ...getConfig(),\n onRest(value, _, index) {\n if (value.finished && index === activeItem) {\n emitEvent({\n eventName: 'onSlideChange',\n slideActionType: slideActionType.current,\n slideMode: slideModeType.current,\n currentItem: {\n index: activeItem,\n id: items[activeItem].id,\n startReached: activeItem === 0,\n endReached: activeItem === items.length - 1,\n },\n })\n }\n },\n })\n\n const bindSwipe = useDrag(\n ({ last, movement: [mx] }) => {\n if (last) {\n const prevItemTreshold = mx > draggingSlideTreshold\n const nextItemTreshold = mx < -draggingSlideTreshold\n const isFirstItem = activeItem === 0\n const isLastItem = activeItem === items.length - 1\n\n if (nextItemTreshold) {\n if (!withLoop && isLastItem) return\n\n emitEvent({\n eventName: 'onLeftSwipe',\n })\n slideToNextItem('swipe')\n } else if (prevItemTreshold) {\n if (!withLoop && isFirstItem) return\n\n emitEvent({\n eventName: 'onRightSwipe',\n })\n slideToPrevItem('swipe')\n }\n }\n },\n {\n enabled: !disableGestures,\n },\n )\n\n const itemsFragment = transitions((styles, item, _, indx) => {\n return (\n <a.div\n id={`use-transition-carousel-item-${indx}`}\n className=\"use-transition-carousel-item\"\n style={{\n ...styles,\n flex: '1 0 100%',\n width: '100%',\n height: '100%',\n }}\n >\n {items[item].renderItem}\n </a.div>\n )\n })\n\n const res = {\n useListenToCustomEvent,\n slideToPrevItem: () => slideToPrevItem('click'),\n slideToNextItem: () => slideToNextItem('click'),\n }\n\n const _thumbsFragment = (\n <Context.Provider value={res}>{thumbsFragment}</Context.Provider>\n )\n const carouselFragment = (\n <Context.Provider value={res}>\n <div\n ref={mainCarouselWrapperRef}\n {...bindSwipe()}\n style={{\n display: 'flex',\n position: 'relative',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n {itemsFragment}\n </div>\n </Context.Provider>\n )\n\n return {\n ...res,\n carouselFragment,\n thumbsFragment: _thumbsFragment,\n }\n}\n\ntype ContextProps = Omit<\n UseTransitionCarouselReturnProps,\n 'carouselFragment' | 'thumbsFragment'\n>\n\nconst Context = createContext<ContextProps | undefined>(undefined)\n\nfunction useTransitionCarouselContext() {\n const context = useContext(Context)\n if (!context) {\n throw new Error('useTransitionCarouselContext must be used within the carousel.')\n }\n return context\n}\n\nexport { useTransitionCarousel, useTransitionCarouselContext }\n"],"names":["eventLabel","useEventsModule","targetEvent","useRef","useListenToCustomEvent","eventHandler","useEffect","handleEvent","event","detail","current","document","createElement","addEventListener","_a","removeEventListener","emitEvent","newEvent","CustomEvent","dispatchEvent","useFullscreenModule","mainCarouselWrapperRef","onFullScreenChange","handleResize","isFullscreen","setIsFullscreen","_isFullscreen","handleFullscreenChange","fullscreenElement","screenfull","isEnabled","on","off","enterFullscreen","elementRef","request","exitFullscreen","exit","getIsFullscreen","useThumbsModule","thumbsSlideAxis","withThumbs","prepareThumbsData","items","wrapperRef","spring","setSpring","useSpring","val","getTotalScrollValue","Math","round","Number","getBoundingClientRect","thumbsFragment","_jsx","jsx","Object","assign","className","ref","onWheel","stop","style","display","flex","position","width","height","flexDirection","overflowX","overflowY","maxHeight","children","getPreparedItems","_items","map","i","id","renderThumb","handlePrepareThumbsData","thumbId","handleScroll","activeItem","thumbNode","querySelector","el","rect","top","left","bottom","window","innerHeight","documentElement","clientHeight","right","innerWidth","clientWidth","isInViewport","offset","offsetLeft","start","from","to","onChange","value","abs","Context","createContext","undefined","defaultAnimationProps","initial","opacity","enter","leave","init","itemsPerSlide","_itemsPerSlide","slideType","gutter","withLoop","startEndGutter","carouselSlideAxis","disableGestures","draggingSlideTreshold","_draggingSlideTreshold","slideWhenThresholdIsReached","freeScroll","enableFreeScrollDrag","initialStartingPosition","initialActiveItem","animateWhenActiveItemChange","resizeByPropChange","length","prevWindowWidth","slideActionType","slideModeType","prevSlidedValue","pause","scrollLeft","scrollTop","setStartEndItemReachedOnFreeScroll","carouselTrackWrapperRef","transform","firstItemReached","lastItemReached","prevWithLoop","internalItems","useCallback","getItems","adjustCarouselWrapperPosition","eventName","getSlideValue","carouselItem","Error","slideToItem","nextActiveItem","immediate","slideMode","nextItem","startReached","endReached","index","config","default","velocity","onRest","finished","currentItem","getCarouselItemWidth","positionProperty","setPosition","v","currentFromValue","getFromValue","setTimeout","get","getToValue","type","next","slideToPrevItem","nextItemWillExceed","slideToNextItem","internalSlideToItem","console","warn","useLayoutEffect","floor","observer","ResizeObserver","observe","disconnect","bindDrag","useDrag","state","isDragging","dragging","movement","currentMovement","direction","prevItemTreshold","nextItemTreshold","cancel","friction","tension","last","canceled","enabled","axis","findItemIndex","error","itemIndex","findIndex","item","shouldReset","newActiveItem","getIsNextItem","_activeItem","getIsPrevItem","getIsActiveItem","res","_thumbsFragment","Provider","carouselFragment","_jsxs","touchAction","percentValue","getAnimatedWrapperStyles","flexShrink","isLastItem","marginRight","renderItem","context","useContext","springConfig","exitBeforeEnter","trail","externalActiveItem","toPrevItemSpringProps","toNextItemSpringProps","setActiveItem","useState","isFirstItem","transitions","useTransition","key","_","bindSwipe","mx","itemsFragment","styles","indx","a","div","overflow"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/modules/useEventsModule.ts","../../src/modules/useFullscreenModule.ts","../../src/modules/useThumbsModule.tsx","../../src/useSpringCarousel.tsx","../../src/useTransitionCarousel.tsx"],"sourcesContent":["import { FullGestureState } from '@use-gesture/react'\nimport { useEffect, useRef } from 'react'\nimport { SlideActionType, SlideMode, TransitionSlideMode } from '../types/common'\n\nconst eventLabel = 'RSC::Event'\n\ntype OnSlideStartChange<T> = {\n eventName: 'onSlideStartChange'\n slideActionType: SlideActionType\n slideMode: T extends 'use-spring' ? SlideMode : TransitionSlideMode\n nextItem: {\n index: number\n id: string\n startReached: boolean\n endReached: boolean\n }\n}\ntype OnSlideChange<T> = {\n eventName: 'onSlideChange'\n slideActionType: SlideActionType\n slideMode: T extends 'use-spring' ? SlideMode : TransitionSlideMode\n currentItem: {\n index: number\n id: string\n startReached: boolean\n endReached: boolean\n }\n}\ntype OnFullscreenChange = {\n eventName: 'onFullscreenChange'\n isFullscreen: boolean\n}\ntype OnDrag = Omit<FullGestureState<'drag'>, 'event'> & {\n eventName: 'onDrag'\n slideActionType: SlideActionType\n}\n\ntype OnLeftSwipe = {\n eventName: 'onLeftSwipe'\n}\n\ntype OnRightSwipe = {\n eventName: 'onRightSwipe'\n}\n\ntype SpringCarouselEvents<T> =\n | OnSlideStartChange<T>\n | OnSlideChange<T>\n | OnDrag\n | OnFullscreenChange\n\ntype TransitionCarouselEvents<T> =\n | OnSlideStartChange<T>\n | OnSlideChange<T>\n | OnFullscreenChange\n | OnLeftSwipe\n | OnRightSwipe\n\ntype Events<T> = T extends 'use-spring'\n ? SpringCarouselEvents<'use-spring'>\n : TransitionCarouselEvents<'use-transition'>\n\ntype EventHandler<T> = (props: Events<T>) => void\n\nexport type UseListenToCustomEvent<T> = {\n useListenToCustomEvent: (eventHandler: EventHandler<T>) => void\n emitEvent: (event: Events<T>) => void\n}\n\nexport function useEventsModule<T extends 'use-spring' | 'use-transition'>() {\n const targetEvent = useRef<HTMLDivElement | null>(null)\n\n function useListenToCustomEvent(eventHandler: EventHandler<T>) {\n useEffect(() => {\n if (!targetEvent.current) {\n targetEvent.current = document.createElement('div')\n }\n\n function handleEvent(event: CustomEvent<Events<T>>) {\n eventHandler(event.detail)\n }\n\n if (targetEvent.current) {\n // @ts-ignore\n targetEvent.current.addEventListener(eventLabel, handleEvent, false)\n return () => {\n // @ts-ignore\n targetEvent.current?.removeEventListener(eventLabel, handleEvent, false)\n }\n }\n }, [eventHandler])\n }\n function emitEvent(event: Events<T>) {\n if (targetEvent.current) {\n const newEvent = new CustomEvent(eventLabel, {\n detail: event,\n })\n targetEvent.current.dispatchEvent(newEvent)\n }\n }\n\n return {\n useListenToCustomEvent,\n emitEvent,\n }\n}\n","import { useRef, MutableRefObject, useEffect } from 'react'\nimport screenfull from 'screenfull'\n\ntype FullscreenModule = {\n mainCarouselWrapperRef: MutableRefObject<HTMLDivElement | null>\n handleResize?(): void\n onFullScreenChange(isFullscreen: boolean): void\n}\n\nexport function useFullscreenModule({\n mainCarouselWrapperRef,\n onFullScreenChange,\n handleResize,\n}: FullscreenModule) {\n const isFullscreen = useRef(false)\n\n useEffect(() => {\n function handleFullscreenChange() {\n if (document.fullscreenElement) {\n setIsFullscreen(true)\n onFullScreenChange(true)\n handleResize && handleResize()\n }\n\n if (!document.fullscreenElement) {\n setIsFullscreen(false)\n onFullScreenChange(false)\n handleResize && handleResize()\n }\n }\n\n if (screenfull.isEnabled) {\n screenfull.on('change', handleFullscreenChange)\n return () => {\n if (screenfull.isEnabled) {\n screenfull.off('change', handleFullscreenChange)\n }\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n function setIsFullscreen(_isFullscreen: boolean) {\n isFullscreen.current = _isFullscreen\n }\n\n function getIsFullscreen() {\n return isFullscreen.current\n }\n\n function enterFullscreen(elementRef?: HTMLElement) {\n if (screenfull.isEnabled) {\n screenfull.request((elementRef || mainCarouselWrapperRef.current) as Element)\n }\n }\n\n function exitFullscreen() {\n screenfull.isEnabled && screenfull.exit()\n }\n\n return {\n enterFullscreen,\n exitFullscreen,\n getIsFullscreen,\n }\n}\n","import { useSpring } from '@react-spring/web'\nimport { useRef } from 'react'\n\nimport { ItemWithThumb, PrepareThumbsData, SpringCarouselWithThumbs } from '../types'\n\ntype Props = {\n withThumbs?: boolean\n thumbsSlideAxis: SpringCarouselWithThumbs['thumbsSlideAxis']\n prepareThumbsData?: PrepareThumbsData\n items: ItemWithThumb[]\n}\n\nfunction isInViewport(el: HTMLElement) {\n const rect = el.getBoundingClientRect()\n return (\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&\n rect.right <= (window.innerWidth || document.documentElement.clientWidth)\n )\n}\n\nexport function useThumbsModule({\n thumbsSlideAxis = 'x',\n withThumbs = false,\n prepareThumbsData,\n items,\n}: Props) {\n const wrapperRef = useRef<HTMLDivElement | null>(null)\n const [spring, setSpring] = useSpring(() => ({\n val: 0,\n }))\n\n function getTotalScrollValue() {\n return Math.round(\n Number(\n wrapperRef.current?.[thumbsSlideAxis === 'x' ? 'scrollWidth' : 'scrollHeight'],\n ) -\n wrapperRef.current!.getBoundingClientRect()[\n thumbsSlideAxis === 'x' ? 'width' : 'height'\n ],\n )\n }\n\n function handleScroll(activeItem: number) {\n function getThumbNode() {\n if (wrapperRef.current) {\n return wrapperRef.current.querySelector(\n `#thumb-item-${items[activeItem].id}`,\n ) as HTMLElement\n }\n return null\n }\n\n const thumbNode = getThumbNode()\n if (thumbNode && wrapperRef.current) {\n if (!isInViewport(thumbNode)) {\n const offset = thumbNode.offsetLeft\n const val = offset > getTotalScrollValue() ? getTotalScrollValue() : offset\n\n setSpring.start({\n from: {\n val:\n wrapperRef.current?.[\n thumbsSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] ?? 0,\n },\n to: {\n val,\n },\n onChange: ({ value }) => {\n if (wrapperRef.current) {\n wrapperRef.current[thumbsSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'] =\n Math.abs(value.val)\n }\n },\n })\n }\n }\n }\n\n function handlePrepareThumbsData() {\n function getPreparedItems(\n _items: ReturnType<PrepareThumbsData>,\n ): ReturnType<PrepareThumbsData> {\n return _items.map(i => ({\n id: i.id,\n renderThumb: i.renderThumb,\n }))\n }\n\n if (prepareThumbsData) {\n return prepareThumbsData(getPreparedItems(items))\n }\n return getPreparedItems(items)\n }\n\n const thumbsFragment = withThumbs ? (\n <div\n className=\"use-spring-carousel-thumbs-wrapper\"\n ref={wrapperRef}\n onWheel={() => spring.val.stop()}\n style={{\n display: 'flex',\n flex: '1',\n position: 'relative',\n width: '100%',\n height: '100%',\n flexDirection: thumbsSlideAxis === 'x' ? 'row' : 'column',\n ...(thumbsSlideAxis === 'x'\n ? { overflowX: 'auto' }\n : {\n overflowY: 'auto',\n maxHeight: '100%',\n }),\n }}\n >\n {handlePrepareThumbsData().map(({ id, renderThumb }) => {\n const thumbId = `thumb-item-${id}`\n return (\n <div key={thumbId} id={thumbId} className=\"thumb-item\">\n {renderThumb}\n </div>\n )\n })}\n </div>\n ) : null\n\n return {\n thumbsFragment,\n handleScroll,\n }\n}\n","import { config, useSpring } from '@react-spring/web'\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useRef,\n} from 'react'\n\nimport { useEventsModule } from './modules/useEventsModule'\nimport { useDrag } from '@use-gesture/react'\nimport { useFullscreenModule } from './modules/useFullscreenModule'\nimport { useThumbsModule } from './modules/useThumbsModule'\nimport {\n SlideActionType,\n SlideMode,\n UseSpringCarouselComplete,\n SpringCarouselWithThumbs,\n UseSpringCarouselWithFreeScroll,\n UseSpringCarouselWithThumbs,\n UseSpringCarouselWithNoThumbs,\n UseSpringCarouselWithNoFixedItems,\n UseSpringCarouselWithFixedItems,\n UseSpringFreeScrollReturnType,\n UseSpringReturnType,\n} from './types'\n\ntype ReturnType<T> = T extends true ? UseSpringFreeScrollReturnType : UseSpringReturnType\n\n/**\n * With free scroll\n */\nfunction useSpringCarousel(props: UseSpringCarouselWithFreeScroll): ReturnType<true>\nfunction useSpringCarousel(props: UseSpringCarouselWithThumbs<true>): ReturnType<true>\nfunction useSpringCarousel(props: UseSpringCarouselWithNoThumbs<true>): ReturnType<true>\n/**\n * No free scroll\n */\nfunction useSpringCarousel(props: UseSpringCarouselWithThumbs<false>): ReturnType<false>\nfunction useSpringCarousel(props: UseSpringCarouselWithNoThumbs<false>): ReturnType<false>\nfunction useSpringCarousel(\n props: UseSpringCarouselWithFixedItems<false>,\n): ReturnType<false>\nfunction useSpringCarousel(\n props: UseSpringCarouselWithNoFixedItems<false>,\n): ReturnType<false>\n\nfunction useSpringCarousel({\n items,\n init = true,\n withThumbs,\n thumbsSlideAxis = 'x',\n itemsPerSlide: _itemsPerSlide = 1,\n slideType = 'fixed',\n gutter = 0,\n withLoop = false,\n startEndGutter = 0,\n carouselSlideAxis = 'x',\n disableGestures = false,\n draggingSlideTreshold: _draggingSlideTreshold,\n slideWhenThresholdIsReached = false,\n freeScroll,\n enableFreeScrollDrag,\n initialStartingPosition,\n prepareThumbsData,\n initialActiveItem = 0,\n animateWhenActiveItemChange = true,\n}: UseSpringCarouselComplete): ReturnType<typeof freeScroll> {\n const resizeByPropChange = useRef(false)\n const itemsPerSlide = _itemsPerSlide > items.length ? items.length : _itemsPerSlide\n const prevWindowWidth = useRef(0)\n const draggingSlideTreshold = useRef(_draggingSlideTreshold ?? 0)\n const slideActionType = useRef<SlideActionType>('initial')\n const slideModeType = useRef<SlideMode>('initial')\n const prevSlidedValue = useRef(0)\n const [spring, setSpring] = useSpring(() => ({\n val: 0,\n pause: !init,\n onChange({ value }) {\n if (freeScroll && mainCarouselWrapperRef.current) {\n if (carouselSlideAxis === 'x') {\n mainCarouselWrapperRef.current.scrollLeft = Math.abs(value.val)\n } else {\n mainCarouselWrapperRef.current.scrollTop = Math.abs(value.val)\n }\n setStartEndItemReachedOnFreeScroll()\n } else if (carouselTrackWrapperRef.current) {\n if (carouselSlideAxis === 'x') {\n carouselTrackWrapperRef.current.style.transform = `translate3d(${value.val}px, 0px,0px)`\n } else {\n carouselTrackWrapperRef.current.style.transform = `translate3d(0px,${value.val}px,0px)`\n }\n }\n },\n }))\n const activeItem = useRef(initialActiveItem)\n const firstItemReached = useRef(initialActiveItem === 0)\n const lastItemReached = useRef(false)\n const mainCarouselWrapperRef = useRef<HTMLDivElement | null>(null)\n const carouselTrackWrapperRef = useRef<HTMLDivElement | null>(null)\n\n const prevWithLoop = useRef(withLoop)\n\n const getItems = useCallback(() => {\n if (withLoop) {\n return [\n ...items.map(i => ({\n ...i,\n id: `prev-repeated-item-${i.id}`,\n })),\n ...items,\n ...items.map(i => ({\n ...i,\n id: `next-repeated-item-${i.id}`,\n })),\n ]\n }\n return [...items]\n }, [items, withLoop])\n const internalItems = getItems()\n\n const { emitEvent, useListenToCustomEvent } = useEventsModule<'use-spring'>()\n const { thumbsFragment, handleScroll } = useThumbsModule({\n withThumbs: !!withThumbs,\n thumbsSlideAxis,\n prepareThumbsData,\n items: items as SpringCarouselWithThumbs['items'],\n })\n const { enterFullscreen, exitFullscreen, getIsFullscreen } = useFullscreenModule({\n mainCarouselWrapperRef,\n handleResize: () => adjustCarouselWrapperPosition(),\n onFullScreenChange: val => {\n emitEvent({\n eventName: 'onFullscreenChange',\n isFullscreen: val,\n })\n },\n })\n\n function getItemStyles(isLastItem: boolean) {\n if (slideType === 'fixed' && !freeScroll) {\n return {\n marginRight: `${isLastItem ? 0 : gutter}px`,\n flex: `1 0 calc(100% / ${itemsPerSlide} - ${\n (gutter * (itemsPerSlide - 1)) / itemsPerSlide\n }px)`,\n }\n }\n return {\n ...{ marginRight: `${isLastItem ? 0 : gutter}px` },\n }\n }\n\n function getSlideValue() {\n const carouselItem = mainCarouselWrapperRef.current?.querySelector(\n '.use-spring-carousel-item',\n )\n\n if (!carouselItem) {\n throw Error('No carousel items available!')\n }\n\n return (\n carouselItem.getBoundingClientRect()[\n carouselSlideAxis === 'x' ? 'width' : 'height'\n ] + gutter\n )\n }\n\n type SlideToItem = {\n from: number\n to: number\n nextActiveItem?: number\n immediate?: boolean\n slideMode: 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 function getTotalScrollValue() {\n if (withLoop) {\n return getSlideValue() * items.length\n }\n return Math.round(\n Number(\n carouselTrackWrapperRef.current?.[\n carouselSlideAxis === 'x' ? 'scrollWidth' : 'scrollHeight'\n ],\n ) -\n carouselTrackWrapperRef.current!.getBoundingClientRect()[\n carouselSlideAxis === 'x' ? 'width' : 'height'\n ] -\n startEndGutter,\n )\n }\n function getAnimatedWrapperStyles() {\n const percentValue = `calc(100% - ${startEndGutter * 2}px)`\n return {\n width: carouselSlideAxis === 'x' ? percentValue : '100%',\n height: carouselSlideAxis === 'y' ? percentValue : '100%',\n }\n }\n\n function getCarouselItemWidth() {\n const carouselItem = carouselTrackWrapperRef.current?.querySelector(\n '.use-spring-carousel-item',\n )\n if (!carouselItem) {\n throw Error('No carousel items available!')\n }\n return (\n carouselItem.getBoundingClientRect()[\n carouselSlideAxis === 'x' ? 'width' : 'height'\n ] + gutter\n )\n }\n function adjustCarouselWrapperPosition() {\n const positionProperty = carouselSlideAxis === 'x' ? 'left' : 'top'\n\n function setPosition(v: number) {\n const ref = carouselTrackWrapperRef.current\n if (!ref) return\n\n if (withLoop) {\n ref.style.top = '0px'\n ref.style.left = '0px'\n ref.style[positionProperty] = `-${v - startEndGutter}px`\n\n firstItemReached.current = false\n lastItemReached.current = false\n } else {\n ref.style.left = '0px'\n ref.style.top = '0px'\n }\n }\n\n const currentFromValue = Math.abs(getFromValue())\n\n if (initialStartingPosition === 'center') {\n setPosition(\n getCarouselItemWidth() * items.length -\n getSlideValue() * Math.round((itemsPerSlide - 1) / 2),\n )\n } else if (initialStartingPosition === 'end') {\n setPosition(\n getCarouselItemWidth() * items.length -\n getSlideValue() * Math.round(itemsPerSlide - 1),\n )\n } else {\n setPosition(getCarouselItemWidth() * items.length)\n }\n\n if (\n currentFromValue < getTotalScrollValue() &&\n slideType === 'fluid' &&\n lastItemReached.current &&\n !withLoop\n ) {\n lastItemReached.current = false\n }\n if (currentFromValue > getTotalScrollValue() && !withLoop) {\n const val = -getTotalScrollValue()\n lastItemReached.current = true\n prevSlidedValue.current = val\n setSpring.start({\n immediate: true,\n val: prevSlidedValue.current,\n })\n setTimeout(() => {\n resizeByPropChange.current = false\n }, 0)\n }\n\n if (!freeScroll && slideType === 'fixed') {\n const val = -(getSlideValue() * activeItem.current)\n prevSlidedValue.current = val\n setSpring.start({\n immediate: true,\n val,\n })\n }\n\n 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 || (firstItemReached.current && !withLoop)) return\n\n slideActionType.current = 'prev'\n lastItemReached.current = false\n\n const nextItem = typeof index === 'number' ? index : activeItem.current - 1\n\n if (!withLoop) {\n const nextItemWillExceed = freeScroll\n ? getToValue('prev', index) - getSlideValue() / 3 < 0\n : getToValue('prev', index) + getSlideValue() / 3 > 0\n\n if (firstItemReached.current) return\n if (nextItemWillExceed) {\n firstItemReached.current = true\n lastItemReached.current = false\n\n slideToItem({\n slideMode: type,\n from: getFromValue(),\n to: 0,\n nextActiveItem: 0,\n immediate,\n })\n return\n }\n }\n if (withLoop && (firstItemReached.current || 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 || (lastItemReached.current && !withLoop)) return\n\n slideActionType.current = 'next'\n firstItemReached.current = false\n\n const nextItem = index || activeItem.current + 1\n\n if (!withLoop) {\n const nextItemWillExceed =\n Math.abs(getToValue('next', index)) > getTotalScrollValue() - getSlideValue() / 3\n\n if (lastItemReached.current) return\n if (nextItemWillExceed) {\n firstItemReached.current = false\n lastItemReached.current = true\n\n slideToItem({\n slideMode: type,\n from: getFromValue(),\n to: freeScroll ? getTotalScrollValue() : -getTotalScrollValue(),\n nextActiveItem: nextItem,\n immediate,\n })\n return\n }\n }\n if (withLoop && (lastItemReached.current || 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\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, animateWhenActiveItemChange])\n useEffect(() => {\n if (init) {\n if (initialActiveItem > items.length - 1) {\n throw new Error(\n `initialActiveItem (${initialActiveItem}) is greater than the total quantity available items (${items.length}).`,\n )\n }\n if (itemsPerSlide > items.length) {\n console.warn(\n `itemsPerSlide (${itemsPerSlide}) is greater than the total quantity available items (${items.length}). Fallback to ${items.length})`,\n )\n }\n }\n }, [initialActiveItem, items, itemsPerSlide, init])\n useEffect(() => {\n prevWindowWidth.current = window.innerWidth\n }, [])\n useEffect(() => {\n resizeByPropChange.current = true\n adjustCarouselWrapperPosition()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n initialStartingPosition,\n itemsPerSlide,\n startEndGutter,\n gutter,\n freeScroll,\n slideType,\n init,\n ])\n useEffect(() => {\n if (withLoop !== prevWithLoop.current) {\n prevWithLoop.current = withLoop\n internalSlideToItem({ id: 0, immediate: true, shouldReset: true })\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [withLoop])\n useLayoutEffect(() => {\n /**\n * Set initial track position\n */\n if (carouselTrackWrapperRef.current) {\n adjustCarouselWrapperPosition()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n useEffect(() => {\n if (_draggingSlideTreshold) {\n draggingSlideTreshold.current = _draggingSlideTreshold\n } else {\n draggingSlideTreshold.current = Math.floor(getSlideValue() / 2 / 2)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [_draggingSlideTreshold])\n useEffect(() => {\n function handleResize() {\n if (window.innerWidth === prevWindowWidth.current) return\n prevWindowWidth.current = window.innerWidth\n adjustCarouselWrapperPosition()\n }\n if ('ResizeObserver' in window && mainCarouselWrapperRef.current) {\n const observer = new ResizeObserver(() => {\n if (!resizeByPropChange.current) {\n prevWindowWidth.current = window.innerWidth\n adjustCarouselWrapperPosition()\n }\n })\n observer.observe(mainCarouselWrapperRef.current)\n return () => {\n observer.disconnect()\n }\n } else {\n window.addEventListener('resize', handleResize)\n return () => {\n window.removeEventListener('resize', handleResize)\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n carouselSlideAxis,\n initialStartingPosition,\n itemsPerSlide,\n withLoop,\n startEndGutter,\n gutter,\n freeScroll,\n slideType,\n init,\n ])\n\n const bindDrag = useDrag(\n state => {\n const isDragging = state.dragging\n const movement = state.offset[carouselSlideAxis === 'x' ? 0 : 1]\n const currentMovement = state.movement[carouselSlideAxis === 'x' ? 0 : 1]\n const direction = state.direction[carouselSlideAxis === 'x' ? 0 : 1]\n\n const prevItemTreshold = currentMovement > draggingSlideTreshold.current\n const nextItemTreshold = currentMovement < -draggingSlideTreshold.current\n\n if (isDragging) {\n if (direction > 0) {\n slideActionType.current = 'prev'\n } else {\n slideActionType.current = 'next'\n }\n\n emitEvent({\n ...state,\n eventName: 'onDrag',\n slideActionType: slideActionType.current,\n })\n\n if (freeScroll) {\n if (slideActionType.current === 'prev' && movement > 0) {\n state.cancel()\n setSpring.start({\n from: {\n val: getFromValue(),\n },\n to: {\n val: 0,\n },\n config: {\n velocity: state.velocity,\n friction: 50,\n tension: 1000,\n },\n })\n return\n }\n\n setSpring.start({\n from: {\n val: getFromValue(),\n },\n to: {\n val: -movement,\n },\n config: {\n velocity: state.velocity,\n friction: 50,\n tension: 1000,\n },\n })\n return\n }\n\n setSpring.start({\n val: movement,\n config: {\n velocity: state.velocity,\n friction: 50,\n tension: 1000,\n },\n })\n\n if (slideWhenThresholdIsReached && nextItemTreshold) {\n slideToNextItem({ type: 'drag' })\n state.cancel()\n } else if (slideWhenThresholdIsReached && prevItemTreshold) {\n slideToPrevItem({ type: 'drag' })\n state.cancel()\n }\n return\n }\n\n if (state.last && !state.canceled && freeScroll) {\n if (slideActionType.current === 'prev') {\n slideToPrevItem({ type: 'drag' })\n }\n if (slideActionType.current === 'next') {\n slideToNextItem({ type: 'drag' })\n }\n }\n\n if (state.last && !state.canceled && !freeScroll) {\n if (nextItemTreshold) {\n if (!withLoop && lastItemReached.current) {\n setSpring.start({\n val: -getTotalScrollValue(),\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n } else {\n slideToNextItem({ type: 'drag' })\n }\n } else if (prevItemTreshold) {\n if (!withLoop && firstItemReached.current) {\n setSpring.start({\n val: 0,\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n } else {\n slideToPrevItem({ type: 'drag' })\n }\n } else {\n setSpring.start({\n val: prevSlidedValue.current,\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n }\n }\n if (state.last && state.canceled) {\n setSpring.start({\n val: prevSlidedValue.current,\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n }\n },\n {\n enabled:\n (init && !disableGestures && !freeScroll) ||\n (!!freeScroll && !!enableFreeScrollDrag),\n axis: carouselSlideAxis,\n from: () => {\n if (freeScroll && mainCarouselWrapperRef.current) {\n return [\n -mainCarouselWrapperRef.current.scrollLeft,\n -mainCarouselWrapperRef.current.scrollTop,\n ]\n }\n if (carouselSlideAxis === 'x') {\n return [spring.val.get(), spring.val.get()]\n }\n return [spring.val.get(), spring.val.get()]\n },\n },\n )\n\n function getWrapperOverflowStyles() {\n if (freeScroll) {\n if (carouselSlideAxis === 'x') {\n return {\n overflowX: 'auto',\n }\n }\n return {\n overflowY: 'auto',\n }\n }\n return {}\n }\n\n function setStartEndItemReachedOnFreeScroll() {\n if (mainCarouselWrapperRef.current) {\n prevSlidedValue.current =\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ]\n if (\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] === 0\n ) {\n firstItemReached.current = true\n lastItemReached.current = false\n }\n if (\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] > 0 &&\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] < getTotalScrollValue()\n ) {\n firstItemReached.current = false\n lastItemReached.current = false\n }\n\n if (\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] === getTotalScrollValue()\n ) {\n firstItemReached.current = false\n lastItemReached.current = true\n }\n }\n }\n function getScrollHandlers() {\n if (freeScroll) {\n return {\n onWheel() {\n spring.val.stop()\n setStartEndItemReachedOnFreeScroll()\n },\n }\n }\n return {}\n }\n\n function findItemIndex(id: string | number, error?: string) {\n let itemIndex = 0\n\n if (typeof id === 'string') {\n itemIndex = items.findIndex(item => item.id === id)\n } else {\n itemIndex = id\n }\n if (itemIndex < 0 || itemIndex >= items.length) {\n if (error) {\n throw new Error(error)\n }\n console.error(\n `The item doesn't exist; check that the id provided - ${id} - is correct.`,\n )\n itemIndex = -1\n }\n\n return itemIndex\n }\n type InternalSlideToItem = {\n id: string | number\n immediate?: boolean\n shouldReset?: boolean\n }\n function internalSlideToItem({ id, immediate, shouldReset }: InternalSlideToItem) {\n if (!init) return\n\n firstItemReached.current = false\n lastItemReached.current = false\n\n const itemIndex = findItemIndex(\n id,\n \"The item you want to slide to doesn't exist; check the provided id.\",\n )\n\n if (itemIndex === activeItem.current && !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: shouldReset ? 'initial' : 'click',\n index: newActiveItem,\n immediate,\n })\n } else {\n slideToPrevItem({\n type: shouldReset ? 'initial' : 'click',\n index: newActiveItem,\n immediate,\n })\n }\n }\n function getIsNextItem(id: string | number) {\n const itemIndex = findItemIndex(id, \"The item doesn't exist; check the provided id.\")\n const _activeItem = activeItem.current\n if (withLoop && _activeItem === items.length - 1) {\n return itemIndex === 0\n }\n return itemIndex === _activeItem + 1\n }\n function getIsPrevItem(id: string | number) {\n const itemIndex = findItemIndex(id, \"The item doesn't exist; check the provided id.\")\n const _activeItem = activeItem.current\n if (withLoop && _activeItem === 0) {\n return itemIndex === items.length - 1\n }\n return itemIndex === _activeItem - 1\n }\n function getIsActiveItem(id: string | number) {\n return (\n findItemIndex(\n id,\n \"The item you want to check doesn't exist; check the provided id.\",\n ) === activeItem.current\n )\n }\n\n const res = freeScroll\n ? {\n useListenToCustomEvent,\n enterFullscreen,\n exitFullscreen,\n getIsFullscreen,\n slideToPrevItem: () => {\n slideToPrevItem({\n type: 'click',\n })\n },\n slideToNextItem: () => {\n slideToNextItem({\n type: 'click',\n })\n },\n }\n : {\n useListenToCustomEvent,\n enterFullscreen,\n exitFullscreen,\n getIsFullscreen,\n slideToPrevItem: () => {\n slideToPrevItem({\n type: 'click',\n })\n },\n slideToNextItem: () => {\n slideToNextItem({\n type: 'click',\n })\n },\n slideToItem: (id: string | number) => internalSlideToItem({ id }),\n getIsNextItem,\n getIsPrevItem,\n getIsActiveItem,\n }\n\n const _thumbsFragment = (\n <Context.Provider value={res}>{thumbsFragment}</Context.Provider>\n )\n const carouselFragment = (\n <Context.Provider value={res}>\n <div\n className=\"use-spring-carousel-main-wrapper\"\n ref={mainCarouselWrapperRef}\n {...getScrollHandlers()}\n style={{\n display: 'flex',\n position: 'relative',\n width: '100%',\n height: '100%',\n ...(getWrapperOverflowStyles() as React.CSSProperties),\n }}\n >\n <div\n className=\"use-spring-carousel-track-wrapper\"\n ref={carouselTrackWrapperRef}\n {...bindDrag()}\n style={{\n position: 'relative',\n display: 'flex',\n flexDirection: carouselSlideAxis === 'x' ? 'row' : 'column',\n touchAction: 'none',\n ...getAnimatedWrapperStyles(),\n }}\n >\n {(freeScroll || !withLoop) && startEndGutter ? (\n <div\n style={{\n flexShrink: 0,\n width: startEndGutter,\n }}\n />\n ) : null}\n {internalItems.map((item, index) => {\n return (\n <div\n key={`${item.id}-${index}`}\n className=\"use-spring-carousel-item\"\n data-testid=\"use-spring-carousel-item-wrapper\"\n style={{\n display: 'flex',\n position: 'relative',\n flex: '1',\n ...getItemStyles(!!freeScroll && index === items.length - 1),\n }}\n >\n {typeof item.renderItem === 'function'\n ? item.renderItem({\n getIsActiveItem,\n getIsNextItem,\n getIsPrevItem,\n useListenToCustomEvent,\n })\n : item.renderItem}\n </div>\n )\n })}\n {freeScroll && startEndGutter ? (\n <div\n style={{\n flexShrink: 0,\n width: startEndGutter,\n }}\n />\n ) : null}\n </div>\n </div>\n </Context.Provider>\n )\n\n return { ...res, carouselFragment, thumbsFragment: _thumbsFragment }\n}\n\ntype ContextProps<T = undefined> = Omit<\n ReturnType<T extends 'free-scroll' ? true : false>,\n 'carouselFragment' | 'thumbsFragment'\n>\n\nconst Context =\n createContext<ContextProps | ContextProps<'free-scroll'> | undefined>(undefined)\n\nfunction useSpringCarouselContext<T>() {\n const context = useContext(Context)\n if (!context) {\n throw new Error('useSpringCarouselContext must be used within the carousel.')\n }\n return context as ContextProps<T>\n}\n\nexport { useSpringCarousel, useSpringCarouselContext }\n","import { a, config, useTransition } from '@react-spring/web'\nimport { useEffect, useRef, useState, createContext, useContext } from 'react'\nimport { useEventsModule } from './modules/useEventsModule'\nimport { useDrag } from '@use-gesture/react'\nimport { useThumbsModule } from './modules'\nimport {\n ItemWithThumb,\n UseTransitionCarouselProps,\n UseTransitionCarouselReturnProps,\n SlideActionType,\n TransitionSlideMode,\n} from './types'\n\nconst defaultAnimationProps = {\n initial: {\n opacity: 1,\n position: 'relative',\n },\n from: {\n opacity: 0,\n position: 'relative',\n },\n enter: {\n position: 'relative',\n opacity: 1,\n },\n leave: {\n opacity: 1,\n position: 'absolute',\n },\n}\n\nfunction useTransitionCarousel({\n init = true,\n disableGestures = false,\n items,\n springConfig = config.default,\n exitBeforeEnter = false,\n trail,\n withLoop = false,\n activeItem: externalActiveItem,\n toPrevItemSpringProps = defaultAnimationProps,\n toNextItemSpringProps = defaultAnimationProps,\n draggingSlideTreshold = 50,\n thumbsSlideAxis = 'x',\n}: UseTransitionCarouselProps): UseTransitionCarouselReturnProps {\n const slideActionType = useRef<SlideActionType>('next')\n const slideModeType = useRef<TransitionSlideMode>('initial')\n const mainCarouselWrapperRef = useRef<HTMLDivElement | null>(null)\n const [activeItem, setActiveItem] = useState(externalActiveItem ?? 0)\n const { emitEvent, useListenToCustomEvent } = useEventsModule<'use-transition'>()\n const { handleScroll, thumbsFragment } = useThumbsModule({\n thumbsSlideAxis,\n items: items as ItemWithThumb[],\n })\n\n function getConfig() {\n if (slideActionType.current === 'prev') {\n return {\n initial: {\n ...toPrevItemSpringProps.initial,\n },\n from: {\n ...toPrevItemSpringProps.from,\n },\n enter: {\n ...toPrevItemSpringProps.enter,\n },\n leave: {\n ...toPrevItemSpringProps.leave,\n },\n }\n }\n if (slideActionType.current === 'next') {\n return {\n initial: {\n ...toNextItemSpringProps.initial,\n },\n from: {\n ...toNextItemSpringProps.from,\n },\n enter: {\n ...toNextItemSpringProps.enter,\n },\n leave: {\n ...toNextItemSpringProps.leave,\n },\n }\n }\n return {\n initial: {\n ...defaultAnimationProps.initial,\n },\n from: {\n ...defaultAnimationProps.from,\n },\n enter: {\n ...defaultAnimationProps.enter,\n },\n leave: {\n ...defaultAnimationProps.leave,\n },\n }\n }\n\n useEffect(() => {\n if (typeof externalActiveItem === 'number' && externalActiveItem !== activeItem) {\n setActiveItem(externalActiveItem)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [externalActiveItem])\n\n type SlideToItem = {\n to: number\n slideType: SlideActionType\n slideMode: TransitionSlideMode\n }\n\n function slideToItem({ to, slideType, slideMode }: SlideToItem) {\n slideActionType.current = slideType\n slideModeType.current = slideMode\n emitEvent({\n eventName: 'onSlideStartChange',\n slideActionType: slideActionType.current,\n slideMode: slideModeType.current,\n nextItem: {\n index: to,\n id: items[to].id,\n startReached: to === 0,\n endReached: to === items.length - 1,\n },\n })\n setActiveItem(to)\n handleScroll(activeItem)\n }\n\n function slideToPrevItem(slideMode: TransitionSlideMode) {\n if (!init) return\n const isFirstItem = activeItem === 0\n\n if (!withLoop && isFirstItem) return\n\n if (withLoop && isFirstItem) {\n slideToItem({\n to: items.length - 1,\n slideType: 'prev',\n slideMode,\n })\n } else {\n slideToItem({\n to: activeItem - 1,\n slideType: 'prev',\n slideMode,\n })\n }\n }\n function slideToNextItem(slideMode: TransitionSlideMode) {\n if (!init) return\n const isLastItem = activeItem === items.length - 1\n\n if (!withLoop && isLastItem) return\n\n if (withLoop && isLastItem) {\n slideToItem({\n to: 0,\n slideType: 'next',\n slideMode,\n })\n } else {\n slideToItem({\n to: activeItem + 1,\n slideType: 'next',\n slideMode,\n })\n }\n }\n\n const transitions = useTransition(activeItem, {\n config: springConfig,\n key: null,\n trail,\n exitBeforeEnter,\n ...getConfig(),\n onRest(value, _, index) {\n if (value.finished && index === activeItem) {\n emitEvent({\n eventName: 'onSlideChange',\n slideActionType: slideActionType.current,\n slideMode: slideModeType.current,\n currentItem: {\n index: activeItem,\n id: items[activeItem].id,\n startReached: activeItem === 0,\n endReached: activeItem === items.length - 1,\n },\n })\n }\n },\n })\n\n const bindSwipe = useDrag(\n ({ last, movement: [mx] }) => {\n if (last) {\n const prevItemTreshold = mx > draggingSlideTreshold\n const nextItemTreshold = mx < -draggingSlideTreshold\n const isFirstItem = activeItem === 0\n const isLastItem = activeItem === items.length - 1\n\n if (nextItemTreshold) {\n if (!withLoop && isLastItem) return\n\n emitEvent({\n eventName: 'onLeftSwipe',\n })\n slideToNextItem('swipe')\n } else if (prevItemTreshold) {\n if (!withLoop && isFirstItem) return\n\n emitEvent({\n eventName: 'onRightSwipe',\n })\n slideToPrevItem('swipe')\n }\n }\n },\n {\n enabled: !disableGestures,\n },\n )\n\n const itemsFragment = transitions((styles, item, _, indx) => {\n return (\n <a.div\n id={`use-transition-carousel-item-${indx}`}\n className=\"use-transition-carousel-item\"\n style={{\n ...styles,\n flex: '1 0 100%',\n width: '100%',\n height: '100%',\n }}\n >\n {items[item].renderItem}\n </a.div>\n )\n })\n\n const res = {\n useListenToCustomEvent,\n slideToPrevItem: () => slideToPrevItem('click'),\n slideToNextItem: () => slideToNextItem('click'),\n }\n\n const _thumbsFragment = (\n <Context.Provider value={res}>{thumbsFragment}</Context.Provider>\n )\n const carouselFragment = (\n <Context.Provider value={res}>\n <div\n ref={mainCarouselWrapperRef}\n {...bindSwipe()}\n style={{\n display: 'flex',\n position: 'relative',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n {itemsFragment}\n </div>\n </Context.Provider>\n )\n\n return {\n ...res,\n carouselFragment,\n thumbsFragment: _thumbsFragment,\n }\n}\n\ntype ContextProps = Omit<\n UseTransitionCarouselReturnProps,\n 'carouselFragment' | 'thumbsFragment'\n>\n\nconst Context = createContext<ContextProps | undefined>(undefined)\n\nfunction useTransitionCarouselContext() {\n const context = useContext(Context)\n if (!context) {\n throw new Error('useTransitionCarouselContext must be used within the carousel.')\n }\n return context\n}\n\nexport { useTransitionCarousel, useTransitionCarouselContext }\n"],"names":["eventLabel","useEventsModule","targetEvent","useRef","useListenToCustomEvent","eventHandler","useEffect","handleEvent","event","detail","current","document","createElement","addEventListener","_a","removeEventListener","emitEvent","newEvent","CustomEvent","dispatchEvent","useFullscreenModule","mainCarouselWrapperRef","onFullScreenChange","handleResize","isFullscreen","setIsFullscreen","_isFullscreen","handleFullscreenChange","fullscreenElement","screenfull","isEnabled","on","off","enterFullscreen","elementRef","request","exitFullscreen","exit","getIsFullscreen","useThumbsModule","thumbsSlideAxis","withThumbs","prepareThumbsData","items","wrapperRef","spring","setSpring","useSpring","val","getTotalScrollValue","Math","round","Number","getBoundingClientRect","thumbsFragment","_jsx","jsx","Object","assign","className","ref","onWheel","stop","style","display","flex","position","width","height","flexDirection","overflowX","overflowY","maxHeight","children","getPreparedItems","_items","map","i","id","renderThumb","handlePrepareThumbsData","thumbId","handleScroll","activeItem","thumbNode","querySelector","el","rect","top","left","bottom","window","innerHeight","documentElement","clientHeight","right","innerWidth","clientWidth","isInViewport","offset","offsetLeft","start","from","to","onChange","value","abs","Context","createContext","undefined","defaultAnimationProps","initial","opacity","enter","leave","init","itemsPerSlide","_itemsPerSlide","slideType","gutter","withLoop","startEndGutter","carouselSlideAxis","disableGestures","draggingSlideTreshold","_draggingSlideTreshold","slideWhenThresholdIsReached","freeScroll","enableFreeScrollDrag","initialStartingPosition","initialActiveItem","animateWhenActiveItemChange","resizeByPropChange","length","prevWindowWidth","slideActionType","slideModeType","prevSlidedValue","pause","scrollLeft","scrollTop","setStartEndItemReachedOnFreeScroll","carouselTrackWrapperRef","transform","firstItemReached","lastItemReached","prevWithLoop","internalItems","useCallback","getItems","adjustCarouselWrapperPosition","eventName","getSlideValue","carouselItem","Error","slideToItem","nextActiveItem","immediate","slideMode","nextItem","startReached","endReached","index","config","default","velocity","onRest","finished","currentItem","getCarouselItemWidth","positionProperty","setPosition","v","currentFromValue","getFromValue","setTimeout","get","getToValue","type","next","slideToPrevItem","nextItemWillExceed","slideToNextItem","internalSlideToItem","console","warn","shouldReset","useLayoutEffect","floor","observer","ResizeObserver","observe","disconnect","bindDrag","useDrag","state","isDragging","dragging","movement","currentMovement","direction","prevItemTreshold","nextItemTreshold","cancel","friction","tension","last","canceled","enabled","axis","findItemIndex","error","itemIndex","findIndex","item","newActiveItem","getIsNextItem","_activeItem","getIsPrevItem","getIsActiveItem","res","_thumbsFragment","Provider","carouselFragment","_jsxs","touchAction","percentValue","getAnimatedWrapperStyles","flexShrink","isLastItem","marginRight","renderItem","context","useContext","springConfig","exitBeforeEnter","trail","externalActiveItem","toPrevItemSpringProps","toNextItemSpringProps","setActiveItem","useState","isFirstItem","transitions","useTransition","key","_","bindSwipe","mx","itemsFragment","styles","indx","a","div","overflow"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-spring-carousel",
3
- "version": "3.0.0-beta034",
3
+ "version": "3.0.0-beta035",
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",