react-spring-carousel 3.0.0-beta059 → 3.0.0-beta061
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"),s=require("resize-observer-polyfill");const c="RSC::Event";function o(){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(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: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 l({thumbsSlideAxis:r="x",withThumbs:i=!1,prepareThumbsData:s,items:c,renderThumbFnProps:o}){const u=n.useRef(null),[l,a]=t.useSpring((()=>({val:0})));function d(){var e;return Math.round(Number(null===(e=u.current)||void 0===e?void 0:e["x"===r?"scrollWidth":"scrollHeight"])-u.current.getBoundingClientRect()["x"===r?"width":"height"])}return{thumbsFragment:i?e.jsx("div",Object.assign({className:"use-spring-carousel-thumbs-wrapper",ref:u,onWheel:()=>l.val.stop(),style:Object.assign({display:"flex",flex:"1",position:"relative",width:"100%",height:"100%",flexDirection:"x"===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:"function"==typeof n?n(o):n}),r)}))})):null,handleScroll:function(e){var t,n;const i=u.current?u.current.querySelector(`#thumb-item-${c[e].id}`):null;if(i&&u.current&&!function(e){const t=e.getBoundingClientRect();return t.top>=0&&t.left>=0&&t.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&t.right<=(window.innerWidth||document.documentElement.clientWidth)}(i)){const e=i.offsetLeft,s=e>d()?d():e;a.start({from:{val:null!==(n=null===(t=u.current)||void 0===t?void 0:t["x"===r?"scrollLeft":"scrollTop"])&&void 0!==n?n:0},to:{val:s},onChange:({value:e})=>{u.current&&(u.current["x"===r?"scrollLeft":"scrollTop"]=Math.abs(e.val))}})}}}}const a=n.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=n.createContext(void 0);exports.useEventsModule=o,exports.useFullscreenModule=u,exports.useSpringCarousel=function({items:i,init:c=!0,withThumbs:d,thumbsSlideAxis:f="x",itemsPerSlide:m=1,slideType:h="fixed",gutter:g=0,withLoop:v=!1,startEndGutter:p=0,carouselSlideAxis:x="x",disableGestures:b=!1,draggingSlideTreshold:y,slideWhenThresholdIsReached:T=!1,freeScroll:I,enableFreeScrollDrag:j,initialStartingPosition:w,prepareThumbsData:E,initialActiveItem:O=0,animateWhenActiveItemChange:R=!0,getControllerRef:C}){const S=m>i.length?i.length:m,M=n.useRef(!1),N=n.useRef(null!=y?y:0),F=n.useRef("initial"),L=n.useRef("initial"),k=n.useRef("initial"),A=n.useRef(O),P=n.useRef(0===O),$=n.useRef("fixed"===h&&O===i.length-1),q=n.useRef(null),W=n.useRef(null),D=n.useRef(!0),B=n.useRef(0),H=n.useRef(0),z=n.useRef(0),G=n.useRef(v),X=n.useRef(h),Y=n.useRef(I),J=n.useRef(!1),K=n.useCallback((()=>v?[...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,v])(),[Q,U]=t.useSpring((()=>({val:0,pause:!c,onChange:({value:e})=>{I&&q.current?("x"===x?q.current.scrollLeft=Math.abs(e.val):q.current.scrollTop=Math.abs(e.val),ge()):W.current&&(W.current.style.transform="x"===x?`translate3d(${e.val}px, 0px,0px)`:`translate3d(0px,${e.val}px,0px)`)}})),[I]),{emitEvent:V,useListenToCustomEvent:Z}=o(),{thumbsFragment:_,handleScroll:ee}=l({withThumbs:!!d,thumbsSlideAxis:f,prepareThumbsData:E,items:i,renderThumbFnProps:{getIsActiveItem:ye,getIsPrevItem:be,useListenToCustomEvent:Z,getIsNextItem:xe}}),{enterFullscreen:te,exitFullscreen:ne,getIsFullscreen:re}=u({mainCarouselWrapperRef:q,handleResize:()=>ue(),onFullScreenChange:e=>{V({eventName:"onFullscreenChange",isFullscreen:e})}});function ie(){var e;const t=null===(e=q.current)||void 0===e?void 0:e.querySelector(".use-spring-carousel-item");if(!t)throw Error("No carousel items available!");return t.getBoundingClientRect()["x"===x?"width":"height"]+g}function se({from:e,to:n,nextActiveItem:r,immediate:s=!1,slideMode:c}){L.current=c,"number"==typeof r&&(I||(A.current=r),V({eventName:"onSlideStartChange",slideActionType:F.current,slideMode:L.current,nextItem:{startReached:P.current,endReached:$.current,index:I?-1:A.current,id:I?"":i[A.current].id}})),z.current=n,U.start({immediate:s,from:{val:e},to:{val:n},config:Object.assign(Object.assign({},t.config.default),{velocity:Q.val.velocity}),onRest(e){!s&&e.finished&&V({eventName:"onSlideChange",slideActionType:F.current,slideMode:L.current,currentItem:{startReached:P.current,endReached:$.current,index:I?-1:A.current,id:I?"":i[A.current].id}})}}),d&&!s&&ee(A.current)}function ce(){var e;return v?ie()*i.length:Math.round(Number(null===(e=W.current)||void 0===e?void 0:e["x"===x?"scrollWidth":"scrollHeight"])-W.current.getBoundingClientRect()["x"===x?"width":"height"]-2*p)}function oe(){var e;const t=null===(e=W.current)||void 0===e?void 0:e.querySelector(".use-spring-carousel-item");if(!t)throw Error("No carousel items available!");return t.getBoundingClientRect()["x"===x?"width":"height"]+g}function ue(){const e="x"===x?"left":"top";function t(t){const n=W.current;n&&(v?(n.style.top="0px",n.style.left="0px",n.style[e]=`-${t-p}px`,P.current=!1,$.current=!1):(n.style.left="0px",n.style.top="0px"))}if("fixed"===h&&v&&t("center"===w?oe()*i.length-ie()*Math.round((S-1)/2):"end"===w?oe()*i.length-ie()*Math.round(S-1):oe()*i.length),"fluid"!==h){if(!I&&"fixed"===h){const e=-ie()*A.current;if(Math.abs(e)>ce()&&!v){const e=-ce();$.current=!0,z.current=e,U.start({immediate:!0,val:z.current})}else z.current=e,U.start({immediate:!0,val:e});setTimeout((()=>{M.current=!1}),0)}}else{if($.current&&ce()!==Math.abs(z.current)&&!v){const e=-ce();return z.current=e,void U.start({immediate:!0,val:z.current})}if(Math.abs(z.current)>0&&ce()!==Math.abs(z.current)&&!v&&!I&&"backward"===k.current){const e=B.current-ce(),t=z.current+e;return U.start({immediate:!0,val:t}),()=>{z.current=t}}}}function le(){return I&&q.current?q.current["x"===x?"scrollLeft":"scrollTop"]:Q.val.get()}function ae(e,t){if(I&&"next"===e){const e=z.current+ie();return e>ce()?ce():e}if(I&&"prev"===e){const e=z.current-ie();return e<0?0:e}return"next"===e?"number"==typeof t?-t*ie():z.current-ie():"number"==typeof t?-t*ie():z.current+ie()}function de({type:e,index:t,immediate:n}){if(!c||J.current||P.current&&!v)return;$.current&&(k.current="backward"),F.current="prev",$.current=!1;const r="number"==typeof t?t:A.current-1;if(!v){const r=I?ae("prev",t)-ie()/3<0:ae("prev",t)+ie()/3>0;if(P.current)return;if(r)return P.current=!0,$.current=!1,void se({slideMode:e,from:le(),to:0,nextActiveItem:0,immediate:n})}if(v&&(P.current||r<0))return P.current=!1,$.current=!0,void se({slideMode:e,from:le()-ie()*i.length,to:-ie()*i.length+ie(),nextActiveItem:i.length-1,immediate:n});0===r&&(P.current=!0),r!==i.length-1&&-1!==r||($.current=!0),se({slideMode:e,from:le(),to:ae("prev",t),nextActiveItem:r,immediate:n})}function fe({type:e,index:t,immediate:n}){if(!c||J.current||$.current&&!v)return;P.current&&(k.current="forward"),F.current="next",P.current=!1;const r=t||A.current+1;if(!v){const i=Math.abs(ae("next",t))>ce()-ie()/3;if($.current)return;if(i)return P.current=!1,$.current=!0,void se({slideMode:e,from:le(),to:I?ce():-ce(),nextActiveItem:r,immediate:n})}if(v&&($.current||r>i.length-1))return $.current=!1,P.current=!0,void se({slideMode:e,from:le()+ie()*i.length,to:0,nextActiveItem:0,immediate:n});0===r&&(P.current=!0),r===i.length-1&&($.current=!0),se({slideMode:e,from:le(),to:ae("next",t),nextActiveItem:r,immediate:n})}function me(){return N.current=y||Math.floor(ie()/2/2),N.current}n.useEffect((()=>{A.current!==O&&pe({id:O,immediate:!R})}),[O]),n.useEffect((()=>{if(c){if(O>i.length-1)throw new Error(`initialActiveItem (${O}) is greater than the total quantity available items (${i.length}).`);S>i.length&&console.warn(`itemsPerSlide (${S}) is greater than the total quantity available items (${i.length}). Fallback to ${i.length})`)}}),[O,i,S,c]),n.useEffect((()=>{H.current=window.innerWidth}),[]),n.useEffect((()=>{B.current=ce(),D.current||(M.current=!0,ue())}),[w,S,p,g,c,ce]),n.useEffect((()=>{v===G.current&&h===X.current&&I===Y.current||(G.current=v,X.current=h,Y.current=I,W.current&&(W.current.style.transform="translate3d(0px, 0px,0px)",U.start({val:0,immediate:!0})),pe({id:0,immediate:!0,shouldReset:!0}))}),[v,h,I]),t.useIsomorphicLayoutEffect((()=>{W.current&&ue()}),[]),n.useEffect((()=>{me()}),[y,S,h]),n.useEffect((()=>{if(q.current){let e;const t=new s((()=>{if(D.current)D.current=!1;else if(!J.current&&!M.current){H.current=window.innerWidth;const t=ue();window.clearTimeout(e),e=setTimeout((()=>{B.current=ce(),"function"==typeof t&&t()}),100)}}));return t.observe(q.current),()=>{t.disconnect()}}}),[ue,ce]),n.useEffect((()=>{if(c)return document.addEventListener("visibilitychange",e),()=>{document.removeEventListener("visibilitychange",e)};function e(){document.hidden?J.current=!0:J.current=!1}}),[c]);const he=r.useDrag((e=>{const n=e.dragging,r=e.offset["x"===x?0:1],i=e.movement["x"===x?0:1],s=e.direction["x"===x?0:1],c=i>me(),o=i<-me(),u=ce();if(n){if(F.current=s>0?"prev":"next",V(Object.assign(Object.assign({},e),{eventName:"onDrag",slideActionType:F.current})),I)return r>0?(U.start({from:{val:le()},to:{val:0},config:{velocity:e.velocity,friction:50,tension:1e3}}),void e.cancel()):void U.start({from:{val:le()},to:{val:-r},config:{velocity:e.velocity,friction:50,tension:1e3}});U.start({val:r,config:{velocity:e.velocity,friction:50,tension:1e3}}),T&&o?(fe({type:"drag"}),e.cancel()):T&&c&&(de({type:"drag"}),e.cancel());u-Math.abs(r)<-2*ie()&&e.cancel()}else e.last&&I&&r>0?U.start({from:{val:le()},to:{val:0},config:{velocity:e.velocity,friction:50,tension:1e3}}):(e.last&&!e.canceled&&I&&("prev"===F.current&&de({type:"drag"}),"next"===F.current&&fe({type:"drag"})),!e.last||e.canceled||I||(o?!v&&$.current?U.start({val:-ce(),config:Object.assign(Object.assign({},t.config.default),{velocity:e.velocity})}):fe({type:"drag"}):c?!v&&P.current?U.start({val:0,config:Object.assign(Object.assign({},t.config.default),{velocity:e.velocity})}):de({type:"drag"}):U.start({val:z.current,config:Object.assign(Object.assign({},t.config.default),{velocity:e.velocity})})),e.last&&e.canceled&&U.start({val:z.current,config:Object.assign(Object.assign({},t.config.default),{velocity:e.velocity})}))}),{enabled:c&&!b&&!I||!!I&&!!j,axis:x,from:()=>I&&q.current?[-q.current.scrollLeft,-q.current.scrollTop]:[Q.val.get(),Q.val.get()]});function ge(){q.current&&(z.current=q.current["x"===x?"scrollLeft":"scrollTop"],0===q.current["x"===x?"scrollLeft":"scrollTop"]&&(P.current=!0,$.current=!1),q.current["x"===x?"scrollLeft":"scrollTop"]>0&&q.current["x"===x?"scrollLeft":"scrollTop"]<ce()&&(P.current=!1,$.current=!1),q.current["x"===x?"scrollLeft":"scrollTop"]===ce()&&(P.current=!1,$.current=!0))}function ve(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 pe({id:e,immediate:t,shouldReset:n,type:r}){if(!c||J.current)return;P.current=!1,$.current=!1;const s=ve(e,"The item you want to slide to doesn't exist; check the provided id.");if(s===A.current&&!n)return;const o=ve(i[A.current].id),u=ve(i[s].id);u>o?fe({type:r||n?"initial":"click",index:u,immediate:t}):de({type:r||n?"initial":"click",index:u,immediate:t})}function xe(e){const t=ve(e,"The item doesn't exist; check the provided id."),n=A.current;return v&&n===i.length-1?0===t:t===n+1}function be(e){const t=ve(e,"The item doesn't exist; check the provided id."),n=A.current;return v&&0===n?t===i.length-1:t===n-1}function ye(e){return ve(e,"The item you want to check doesn't exist; check the provided id.")===A.current}const Te=I?{useListenToCustomEvent:Z,enterFullscreen:te,exitFullscreen:ne,getIsFullscreen:re,slideToPrevItem:(e=!0)=>{de({type:"click",immediate:!e})},slideToNextItem:(e=!0)=>{fe({type:"click",immediate:!e})}}:{useListenToCustomEvent:Z,enterFullscreen:te,exitFullscreen:ne,getIsFullscreen:re,slideToPrevItem:(e=!0)=>{de({type:"click",immediate:!e})},slideToNextItem:(e=!0)=>{fe({type:"click",immediate:!e})},slideToItem:(e,t=!0)=>{pe({id:e,immediate:!t})},getIsNextItem:xe,getIsPrevItem:be,getIsActiveItem:ye};n.useEffect((()=>{C&&C({slideToNextItem:Te.slideToNextItem,slideToPrevItem:Te.slideToPrevItem,slideToItem:null==Te?void 0:Te.slideToItem})}),[C,Te.slideToItem,Te.slideToNextItem,Te.slideToPrevItem]);const Ie=e.jsx(a.Provider,Object.assign({value:Te},{children:_})),je=e.jsx(a.Provider,Object.assign({value:Te},{children:e.jsx("div",Object.assign({className:"use-spring-carousel-main-wrapper",ref:q},I?{onWheel(){Q.val.stop(),ge()}}:{},{style:Object.assign({display:"flex",position:"relative",width:"100%",height:"100%"},I?"x"===x?{overflowX:"auto"}:{overflowY:"auto"}:{})},{children:e.jsxs("div",Object.assign({className:"use-spring-carousel-track-wrapper",ref:W},he(),{style:Object.assign({position:"relative",display:"flex",flexDirection:"x"===x?"row":"column",touchAction:"none"},function(){const e=`calc(100% - ${2*p}px)`;return{width:"x"===x?e:"100%",height:"y"===x?e:"100%"}}())},{children:[!I&&v||!p?null:e.jsx("div",{style:{flexShrink:0,width:p}}),K.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=n===K.findIndex((e=>e.id===i[K.length-1].id)),"fixed"!==h||I?Object.assign({marginRight:`${r?0:g}px`}):{marginRight:`${r?0:g}px`,flex:`1 0 calc(100% / ${S} - ${g*(S-1)/S}px)`}))},{children:"function"==typeof t.renderItem?t.renderItem({getIsActiveItem:ye,getIsNextItem:xe,getIsPrevItem:be,useListenToCustomEvent:Z}):t.renderItem}),`${t.id}-${n}`);var r})),!I&&v||!p?null:e.jsx("div",{style:{flexShrink:0,width:p}})]}))}))}));return Object.assign(Object.assign({},Te),{carouselFragment:je,thumbsFragment:Ie})},exports.useSpringCarouselContext=function(){const e=n.useContext(a);if(!e)throw new Error("useSpringCarouselContext must be used within the carousel.");return e},exports.useThumbsModule=l,exports.useTransitionCarousel=function({init:i=!0,disableGestures:s=!1,items:c,springConfig:u=t.config.default,exitBeforeEnter:a=!1,trail:m,withLoop:h=!1,activeItem:g,toPrevItemSpringProps:v=d,toNextItemSpringProps:p=d,draggingSlideTreshold:x=50,thumbsSlideAxis:b="x"}){const y=n.useRef("next"),T=n.useRef("initial"),I=n.useRef(null),[j,w]=n.useState(null!=g?g:0),{emitEvent:E,useListenToCustomEvent:O}=o(),{handleScroll:R,thumbsFragment:C}=l({thumbsSlideAxis:b,items:c,renderThumbFnProps:{getIsNextItem:A,getIsPrevItem:P,useListenToCustomEvent:O,activeItem:{index:j,id:c[j].id}}});function S({to:e,slideType:t,slideMode:n}){y.current=t,T.current=n,E({eventName:"onSlideStartChange",slideActionType:y.current,slideMode:T.current,nextItem:{index:e,id:c[e].id,startReached:0===e,endReached:e===c.length-1}}),w(e),R(j)}function M(e){if(!i)return;const t=0===j;!h&&t||S(h&&t?{to:c.length-1,slideType:"prev",slideMode:e}:{to:j-1,slideType:"prev",slideMode:e})}function N(e){if(!i)return;const t=j===c.length-1;!h&&t||S(h&&t?{to:0,slideType:"next",slideMode:e}:{to:j+1,slideType:"next",slideMode:e})}n.useEffect((()=>{"number"==typeof g&&g!==j&&w(g)}),[g]);const F=t.useTransition(j,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===j&&E({eventName:"onSlideChange",slideActionType:y.current,slideMode:T.current,currentItem:{index:j,id:c[j].id,startReached:0===j,endReached:j===c.length-1}})}})),L=r.useDrag((({last:e,movement:[t]})=>{if(e){const e=t>x,n=t<-x,r=0===j,i=j===c.length-1;if(n){if(!h&&i)return;E({eventName:"onLeftSwipe"}),N("swipe")}else if(e){if(!h&&r)return;E({eventName:"onRightSwipe"}),M("swipe")}}}),{enabled:!s});function k(e,t){let n=0;if(n="string"==typeof e?c.findIndex((t=>t.id===e)):e,n<0||n>=c.length){if(t)throw new Error(t);console.error(`The item doesn't exist; check that the id provided - ${e} - is correct.`),n=-1}return n}function A(e){const t=k(e,"The item doesn't exist; check the provided id."),n=j;return h&&n===c.length-1?0===t:t===n+1}function P(e){const t=k(e,"The item doesn't exist; check the provided id."),n=j;return h&&0===n?t===c.length-1:t===n-1}const $=F(((n,r,i,s)=>{const o=c[r].renderItem;return 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:"function"==typeof o?o({useListenToCustomEvent:O,getIsNextItem:A,getIsPrevItem:P,activeItem:{index:j,id:c[j].id}}):o}))})),q={useListenToCustomEvent:O,slideToPrevItem:()=>M("click"),slideToNextItem:()=>N("click")},W=e.jsx(f.Provider,Object.assign({value:q},{children:C})),D=e.jsx(f.Provider,Object.assign({value:q},{children:e.jsx("div",Object.assign({ref:I},L(),{style:{display:"flex",position:"relative",width:"100%",height:"100%",overflow:"hidden"}},{children:$}))}));return Object.assign(Object.assign({},q),{carouselFragment:D,thumbsFragment:W})},exports.useTransitionCarouselContext=function(){const e=n.useContext(f);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"),s=require("resize-observer-polyfill");const c="RSC::Event";function o(){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(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: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 l({thumbsSlideAxis:r="x",withThumbs:i=!1,prepareThumbsData:s,items:c,renderThumbFnProps:o}){const u=n.useRef(null),[l,a]=t.useSpring((()=>({val:0})));function d(){var e;return Math.round(Number(null===(e=u.current)||void 0===e?void 0:e["x"===r?"scrollWidth":"scrollHeight"])-u.current.getBoundingClientRect()["x"===r?"width":"height"])}return{thumbsFragment:i?e.jsx("div",Object.assign({className:"use-spring-carousel-thumbs-wrapper",ref:u,onWheel:()=>l.val.stop(),style:Object.assign({display:"flex",flex:"1",position:"relative",width:"100%",height:"100%",flexDirection:"x"===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:"function"==typeof n?n(o):n}),r)}))})):null,handleScroll:function(e){var t,n;const i=u.current?u.current.querySelector(`#thumb-item-${c[e].id}`):null;if(i&&u.current&&!function(e){const t=e.getBoundingClientRect();return t.top>=0&&t.left>=0&&t.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&t.right<=(window.innerWidth||document.documentElement.clientWidth)}(i)){const e=i.offsetLeft,s=e>d()?d():e;a.start({from:{val:null!==(n=null===(t=u.current)||void 0===t?void 0:t["x"===r?"scrollLeft":"scrollTop"])&&void 0!==n?n:0},to:{val:s},onChange:({value:e})=>{u.current&&(u.current["x"===r?"scrollLeft":"scrollTop"]=Math.abs(e.val))}})}}}}const a=n.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=n.createContext(void 0);exports.useEventsModule=o,exports.useFullscreenModule=u,exports.useSpringCarousel=function({items:i,init:c=!0,withThumbs:d,thumbsSlideAxis:f="x",itemsPerSlide:m=1,slideType:h="fixed",gutter:g=0,withLoop:v=!1,startEndGutter:p=0,carouselSlideAxis:x="x",disableGestures:b=!1,draggingSlideTreshold:y,slideWhenThresholdIsReached:T=!1,freeScroll:I,enableFreeScrollDrag:j,initialStartingPosition:w,prepareThumbsData:E,initialActiveItem:O=0,animateWhenActiveItemChange:R=!0,getControllerRef:C}){const S=m>i.length?i.length:m,M=n.useRef(!1),N=n.useRef(null!=y?y:0),F=n.useRef("initial"),L=n.useRef("initial"),k=n.useRef("initial"),A=n.useRef(O),P=n.useRef(0===O),$=n.useRef("fixed"===h&&O===i.length-1),q=n.useRef(null),W=n.useRef(null),D=n.useRef(!0),B=n.useRef(0),H=n.useRef(0),z=n.useRef(0),G=n.useRef(v),X=n.useRef(h),Y=n.useRef(I),J=n.useRef(!1),K=n.useCallback((()=>v?[...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,v])(),[Q,U]=t.useSpring((()=>({val:0,pause:!c,onChange:({value:e})=>{I&&q.current?("x"===x?q.current.scrollLeft=Math.abs(e.val):q.current.scrollTop=Math.abs(e.val),ge()):W.current&&(W.current.style.transform="x"===x?`translate3d(${e.val}px, 0px,0px)`:`translate3d(0px,${e.val}px,0px)`)}})),[I]),{emitEvent:V,useListenToCustomEvent:Z}=o(),{thumbsFragment:_,handleScroll:ee}=l({withThumbs:!!d,thumbsSlideAxis:f,prepareThumbsData:E,items:i,renderThumbFnProps:{getIsActiveItem:ye,getIsPrevItem:be,useListenToCustomEvent:Z,getIsNextItem:xe}}),{enterFullscreen:te,exitFullscreen:ne,getIsFullscreen:re}=u({mainCarouselWrapperRef:q,handleResize:()=>ue(),onFullScreenChange:e=>{V({eventName:"onFullscreenChange",isFullscreen:e})}});function ie(){var e;const t=null===(e=q.current)||void 0===e?void 0:e.querySelector(".use-spring-carousel-item");if(!t)throw Error("No carousel items available!");return t.getBoundingClientRect()["x"===x?"width":"height"]+g}function se({from:e,to:n,nextActiveItem:r,immediate:s=!1,slideMode:c}){L.current=c,"number"==typeof r&&(I||(A.current=r),V({eventName:"onSlideStartChange",slideActionType:F.current,slideMode:L.current,nextItem:{startReached:P.current,endReached:$.current,index:I?-1:A.current,id:I?"":i[A.current].id}})),z.current=n,U.start({immediate:s,from:{val:e},to:{val:n},config:Object.assign(Object.assign({},t.config.default),{velocity:Q.val.velocity}),onRest(e){!s&&e.finished&&V({eventName:"onSlideChange",slideActionType:F.current,slideMode:L.current,currentItem:{startReached:P.current,endReached:$.current,index:I?-1:A.current,id:I?"":i[A.current].id}})}}),d&&!s&&ee(A.current)}function ce(){var e;return v?ie()*i.length:Math.round(Number(null===(e=W.current)||void 0===e?void 0:e["x"===x?"scrollWidth":"scrollHeight"])-W.current.getBoundingClientRect()["x"===x?"width":"height"]-2*p)}function oe(){var e;const t=null===(e=W.current)||void 0===e?void 0:e.querySelector(".use-spring-carousel-item");if(!t)throw Error("No carousel items available!");return t.getBoundingClientRect()["x"===x?"width":"height"]+g}function ue(){const e="x"===x?"left":"top";function t(t){const n=W.current;n&&(v?(n.style.top="0px",n.style.left="0px",n.style[e]=`-${t-p}px`,P.current=!1,$.current=!1):(n.style.left="0px",n.style.top="0px"))}if("fixed"===h&&v&&t("center"===w?oe()*i.length-ie()*Math.round((S-1)/2):"end"===w?oe()*i.length-ie()*Math.round(S-1):oe()*i.length),"fluid"!==h){if(!I&&"fixed"===h){const e=-ie()*A.current;if(Math.abs(e)>ce()&&!v){const e=-ce();$.current=!0,z.current=e,U.start({immediate:!0,val:z.current})}else z.current=e,U.start({immediate:!0,val:e});setTimeout((()=>{M.current=!1}),0)}}else{if($.current&&ce()!==Math.abs(z.current)&&!v){const e=-ce();return z.current=e,void U.start({immediate:!0,val:z.current})}if(Math.abs(z.current)>0&&ce()!==Math.abs(z.current)&&!v&&!I&&"backward"===k.current){const e=B.current-ce(),t=z.current+e;return U.start({immediate:!0,val:t}),()=>{z.current=t}}}}function le(){return I&&q.current?q.current["x"===x?"scrollLeft":"scrollTop"]:Q.val.get()}function ae(e,t){if(I&&"next"===e){const e=z.current+ie();return e>ce()?ce():e}if(I&&"prev"===e){const e=z.current-ie();return e<0?0:e}return"next"===e?"number"==typeof t?-t*ie():z.current-ie():"number"==typeof t?-t*ie():z.current+ie()}function de({type:e,index:t,immediate:n}){if(!c||J.current||P.current&&!v)return;$.current&&(k.current="backward"),F.current="prev",$.current=!1;const r="number"==typeof t?t:A.current-1;if(!v){const r=I?ae("prev",t)-ie()/3<0:ae("prev",t)+ie()/3>0;if(P.current)return;if(r)return P.current=!0,$.current=!1,void se({slideMode:e,from:le(),to:0,nextActiveItem:0,immediate:n})}if(v&&(P.current||r<0))return P.current=!1,$.current=!0,void se({slideMode:e,from:le()-ie()*i.length,to:-ie()*i.length+ie(),nextActiveItem:i.length-1,immediate:n});0===r&&(P.current=!0),r!==i.length-1&&-1!==r||($.current=!0),se({slideMode:e,from:le(),to:ae("prev",t),nextActiveItem:r,immediate:n})}function fe({type:e,index:t,immediate:n}){if(!c||J.current||$.current&&!v)return;P.current&&(k.current="forward"),F.current="next",P.current=!1;const r=t||A.current+1;if(!v){const i=Math.abs(ae("next",t))>ce()-ie()/3;if($.current)return;if(i)return P.current=!1,$.current=!0,void se({slideMode:e,from:le(),to:I?ce():-ce(),nextActiveItem:r,immediate:n})}if(v&&($.current||r>i.length-1))return $.current=!1,P.current=!0,void se({slideMode:e,from:le()+ie()*i.length,to:0,nextActiveItem:0,immediate:n});0===r&&(P.current=!0),r===i.length-1&&($.current=!0),se({slideMode:e,from:le(),to:ae("next",t),nextActiveItem:r,immediate:n})}function me(){return N.current=y||Math.floor(ie()/2/2),N.current}n.useEffect((()=>{A.current!==O&&pe({id:O,immediate:!R})}),[O]),n.useEffect((()=>{if(c){if(O>i.length-1)throw new Error(`initialActiveItem (${O}) is greater than the total quantity available items (${i.length}).`);S>i.length&&console.warn(`itemsPerSlide (${S}) is greater than the total quantity available items (${i.length}). Fallback to ${i.length})`)}}),[O,i,S,c]),n.useEffect((()=>{H.current=window.innerWidth}),[]),n.useEffect((()=>{B.current=ce(),D.current||(M.current=!0,ue())}),[w,S,p,g,c,ce]),n.useEffect((()=>{v===G.current&&h===X.current&&I===Y.current||(G.current=v,X.current=h,Y.current=I,W.current&&(W.current.style.transform="translate3d(0px, 0px,0px)",U.start({val:0,immediate:!0})),pe({id:0,immediate:!0,shouldReset:!0}))}),[v,h,I]),t.useIsomorphicLayoutEffect((()=>{W.current&&ue()}),[]),n.useEffect((()=>{me()}),[y,S,h]),n.useEffect((()=>{if(q.current){let e;const t=new s((()=>{if(D.current)D.current=!1;else if(!J.current&&!M.current){H.current=window.innerWidth;const t=ue();window.clearTimeout(e),e=setTimeout((()=>{B.current=ce(),"function"==typeof t&&t()}),100)}}));return t.observe(q.current),()=>{t.disconnect()}}}),[ue,ce]),n.useEffect((()=>{if(c)return document.addEventListener("visibilitychange",e),()=>{document.removeEventListener("visibilitychange",e)};function e(){document.hidden?J.current=!0:J.current=!1}}),[c]);const he=r.useDrag((e=>{const n=e.dragging,r=e.offset["x"===x?0:1],i=e.movement["x"===x?0:1],s=e.direction["x"===x?0:1],c=i>me(),o=i<-me(),u=ce();if(n){if(F.current=s>0?"prev":"next",V(Object.assign(Object.assign({},e),{eventName:"onDrag",slideActionType:F.current})),I)return r>0?(U.start({from:{val:le()},to:{val:0},config:{velocity:e.velocity,friction:50,tension:1e3}}),void e.cancel()):void U.start({from:{val:le()},to:{val:-r},config:{velocity:e.velocity,friction:50,tension:1e3}});U.start({val:r,config:{velocity:e.velocity,friction:50,tension:1e3}}),T&&o?(fe({type:"drag"}),e.cancel()):T&&c&&(de({type:"drag"}),e.cancel());u-Math.abs(r)<-2*ie()&&e.cancel()}else e.last&&I&&r>0?U.start({from:{val:le()},to:{val:0},config:{velocity:e.velocity,friction:50,tension:1e3}}):(e.last&&!e.canceled&&I&&("prev"===F.current&&de({type:"drag"}),"next"===F.current&&fe({type:"drag"})),!e.last||e.canceled||I||(o?!v&&$.current?U.start({val:-ce(),config:Object.assign(Object.assign({},t.config.default),{velocity:e.velocity})}):fe({type:"drag"}):c?!v&&P.current?U.start({val:0,config:Object.assign(Object.assign({},t.config.default),{velocity:e.velocity})}):de({type:"drag"}):U.start({val:z.current,config:Object.assign(Object.assign({},t.config.default),{velocity:e.velocity})})),e.last&&e.canceled&&U.start({val:z.current,config:Object.assign(Object.assign({},t.config.default),{velocity:e.velocity})}))}),{enabled:c&&!b&&!I||!!I&&!!j,axis:x,from:()=>I&&q.current?[-q.current.scrollLeft,-q.current.scrollTop]:[Q.val.get(),Q.val.get()]});function ge(){q.current&&(z.current=q.current["x"===x?"scrollLeft":"scrollTop"],0===q.current["x"===x?"scrollLeft":"scrollTop"]&&(P.current=!0,$.current=!1),q.current["x"===x?"scrollLeft":"scrollTop"]>0&&q.current["x"===x?"scrollLeft":"scrollTop"]<ce()&&(P.current=!1,$.current=!1),q.current["x"===x?"scrollLeft":"scrollTop"]===ce()&&(P.current=!1,$.current=!0))}function ve(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 pe({id:e,immediate:t,shouldReset:n,type:r}){if(!c||J.current)return;P.current=!1,$.current=!1;const s=ve(e,"The item you want to slide to doesn't exist; check the provided id.");if(s===A.current&&!n)return;const o=ve(i[A.current].id),u=ve(i[s].id);u>o?fe({type:r||n?"initial":"click",index:u,immediate:t}):de({type:r||n?"initial":"click",index:u,immediate:t})}function xe(e){const t=ve(e,"The item doesn't exist; check the provided id."),n=A.current;return v&&n===i.length-1?0===t:t===n+1}function be(e){const t=ve(e,"The item doesn't exist; check the provided id."),n=A.current;return v&&0===n?t===i.length-1:t===n-1}function ye(e){return ve(e,"The item you want to check doesn't exist; check the provided id.")===A.current}const Te=I?{useListenToCustomEvent:Z,enterFullscreen:te,exitFullscreen:ne,getIsFullscreen:re,slideToPrevItem:(e=!0)=>{de({type:"click",immediate:!e})},slideToNextItem:(e=!0)=>{fe({type:"click",immediate:!e})}}:{useListenToCustomEvent:Z,enterFullscreen:te,exitFullscreen:ne,getIsFullscreen:re,slideToPrevItem:(e=!0)=>{de({type:"click",immediate:!e})},slideToNextItem:(e=!0)=>{fe({type:"click",immediate:!e})},slideToItem:(e,t=!0)=>{pe({id:e,immediate:!t})},getIsNextItem:xe,getIsPrevItem:be,getIsActiveItem:ye};n.useEffect((()=>{C&&C({slideToNextItem:Te.slideToNextItem,slideToPrevItem:Te.slideToPrevItem,slideToItem:null==Te?void 0:Te.slideToItem})}),[C,Te.slideToItem,Te.slideToNextItem,Te.slideToPrevItem]);const Ie=e.jsx(a.Provider,Object.assign({value:Te},{children:_})),je=e.jsx(a.Provider,Object.assign({value:Te},{children:e.jsx("div",Object.assign({className:"use-spring-carousel-main-wrapper",ref:q},I?{onWheel(){Q.val.stop(),ge()}}:{},{style:Object.assign({display:"flex",position:"relative",width:"100%",height:"100%"},I?"x"===x?{overflowX:"auto"}:{overflowY:"auto"}:{})},{children:e.jsxs("div",Object.assign({className:"use-spring-carousel-track-wrapper",ref:W},he(),{style:Object.assign({position:"relative",display:"flex",flexDirection:"x"===x?"row":"column",touchAction:"none"},function(){const e=`calc(100% - ${2*p}px)`;return{width:"x"===x?e:"100%",height:"y"===x?e:"100%"}}())},{children:[!I&&v||!p?null:e.jsx("div",{style:{flexShrink:0,width:p}}),K.map(((t,n)=>{return console.log({curr:n,index:K.findIndex((e=>e.id===K[K.length-1].id))}),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=n===K.findIndex((e=>e.id===K[K.length-1].id)),"fixed"!==h||I?Object.assign({marginRight:`${r?0:g}px`}):{marginRight:`${r?0:g}px`,flex:`1 0 calc(100% / ${S} - ${g*(S-1)/S}px)`}))},{children:"function"==typeof t.renderItem?t.renderItem({getIsActiveItem:ye,getIsNextItem:xe,getIsPrevItem:be,useListenToCustomEvent:Z}):t.renderItem}),`${t.id}-${n}`);var r})),!I&&v||!p?null:e.jsx("div",{style:{flexShrink:0,width:p}})]}))}))}));return Object.assign(Object.assign({},Te),{carouselFragment:je,thumbsFragment:Ie})},exports.useSpringCarouselContext=function(){const e=n.useContext(a);if(!e)throw new Error("useSpringCarouselContext must be used within the carousel.");return e},exports.useThumbsModule=l,exports.useTransitionCarousel=function({init:i=!0,disableGestures:s=!1,items:c,springConfig:u=t.config.default,exitBeforeEnter:a=!1,trail:m,withLoop:h=!1,activeItem:g,toPrevItemSpringProps:v=d,toNextItemSpringProps:p=d,draggingSlideTreshold:x=50,thumbsSlideAxis:b="x"}){const y=n.useRef("next"),T=n.useRef("initial"),I=n.useRef(null),[j,w]=n.useState(null!=g?g:0),{emitEvent:E,useListenToCustomEvent:O}=o(),{handleScroll:R,thumbsFragment:C}=l({thumbsSlideAxis:b,items:c,renderThumbFnProps:{getIsNextItem:A,getIsPrevItem:P,useListenToCustomEvent:O,activeItem:{index:j,id:c[j].id}}});function S({to:e,slideType:t,slideMode:n}){y.current=t,T.current=n,E({eventName:"onSlideStartChange",slideActionType:y.current,slideMode:T.current,nextItem:{index:e,id:c[e].id,startReached:0===e,endReached:e===c.length-1}}),w(e),R(j)}function M(e){if(!i)return;const t=0===j;!h&&t||S(h&&t?{to:c.length-1,slideType:"prev",slideMode:e}:{to:j-1,slideType:"prev",slideMode:e})}function N(e){if(!i)return;const t=j===c.length-1;!h&&t||S(h&&t?{to:0,slideType:"next",slideMode:e}:{to:j+1,slideType:"next",slideMode:e})}n.useEffect((()=>{"number"==typeof g&&g!==j&&w(g)}),[g]);const F=t.useTransition(j,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===j&&E({eventName:"onSlideChange",slideActionType:y.current,slideMode:T.current,currentItem:{index:j,id:c[j].id,startReached:0===j,endReached:j===c.length-1}})}})),L=r.useDrag((({last:e,movement:[t]})=>{if(e){const e=t>x,n=t<-x,r=0===j,i=j===c.length-1;if(n){if(!h&&i)return;E({eventName:"onLeftSwipe"}),N("swipe")}else if(e){if(!h&&r)return;E({eventName:"onRightSwipe"}),M("swipe")}}}),{enabled:!s});function k(e,t){let n=0;if(n="string"==typeof e?c.findIndex((t=>t.id===e)):e,n<0||n>=c.length){if(t)throw new Error(t);console.error(`The item doesn't exist; check that the id provided - ${e} - is correct.`),n=-1}return n}function A(e){const t=k(e,"The item doesn't exist; check the provided id."),n=j;return h&&n===c.length-1?0===t:t===n+1}function P(e){const t=k(e,"The item doesn't exist; check the provided id."),n=j;return h&&0===n?t===c.length-1:t===n-1}const $=F(((n,r,i,s)=>{const o=c[r].renderItem;return 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:"function"==typeof o?o({useListenToCustomEvent:O,getIsNextItem:A,getIsPrevItem:P,activeItem:{index:j,id:c[j].id}}):o}))})),q={useListenToCustomEvent:O,slideToPrevItem:()=>M("click"),slideToNextItem:()=>N("click")},W=e.jsx(f.Provider,Object.assign({value:q},{children:C})),D=e.jsx(f.Provider,Object.assign({value:q},{children:e.jsx("div",Object.assign({ref:I},L(),{style:{display:"flex",position:"relative",width:"100%",height:"100%",overflow:"hidden"}},{children:$}))}));return Object.assign(Object.assign({},q),{carouselFragment:D,thumbsFragment:W})},exports.useTransitionCarouselContext=function(){const e=n.useContext(f);if(!e)throw new Error("useTransitionCarouselContext must be used within the carousel.");return e};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -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 {\n ItemWithThumb,\n PrepareThumbsData,\n RenderItemProps,\n SpringCarouselWithThumbs,\n} from '../types'\n\ntype Props<T extends 'use-spring' | 'use-transition'> = {\n withThumbs?: boolean\n thumbsSlideAxis: SpringCarouselWithThumbs['thumbsSlideAxis']\n prepareThumbsData?: PrepareThumbsData<T>\n items: ItemWithThumb<T>[]\n renderThumbFnProps: RenderItemProps<T>\n}\n\nfunction isInViewport(el: HTMLElement) {\n const rect = el.getBoundingClientRect()\n return (\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&\n rect.right <= (window.innerWidth || document.documentElement.clientWidth)\n )\n}\n\nexport function useThumbsModule<T extends 'use-spring' | 'use-transition'>({\n thumbsSlideAxis = 'x',\n withThumbs = false,\n prepareThumbsData,\n items,\n renderThumbFnProps,\n}: Props<T>) {\n const wrapperRef = useRef<HTMLDivElement | null>(null)\n const [spring, setSpring] = useSpring(() => ({\n val: 0,\n }))\n\n function getTotalScrollValue() {\n return Math.round(\n Number(\n wrapperRef.current?.[thumbsSlideAxis === 'x' ? 'scrollWidth' : 'scrollHeight'],\n ) -\n wrapperRef.current!.getBoundingClientRect()[\n thumbsSlideAxis === 'x' ? 'width' : 'height'\n ],\n )\n }\n\n function handleScroll(activeItem: number) {\n function getThumbNode() {\n if (wrapperRef.current) {\n return wrapperRef.current.querySelector(\n `#thumb-item-${items[activeItem].id}`,\n ) as HTMLElement\n }\n return null\n }\n\n const thumbNode = getThumbNode()\n if (thumbNode && wrapperRef.current) {\n if (!isInViewport(thumbNode)) {\n const offset = thumbNode.offsetLeft\n const val = offset > getTotalScrollValue() ? getTotalScrollValue() : offset\n\n setSpring.start({\n from: {\n val:\n wrapperRef.current?.[\n thumbsSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] ?? 0,\n },\n to: {\n val,\n },\n onChange: ({ value }) => {\n if (wrapperRef.current) {\n wrapperRef.current[thumbsSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'] =\n Math.abs(value.val)\n }\n },\n })\n }\n }\n }\n\n function handlePrepareThumbsData() {\n function getPreparedItems(\n _items: ReturnType<PrepareThumbsData<T>>,\n ): ReturnType<PrepareThumbsData<T>> {\n return _items.map(i => ({\n id: i.id,\n renderThumb: i.renderThumb,\n }))\n }\n\n if (prepareThumbsData) {\n return prepareThumbsData(getPreparedItems(items))\n }\n return getPreparedItems(items)\n }\n\n const thumbsFragment = withThumbs ? (\n <div\n className=\"use-spring-carousel-thumbs-wrapper\"\n ref={wrapperRef}\n onWheel={() => spring.val.stop()}\n style={{\n display: 'flex',\n flex: '1',\n position: 'relative',\n width: '100%',\n height: '100%',\n flexDirection: thumbsSlideAxis === 'x' ? 'row' : 'column',\n ...(thumbsSlideAxis === 'x'\n ? { overflowX: 'auto' }\n : {\n overflowY: 'auto',\n maxHeight: '100%',\n }),\n }}\n >\n {handlePrepareThumbsData().map(({ id, renderThumb }) => {\n const thumbId = `thumb-item-${id}`\n return (\n <div key={thumbId} id={thumbId} className=\"thumb-item\">\n {typeof renderThumb === 'function'\n ? renderThumb(renderThumbFnProps)\n : renderThumb}\n </div>\n )\n })}\n </div>\n ) : null\n\n return {\n thumbsFragment,\n handleScroll,\n }\n}\n","import { config, useIsomorphicLayoutEffect, useSpring } from '@react-spring/web'\nimport React, { createContext, useCallback, useContext, useEffect, useRef } from 'react'\n\nimport { useEventsModule } from './modules/useEventsModule'\nimport { useDrag } from '@use-gesture/react'\nimport { useFullscreenModule } from './modules/useFullscreenModule'\nimport { useThumbsModule } from './modules/useThumbsModule'\nimport ResizeObserver from 'resize-observer-polyfill'\n\nimport {\n SlideActionType,\n SlideMode,\n UseSpringCarouselComplete,\n UseSpringCarouselWithFreeScroll,\n UseSpringCarouselWithThumbs,\n UseSpringCarouselWithNoThumbs,\n UseSpringCarouselWithNoFixedItems,\n UseSpringCarouselWithFixedItems,\n UseSpringFreeScrollReturnType,\n UseSpringReturnType,\n SlideType,\n ItemWithThumb,\n} from './types'\n\ntype ReturnType<T> = T extends true ? UseSpringFreeScrollReturnType : UseSpringReturnType\n\n/**\n * With free scroll\n */\nfunction useSpringCarousel(props: UseSpringCarouselWithFreeScroll): ReturnType<true>\nfunction useSpringCarousel(props: UseSpringCarouselWithThumbs<true>): ReturnType<true>\nfunction useSpringCarousel(props: UseSpringCarouselWithNoThumbs<true>): ReturnType<true>\n/**\n * No free scroll\n */\nfunction useSpringCarousel(props: UseSpringCarouselWithThumbs<false>): ReturnType<false>\nfunction useSpringCarousel(props: UseSpringCarouselWithNoThumbs<false>): ReturnType<false>\nfunction useSpringCarousel(\n props: UseSpringCarouselWithFixedItems<false>,\n): ReturnType<false>\nfunction useSpringCarousel(\n props: UseSpringCarouselWithNoFixedItems<false>,\n): ReturnType<false>\n\nfunction useSpringCarousel({\n items,\n init = true,\n withThumbs,\n thumbsSlideAxis = 'x',\n itemsPerSlide: _itemsPerSlide = 1,\n slideType = 'fixed',\n gutter = 0,\n withLoop = false,\n startEndGutter = 0,\n carouselSlideAxis = 'x',\n disableGestures = false,\n draggingSlideTreshold: _draggingSlideTreshold,\n slideWhenThresholdIsReached = false,\n freeScroll,\n enableFreeScrollDrag,\n initialStartingPosition,\n prepareThumbsData,\n initialActiveItem = 0,\n animateWhenActiveItemChange = true,\n getControllerRef,\n}: UseSpringCarouselComplete): ReturnType<typeof freeScroll> {\n const itemsPerSlide = _itemsPerSlide > items.length ? items.length : _itemsPerSlide\n\n const resizeByPropChange = useRef(false)\n const draggingSlideTreshold = useRef(_draggingSlideTreshold ?? 0)\n const slideActionType = useRef<SlideActionType>('initial')\n const slideModeType = useRef<SlideMode>('initial')\n\n /**\n * After the user hits start/end edges of the carousel,\n * we check where the user is going. This is useful\n * to correctly resize the carousel when the carousel is going\n * backward after reaching the last item in fluid slide mode\n */\n const directionAfterReachingEdges = useRef<'forward' | 'backward' | 'initial'>(\n 'initial',\n )\n\n const activeItem = useRef(initialActiveItem)\n const firstItemReached = useRef(initialActiveItem === 0)\n const lastItemReached = useRef(\n slideType === 'fixed' && initialActiveItem === items.length - 1,\n )\n const mainCarouselWrapperRef = useRef<HTMLDivElement | null>(null)\n const carouselTrackWrapperRef = useRef<HTMLDivElement | null>(null)\n\n const isFirstMount = useRef(true)\n\n const prevTotalScrollValue = useRef(0)\n const prevWindowWidth = useRef(0)\n const prevSlidedValue = useRef(0)\n const prevWithLoop = useRef(withLoop)\n const prevSlideType = useRef(slideType)\n const prevFreeScroll = useRef(freeScroll)\n const windowIsHidden = useRef(false)\n\n const getItems = useCallback(() => {\n if (withLoop) {\n return [\n ...items.map(i => ({\n ...i,\n id: `prev-repeated-item-${i.id}`,\n })),\n ...items,\n ...items.map(i => ({\n ...i,\n id: `next-repeated-item-${i.id}`,\n })),\n ]\n }\n return [...items]\n }, [items, withLoop])\n const internalItems = getItems()\n\n const [spring, setSpring] = useSpring(\n () => ({\n val: 0,\n pause: !init,\n onChange: ({ value }) => {\n if (freeScroll && mainCarouselWrapperRef.current) {\n if (carouselSlideAxis === 'x') {\n mainCarouselWrapperRef.current.scrollLeft = Math.abs(value.val)\n } else {\n mainCarouselWrapperRef.current.scrollTop = Math.abs(value.val)\n }\n setStartEndItemReachedOnFreeScroll()\n } else if (carouselTrackWrapperRef.current) {\n if (carouselSlideAxis === 'x') {\n carouselTrackWrapperRef.current.style.transform = `translate3d(${value.val}px, 0px,0px)`\n } else {\n carouselTrackWrapperRef.current.style.transform = `translate3d(0px,${value.val}px,0px)`\n }\n }\n },\n }),\n [freeScroll],\n )\n const { emitEvent, useListenToCustomEvent } = useEventsModule<'use-spring'>()\n const { thumbsFragment, handleScroll } = useThumbsModule<'use-spring'>({\n withThumbs: !!withThumbs,\n thumbsSlideAxis,\n prepareThumbsData,\n items: items as ItemWithThumb<'use-spring'>[],\n renderThumbFnProps: {\n getIsActiveItem,\n getIsPrevItem,\n useListenToCustomEvent,\n getIsNextItem,\n },\n })\n const { enterFullscreen, exitFullscreen, getIsFullscreen } = useFullscreenModule({\n mainCarouselWrapperRef,\n handleResize: () => adjustCarouselWrapperPosition(),\n onFullScreenChange: val => {\n emitEvent({\n eventName: 'onFullscreenChange',\n isFullscreen: val,\n })\n },\n })\n\n function getItemStyles(isLastItem: boolean) {\n if (slideType === 'fixed' && !freeScroll) {\n return {\n marginRight: `${isLastItem ? 0 : gutter}px`,\n flex: `1 0 calc(100% / ${itemsPerSlide} - ${\n (gutter * (itemsPerSlide - 1)) / itemsPerSlide\n }px)`,\n }\n }\n return {\n ...{ marginRight: `${isLastItem ? 0 : gutter}px` },\n }\n }\n\n function getSlideValue() {\n const carouselItem = mainCarouselWrapperRef.current?.querySelector(\n '.use-spring-carousel-item',\n )\n\n if (!carouselItem) {\n throw Error('No carousel items available!')\n }\n\n return (\n carouselItem.getBoundingClientRect()[\n carouselSlideAxis === 'x' ? 'width' : 'height'\n ] + gutter\n )\n }\n\n type SlideToItem = {\n from: number\n to: number\n nextActiveItem?: number\n immediate?: boolean\n slideMode: SlideMode\n }\n\n function slideToItem({\n from,\n to,\n nextActiveItem,\n immediate = false,\n slideMode,\n }: SlideToItem) {\n slideModeType.current = slideMode\n\n if (typeof nextActiveItem === 'number') {\n if (!freeScroll) {\n activeItem.current = nextActiveItem\n }\n emitEvent({\n eventName: 'onSlideStartChange',\n slideActionType: slideActionType.current,\n slideMode: slideModeType.current,\n nextItem: {\n startReached: firstItemReached.current,\n endReached: lastItemReached.current,\n index: freeScroll ? -1 : activeItem.current,\n id: freeScroll ? '' : items[activeItem.current].id,\n },\n })\n }\n\n prevSlidedValue.current = to\n setSpring.start({\n immediate,\n from: {\n val: from,\n },\n to: {\n val: to,\n },\n config: {\n ...config.default,\n velocity: spring.val.velocity,\n },\n onRest(value) {\n if (!immediate && value.finished) {\n emitEvent({\n eventName: 'onSlideChange',\n slideActionType: slideActionType.current,\n slideMode: slideModeType.current,\n currentItem: {\n startReached: firstItemReached.current,\n endReached: lastItemReached.current,\n index: freeScroll ? -1 : activeItem.current,\n id: freeScroll ? '' : items[activeItem.current].id,\n },\n })\n }\n },\n })\n if (withThumbs && !immediate) {\n handleScroll(activeItem.current)\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n function getTotalScrollValue() {\n if (withLoop) {\n return getSlideValue() * items.length\n }\n return Math.round(\n Number(\n carouselTrackWrapperRef.current?.[\n carouselSlideAxis === 'x' ? 'scrollWidth' : 'scrollHeight'\n ],\n ) -\n carouselTrackWrapperRef.current!.getBoundingClientRect()[\n carouselSlideAxis === 'x' ? 'width' : 'height'\n ] -\n startEndGutter * 2,\n )\n }\n function getAnimatedWrapperStyles() {\n const percentValue = `calc(100% - ${startEndGutter * 2}px)`\n return {\n width: carouselSlideAxis === 'x' ? percentValue : '100%',\n height: carouselSlideAxis === 'y' ? percentValue : '100%',\n }\n }\n\n function getCarouselItemWidth() {\n const carouselItem = carouselTrackWrapperRef.current?.querySelector(\n '.use-spring-carousel-item',\n )\n if (!carouselItem) {\n throw Error('No carousel items available!')\n }\n return (\n carouselItem.getBoundingClientRect()[\n carouselSlideAxis === 'x' ? 'width' : 'height'\n ] + gutter\n )\n }\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n function adjustCarouselWrapperPosition() {\n const positionProperty = carouselSlideAxis === 'x' ? 'left' : 'top'\n\n function setPosition(v: number) {\n const ref = carouselTrackWrapperRef.current\n if (!ref) return\n\n if (withLoop) {\n ref.style.top = '0px'\n ref.style.left = '0px'\n ref.style[positionProperty] = `-${v - startEndGutter}px`\n\n firstItemReached.current = false\n lastItemReached.current = false\n } else {\n ref.style.left = '0px'\n ref.style.top = '0px'\n }\n }\n\n if (slideType === 'fixed' && withLoop) {\n if (initialStartingPosition === 'center') {\n setPosition(\n getCarouselItemWidth() * items.length -\n getSlideValue() * Math.round((itemsPerSlide - 1) / 2),\n )\n } else if (initialStartingPosition === 'end') {\n setPosition(\n getCarouselItemWidth() * items.length -\n getSlideValue() * Math.round(itemsPerSlide - 1),\n )\n } else {\n setPosition(getCarouselItemWidth() * items.length)\n }\n }\n\n if (slideType === 'fluid') {\n /**\n * User reached the last item and now is resizing the container that becomes smaller/bigger.\n * Example: on mobile devices the user rotates the device\n */\n if (\n lastItemReached.current &&\n getTotalScrollValue() !== Math.abs(prevSlidedValue.current) &&\n !withLoop\n ) {\n const newVal = -getTotalScrollValue()\n prevSlidedValue.current = newVal\n setSpring.start({\n immediate: true,\n val: prevSlidedValue.current,\n })\n return\n }\n\n if (\n Math.abs(prevSlidedValue.current) > 0 &&\n getTotalScrollValue() !== Math.abs(prevSlidedValue.current) &&\n !withLoop &&\n !freeScroll &&\n directionAfterReachingEdges.current === 'backward'\n ) {\n const diff = prevTotalScrollValue.current - getTotalScrollValue()\n const next = prevSlidedValue.current + diff\n\n setSpring.start({\n immediate: true,\n val: next,\n })\n\n return () => {\n prevSlidedValue.current = next\n }\n }\n\n return\n }\n\n if (!freeScroll && slideType === 'fixed') {\n const nextValue = -(getSlideValue() * activeItem.current)\n\n /**\n * Here we make sure to always show the latest item as the\n * latest item visible in the carousel viewport.\n */\n if (Math.abs(nextValue) > getTotalScrollValue() && !withLoop) {\n const val = -getTotalScrollValue()\n lastItemReached.current = true\n prevSlidedValue.current = val\n setSpring.start({\n immediate: true,\n val: prevSlidedValue.current,\n })\n } else {\n prevSlidedValue.current = nextValue\n setSpring.start({\n immediate: true,\n val: nextValue,\n })\n }\n\n setTimeout(() => {\n resizeByPropChange.current = false\n }, 0)\n }\n }\n function getFromValue() {\n if (freeScroll && mainCarouselWrapperRef.current) {\n return mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ]\n }\n return spring.val.get()\n }\n function getToValue(type: 'next' | 'prev', index?: number) {\n if (freeScroll && type === 'next') {\n const next = prevSlidedValue.current + getSlideValue()\n if (next > getTotalScrollValue()) {\n return getTotalScrollValue()\n }\n return next\n }\n\n if (freeScroll && type === 'prev') {\n const next = prevSlidedValue.current - getSlideValue()\n if (next < 0) {\n return 0\n }\n return next\n }\n\n if (type === 'next') {\n if (typeof index === 'number') {\n return -(index * getSlideValue())\n }\n return prevSlidedValue.current - getSlideValue()\n }\n\n if (typeof index === 'number') {\n return -(index * getSlideValue())\n }\n return prevSlidedValue.current + getSlideValue()\n }\n\n type SlideToPrevNextItem = {\n type: SlideMode\n index?: number\n immediate?: boolean\n }\n function slideToPrevItem({ type, index, immediate }: SlideToPrevNextItem) {\n if (!init || windowIsHidden.current || (firstItemReached.current && !withLoop)) return\n\n if (lastItemReached.current) {\n directionAfterReachingEdges.current = 'backward'\n }\n\n slideActionType.current = 'prev'\n lastItemReached.current = false\n\n const nextItem = typeof index === 'number' ? index : activeItem.current - 1\n\n if (!withLoop) {\n const nextItemWillExceed = freeScroll\n ? getToValue('prev', index) - getSlideValue() / 3 < 0\n : getToValue('prev', index) + getSlideValue() / 3 > 0\n\n if (firstItemReached.current) return\n if (nextItemWillExceed) {\n firstItemReached.current = true\n lastItemReached.current = false\n\n slideToItem({\n slideMode: type,\n from: getFromValue(),\n to: 0,\n nextActiveItem: 0,\n immediate,\n })\n return\n }\n }\n if (withLoop && (firstItemReached.current || nextItem < 0)) {\n firstItemReached.current = false\n lastItemReached.current = true\n slideToItem({\n slideMode: type,\n from: getFromValue() - getSlideValue() * items.length,\n to: -(getSlideValue() * items.length) + getSlideValue(),\n nextActiveItem: items.length - 1,\n immediate,\n })\n return\n }\n if (nextItem === 0) {\n firstItemReached.current = true\n }\n if (nextItem === items.length - 1 || nextItem === -1) {\n lastItemReached.current = true\n }\n slideToItem({\n slideMode: type,\n from: getFromValue(),\n to: getToValue('prev', index),\n nextActiveItem: nextItem,\n immediate,\n })\n }\n function slideToNextItem({ type, index, immediate }: SlideToPrevNextItem) {\n if (!init || windowIsHidden.current || (lastItemReached.current && !withLoop)) return\n\n if (firstItemReached.current) {\n directionAfterReachingEdges.current = 'forward'\n }\n\n slideActionType.current = 'next'\n firstItemReached.current = false\n\n const nextItem = index || activeItem.current + 1\n\n if (!withLoop) {\n const nextItemWillExceed =\n Math.abs(getToValue('next', index)) > getTotalScrollValue() - getSlideValue() / 3\n\n if (lastItemReached.current) return\n if (nextItemWillExceed) {\n firstItemReached.current = false\n lastItemReached.current = true\n\n slideToItem({\n slideMode: type,\n from: getFromValue(),\n to: freeScroll ? getTotalScrollValue() : -getTotalScrollValue(),\n nextActiveItem: nextItem,\n immediate,\n })\n return\n }\n }\n if (withLoop && (lastItemReached.current || nextItem > items.length - 1)) {\n lastItemReached.current = false\n firstItemReached.current = true\n slideToItem({\n slideMode: type,\n from: getFromValue() + getSlideValue() * items.length,\n to: 0,\n nextActiveItem: 0,\n immediate,\n })\n return\n }\n if (nextItem === 0) {\n firstItemReached.current = true\n }\n if (nextItem === items.length - 1) {\n lastItemReached.current = true\n }\n slideToItem({\n slideMode: type,\n from: getFromValue(),\n to: getToValue('next', index),\n nextActiveItem: nextItem,\n immediate,\n })\n }\n function getDraggingSliderTreshold() {\n if (_draggingSlideTreshold) {\n draggingSlideTreshold.current = _draggingSlideTreshold\n } else {\n draggingSlideTreshold.current = Math.floor(getSlideValue() / 2 / 2)\n }\n return draggingSlideTreshold.current\n }\n\n useEffect(() => {\n if (activeItem.current !== initialActiveItem) {\n internalSlideToItem({\n id: initialActiveItem,\n immediate: !animateWhenActiveItemChange,\n })\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialActiveItem])\n useEffect(() => {\n if (init) {\n if (initialActiveItem > items.length - 1) {\n throw new Error(\n `initialActiveItem (${initialActiveItem}) is greater than the total quantity available items (${items.length}).`,\n )\n }\n if (itemsPerSlide > items.length) {\n console.warn(\n `itemsPerSlide (${itemsPerSlide}) is greater than the total quantity available items (${items.length}). Fallback to ${items.length})`,\n )\n }\n }\n }, [initialActiveItem, items, itemsPerSlide, init])\n useEffect(() => {\n prevWindowWidth.current = window.innerWidth\n }, [])\n useEffect(() => {\n prevTotalScrollValue.current = getTotalScrollValue()\n if (!isFirstMount.current) {\n resizeByPropChange.current = true\n adjustCarouselWrapperPosition()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n initialStartingPosition,\n itemsPerSlide,\n startEndGutter,\n gutter,\n init,\n getTotalScrollValue,\n ])\n useEffect(() => {\n /**\n * When these props change we reset the carousel\n */\n if (\n withLoop !== prevWithLoop.current ||\n slideType !== prevSlideType.current ||\n freeScroll !== prevFreeScroll.current\n ) {\n prevWithLoop.current = withLoop\n prevSlideType.current = slideType\n prevFreeScroll.current = freeScroll\n\n if (carouselTrackWrapperRef.current) {\n carouselTrackWrapperRef.current.style.transform = `translate3d(0px, 0px,0px)`\n setSpring.start({\n val: 0,\n immediate: true,\n })\n }\n\n internalSlideToItem({ id: 0, immediate: true, shouldReset: true })\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [withLoop, slideType, freeScroll])\n useIsomorphicLayoutEffect(() => {\n /**\n * Set initial track position\n */\n if (carouselTrackWrapperRef.current) {\n adjustCarouselWrapperPosition()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n useEffect(() => {\n /**\n * When itemsPerSlide change we need to update the draggingSlideTreshold.current,\n * since it's default value is based on the calculation of the\n * width of a single item\n */\n getDraggingSliderTreshold()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [_draggingSlideTreshold, itemsPerSlide, slideType])\n useEffect(() => {\n if (mainCarouselWrapperRef.current) {\n let timer: NodeJS.Timeout\n const observer = new ResizeObserver(() => {\n if (isFirstMount.current) {\n isFirstMount.current = false\n return\n }\n\n if (windowIsHidden.current) return\n if (!resizeByPropChange.current) {\n prevWindowWidth.current = window.innerWidth\n const cb = adjustCarouselWrapperPosition()\n window.clearTimeout(timer)\n\n timer = setTimeout(() => {\n prevTotalScrollValue.current = getTotalScrollValue()\n if (typeof cb === 'function') {\n cb()\n }\n }, 100)\n }\n })\n observer.observe(mainCarouselWrapperRef.current)\n return () => {\n observer.disconnect()\n }\n }\n }, [adjustCarouselWrapperPosition, getTotalScrollValue])\n useEffect(() => {\n if (!init) return\n function handleVisibilityChange() {\n if (document.hidden) {\n windowIsHidden.current = true\n } else {\n windowIsHidden.current = false\n }\n }\n document.addEventListener('visibilitychange', handleVisibilityChange)\n return () => {\n document.removeEventListener('visibilitychange', handleVisibilityChange)\n }\n }, [init])\n\n const bindDrag = useDrag(\n state => {\n const isDragging = state.dragging\n const movement = state.offset[carouselSlideAxis === 'x' ? 0 : 1]\n const currentMovement = state.movement[carouselSlideAxis === 'x' ? 0 : 1]\n const direction = state.direction[carouselSlideAxis === 'x' ? 0 : 1]\n\n const prevItemTreshold = currentMovement > getDraggingSliderTreshold()\n const nextItemTreshold = currentMovement < -getDraggingSliderTreshold()\n const tot = getTotalScrollValue()\n\n if (isDragging) {\n if (direction > 0) {\n slideActionType.current = 'prev'\n } else {\n slideActionType.current = 'next'\n }\n\n emitEvent({\n ...state,\n eventName: 'onDrag',\n slideActionType: slideActionType.current,\n })\n\n if (freeScroll) {\n if (movement > 0) {\n setSpring.start({\n from: {\n val: getFromValue(),\n },\n to: {\n val: 0,\n },\n config: {\n velocity: state.velocity,\n friction: 50,\n tension: 1000,\n },\n })\n state.cancel()\n return\n }\n\n setSpring.start({\n from: {\n val: getFromValue(),\n },\n to: {\n val: -movement,\n },\n config: {\n velocity: state.velocity,\n friction: 50,\n tension: 1000,\n },\n })\n return\n }\n\n setSpring.start({\n val: movement,\n config: {\n velocity: state.velocity,\n friction: 50,\n tension: 1000,\n },\n })\n\n if (slideWhenThresholdIsReached && nextItemTreshold) {\n slideToNextItem({ type: 'drag' })\n state.cancel()\n } else if (slideWhenThresholdIsReached && prevItemTreshold) {\n slideToPrevItem({ type: 'drag' })\n state.cancel()\n }\n\n const res = tot - Math.abs(movement)\n\n if (res < -(getSlideValue() * 2)) {\n state.cancel()\n }\n\n return\n }\n\n if (state.last && freeScroll && movement > 0) {\n setSpring.start({\n from: {\n val: getFromValue(),\n },\n to: {\n val: 0,\n },\n config: {\n velocity: state.velocity,\n friction: 50,\n tension: 1000,\n },\n })\n return\n }\n if (state.last && !state.canceled && freeScroll) {\n if (slideActionType.current === 'prev') {\n slideToPrevItem({ type: 'drag' })\n }\n if (slideActionType.current === 'next') {\n slideToNextItem({ type: 'drag' })\n }\n }\n\n if (state.last && !state.canceled && !freeScroll) {\n if (nextItemTreshold) {\n if (!withLoop && lastItemReached.current) {\n setSpring.start({\n val: -getTotalScrollValue(),\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n } else {\n slideToNextItem({ type: 'drag' })\n }\n } else if (prevItemTreshold) {\n if (!withLoop && firstItemReached.current) {\n setSpring.start({\n val: 0,\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n } else {\n slideToPrevItem({ type: 'drag' })\n }\n } else {\n setSpring.start({\n val: prevSlidedValue.current,\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n }\n }\n if (state.last && state.canceled) {\n setSpring.start({\n val: prevSlidedValue.current,\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n }\n },\n {\n enabled:\n (init && !disableGestures && !freeScroll) ||\n (!!freeScroll && !!enableFreeScrollDrag),\n axis: carouselSlideAxis,\n from: () => {\n if (freeScroll && mainCarouselWrapperRef.current) {\n return [\n -mainCarouselWrapperRef.current.scrollLeft,\n -mainCarouselWrapperRef.current.scrollTop,\n ]\n }\n if (carouselSlideAxis === 'x') {\n return [spring.val.get(), spring.val.get()]\n }\n return [spring.val.get(), spring.val.get()]\n },\n },\n )\n\n function getWrapperOverflowStyles() {\n if (freeScroll) {\n if (carouselSlideAxis === 'x') {\n return {\n overflowX: 'auto',\n }\n }\n return {\n overflowY: 'auto',\n }\n }\n return {}\n }\n\n function setStartEndItemReachedOnFreeScroll() {\n if (mainCarouselWrapperRef.current) {\n prevSlidedValue.current =\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ]\n if (\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] === 0\n ) {\n firstItemReached.current = true\n lastItemReached.current = false\n }\n if (\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] > 0 &&\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] < getTotalScrollValue()\n ) {\n firstItemReached.current = false\n lastItemReached.current = false\n }\n\n if (\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] === getTotalScrollValue()\n ) {\n firstItemReached.current = false\n lastItemReached.current = true\n }\n }\n }\n function getScrollHandlers() {\n if (freeScroll) {\n return {\n onWheel() {\n spring.val.stop()\n setStartEndItemReachedOnFreeScroll()\n },\n }\n }\n return {}\n }\n\n function findItemIndex(id: string | number, error?: string) {\n let itemIndex = 0\n\n if (typeof id === 'string') {\n itemIndex = items.findIndex(item => item.id === id)\n } else {\n itemIndex = id\n }\n if (itemIndex < 0 || itemIndex >= items.length) {\n if (error) {\n throw new Error(error)\n }\n console.error(\n `The item doesn't exist; check that the id provided - ${id} - is correct.`,\n )\n itemIndex = -1\n }\n\n return itemIndex\n }\n type InternalSlideToItem = {\n id: string | number\n immediate?: boolean\n shouldReset?: boolean\n type?: SlideType\n }\n function internalSlideToItem({\n id,\n immediate,\n shouldReset,\n type,\n }: InternalSlideToItem) {\n if (!init || windowIsHidden.current) return\n\n firstItemReached.current = false\n lastItemReached.current = false\n\n const itemIndex = findItemIndex(\n id,\n \"The item you want to slide to doesn't exist; check the provided id.\",\n )\n\n if (itemIndex === activeItem.current && !shouldReset) {\n return\n }\n\n const currentItem = findItemIndex(items[activeItem.current].id)\n const newActiveItem = findItemIndex(items[itemIndex].id)\n\n if (newActiveItem > currentItem) {\n slideToNextItem({\n type: type || shouldReset ? 'initial' : 'click',\n index: newActiveItem,\n immediate,\n })\n } else {\n slideToPrevItem({\n type: type || shouldReset ? 'initial' : 'click',\n index: newActiveItem,\n immediate,\n })\n }\n }\n function getIsNextItem(id: string | number) {\n const itemIndex = findItemIndex(id, \"The item doesn't exist; check the provided id.\")\n const _activeItem = activeItem.current\n if (withLoop && _activeItem === items.length - 1) {\n return itemIndex === 0\n }\n return itemIndex === _activeItem + 1\n }\n function getIsPrevItem(id: string | number) {\n const itemIndex = findItemIndex(id, \"The item doesn't exist; check the provided id.\")\n const _activeItem = activeItem.current\n if (withLoop && _activeItem === 0) {\n return itemIndex === items.length - 1\n }\n return itemIndex === _activeItem - 1\n }\n function getIsActiveItem(id: string | number) {\n return (\n findItemIndex(\n id,\n \"The item you want to check doesn't exist; check the provided id.\",\n ) === activeItem.current\n )\n }\n\n const res = freeScroll\n ? {\n useListenToCustomEvent,\n enterFullscreen,\n exitFullscreen,\n getIsFullscreen,\n slideToPrevItem: (animate = true) => {\n slideToPrevItem({\n type: 'click',\n immediate: !animate,\n })\n },\n slideToNextItem: (animate = true) => {\n slideToNextItem({\n type: 'click',\n immediate: !animate,\n })\n },\n }\n : {\n useListenToCustomEvent,\n enterFullscreen,\n exitFullscreen,\n getIsFullscreen,\n slideToPrevItem: (animate = true) => {\n slideToPrevItem({\n type: 'click',\n immediate: !animate,\n })\n },\n slideToNextItem: (animate = true) => {\n slideToNextItem({\n type: 'click',\n immediate: !animate,\n })\n },\n slideToItem: (id: string | number, animate = true) => {\n internalSlideToItem({ id, immediate: !animate })\n },\n getIsNextItem,\n getIsPrevItem,\n getIsActiveItem,\n }\n\n useEffect(() => {\n if (getControllerRef) {\n getControllerRef({\n slideToNextItem: res.slideToNextItem,\n slideToPrevItem: res.slideToPrevItem,\n slideToItem: res?.slideToItem,\n })\n }\n }, [getControllerRef, res.slideToItem, res.slideToNextItem, res.slideToPrevItem])\n\n const _thumbsFragment = (\n <Context.Provider value={res}>{thumbsFragment}</Context.Provider>\n )\n const carouselFragment = (\n <Context.Provider value={res}>\n <div\n className=\"use-spring-carousel-main-wrapper\"\n ref={mainCarouselWrapperRef}\n {...getScrollHandlers()}\n style={{\n display: 'flex',\n position: 'relative',\n width: '100%',\n height: '100%',\n ...(getWrapperOverflowStyles() as React.CSSProperties),\n }}\n >\n <div\n className=\"use-spring-carousel-track-wrapper\"\n ref={carouselTrackWrapperRef}\n {...bindDrag()}\n style={{\n position: 'relative',\n display: 'flex',\n flexDirection: carouselSlideAxis === 'x' ? 'row' : 'column',\n touchAction: 'none',\n ...getAnimatedWrapperStyles(),\n }}\n >\n {(freeScroll || !withLoop) && startEndGutter ? (\n <div\n style={{\n flexShrink: 0,\n width: startEndGutter,\n }}\n />\n ) : null}\n {internalItems.map((item, index) => {\n return (\n <div\n key={`${item.id}-${index}`}\n className=\"use-spring-carousel-item\"\n data-testid=\"use-spring-carousel-item-wrapper\"\n style={{\n display: 'flex',\n position: 'relative',\n flex: '1',\n ...getItemStyles(\n index ===\n internalItems.findIndex(\n i => i.id === items[internalItems.length - 1].id,\n ),\n ),\n }}\n >\n {typeof item.renderItem === 'function'\n ? item.renderItem({\n getIsActiveItem,\n getIsNextItem,\n getIsPrevItem,\n useListenToCustomEvent,\n })\n : item.renderItem}\n </div>\n )\n })}\n {(freeScroll || !withLoop) && startEndGutter ? (\n <div\n style={{\n flexShrink: 0,\n width: startEndGutter,\n }}\n />\n ) : null}\n </div>\n </div>\n </Context.Provider>\n )\n\n return { ...res, carouselFragment, thumbsFragment: _thumbsFragment }\n}\n\ntype ContextProps<T = undefined> = Omit<\n ReturnType<T extends 'free-scroll' ? true : false>,\n 'carouselFragment' | 'thumbsFragment'\n>\n\nconst Context = createContext<ContextProps | ContextProps<'free-scroll'> | undefined>(\n undefined,\n)\n\nfunction useSpringCarouselContext<T>() {\n const context = useContext(Context)\n if (!context) {\n throw new Error('useSpringCarouselContext must be used within the carousel.')\n }\n return context as ContextProps<T>\n}\n\nexport { useSpringCarousel, useSpringCarouselContext }\n","import { a, config, useTransition } from '@react-spring/web'\nimport { useEffect, useRef, useState, createContext, useContext } from 'react'\nimport { useEventsModule } from './modules/useEventsModule'\nimport { useDrag } from '@use-gesture/react'\nimport { useThumbsModule } from './modules'\nimport {\n ItemWithThumb,\n UseTransitionCarouselProps,\n UseTransitionCarouselReturnProps,\n SlideActionType,\n TransitionSlideMode,\n} from './types'\n\nconst defaultAnimationProps = {\n initial: {\n opacity: 1,\n position: 'relative',\n },\n from: {\n opacity: 0,\n position: 'relative',\n },\n enter: {\n position: 'relative',\n opacity: 1,\n },\n leave: {\n opacity: 1,\n position: 'absolute',\n },\n}\n\nfunction useTransitionCarousel({\n init = true,\n disableGestures = false,\n items,\n springConfig = config.default,\n exitBeforeEnter = false,\n trail,\n withLoop = false,\n activeItem: externalActiveItem,\n toPrevItemSpringProps = defaultAnimationProps,\n toNextItemSpringProps = defaultAnimationProps,\n draggingSlideTreshold = 50,\n thumbsSlideAxis = 'x',\n}: UseTransitionCarouselProps): UseTransitionCarouselReturnProps {\n const slideActionType = useRef<SlideActionType>('next')\n const slideModeType = useRef<TransitionSlideMode>('initial')\n const mainCarouselWrapperRef = useRef<HTMLDivElement | null>(null)\n const [activeItem, setActiveItem] = useState(externalActiveItem ?? 0)\n const { emitEvent, useListenToCustomEvent } = useEventsModule<'use-transition'>()\n const { handleScroll, thumbsFragment } = useThumbsModule<'use-transition'>({\n thumbsSlideAxis,\n items: items as ItemWithThumb<'use-transition'>[],\n renderThumbFnProps: {\n getIsNextItem,\n getIsPrevItem,\n useListenToCustomEvent,\n activeItem: {\n index: activeItem,\n id: items[activeItem].id,\n },\n },\n })\n\n function getConfig() {\n if (slideActionType.current === 'prev') {\n return {\n initial: {\n ...toPrevItemSpringProps.initial,\n },\n from: {\n ...toPrevItemSpringProps.from,\n },\n enter: {\n ...toPrevItemSpringProps.enter,\n },\n leave: {\n ...toPrevItemSpringProps.leave,\n },\n }\n }\n if (slideActionType.current === 'next') {\n return {\n initial: {\n ...toNextItemSpringProps.initial,\n },\n from: {\n ...toNextItemSpringProps.from,\n },\n enter: {\n ...toNextItemSpringProps.enter,\n },\n leave: {\n ...toNextItemSpringProps.leave,\n },\n }\n }\n return {\n initial: {\n ...defaultAnimationProps.initial,\n },\n from: {\n ...defaultAnimationProps.from,\n },\n enter: {\n ...defaultAnimationProps.enter,\n },\n leave: {\n ...defaultAnimationProps.leave,\n },\n }\n }\n\n useEffect(() => {\n if (typeof externalActiveItem === 'number' && externalActiveItem !== activeItem) {\n setActiveItem(externalActiveItem)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [externalActiveItem])\n\n type SlideToItem = {\n to: number\n slideType: SlideActionType\n slideMode: TransitionSlideMode\n }\n\n function slideToItem({ to, slideType, slideMode }: SlideToItem) {\n slideActionType.current = slideType\n slideModeType.current = slideMode\n emitEvent({\n eventName: 'onSlideStartChange',\n slideActionType: slideActionType.current,\n slideMode: slideModeType.current,\n nextItem: {\n index: to,\n id: items[to].id,\n startReached: to === 0,\n endReached: to === items.length - 1,\n },\n })\n setActiveItem(to)\n handleScroll(activeItem)\n }\n\n function slideToPrevItem(slideMode: TransitionSlideMode) {\n if (!init) return\n const isFirstItem = activeItem === 0\n\n if (!withLoop && isFirstItem) return\n\n if (withLoop && isFirstItem) {\n slideToItem({\n to: items.length - 1,\n slideType: 'prev',\n slideMode,\n })\n } else {\n slideToItem({\n to: activeItem - 1,\n slideType: 'prev',\n slideMode,\n })\n }\n }\n function slideToNextItem(slideMode: TransitionSlideMode) {\n if (!init) return\n const isLastItem = activeItem === items.length - 1\n\n if (!withLoop && isLastItem) return\n\n if (withLoop && isLastItem) {\n slideToItem({\n to: 0,\n slideType: 'next',\n slideMode,\n })\n } else {\n slideToItem({\n to: activeItem + 1,\n slideType: 'next',\n slideMode,\n })\n }\n }\n\n const transitions = useTransition(activeItem, {\n config: springConfig,\n key: null,\n trail,\n exitBeforeEnter,\n ...getConfig(),\n onRest(value, _, index) {\n if (value.finished && index === activeItem) {\n emitEvent({\n eventName: 'onSlideChange',\n slideActionType: slideActionType.current,\n slideMode: slideModeType.current,\n currentItem: {\n index: activeItem,\n id: items[activeItem].id,\n startReached: activeItem === 0,\n endReached: activeItem === items.length - 1,\n },\n })\n }\n },\n })\n\n const bindSwipe = useDrag(\n ({ last, movement: [mx] }) => {\n if (last) {\n const prevItemTreshold = mx > draggingSlideTreshold\n const nextItemTreshold = mx < -draggingSlideTreshold\n const isFirstItem = activeItem === 0\n const isLastItem = activeItem === items.length - 1\n\n if (nextItemTreshold) {\n if (!withLoop && isLastItem) return\n\n emitEvent({\n eventName: 'onLeftSwipe',\n })\n slideToNextItem('swipe')\n } else if (prevItemTreshold) {\n if (!withLoop && isFirstItem) return\n\n emitEvent({\n eventName: 'onRightSwipe',\n })\n slideToPrevItem('swipe')\n }\n }\n },\n {\n enabled: !disableGestures,\n },\n )\n\n function findItemIndex(id: string | number, error?: string) {\n let itemIndex = 0\n\n if (typeof id === 'string') {\n itemIndex = items.findIndex(item => item.id === id)\n } else {\n itemIndex = id\n }\n if (itemIndex < 0 || itemIndex >= items.length) {\n if (error) {\n throw new Error(error)\n }\n console.error(\n `The item doesn't exist; check that the id provided - ${id} - is correct.`,\n )\n itemIndex = -1\n }\n\n return itemIndex\n }\n function getIsNextItem(id: string | number) {\n const itemIndex = findItemIndex(id, \"The item doesn't exist; check the provided id.\")\n const _activeItem = activeItem\n if (withLoop && _activeItem === items.length - 1) {\n return itemIndex === 0\n }\n return itemIndex === _activeItem + 1\n }\n function getIsPrevItem(id: string | number) {\n const itemIndex = findItemIndex(id, \"The item doesn't exist; check the provided id.\")\n const _activeItem = activeItem\n if (withLoop && _activeItem === 0) {\n return itemIndex === items.length - 1\n }\n return itemIndex === _activeItem - 1\n }\n\n const itemsFragment = transitions((styles, item, _, indx) => {\n const renderItem = items[item].renderItem\n return (\n <a.div\n id={`use-transition-carousel-item-${indx}`}\n className=\"use-transition-carousel-item\"\n style={{\n ...styles,\n flex: '1 0 100%',\n width: '100%',\n height: '100%',\n }}\n >\n {typeof renderItem === 'function'\n ? renderItem({\n useListenToCustomEvent,\n getIsNextItem,\n getIsPrevItem,\n activeItem: {\n index: activeItem,\n id: items[activeItem].id,\n },\n })\n : renderItem}\n </a.div>\n )\n })\n\n const result = {\n useListenToCustomEvent,\n slideToPrevItem: () => slideToPrevItem('click'),\n slideToNextItem: () => slideToNextItem('click'),\n }\n\n const _thumbsFragment = (\n <Context.Provider value={result}>{thumbsFragment}</Context.Provider>\n )\n const carouselFragment = (\n <Context.Provider value={result}>\n <div\n ref={mainCarouselWrapperRef}\n {...bindSwipe()}\n style={{\n display: 'flex',\n position: 'relative',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n {itemsFragment}\n </div>\n </Context.Provider>\n )\n\n return {\n ...result,\n carouselFragment,\n thumbsFragment: _thumbsFragment,\n }\n}\n\ntype ContextProps = Omit<\n UseTransitionCarouselReturnProps,\n 'carouselFragment' | 'thumbsFragment'\n>\n\nconst Context = createContext<ContextProps | undefined>(undefined)\n\nfunction useTransitionCarouselContext() {\n const context = useContext(Context)\n if (!context) {\n throw new Error('useTransitionCarouselContext must be used within the carousel.')\n }\n return context\n}\n\nexport { useTransitionCarousel, useTransitionCarouselContext }\n"],"names":["eventLabel","useEventsModule","targetEvent","useRef","useListenToCustomEvent","eventHandler","useEffect","handleEvent","event","detail","current","document","createElement","addEventListener","_a","removeEventListener","emitEvent","newEvent","CustomEvent","dispatchEvent","useFullscreenModule","mainCarouselWrapperRef","onFullScreenChange","handleResize","isFullscreen","setIsFullscreen","_isFullscreen","handleFullscreenChange","fullscreenElement","screenfull","isEnabled","on","off","enterFullscreen","elementRef","request","exitFullscreen","exit","getIsFullscreen","useThumbsModule","thumbsSlideAxis","withThumbs","prepareThumbsData","items","renderThumbFnProps","wrapperRef","spring","setSpring","useSpring","val","getTotalScrollValue","Math","round","Number","getBoundingClientRect","thumbsFragment","_jsx","jsx","Object","assign","className","ref","onWheel","stop","style","display","flex","position","width","height","flexDirection","overflowX","overflowY","maxHeight","children","getPreparedItems","_items","map","i","id","renderThumb","handlePrepareThumbsData","thumbId","handleScroll","activeItem","thumbNode","querySelector","el","rect","top","left","bottom","window","innerHeight","documentElement","clientHeight","right","innerWidth","clientWidth","isInViewport","offset","offsetLeft","start","from","to","onChange","value","abs","Context","createContext","undefined","defaultAnimationProps","initial","opacity","enter","leave","init","itemsPerSlide","_itemsPerSlide","slideType","gutter","withLoop","startEndGutter","carouselSlideAxis","disableGestures","draggingSlideTreshold","_draggingSlideTreshold","slideWhenThresholdIsReached","freeScroll","enableFreeScrollDrag","initialStartingPosition","initialActiveItem","animateWhenActiveItemChange","getControllerRef","length","resizeByPropChange","slideActionType","slideModeType","directionAfterReachingEdges","firstItemReached","lastItemReached","carouselTrackWrapperRef","isFirstMount","prevTotalScrollValue","prevWindowWidth","prevSlidedValue","prevWithLoop","prevSlideType","prevFreeScroll","windowIsHidden","internalItems","useCallback","getItems","pause","scrollLeft","scrollTop","setStartEndItemReachedOnFreeScroll","transform","getIsActiveItem","getIsPrevItem","getIsNextItem","adjustCarouselWrapperPosition","eventName","getSlideValue","carouselItem","Error","slideToItem","nextActiveItem","immediate","slideMode","nextItem","startReached","endReached","index","config","default","velocity","onRest","finished","currentItem","getCarouselItemWidth","positionProperty","setPosition","v","nextValue","setTimeout","newVal","diff","next","getFromValue","get","getToValue","type","slideToPrevItem","nextItemWillExceed","slideToNextItem","getDraggingSliderTreshold","floor","internalSlideToItem","console","warn","shouldReset","useIsomorphicLayoutEffect","timer","observer","ResizeObserver","cb","clearTimeout","observe","disconnect","handleVisibilityChange","hidden","bindDrag","useDrag","state","isDragging","dragging","movement","currentMovement","direction","prevItemTreshold","nextItemTreshold","tot","friction","tension","cancel","last","canceled","enabled","axis","findItemIndex","error","itemIndex","findIndex","item","newActiveItem","_activeItem","res","animate","_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","result","overflow"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/modules/useEventsModule.ts","../../src/modules/useFullscreenModule.ts","../../src/modules/useThumbsModule.tsx","../../src/useSpringCarousel.tsx","../../src/useTransitionCarousel.tsx"],"sourcesContent":["import { FullGestureState } from '@use-gesture/react'\nimport { useEffect, useRef } from 'react'\nimport { SlideActionType, SlideMode, TransitionSlideMode } from '../types/common'\n\nconst eventLabel = 'RSC::Event'\n\ntype OnSlideStartChange<T> = {\n eventName: 'onSlideStartChange'\n slideActionType: SlideActionType\n slideMode: T extends 'use-spring' ? SlideMode : TransitionSlideMode\n nextItem: {\n index: number\n id: string\n startReached: boolean\n endReached: boolean\n }\n}\ntype OnSlideChange<T> = {\n eventName: 'onSlideChange'\n slideActionType: SlideActionType\n slideMode: T extends 'use-spring' ? SlideMode : TransitionSlideMode\n currentItem: {\n index: number\n id: string\n startReached: boolean\n endReached: boolean\n }\n}\ntype OnFullscreenChange = {\n eventName: 'onFullscreenChange'\n isFullscreen: boolean\n}\ntype OnDrag = Omit<FullGestureState<'drag'>, 'event'> & {\n eventName: 'onDrag'\n slideActionType: SlideActionType\n}\n\ntype OnLeftSwipe = {\n eventName: 'onLeftSwipe'\n}\n\ntype OnRightSwipe = {\n eventName: 'onRightSwipe'\n}\n\ntype SpringCarouselEvents<T> =\n | OnSlideStartChange<T>\n | OnSlideChange<T>\n | OnDrag\n | OnFullscreenChange\n\ntype TransitionCarouselEvents<T> =\n | OnSlideStartChange<T>\n | OnSlideChange<T>\n | OnFullscreenChange\n | OnLeftSwipe\n | OnRightSwipe\n\ntype Events<T> = T extends 'use-spring'\n ? SpringCarouselEvents<'use-spring'>\n : TransitionCarouselEvents<'use-transition'>\n\ntype EventHandler<T> = (props: Events<T>) => void\n\nexport type UseListenToCustomEvent<T> = {\n useListenToCustomEvent: (eventHandler: EventHandler<T>) => void\n emitEvent: (event: Events<T>) => void\n}\n\nexport function useEventsModule<T extends 'use-spring' | 'use-transition'>() {\n const targetEvent = useRef<HTMLDivElement | null>(null)\n\n function useListenToCustomEvent(eventHandler: EventHandler<T>) {\n useEffect(() => {\n if (!targetEvent.current) {\n targetEvent.current = document.createElement('div')\n }\n\n function handleEvent(event: CustomEvent<Events<T>>) {\n eventHandler(event.detail)\n }\n\n if (targetEvent.current) {\n // @ts-ignore\n targetEvent.current.addEventListener(eventLabel, handleEvent, false)\n return () => {\n // @ts-ignore\n targetEvent.current?.removeEventListener(eventLabel, handleEvent, false)\n }\n }\n }, [eventHandler])\n }\n function emitEvent(event: Events<T>) {\n if (targetEvent.current) {\n const newEvent = new CustomEvent(eventLabel, {\n detail: event,\n })\n targetEvent.current.dispatchEvent(newEvent)\n }\n }\n\n return {\n useListenToCustomEvent,\n emitEvent,\n }\n}\n","import { useRef, MutableRefObject, useEffect } from 'react'\nimport screenfull from 'screenfull'\n\ntype FullscreenModule = {\n mainCarouselWrapperRef: MutableRefObject<HTMLDivElement | null>\n handleResize?(): void\n onFullScreenChange(isFullscreen: boolean): void\n}\n\nexport function useFullscreenModule({\n mainCarouselWrapperRef,\n onFullScreenChange,\n handleResize,\n}: FullscreenModule) {\n const isFullscreen = useRef(false)\n\n useEffect(() => {\n function handleFullscreenChange() {\n if (document.fullscreenElement) {\n setIsFullscreen(true)\n onFullScreenChange(true)\n handleResize && handleResize()\n }\n\n if (!document.fullscreenElement) {\n setIsFullscreen(false)\n onFullScreenChange(false)\n handleResize && handleResize()\n }\n }\n\n if (screenfull.isEnabled) {\n screenfull.on('change', handleFullscreenChange)\n return () => {\n if (screenfull.isEnabled) {\n screenfull.off('change', handleFullscreenChange)\n }\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n function setIsFullscreen(_isFullscreen: boolean) {\n isFullscreen.current = _isFullscreen\n }\n\n function getIsFullscreen() {\n return isFullscreen.current\n }\n\n function enterFullscreen(elementRef?: HTMLElement) {\n if (screenfull.isEnabled) {\n screenfull.request((elementRef || mainCarouselWrapperRef.current) as Element)\n }\n }\n\n function exitFullscreen() {\n screenfull.isEnabled && screenfull.exit()\n }\n\n return {\n enterFullscreen,\n exitFullscreen,\n getIsFullscreen,\n }\n}\n","import { useSpring } from '@react-spring/web'\nimport { useRef } from 'react'\n\nimport {\n ItemWithThumb,\n PrepareThumbsData,\n RenderItemProps,\n SpringCarouselWithThumbs,\n} from '../types'\n\ntype Props<T extends 'use-spring' | 'use-transition'> = {\n withThumbs?: boolean\n thumbsSlideAxis: SpringCarouselWithThumbs['thumbsSlideAxis']\n prepareThumbsData?: PrepareThumbsData<T>\n items: ItemWithThumb<T>[]\n renderThumbFnProps: RenderItemProps<T>\n}\n\nfunction isInViewport(el: HTMLElement) {\n const rect = el.getBoundingClientRect()\n return (\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&\n rect.right <= (window.innerWidth || document.documentElement.clientWidth)\n )\n}\n\nexport function useThumbsModule<T extends 'use-spring' | 'use-transition'>({\n thumbsSlideAxis = 'x',\n withThumbs = false,\n prepareThumbsData,\n items,\n renderThumbFnProps,\n}: Props<T>) {\n const wrapperRef = useRef<HTMLDivElement | null>(null)\n const [spring, setSpring] = useSpring(() => ({\n val: 0,\n }))\n\n function getTotalScrollValue() {\n return Math.round(\n Number(\n wrapperRef.current?.[thumbsSlideAxis === 'x' ? 'scrollWidth' : 'scrollHeight'],\n ) -\n wrapperRef.current!.getBoundingClientRect()[\n thumbsSlideAxis === 'x' ? 'width' : 'height'\n ],\n )\n }\n\n function handleScroll(activeItem: number) {\n function getThumbNode() {\n if (wrapperRef.current) {\n return wrapperRef.current.querySelector(\n `#thumb-item-${items[activeItem].id}`,\n ) as HTMLElement\n }\n return null\n }\n\n const thumbNode = getThumbNode()\n if (thumbNode && wrapperRef.current) {\n if (!isInViewport(thumbNode)) {\n const offset = thumbNode.offsetLeft\n const val = offset > getTotalScrollValue() ? getTotalScrollValue() : offset\n\n setSpring.start({\n from: {\n val:\n wrapperRef.current?.[\n thumbsSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] ?? 0,\n },\n to: {\n val,\n },\n onChange: ({ value }) => {\n if (wrapperRef.current) {\n wrapperRef.current[thumbsSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'] =\n Math.abs(value.val)\n }\n },\n })\n }\n }\n }\n\n function handlePrepareThumbsData() {\n function getPreparedItems(\n _items: ReturnType<PrepareThumbsData<T>>,\n ): ReturnType<PrepareThumbsData<T>> {\n return _items.map(i => ({\n id: i.id,\n renderThumb: i.renderThumb,\n }))\n }\n\n if (prepareThumbsData) {\n return prepareThumbsData(getPreparedItems(items))\n }\n return getPreparedItems(items)\n }\n\n const thumbsFragment = withThumbs ? (\n <div\n className=\"use-spring-carousel-thumbs-wrapper\"\n ref={wrapperRef}\n onWheel={() => spring.val.stop()}\n style={{\n display: 'flex',\n flex: '1',\n position: 'relative',\n width: '100%',\n height: '100%',\n flexDirection: thumbsSlideAxis === 'x' ? 'row' : 'column',\n ...(thumbsSlideAxis === 'x'\n ? { overflowX: 'auto' }\n : {\n overflowY: 'auto',\n maxHeight: '100%',\n }),\n }}\n >\n {handlePrepareThumbsData().map(({ id, renderThumb }) => {\n const thumbId = `thumb-item-${id}`\n return (\n <div key={thumbId} id={thumbId} className=\"thumb-item\">\n {typeof renderThumb === 'function'\n ? renderThumb(renderThumbFnProps)\n : renderThumb}\n </div>\n )\n })}\n </div>\n ) : null\n\n return {\n thumbsFragment,\n handleScroll,\n }\n}\n","import { config, useIsomorphicLayoutEffect, useSpring } from '@react-spring/web'\nimport React, { createContext, useCallback, useContext, useEffect, useRef } from 'react'\n\nimport { useEventsModule } from './modules/useEventsModule'\nimport { useDrag } from '@use-gesture/react'\nimport { useFullscreenModule } from './modules/useFullscreenModule'\nimport { useThumbsModule } from './modules/useThumbsModule'\nimport ResizeObserver from 'resize-observer-polyfill'\n\nimport {\n SlideActionType,\n SlideMode,\n UseSpringCarouselComplete,\n UseSpringCarouselWithFreeScroll,\n UseSpringCarouselWithThumbs,\n UseSpringCarouselWithNoThumbs,\n UseSpringCarouselWithNoFixedItems,\n UseSpringCarouselWithFixedItems,\n UseSpringFreeScrollReturnType,\n UseSpringReturnType,\n SlideType,\n ItemWithThumb,\n} from './types'\n\ntype ReturnType<T> = T extends true ? UseSpringFreeScrollReturnType : UseSpringReturnType\n\n/**\n * With free scroll\n */\nfunction useSpringCarousel(props: UseSpringCarouselWithFreeScroll): ReturnType<true>\nfunction useSpringCarousel(props: UseSpringCarouselWithThumbs<true>): ReturnType<true>\nfunction useSpringCarousel(props: UseSpringCarouselWithNoThumbs<true>): ReturnType<true>\n/**\n * No free scroll\n */\nfunction useSpringCarousel(props: UseSpringCarouselWithThumbs<false>): ReturnType<false>\nfunction useSpringCarousel(props: UseSpringCarouselWithNoThumbs<false>): ReturnType<false>\nfunction useSpringCarousel(\n props: UseSpringCarouselWithFixedItems<false>,\n): ReturnType<false>\nfunction useSpringCarousel(\n props: UseSpringCarouselWithNoFixedItems<false>,\n): ReturnType<false>\n\nfunction useSpringCarousel({\n items,\n init = true,\n withThumbs,\n thumbsSlideAxis = 'x',\n itemsPerSlide: _itemsPerSlide = 1,\n slideType = 'fixed',\n gutter = 0,\n withLoop = false,\n startEndGutter = 0,\n carouselSlideAxis = 'x',\n disableGestures = false,\n draggingSlideTreshold: _draggingSlideTreshold,\n slideWhenThresholdIsReached = false,\n freeScroll,\n enableFreeScrollDrag,\n initialStartingPosition,\n prepareThumbsData,\n initialActiveItem = 0,\n animateWhenActiveItemChange = true,\n getControllerRef,\n}: UseSpringCarouselComplete): ReturnType<typeof freeScroll> {\n const itemsPerSlide = _itemsPerSlide > items.length ? items.length : _itemsPerSlide\n\n const resizeByPropChange = useRef(false)\n const draggingSlideTreshold = useRef(_draggingSlideTreshold ?? 0)\n const slideActionType = useRef<SlideActionType>('initial')\n const slideModeType = useRef<SlideMode>('initial')\n\n /**\n * After the user hits start/end edges of the carousel,\n * we check where the user is going. This is useful\n * to correctly resize the carousel when the carousel is going\n * backward after reaching the last item in fluid slide mode\n */\n const directionAfterReachingEdges = useRef<'forward' | 'backward' | 'initial'>(\n 'initial',\n )\n\n const activeItem = useRef(initialActiveItem)\n const firstItemReached = useRef(initialActiveItem === 0)\n const lastItemReached = useRef(\n slideType === 'fixed' && initialActiveItem === items.length - 1,\n )\n const mainCarouselWrapperRef = useRef<HTMLDivElement | null>(null)\n const carouselTrackWrapperRef = useRef<HTMLDivElement | null>(null)\n\n const isFirstMount = useRef(true)\n\n const prevTotalScrollValue = useRef(0)\n const prevWindowWidth = useRef(0)\n const prevSlidedValue = useRef(0)\n const prevWithLoop = useRef(withLoop)\n const prevSlideType = useRef(slideType)\n const prevFreeScroll = useRef(freeScroll)\n const windowIsHidden = useRef(false)\n\n const getItems = useCallback(() => {\n if (withLoop) {\n return [\n ...items.map(i => ({\n ...i,\n id: `prev-repeated-item-${i.id}`,\n })),\n ...items,\n ...items.map(i => ({\n ...i,\n id: `next-repeated-item-${i.id}`,\n })),\n ]\n }\n return [...items]\n }, [items, withLoop])\n const internalItems = getItems()\n\n const [spring, setSpring] = useSpring(\n () => ({\n val: 0,\n pause: !init,\n onChange: ({ value }) => {\n if (freeScroll && mainCarouselWrapperRef.current) {\n if (carouselSlideAxis === 'x') {\n mainCarouselWrapperRef.current.scrollLeft = Math.abs(value.val)\n } else {\n mainCarouselWrapperRef.current.scrollTop = Math.abs(value.val)\n }\n setStartEndItemReachedOnFreeScroll()\n } else if (carouselTrackWrapperRef.current) {\n if (carouselSlideAxis === 'x') {\n carouselTrackWrapperRef.current.style.transform = `translate3d(${value.val}px, 0px,0px)`\n } else {\n carouselTrackWrapperRef.current.style.transform = `translate3d(0px,${value.val}px,0px)`\n }\n }\n },\n }),\n [freeScroll],\n )\n const { emitEvent, useListenToCustomEvent } = useEventsModule<'use-spring'>()\n const { thumbsFragment, handleScroll } = useThumbsModule<'use-spring'>({\n withThumbs: !!withThumbs,\n thumbsSlideAxis,\n prepareThumbsData,\n items: items as ItemWithThumb<'use-spring'>[],\n renderThumbFnProps: {\n getIsActiveItem,\n getIsPrevItem,\n useListenToCustomEvent,\n getIsNextItem,\n },\n })\n const { enterFullscreen, exitFullscreen, getIsFullscreen } = useFullscreenModule({\n mainCarouselWrapperRef,\n handleResize: () => adjustCarouselWrapperPosition(),\n onFullScreenChange: val => {\n emitEvent({\n eventName: 'onFullscreenChange',\n isFullscreen: val,\n })\n },\n })\n\n function getItemStyles(isLastItem: boolean) {\n if (slideType === 'fixed' && !freeScroll) {\n return {\n marginRight: `${isLastItem ? 0 : gutter}px`,\n flex: `1 0 calc(100% / ${itemsPerSlide} - ${\n (gutter * (itemsPerSlide - 1)) / itemsPerSlide\n }px)`,\n }\n }\n return {\n ...{ marginRight: `${isLastItem ? 0 : gutter}px` },\n }\n }\n\n function getSlideValue() {\n const carouselItem = mainCarouselWrapperRef.current?.querySelector(\n '.use-spring-carousel-item',\n )\n\n if (!carouselItem) {\n throw Error('No carousel items available!')\n }\n\n return (\n carouselItem.getBoundingClientRect()[\n carouselSlideAxis === 'x' ? 'width' : 'height'\n ] + gutter\n )\n }\n\n type SlideToItem = {\n from: number\n to: number\n nextActiveItem?: number\n immediate?: boolean\n slideMode: SlideMode\n }\n\n function slideToItem({\n from,\n to,\n nextActiveItem,\n immediate = false,\n slideMode,\n }: SlideToItem) {\n slideModeType.current = slideMode\n\n if (typeof nextActiveItem === 'number') {\n if (!freeScroll) {\n activeItem.current = nextActiveItem\n }\n emitEvent({\n eventName: 'onSlideStartChange',\n slideActionType: slideActionType.current,\n slideMode: slideModeType.current,\n nextItem: {\n startReached: firstItemReached.current,\n endReached: lastItemReached.current,\n index: freeScroll ? -1 : activeItem.current,\n id: freeScroll ? '' : items[activeItem.current].id,\n },\n })\n }\n\n prevSlidedValue.current = to\n setSpring.start({\n immediate,\n from: {\n val: from,\n },\n to: {\n val: to,\n },\n config: {\n ...config.default,\n velocity: spring.val.velocity,\n },\n onRest(value) {\n if (!immediate && value.finished) {\n emitEvent({\n eventName: 'onSlideChange',\n slideActionType: slideActionType.current,\n slideMode: slideModeType.current,\n currentItem: {\n startReached: firstItemReached.current,\n endReached: lastItemReached.current,\n index: freeScroll ? -1 : activeItem.current,\n id: freeScroll ? '' : items[activeItem.current].id,\n },\n })\n }\n },\n })\n if (withThumbs && !immediate) {\n handleScroll(activeItem.current)\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n function getTotalScrollValue() {\n if (withLoop) {\n return getSlideValue() * items.length\n }\n return Math.round(\n Number(\n carouselTrackWrapperRef.current?.[\n carouselSlideAxis === 'x' ? 'scrollWidth' : 'scrollHeight'\n ],\n ) -\n carouselTrackWrapperRef.current!.getBoundingClientRect()[\n carouselSlideAxis === 'x' ? 'width' : 'height'\n ] -\n startEndGutter * 2,\n )\n }\n function getAnimatedWrapperStyles() {\n const percentValue = `calc(100% - ${startEndGutter * 2}px)`\n return {\n width: carouselSlideAxis === 'x' ? percentValue : '100%',\n height: carouselSlideAxis === 'y' ? percentValue : '100%',\n }\n }\n\n function getCarouselItemWidth() {\n const carouselItem = carouselTrackWrapperRef.current?.querySelector(\n '.use-spring-carousel-item',\n )\n if (!carouselItem) {\n throw Error('No carousel items available!')\n }\n return (\n carouselItem.getBoundingClientRect()[\n carouselSlideAxis === 'x' ? 'width' : 'height'\n ] + gutter\n )\n }\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n function adjustCarouselWrapperPosition() {\n const positionProperty = carouselSlideAxis === 'x' ? 'left' : 'top'\n\n function setPosition(v: number) {\n const ref = carouselTrackWrapperRef.current\n if (!ref) return\n\n if (withLoop) {\n ref.style.top = '0px'\n ref.style.left = '0px'\n ref.style[positionProperty] = `-${v - startEndGutter}px`\n\n firstItemReached.current = false\n lastItemReached.current = false\n } else {\n ref.style.left = '0px'\n ref.style.top = '0px'\n }\n }\n\n if (slideType === 'fixed' && withLoop) {\n if (initialStartingPosition === 'center') {\n setPosition(\n getCarouselItemWidth() * items.length -\n getSlideValue() * Math.round((itemsPerSlide - 1) / 2),\n )\n } else if (initialStartingPosition === 'end') {\n setPosition(\n getCarouselItemWidth() * items.length -\n getSlideValue() * Math.round(itemsPerSlide - 1),\n )\n } else {\n setPosition(getCarouselItemWidth() * items.length)\n }\n }\n\n if (slideType === 'fluid') {\n /**\n * User reached the last item and now is resizing the container that becomes smaller/bigger.\n * Example: on mobile devices the user rotates the device\n */\n if (\n lastItemReached.current &&\n getTotalScrollValue() !== Math.abs(prevSlidedValue.current) &&\n !withLoop\n ) {\n const newVal = -getTotalScrollValue()\n prevSlidedValue.current = newVal\n setSpring.start({\n immediate: true,\n val: prevSlidedValue.current,\n })\n return\n }\n\n if (\n Math.abs(prevSlidedValue.current) > 0 &&\n getTotalScrollValue() !== Math.abs(prevSlidedValue.current) &&\n !withLoop &&\n !freeScroll &&\n directionAfterReachingEdges.current === 'backward'\n ) {\n const diff = prevTotalScrollValue.current - getTotalScrollValue()\n const next = prevSlidedValue.current + diff\n\n setSpring.start({\n immediate: true,\n val: next,\n })\n\n return () => {\n prevSlidedValue.current = next\n }\n }\n\n return\n }\n\n if (!freeScroll && slideType === 'fixed') {\n const nextValue = -(getSlideValue() * activeItem.current)\n\n /**\n * Here we make sure to always show the latest item as the\n * latest item visible in the carousel viewport.\n */\n if (Math.abs(nextValue) > getTotalScrollValue() && !withLoop) {\n const val = -getTotalScrollValue()\n lastItemReached.current = true\n prevSlidedValue.current = val\n setSpring.start({\n immediate: true,\n val: prevSlidedValue.current,\n })\n } else {\n prevSlidedValue.current = nextValue\n setSpring.start({\n immediate: true,\n val: nextValue,\n })\n }\n\n setTimeout(() => {\n resizeByPropChange.current = false\n }, 0)\n }\n }\n function getFromValue() {\n if (freeScroll && mainCarouselWrapperRef.current) {\n return mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ]\n }\n return spring.val.get()\n }\n function getToValue(type: 'next' | 'prev', index?: number) {\n if (freeScroll && type === 'next') {\n const next = prevSlidedValue.current + getSlideValue()\n if (next > getTotalScrollValue()) {\n return getTotalScrollValue()\n }\n return next\n }\n\n if (freeScroll && type === 'prev') {\n const next = prevSlidedValue.current - getSlideValue()\n if (next < 0) {\n return 0\n }\n return next\n }\n\n if (type === 'next') {\n if (typeof index === 'number') {\n return -(index * getSlideValue())\n }\n return prevSlidedValue.current - getSlideValue()\n }\n\n if (typeof index === 'number') {\n return -(index * getSlideValue())\n }\n return prevSlidedValue.current + getSlideValue()\n }\n\n type SlideToPrevNextItem = {\n type: SlideMode\n index?: number\n immediate?: boolean\n }\n function slideToPrevItem({ type, index, immediate }: SlideToPrevNextItem) {\n if (!init || windowIsHidden.current || (firstItemReached.current && !withLoop)) return\n\n if (lastItemReached.current) {\n directionAfterReachingEdges.current = 'backward'\n }\n\n slideActionType.current = 'prev'\n lastItemReached.current = false\n\n const nextItem = typeof index === 'number' ? index : activeItem.current - 1\n\n if (!withLoop) {\n const nextItemWillExceed = freeScroll\n ? getToValue('prev', index) - getSlideValue() / 3 < 0\n : getToValue('prev', index) + getSlideValue() / 3 > 0\n\n if (firstItemReached.current) return\n if (nextItemWillExceed) {\n firstItemReached.current = true\n lastItemReached.current = false\n\n slideToItem({\n slideMode: type,\n from: getFromValue(),\n to: 0,\n nextActiveItem: 0,\n immediate,\n })\n return\n }\n }\n if (withLoop && (firstItemReached.current || nextItem < 0)) {\n firstItemReached.current = false\n lastItemReached.current = true\n slideToItem({\n slideMode: type,\n from: getFromValue() - getSlideValue() * items.length,\n to: -(getSlideValue() * items.length) + getSlideValue(),\n nextActiveItem: items.length - 1,\n immediate,\n })\n return\n }\n if (nextItem === 0) {\n firstItemReached.current = true\n }\n if (nextItem === items.length - 1 || nextItem === -1) {\n lastItemReached.current = true\n }\n slideToItem({\n slideMode: type,\n from: getFromValue(),\n to: getToValue('prev', index),\n nextActiveItem: nextItem,\n immediate,\n })\n }\n function slideToNextItem({ type, index, immediate }: SlideToPrevNextItem) {\n if (!init || windowIsHidden.current || (lastItemReached.current && !withLoop)) return\n\n if (firstItemReached.current) {\n directionAfterReachingEdges.current = 'forward'\n }\n\n slideActionType.current = 'next'\n firstItemReached.current = false\n\n const nextItem = index || activeItem.current + 1\n\n if (!withLoop) {\n const nextItemWillExceed =\n Math.abs(getToValue('next', index)) > getTotalScrollValue() - getSlideValue() / 3\n\n if (lastItemReached.current) return\n if (nextItemWillExceed) {\n firstItemReached.current = false\n lastItemReached.current = true\n\n slideToItem({\n slideMode: type,\n from: getFromValue(),\n to: freeScroll ? getTotalScrollValue() : -getTotalScrollValue(),\n nextActiveItem: nextItem,\n immediate,\n })\n return\n }\n }\n if (withLoop && (lastItemReached.current || nextItem > items.length - 1)) {\n lastItemReached.current = false\n firstItemReached.current = true\n slideToItem({\n slideMode: type,\n from: getFromValue() + getSlideValue() * items.length,\n to: 0,\n nextActiveItem: 0,\n immediate,\n })\n return\n }\n if (nextItem === 0) {\n firstItemReached.current = true\n }\n if (nextItem === items.length - 1) {\n lastItemReached.current = true\n }\n slideToItem({\n slideMode: type,\n from: getFromValue(),\n to: getToValue('next', index),\n nextActiveItem: nextItem,\n immediate,\n })\n }\n function getDraggingSliderTreshold() {\n if (_draggingSlideTreshold) {\n draggingSlideTreshold.current = _draggingSlideTreshold\n } else {\n draggingSlideTreshold.current = Math.floor(getSlideValue() / 2 / 2)\n }\n return draggingSlideTreshold.current\n }\n\n useEffect(() => {\n if (activeItem.current !== initialActiveItem) {\n internalSlideToItem({\n id: initialActiveItem,\n immediate: !animateWhenActiveItemChange,\n })\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialActiveItem])\n useEffect(() => {\n if (init) {\n if (initialActiveItem > items.length - 1) {\n throw new Error(\n `initialActiveItem (${initialActiveItem}) is greater than the total quantity available items (${items.length}).`,\n )\n }\n if (itemsPerSlide > items.length) {\n console.warn(\n `itemsPerSlide (${itemsPerSlide}) is greater than the total quantity available items (${items.length}). Fallback to ${items.length})`,\n )\n }\n }\n }, [initialActiveItem, items, itemsPerSlide, init])\n useEffect(() => {\n prevWindowWidth.current = window.innerWidth\n }, [])\n useEffect(() => {\n prevTotalScrollValue.current = getTotalScrollValue()\n if (!isFirstMount.current) {\n resizeByPropChange.current = true\n adjustCarouselWrapperPosition()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n initialStartingPosition,\n itemsPerSlide,\n startEndGutter,\n gutter,\n init,\n getTotalScrollValue,\n ])\n useEffect(() => {\n /**\n * When these props change we reset the carousel\n */\n if (\n withLoop !== prevWithLoop.current ||\n slideType !== prevSlideType.current ||\n freeScroll !== prevFreeScroll.current\n ) {\n prevWithLoop.current = withLoop\n prevSlideType.current = slideType\n prevFreeScroll.current = freeScroll\n\n if (carouselTrackWrapperRef.current) {\n carouselTrackWrapperRef.current.style.transform = `translate3d(0px, 0px,0px)`\n setSpring.start({\n val: 0,\n immediate: true,\n })\n }\n\n internalSlideToItem({ id: 0, immediate: true, shouldReset: true })\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [withLoop, slideType, freeScroll])\n useIsomorphicLayoutEffect(() => {\n /**\n * Set initial track position\n */\n if (carouselTrackWrapperRef.current) {\n adjustCarouselWrapperPosition()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n useEffect(() => {\n /**\n * When itemsPerSlide change we need to update the draggingSlideTreshold.current,\n * since it's default value is based on the calculation of the\n * width of a single item\n */\n getDraggingSliderTreshold()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [_draggingSlideTreshold, itemsPerSlide, slideType])\n useEffect(() => {\n if (mainCarouselWrapperRef.current) {\n let timer: NodeJS.Timeout\n const observer = new ResizeObserver(() => {\n if (isFirstMount.current) {\n isFirstMount.current = false\n return\n }\n\n if (windowIsHidden.current) return\n if (!resizeByPropChange.current) {\n prevWindowWidth.current = window.innerWidth\n const cb = adjustCarouselWrapperPosition()\n window.clearTimeout(timer)\n\n timer = setTimeout(() => {\n prevTotalScrollValue.current = getTotalScrollValue()\n if (typeof cb === 'function') {\n cb()\n }\n }, 100)\n }\n })\n observer.observe(mainCarouselWrapperRef.current)\n return () => {\n observer.disconnect()\n }\n }\n }, [adjustCarouselWrapperPosition, getTotalScrollValue])\n useEffect(() => {\n if (!init) return\n function handleVisibilityChange() {\n if (document.hidden) {\n windowIsHidden.current = true\n } else {\n windowIsHidden.current = false\n }\n }\n document.addEventListener('visibilitychange', handleVisibilityChange)\n return () => {\n document.removeEventListener('visibilitychange', handleVisibilityChange)\n }\n }, [init])\n\n const bindDrag = useDrag(\n state => {\n const isDragging = state.dragging\n const movement = state.offset[carouselSlideAxis === 'x' ? 0 : 1]\n const currentMovement = state.movement[carouselSlideAxis === 'x' ? 0 : 1]\n const direction = state.direction[carouselSlideAxis === 'x' ? 0 : 1]\n\n const prevItemTreshold = currentMovement > getDraggingSliderTreshold()\n const nextItemTreshold = currentMovement < -getDraggingSliderTreshold()\n const tot = getTotalScrollValue()\n\n if (isDragging) {\n if (direction > 0) {\n slideActionType.current = 'prev'\n } else {\n slideActionType.current = 'next'\n }\n\n emitEvent({\n ...state,\n eventName: 'onDrag',\n slideActionType: slideActionType.current,\n })\n\n if (freeScroll) {\n if (movement > 0) {\n setSpring.start({\n from: {\n val: getFromValue(),\n },\n to: {\n val: 0,\n },\n config: {\n velocity: state.velocity,\n friction: 50,\n tension: 1000,\n },\n })\n state.cancel()\n return\n }\n\n setSpring.start({\n from: {\n val: getFromValue(),\n },\n to: {\n val: -movement,\n },\n config: {\n velocity: state.velocity,\n friction: 50,\n tension: 1000,\n },\n })\n return\n }\n\n setSpring.start({\n val: movement,\n config: {\n velocity: state.velocity,\n friction: 50,\n tension: 1000,\n },\n })\n\n if (slideWhenThresholdIsReached && nextItemTreshold) {\n slideToNextItem({ type: 'drag' })\n state.cancel()\n } else if (slideWhenThresholdIsReached && prevItemTreshold) {\n slideToPrevItem({ type: 'drag' })\n state.cancel()\n }\n\n const res = tot - Math.abs(movement)\n\n if (res < -(getSlideValue() * 2)) {\n state.cancel()\n }\n\n return\n }\n\n if (state.last && freeScroll && movement > 0) {\n setSpring.start({\n from: {\n val: getFromValue(),\n },\n to: {\n val: 0,\n },\n config: {\n velocity: state.velocity,\n friction: 50,\n tension: 1000,\n },\n })\n return\n }\n if (state.last && !state.canceled && freeScroll) {\n if (slideActionType.current === 'prev') {\n slideToPrevItem({ type: 'drag' })\n }\n if (slideActionType.current === 'next') {\n slideToNextItem({ type: 'drag' })\n }\n }\n\n if (state.last && !state.canceled && !freeScroll) {\n if (nextItemTreshold) {\n if (!withLoop && lastItemReached.current) {\n setSpring.start({\n val: -getTotalScrollValue(),\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n } else {\n slideToNextItem({ type: 'drag' })\n }\n } else if (prevItemTreshold) {\n if (!withLoop && firstItemReached.current) {\n setSpring.start({\n val: 0,\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n } else {\n slideToPrevItem({ type: 'drag' })\n }\n } else {\n setSpring.start({\n val: prevSlidedValue.current,\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n }\n }\n if (state.last && state.canceled) {\n setSpring.start({\n val: prevSlidedValue.current,\n config: {\n ...config.default,\n velocity: state.velocity,\n },\n })\n }\n },\n {\n enabled:\n (init && !disableGestures && !freeScroll) ||\n (!!freeScroll && !!enableFreeScrollDrag),\n axis: carouselSlideAxis,\n from: () => {\n if (freeScroll && mainCarouselWrapperRef.current) {\n return [\n -mainCarouselWrapperRef.current.scrollLeft,\n -mainCarouselWrapperRef.current.scrollTop,\n ]\n }\n if (carouselSlideAxis === 'x') {\n return [spring.val.get(), spring.val.get()]\n }\n return [spring.val.get(), spring.val.get()]\n },\n },\n )\n\n function getWrapperOverflowStyles() {\n if (freeScroll) {\n if (carouselSlideAxis === 'x') {\n return {\n overflowX: 'auto',\n }\n }\n return {\n overflowY: 'auto',\n }\n }\n return {}\n }\n\n function setStartEndItemReachedOnFreeScroll() {\n if (mainCarouselWrapperRef.current) {\n prevSlidedValue.current =\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ]\n if (\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] === 0\n ) {\n firstItemReached.current = true\n lastItemReached.current = false\n }\n if (\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] > 0 &&\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] < getTotalScrollValue()\n ) {\n firstItemReached.current = false\n lastItemReached.current = false\n }\n\n if (\n mainCarouselWrapperRef.current[\n carouselSlideAxis === 'x' ? 'scrollLeft' : 'scrollTop'\n ] === getTotalScrollValue()\n ) {\n firstItemReached.current = false\n lastItemReached.current = true\n }\n }\n }\n function getScrollHandlers() {\n if (freeScroll) {\n return {\n onWheel() {\n spring.val.stop()\n setStartEndItemReachedOnFreeScroll()\n },\n }\n }\n return {}\n }\n\n function findItemIndex(id: string | number, error?: string) {\n let itemIndex = 0\n\n if (typeof id === 'string') {\n itemIndex = items.findIndex(item => item.id === id)\n } else {\n itemIndex = id\n }\n if (itemIndex < 0 || itemIndex >= items.length) {\n if (error) {\n throw new Error(error)\n }\n console.error(\n `The item doesn't exist; check that the id provided - ${id} - is correct.`,\n )\n itemIndex = -1\n }\n\n return itemIndex\n }\n type InternalSlideToItem = {\n id: string | number\n immediate?: boolean\n shouldReset?: boolean\n type?: SlideType\n }\n function internalSlideToItem({\n id,\n immediate,\n shouldReset,\n type,\n }: InternalSlideToItem) {\n if (!init || windowIsHidden.current) return\n\n firstItemReached.current = false\n lastItemReached.current = false\n\n const itemIndex = findItemIndex(\n id,\n \"The item you want to slide to doesn't exist; check the provided id.\",\n )\n\n if (itemIndex === activeItem.current && !shouldReset) {\n return\n }\n\n const currentItem = findItemIndex(items[activeItem.current].id)\n const newActiveItem = findItemIndex(items[itemIndex].id)\n\n if (newActiveItem > currentItem) {\n slideToNextItem({\n type: type || shouldReset ? 'initial' : 'click',\n index: newActiveItem,\n immediate,\n })\n } else {\n slideToPrevItem({\n type: type || shouldReset ? 'initial' : 'click',\n index: newActiveItem,\n immediate,\n })\n }\n }\n function getIsNextItem(id: string | number) {\n const itemIndex = findItemIndex(id, \"The item doesn't exist; check the provided id.\")\n const _activeItem = activeItem.current\n if (withLoop && _activeItem === items.length - 1) {\n return itemIndex === 0\n }\n return itemIndex === _activeItem + 1\n }\n function getIsPrevItem(id: string | number) {\n const itemIndex = findItemIndex(id, \"The item doesn't exist; check the provided id.\")\n const _activeItem = activeItem.current\n if (withLoop && _activeItem === 0) {\n return itemIndex === items.length - 1\n }\n return itemIndex === _activeItem - 1\n }\n function getIsActiveItem(id: string | number) {\n return (\n findItemIndex(\n id,\n \"The item you want to check doesn't exist; check the provided id.\",\n ) === activeItem.current\n )\n }\n\n const res = freeScroll\n ? {\n useListenToCustomEvent,\n enterFullscreen,\n exitFullscreen,\n getIsFullscreen,\n slideToPrevItem: (animate = true) => {\n slideToPrevItem({\n type: 'click',\n immediate: !animate,\n })\n },\n slideToNextItem: (animate = true) => {\n slideToNextItem({\n type: 'click',\n immediate: !animate,\n })\n },\n }\n : {\n useListenToCustomEvent,\n enterFullscreen,\n exitFullscreen,\n getIsFullscreen,\n slideToPrevItem: (animate = true) => {\n slideToPrevItem({\n type: 'click',\n immediate: !animate,\n })\n },\n slideToNextItem: (animate = true) => {\n slideToNextItem({\n type: 'click',\n immediate: !animate,\n })\n },\n slideToItem: (id: string | number, animate = true) => {\n internalSlideToItem({ id, immediate: !animate })\n },\n getIsNextItem,\n getIsPrevItem,\n getIsActiveItem,\n }\n\n useEffect(() => {\n if (getControllerRef) {\n getControllerRef({\n slideToNextItem: res.slideToNextItem,\n slideToPrevItem: res.slideToPrevItem,\n slideToItem: res?.slideToItem,\n })\n }\n }, [getControllerRef, res.slideToItem, res.slideToNextItem, res.slideToPrevItem])\n\n const _thumbsFragment = (\n <Context.Provider value={res}>{thumbsFragment}</Context.Provider>\n )\n const carouselFragment = (\n <Context.Provider value={res}>\n <div\n className=\"use-spring-carousel-main-wrapper\"\n ref={mainCarouselWrapperRef}\n {...getScrollHandlers()}\n style={{\n display: 'flex',\n position: 'relative',\n width: '100%',\n height: '100%',\n ...(getWrapperOverflowStyles() as React.CSSProperties),\n }}\n >\n <div\n className=\"use-spring-carousel-track-wrapper\"\n ref={carouselTrackWrapperRef}\n {...bindDrag()}\n style={{\n position: 'relative',\n display: 'flex',\n flexDirection: carouselSlideAxis === 'x' ? 'row' : 'column',\n touchAction: 'none',\n ...getAnimatedWrapperStyles(),\n }}\n >\n {(freeScroll || !withLoop) && startEndGutter ? (\n <div\n style={{\n flexShrink: 0,\n width: startEndGutter,\n }}\n />\n ) : null}\n {internalItems.map((item, index) => {\n console.log({\n curr: index,\n index: internalItems.findIndex(\n i => i.id === internalItems[internalItems.length - 1].id,\n ),\n })\n return (\n <div\n key={`${item.id}-${index}`}\n className=\"use-spring-carousel-item\"\n data-testid=\"use-spring-carousel-item-wrapper\"\n style={{\n display: 'flex',\n position: 'relative',\n flex: '1',\n ...getItemStyles(\n index ===\n internalItems.findIndex(\n i => i.id === internalItems[internalItems.length - 1].id,\n ),\n ),\n }}\n >\n {typeof item.renderItem === 'function'\n ? item.renderItem({\n getIsActiveItem,\n getIsNextItem,\n getIsPrevItem,\n useListenToCustomEvent,\n })\n : item.renderItem}\n </div>\n )\n })}\n {(freeScroll || !withLoop) && startEndGutter ? (\n <div\n style={{\n flexShrink: 0,\n width: startEndGutter,\n }}\n />\n ) : null}\n </div>\n </div>\n </Context.Provider>\n )\n\n return { ...res, carouselFragment, thumbsFragment: _thumbsFragment }\n}\n\ntype ContextProps<T = undefined> = Omit<\n ReturnType<T extends 'free-scroll' ? true : false>,\n 'carouselFragment' | 'thumbsFragment'\n>\n\nconst Context = createContext<ContextProps | ContextProps<'free-scroll'> | undefined>(\n undefined,\n)\n\nfunction useSpringCarouselContext<T>() {\n const context = useContext(Context)\n if (!context) {\n throw new Error('useSpringCarouselContext must be used within the carousel.')\n }\n return context as ContextProps<T>\n}\n\nexport { useSpringCarousel, useSpringCarouselContext }\n","import { a, config, useTransition } from '@react-spring/web'\nimport { useEffect, useRef, useState, createContext, useContext } from 'react'\nimport { useEventsModule } from './modules/useEventsModule'\nimport { useDrag } from '@use-gesture/react'\nimport { useThumbsModule } from './modules'\nimport {\n ItemWithThumb,\n UseTransitionCarouselProps,\n UseTransitionCarouselReturnProps,\n SlideActionType,\n TransitionSlideMode,\n} from './types'\n\nconst defaultAnimationProps = {\n initial: {\n opacity: 1,\n position: 'relative',\n },\n from: {\n opacity: 0,\n position: 'relative',\n },\n enter: {\n position: 'relative',\n opacity: 1,\n },\n leave: {\n opacity: 1,\n position: 'absolute',\n },\n}\n\nfunction useTransitionCarousel({\n init = true,\n disableGestures = false,\n items,\n springConfig = config.default,\n exitBeforeEnter = false,\n trail,\n withLoop = false,\n activeItem: externalActiveItem,\n toPrevItemSpringProps = defaultAnimationProps,\n toNextItemSpringProps = defaultAnimationProps,\n draggingSlideTreshold = 50,\n thumbsSlideAxis = 'x',\n}: UseTransitionCarouselProps): UseTransitionCarouselReturnProps {\n const slideActionType = useRef<SlideActionType>('next')\n const slideModeType = useRef<TransitionSlideMode>('initial')\n const mainCarouselWrapperRef = useRef<HTMLDivElement | null>(null)\n const [activeItem, setActiveItem] = useState(externalActiveItem ?? 0)\n const { emitEvent, useListenToCustomEvent } = useEventsModule<'use-transition'>()\n const { handleScroll, thumbsFragment } = useThumbsModule<'use-transition'>({\n thumbsSlideAxis,\n items: items as ItemWithThumb<'use-transition'>[],\n renderThumbFnProps: {\n getIsNextItem,\n getIsPrevItem,\n useListenToCustomEvent,\n activeItem: {\n index: activeItem,\n id: items[activeItem].id,\n },\n },\n })\n\n function getConfig() {\n if (slideActionType.current === 'prev') {\n return {\n initial: {\n ...toPrevItemSpringProps.initial,\n },\n from: {\n ...toPrevItemSpringProps.from,\n },\n enter: {\n ...toPrevItemSpringProps.enter,\n },\n leave: {\n ...toPrevItemSpringProps.leave,\n },\n }\n }\n if (slideActionType.current === 'next') {\n return {\n initial: {\n ...toNextItemSpringProps.initial,\n },\n from: {\n ...toNextItemSpringProps.from,\n },\n enter: {\n ...toNextItemSpringProps.enter,\n },\n leave: {\n ...toNextItemSpringProps.leave,\n },\n }\n }\n return {\n initial: {\n ...defaultAnimationProps.initial,\n },\n from: {\n ...defaultAnimationProps.from,\n },\n enter: {\n ...defaultAnimationProps.enter,\n },\n leave: {\n ...defaultAnimationProps.leave,\n },\n }\n }\n\n useEffect(() => {\n if (typeof externalActiveItem === 'number' && externalActiveItem !== activeItem) {\n setActiveItem(externalActiveItem)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [externalActiveItem])\n\n type SlideToItem = {\n to: number\n slideType: SlideActionType\n slideMode: TransitionSlideMode\n }\n\n function slideToItem({ to, slideType, slideMode }: SlideToItem) {\n slideActionType.current = slideType\n slideModeType.current = slideMode\n emitEvent({\n eventName: 'onSlideStartChange',\n slideActionType: slideActionType.current,\n slideMode: slideModeType.current,\n nextItem: {\n index: to,\n id: items[to].id,\n startReached: to === 0,\n endReached: to === items.length - 1,\n },\n })\n setActiveItem(to)\n handleScroll(activeItem)\n }\n\n function slideToPrevItem(slideMode: TransitionSlideMode) {\n if (!init) return\n const isFirstItem = activeItem === 0\n\n if (!withLoop && isFirstItem) return\n\n if (withLoop && isFirstItem) {\n slideToItem({\n to: items.length - 1,\n slideType: 'prev',\n slideMode,\n })\n } else {\n slideToItem({\n to: activeItem - 1,\n slideType: 'prev',\n slideMode,\n })\n }\n }\n function slideToNextItem(slideMode: TransitionSlideMode) {\n if (!init) return\n const isLastItem = activeItem === items.length - 1\n\n if (!withLoop && isLastItem) return\n\n if (withLoop && isLastItem) {\n slideToItem({\n to: 0,\n slideType: 'next',\n slideMode,\n })\n } else {\n slideToItem({\n to: activeItem + 1,\n slideType: 'next',\n slideMode,\n })\n }\n }\n\n const transitions = useTransition(activeItem, {\n config: springConfig,\n key: null,\n trail,\n exitBeforeEnter,\n ...getConfig(),\n onRest(value, _, index) {\n if (value.finished && index === activeItem) {\n emitEvent({\n eventName: 'onSlideChange',\n slideActionType: slideActionType.current,\n slideMode: slideModeType.current,\n currentItem: {\n index: activeItem,\n id: items[activeItem].id,\n startReached: activeItem === 0,\n endReached: activeItem === items.length - 1,\n },\n })\n }\n },\n })\n\n const bindSwipe = useDrag(\n ({ last, movement: [mx] }) => {\n if (last) {\n const prevItemTreshold = mx > draggingSlideTreshold\n const nextItemTreshold = mx < -draggingSlideTreshold\n const isFirstItem = activeItem === 0\n const isLastItem = activeItem === items.length - 1\n\n if (nextItemTreshold) {\n if (!withLoop && isLastItem) return\n\n emitEvent({\n eventName: 'onLeftSwipe',\n })\n slideToNextItem('swipe')\n } else if (prevItemTreshold) {\n if (!withLoop && isFirstItem) return\n\n emitEvent({\n eventName: 'onRightSwipe',\n })\n slideToPrevItem('swipe')\n }\n }\n },\n {\n enabled: !disableGestures,\n },\n )\n\n function findItemIndex(id: string | number, error?: string) {\n let itemIndex = 0\n\n if (typeof id === 'string') {\n itemIndex = items.findIndex(item => item.id === id)\n } else {\n itemIndex = id\n }\n if (itemIndex < 0 || itemIndex >= items.length) {\n if (error) {\n throw new Error(error)\n }\n console.error(\n `The item doesn't exist; check that the id provided - ${id} - is correct.`,\n )\n itemIndex = -1\n }\n\n return itemIndex\n }\n function getIsNextItem(id: string | number) {\n const itemIndex = findItemIndex(id, \"The item doesn't exist; check the provided id.\")\n const _activeItem = activeItem\n if (withLoop && _activeItem === items.length - 1) {\n return itemIndex === 0\n }\n return itemIndex === _activeItem + 1\n }\n function getIsPrevItem(id: string | number) {\n const itemIndex = findItemIndex(id, \"The item doesn't exist; check the provided id.\")\n const _activeItem = activeItem\n if (withLoop && _activeItem === 0) {\n return itemIndex === items.length - 1\n }\n return itemIndex === _activeItem - 1\n }\n\n const itemsFragment = transitions((styles, item, _, indx) => {\n const renderItem = items[item].renderItem\n return (\n <a.div\n id={`use-transition-carousel-item-${indx}`}\n className=\"use-transition-carousel-item\"\n style={{\n ...styles,\n flex: '1 0 100%',\n width: '100%',\n height: '100%',\n }}\n >\n {typeof renderItem === 'function'\n ? renderItem({\n useListenToCustomEvent,\n getIsNextItem,\n getIsPrevItem,\n activeItem: {\n index: activeItem,\n id: items[activeItem].id,\n },\n })\n : renderItem}\n </a.div>\n )\n })\n\n const result = {\n useListenToCustomEvent,\n slideToPrevItem: () => slideToPrevItem('click'),\n slideToNextItem: () => slideToNextItem('click'),\n }\n\n const _thumbsFragment = (\n <Context.Provider value={result}>{thumbsFragment}</Context.Provider>\n )\n const carouselFragment = (\n <Context.Provider value={result}>\n <div\n ref={mainCarouselWrapperRef}\n {...bindSwipe()}\n style={{\n display: 'flex',\n position: 'relative',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n {itemsFragment}\n </div>\n </Context.Provider>\n )\n\n return {\n ...result,\n carouselFragment,\n thumbsFragment: _thumbsFragment,\n }\n}\n\ntype ContextProps = Omit<\n UseTransitionCarouselReturnProps,\n 'carouselFragment' | 'thumbsFragment'\n>\n\nconst Context = createContext<ContextProps | undefined>(undefined)\n\nfunction useTransitionCarouselContext() {\n const context = useContext(Context)\n if (!context) {\n throw new Error('useTransitionCarouselContext must be used within the carousel.')\n }\n return context\n}\n\nexport { useTransitionCarousel, useTransitionCarouselContext }\n"],"names":["eventLabel","useEventsModule","targetEvent","useRef","useListenToCustomEvent","eventHandler","useEffect","handleEvent","event","detail","current","document","createElement","addEventListener","_a","removeEventListener","emitEvent","newEvent","CustomEvent","dispatchEvent","useFullscreenModule","mainCarouselWrapperRef","onFullScreenChange","handleResize","isFullscreen","setIsFullscreen","_isFullscreen","handleFullscreenChange","fullscreenElement","screenfull","isEnabled","on","off","enterFullscreen","elementRef","request","exitFullscreen","exit","getIsFullscreen","useThumbsModule","thumbsSlideAxis","withThumbs","prepareThumbsData","items","renderThumbFnProps","wrapperRef","spring","setSpring","useSpring","val","getTotalScrollValue","Math","round","Number","getBoundingClientRect","thumbsFragment","_jsx","jsx","Object","assign","className","ref","onWheel","stop","style","display","flex","position","width","height","flexDirection","overflowX","overflowY","maxHeight","children","getPreparedItems","_items","map","i","id","renderThumb","handlePrepareThumbsData","thumbId","handleScroll","activeItem","thumbNode","querySelector","el","rect","top","left","bottom","window","innerHeight","documentElement","clientHeight","right","innerWidth","clientWidth","isInViewport","offset","offsetLeft","start","from","to","onChange","value","abs","Context","createContext","undefined","defaultAnimationProps","initial","opacity","enter","leave","init","itemsPerSlide","_itemsPerSlide","slideType","gutter","withLoop","startEndGutter","carouselSlideAxis","disableGestures","draggingSlideTreshold","_draggingSlideTreshold","slideWhenThresholdIsReached","freeScroll","enableFreeScrollDrag","initialStartingPosition","initialActiveItem","animateWhenActiveItemChange","getControllerRef","length","resizeByPropChange","slideActionType","slideModeType","directionAfterReachingEdges","firstItemReached","lastItemReached","carouselTrackWrapperRef","isFirstMount","prevTotalScrollValue","prevWindowWidth","prevSlidedValue","prevWithLoop","prevSlideType","prevFreeScroll","windowIsHidden","internalItems","useCallback","getItems","pause","scrollLeft","scrollTop","setStartEndItemReachedOnFreeScroll","transform","getIsActiveItem","getIsPrevItem","getIsNextItem","adjustCarouselWrapperPosition","eventName","getSlideValue","carouselItem","Error","slideToItem","nextActiveItem","immediate","slideMode","nextItem","startReached","endReached","index","config","default","velocity","onRest","finished","currentItem","getCarouselItemWidth","positionProperty","setPosition","v","nextValue","setTimeout","newVal","diff","next","getFromValue","get","getToValue","type","slideToPrevItem","nextItemWillExceed","slideToNextItem","getDraggingSliderTreshold","floor","internalSlideToItem","console","warn","shouldReset","useIsomorphicLayoutEffect","timer","observer","ResizeObserver","cb","clearTimeout","observe","disconnect","handleVisibilityChange","hidden","bindDrag","useDrag","state","isDragging","dragging","movement","currentMovement","direction","prevItemTreshold","nextItemTreshold","tot","friction","tension","cancel","last","canceled","enabled","axis","findItemIndex","error","itemIndex","findIndex","item","newActiveItem","_activeItem","res","animate","_thumbsFragment","Provider","carouselFragment","_jsxs","touchAction","percentValue","getAnimatedWrapperStyles","flexShrink","log","curr","isLastItem","marginRight","renderItem","context","useContext","springConfig","exitBeforeEnter","trail","externalActiveItem","toPrevItemSpringProps","toNextItemSpringProps","setActiveItem","useState","isFirstItem","transitions","useTransition","key","_","bindSwipe","mx","itemsFragment","styles","indx","a","div","result","overflow"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsx as e,jsxs as t}from"react/jsx-runtime";import{useSpring as r,useIsomorphicLayoutEffect as n,config as i}from"@react-spring/web";import{createContext as c,useRef as s,useCallback as o,useEffect as l,useContext as u}from"react";import{u as a,a as d}from"./useThumbsModule-faa196f9.js";import{useDrag as m}from"@use-gesture/react";import{u as f}from"./useFullscreenModule-519d337d.js";import v from"resize-observer-polyfill";import"screenfull";function h({items:c,init:u=!0,withThumbs:h,thumbsSlideAxis:p="x",itemsPerSlide:x=1,slideType:y="fixed",gutter:b=0,withLoop:I=!1,startEndGutter:T=0,carouselSlideAxis:w="x",disableGestures:j=!1,draggingSlideTreshold:O,slideWhenThresholdIsReached:M=!1,freeScroll:A,enableFreeScrollDrag:F,initialStartingPosition:S,prepareThumbsData:k,initialActiveItem:C=0,animateWhenActiveItemChange:N=!0,getControllerRef:$}){const L=x>c.length?c.length:x,R=s(!1),E=s(null!=O?O:0),P=s("initial"),W=s("initial"),D=s("initial"),q=s(C),B=s(0===C),z=s("fixed"===y&&C===c.length-1),G=s(null),H=s(null),X=s(!0),Y=s(0),J=s(0),K=s(0),Q=s(I),U=s(y),V=s(A),Z=s(!1),_=o((()=>I?[...c.map((e=>Object.assign(Object.assign({},e),{id:`prev-repeated-item-${e.id}`}))),...c,...c.map((e=>Object.assign(Object.assign({},e),{id:`next-repeated-item-${e.id}`})))]:[...c]),[c,I])(),[ee,te]=r((()=>({val:0,pause:!u,onChange:({value:e})=>{A&&G.current?("x"===w?G.current.scrollLeft=Math.abs(e.val):G.current.scrollTop=Math.abs(e.val),be()):H.current&&(H.current.style.transform="x"===w?`translate3d(${e.val}px, 0px,0px)`:`translate3d(0px,${e.val}px,0px)`)}})),[A]),{emitEvent:re,useListenToCustomEvent:ne}=a(),{thumbsFragment:ie,handleScroll:ce}=d({withThumbs:!!h,thumbsSlideAxis:p,prepareThumbsData:k,items:c,renderThumbFnProps:{getIsActiveItem:Oe,getIsPrevItem:je,useListenToCustomEvent:ne,getIsNextItem:we}}),{enterFullscreen:se,exitFullscreen:oe,getIsFullscreen:le}=f({mainCarouselWrapperRef:G,handleResize:()=>fe(),onFullScreenChange:e=>{re({eventName:"onFullscreenChange",isFullscreen:e})}});function ue(){var e;const t=null===(e=G.current)||void 0===e?void 0:e.querySelector(".use-spring-carousel-item");if(!t)throw Error("No carousel items available!");return t.getBoundingClientRect()["x"===w?"width":"height"]+b}function ae({from:e,to:t,nextActiveItem:r,immediate:n=!1,slideMode:s}){W.current=s,"number"==typeof r&&(A||(q.current=r),re({eventName:"onSlideStartChange",slideActionType:P.current,slideMode:W.current,nextItem:{startReached:B.current,endReached:z.current,index:A?-1:q.current,id:A?"":c[q.current].id}})),K.current=t,te.start({immediate:n,from:{val:e},to:{val:t},config:Object.assign(Object.assign({},i.default),{velocity:ee.val.velocity}),onRest(e){!n&&e.finished&&re({eventName:"onSlideChange",slideActionType:P.current,slideMode:W.current,currentItem:{startReached:B.current,endReached:z.current,index:A?-1:q.current,id:A?"":c[q.current].id}})}}),h&&!n&&ce(q.current)}function de(){var e;return I?ue()*c.length:Math.round(Number(null===(e=H.current)||void 0===e?void 0:e["x"===w?"scrollWidth":"scrollHeight"])-H.current.getBoundingClientRect()["x"===w?"width":"height"]-2*T)}function me(){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"===w?"width":"height"]+b}function fe(){const e="x"===w?"left":"top";function t(t){const r=H.current;r&&(I?(r.style.top="0px",r.style.left="0px",r.style[e]=`-${t-T}px`,B.current=!1,z.current=!1):(r.style.left="0px",r.style.top="0px"))}if("fixed"===y&&I&&t("center"===S?me()*c.length-ue()*Math.round((L-1)/2):"end"===S?me()*c.length-ue()*Math.round(L-1):me()*c.length),"fluid"!==y){if(!A&&"fixed"===y){const e=-ue()*q.current;if(Math.abs(e)>de()&&!I){const e=-de();z.current=!0,K.current=e,te.start({immediate:!0,val:K.current})}else K.current=e,te.start({immediate:!0,val:e});setTimeout((()=>{R.current=!1}),0)}}else{if(z.current&&de()!==Math.abs(K.current)&&!I){const e=-de();return K.current=e,void te.start({immediate:!0,val:K.current})}if(Math.abs(K.current)>0&&de()!==Math.abs(K.current)&&!I&&!A&&"backward"===D.current){const e=Y.current-de(),t=K.current+e;return te.start({immediate:!0,val:t}),()=>{K.current=t}}}}function ve(){return A&&G.current?G.current["x"===w?"scrollLeft":"scrollTop"]:ee.val.get()}function he(e,t){if(A&&"next"===e){const e=K.current+ue();return e>de()?de():e}if(A&&"prev"===e){const e=K.current-ue();return e<0?0:e}return"next"===e?"number"==typeof t?-t*ue():K.current-ue():"number"==typeof t?-t*ue():K.current+ue()}function ge({type:e,index:t,immediate:r}){if(!u||Z.current||B.current&&!I)return;z.current&&(D.current="backward"),P.current="prev",z.current=!1;const n="number"==typeof t?t:q.current-1;if(!I){const n=A?he("prev",t)-ue()/3<0:he("prev",t)+ue()/3>0;if(B.current)return;if(n)return B.current=!0,z.current=!1,void ae({slideMode:e,from:ve(),to:0,nextActiveItem:0,immediate:r})}if(I&&(B.current||n<0))return B.current=!1,z.current=!0,void ae({slideMode:e,from:ve()-ue()*c.length,to:-ue()*c.length+ue(),nextActiveItem:c.length-1,immediate:r});0===n&&(B.current=!0),n!==c.length-1&&-1!==n||(z.current=!0),ae({slideMode:e,from:ve(),to:he("prev",t),nextActiveItem:n,immediate:r})}function pe({type:e,index:t,immediate:r}){if(!u||Z.current||z.current&&!I)return;B.current&&(D.current="forward"),P.current="next",B.current=!1;const n=t||q.current+1;if(!I){const i=Math.abs(he("next",t))>de()-ue()/3;if(z.current)return;if(i)return B.current=!1,z.current=!0,void ae({slideMode:e,from:ve(),to:A?de():-de(),nextActiveItem:n,immediate:r})}if(I&&(z.current||n>c.length-1))return z.current=!1,B.current=!0,void ae({slideMode:e,from:ve()+ue()*c.length,to:0,nextActiveItem:0,immediate:r});0===n&&(B.current=!0),n===c.length-1&&(z.current=!0),ae({slideMode:e,from:ve(),to:he("next",t),nextActiveItem:n,immediate:r})}function xe(){return E.current=O||Math.floor(ue()/2/2),E.current}l((()=>{q.current!==C&&Te({id:C,immediate:!N})}),[C]),l((()=>{if(u){if(C>c.length-1)throw new Error(`initialActiveItem (${C}) is greater than the total quantity available items (${c.length}).`);L>c.length&&console.warn(`itemsPerSlide (${L}) is greater than the total quantity available items (${c.length}). Fallback to ${c.length})`)}}),[C,c,L,u]),l((()=>{J.current=window.innerWidth}),[]),l((()=>{Y.current=de(),X.current||(R.current=!0,fe())}),[S,L,T,b,u,de]),l((()=>{I===Q.current&&y===U.current&&A===V.current||(Q.current=I,U.current=y,V.current=A,H.current&&(H.current.style.transform="translate3d(0px, 0px,0px)",te.start({val:0,immediate:!0})),Te({id:0,immediate:!0,shouldReset:!0}))}),[I,y,A]),n((()=>{H.current&&fe()}),[]),l((()=>{xe()}),[O,L,y]),l((()=>{if(G.current){let e;const t=new v((()=>{if(X.current)X.current=!1;else if(!Z.current&&!R.current){J.current=window.innerWidth;const t=fe();window.clearTimeout(e),e=setTimeout((()=>{Y.current=de(),"function"==typeof t&&t()}),100)}}));return t.observe(G.current),()=>{t.disconnect()}}}),[fe,de]),l((()=>{if(u)return document.addEventListener("visibilitychange",e),()=>{document.removeEventListener("visibilitychange",e)};function e(){document.hidden?Z.current=!0:Z.current=!1}}),[u]);const ye=m((e=>{const t=e.dragging,r=e.offset["x"===w?0:1],n=e.movement["x"===w?0:1],c=e.direction["x"===w?0:1],s=n>xe(),o=n<-xe(),l=de();if(t){if(P.current=c>0?"prev":"next",re(Object.assign(Object.assign({},e),{eventName:"onDrag",slideActionType:P.current})),A)return r>0?(te.start({from:{val:ve()},to:{val:0},config:{velocity:e.velocity,friction:50,tension:1e3}}),void e.cancel()):void te.start({from:{val:ve()},to:{val:-r},config:{velocity:e.velocity,friction:50,tension:1e3}});te.start({val:r,config:{velocity:e.velocity,friction:50,tension:1e3}}),M&&o?(pe({type:"drag"}),e.cancel()):M&&s&&(ge({type:"drag"}),e.cancel());l-Math.abs(r)<-2*ue()&&e.cancel()}else e.last&&A&&r>0?te.start({from:{val:ve()},to:{val:0},config:{velocity:e.velocity,friction:50,tension:1e3}}):(e.last&&!e.canceled&&A&&("prev"===P.current&&ge({type:"drag"}),"next"===P.current&&pe({type:"drag"})),!e.last||e.canceled||A||(o?!I&&z.current?te.start({val:-de(),config:Object.assign(Object.assign({},i.default),{velocity:e.velocity})}):pe({type:"drag"}):s?!I&&B.current?te.start({val:0,config:Object.assign(Object.assign({},i.default),{velocity:e.velocity})}):ge({type:"drag"}):te.start({val:K.current,config:Object.assign(Object.assign({},i.default),{velocity:e.velocity})})),e.last&&e.canceled&&te.start({val:K.current,config:Object.assign(Object.assign({},i.default),{velocity:e.velocity})}))}),{enabled:u&&!j&&!A||!!A&&!!F,axis:w,from:()=>A&&G.current?[-G.current.scrollLeft,-G.current.scrollTop]:[ee.val.get(),ee.val.get()]});function be(){G.current&&(K.current=G.current["x"===w?"scrollLeft":"scrollTop"],0===G.current["x"===w?"scrollLeft":"scrollTop"]&&(B.current=!0,z.current=!1),G.current["x"===w?"scrollLeft":"scrollTop"]>0&&G.current["x"===w?"scrollLeft":"scrollTop"]<de()&&(B.current=!1,z.current=!1),G.current["x"===w?"scrollLeft":"scrollTop"]===de()&&(B.current=!1,z.current=!0))}function Ie(e,t){let r=0;if(r="string"==typeof e?c.findIndex((t=>t.id===e)):e,r<0||r>=c.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 Te({id:e,immediate:t,shouldReset:r,type:n}){if(!u||Z.current)return;B.current=!1,z.current=!1;const i=Ie(e,"The item you want to slide to doesn't exist; check the provided id.");if(i===q.current&&!r)return;const s=Ie(c[q.current].id),o=Ie(c[i].id);o>s?pe({type:n||r?"initial":"click",index:o,immediate:t}):ge({type:n||r?"initial":"click",index:o,immediate:t})}function we(e){const t=Ie(e,"The item doesn't exist; check the provided id."),r=q.current;return I&&r===c.length-1?0===t:t===r+1}function je(e){const t=Ie(e,"The item doesn't exist; check the provided id."),r=q.current;return I&&0===r?t===c.length-1:t===r-1}function Oe(e){return Ie(e,"The item you want to check doesn't exist; check the provided id.")===q.current}const Me=A?{useListenToCustomEvent:ne,enterFullscreen:se,exitFullscreen:oe,getIsFullscreen:le,slideToPrevItem:(e=!0)=>{ge({type:"click",immediate:!e})},slideToNextItem:(e=!0)=>{pe({type:"click",immediate:!e})}}:{useListenToCustomEvent:ne,enterFullscreen:se,exitFullscreen:oe,getIsFullscreen:le,slideToPrevItem:(e=!0)=>{ge({type:"click",immediate:!e})},slideToNextItem:(e=!0)=>{pe({type:"click",immediate:!e})},slideToItem:(e,t=!0)=>{Te({id:e,immediate:!t})},getIsNextItem:we,getIsPrevItem:je,getIsActiveItem:Oe};l((()=>{$&&$({slideToNextItem:Me.slideToNextItem,slideToPrevItem:Me.slideToPrevItem,slideToItem:null==Me?void 0:Me.slideToItem})}),[$,Me.slideToItem,Me.slideToNextItem,Me.slideToPrevItem]);const Ae=e(g.Provider,Object.assign({value:Me},{children:ie})),Fe=e(g.Provider,Object.assign({value:Me},{children:e("div",Object.assign({className:"use-spring-carousel-main-wrapper",ref:G},A?{onWheel(){ee.val.stop(),be()}}:{},{style:Object.assign({display:"flex",position:"relative",width:"100%",height:"100%"},A?"x"===w?{overflowX:"auto"}:{overflowY:"auto"}:{})},{children:t("div",Object.assign({className:"use-spring-carousel-track-wrapper",ref:H},ye(),{style:Object.assign({position:"relative",display:"flex",flexDirection:"x"===w?"row":"column",touchAction:"none"},function(){const e=`calc(100% - ${2*T}px)`;return{width:"x"===w?e:"100%",height:"y"===w?e:"100%"}}())},{children:[!A&&I||!T?null:e("div",{style:{flexShrink:0,width:T}}),_.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=r===_.findIndex((e=>e.id===c[_.length-1].id)),"fixed"!==y||A?Object.assign({marginRight:`${n?0:b}px`}):{marginRight:`${n?0:b}px`,flex:`1 0 calc(100% / ${L} - ${b*(L-1)/L}px)`}))},{children:"function"==typeof t.renderItem?t.renderItem({getIsActiveItem:Oe,getIsNextItem:we,getIsPrevItem:je,useListenToCustomEvent:ne}):t.renderItem}),`${t.id}-${r}`);var n})),!A&&I||!T?null:e("div",{style:{flexShrink:0,width:T}})]}))}))}));return Object.assign(Object.assign({},Me),{carouselFragment:Fe,thumbsFragment:Ae})}const g=c(void 0);function p(){const e=u(g);if(!e)throw new Error("useSpringCarouselContext must be used within the carousel.");return e}export{h as useSpringCarousel,p as useSpringCarouselContext};
|
|
1
|
+
import{jsx as e,jsxs as t}from"react/jsx-runtime";import{useSpring as r,useIsomorphicLayoutEffect as n,config as i}from"@react-spring/web";import{createContext as c,useRef as s,useCallback as o,useEffect as l,useContext as u}from"react";import{u as a,a as d}from"./useThumbsModule-faa196f9.js";import{useDrag as m}from"@use-gesture/react";import{u as f}from"./useFullscreenModule-519d337d.js";import v from"resize-observer-polyfill";import"screenfull";function h({items:c,init:u=!0,withThumbs:h,thumbsSlideAxis:p="x",itemsPerSlide:x=1,slideType:y="fixed",gutter:b=0,withLoop:I=!1,startEndGutter:T=0,carouselSlideAxis:w="x",disableGestures:j=!1,draggingSlideTreshold:O,slideWhenThresholdIsReached:M=!1,freeScroll:A,enableFreeScrollDrag:F,initialStartingPosition:S,prepareThumbsData:k,initialActiveItem:C=0,animateWhenActiveItemChange:N=!0,getControllerRef:$}){const L=x>c.length?c.length:x,R=s(!1),E=s(null!=O?O:0),P=s("initial"),W=s("initial"),D=s("initial"),q=s(C),B=s(0===C),z=s("fixed"===y&&C===c.length-1),G=s(null),H=s(null),X=s(!0),Y=s(0),J=s(0),K=s(0),Q=s(I),U=s(y),V=s(A),Z=s(!1),_=o((()=>I?[...c.map((e=>Object.assign(Object.assign({},e),{id:`prev-repeated-item-${e.id}`}))),...c,...c.map((e=>Object.assign(Object.assign({},e),{id:`next-repeated-item-${e.id}`})))]:[...c]),[c,I])(),[ee,te]=r((()=>({val:0,pause:!u,onChange:({value:e})=>{A&&G.current?("x"===w?G.current.scrollLeft=Math.abs(e.val):G.current.scrollTop=Math.abs(e.val),be()):H.current&&(H.current.style.transform="x"===w?`translate3d(${e.val}px, 0px,0px)`:`translate3d(0px,${e.val}px,0px)`)}})),[A]),{emitEvent:re,useListenToCustomEvent:ne}=a(),{thumbsFragment:ie,handleScroll:ce}=d({withThumbs:!!h,thumbsSlideAxis:p,prepareThumbsData:k,items:c,renderThumbFnProps:{getIsActiveItem:Oe,getIsPrevItem:je,useListenToCustomEvent:ne,getIsNextItem:we}}),{enterFullscreen:se,exitFullscreen:oe,getIsFullscreen:le}=f({mainCarouselWrapperRef:G,handleResize:()=>fe(),onFullScreenChange:e=>{re({eventName:"onFullscreenChange",isFullscreen:e})}});function ue(){var e;const t=null===(e=G.current)||void 0===e?void 0:e.querySelector(".use-spring-carousel-item");if(!t)throw Error("No carousel items available!");return t.getBoundingClientRect()["x"===w?"width":"height"]+b}function ae({from:e,to:t,nextActiveItem:r,immediate:n=!1,slideMode:s}){W.current=s,"number"==typeof r&&(A||(q.current=r),re({eventName:"onSlideStartChange",slideActionType:P.current,slideMode:W.current,nextItem:{startReached:B.current,endReached:z.current,index:A?-1:q.current,id:A?"":c[q.current].id}})),K.current=t,te.start({immediate:n,from:{val:e},to:{val:t},config:Object.assign(Object.assign({},i.default),{velocity:ee.val.velocity}),onRest(e){!n&&e.finished&&re({eventName:"onSlideChange",slideActionType:P.current,slideMode:W.current,currentItem:{startReached:B.current,endReached:z.current,index:A?-1:q.current,id:A?"":c[q.current].id}})}}),h&&!n&&ce(q.current)}function de(){var e;return I?ue()*c.length:Math.round(Number(null===(e=H.current)||void 0===e?void 0:e["x"===w?"scrollWidth":"scrollHeight"])-H.current.getBoundingClientRect()["x"===w?"width":"height"]-2*T)}function me(){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"===w?"width":"height"]+b}function fe(){const e="x"===w?"left":"top";function t(t){const r=H.current;r&&(I?(r.style.top="0px",r.style.left="0px",r.style[e]=`-${t-T}px`,B.current=!1,z.current=!1):(r.style.left="0px",r.style.top="0px"))}if("fixed"===y&&I&&t("center"===S?me()*c.length-ue()*Math.round((L-1)/2):"end"===S?me()*c.length-ue()*Math.round(L-1):me()*c.length),"fluid"!==y){if(!A&&"fixed"===y){const e=-ue()*q.current;if(Math.abs(e)>de()&&!I){const e=-de();z.current=!0,K.current=e,te.start({immediate:!0,val:K.current})}else K.current=e,te.start({immediate:!0,val:e});setTimeout((()=>{R.current=!1}),0)}}else{if(z.current&&de()!==Math.abs(K.current)&&!I){const e=-de();return K.current=e,void te.start({immediate:!0,val:K.current})}if(Math.abs(K.current)>0&&de()!==Math.abs(K.current)&&!I&&!A&&"backward"===D.current){const e=Y.current-de(),t=K.current+e;return te.start({immediate:!0,val:t}),()=>{K.current=t}}}}function ve(){return A&&G.current?G.current["x"===w?"scrollLeft":"scrollTop"]:ee.val.get()}function he(e,t){if(A&&"next"===e){const e=K.current+ue();return e>de()?de():e}if(A&&"prev"===e){const e=K.current-ue();return e<0?0:e}return"next"===e?"number"==typeof t?-t*ue():K.current-ue():"number"==typeof t?-t*ue():K.current+ue()}function ge({type:e,index:t,immediate:r}){if(!u||Z.current||B.current&&!I)return;z.current&&(D.current="backward"),P.current="prev",z.current=!1;const n="number"==typeof t?t:q.current-1;if(!I){const n=A?he("prev",t)-ue()/3<0:he("prev",t)+ue()/3>0;if(B.current)return;if(n)return B.current=!0,z.current=!1,void ae({slideMode:e,from:ve(),to:0,nextActiveItem:0,immediate:r})}if(I&&(B.current||n<0))return B.current=!1,z.current=!0,void ae({slideMode:e,from:ve()-ue()*c.length,to:-ue()*c.length+ue(),nextActiveItem:c.length-1,immediate:r});0===n&&(B.current=!0),n!==c.length-1&&-1!==n||(z.current=!0),ae({slideMode:e,from:ve(),to:he("prev",t),nextActiveItem:n,immediate:r})}function pe({type:e,index:t,immediate:r}){if(!u||Z.current||z.current&&!I)return;B.current&&(D.current="forward"),P.current="next",B.current=!1;const n=t||q.current+1;if(!I){const i=Math.abs(he("next",t))>de()-ue()/3;if(z.current)return;if(i)return B.current=!1,z.current=!0,void ae({slideMode:e,from:ve(),to:A?de():-de(),nextActiveItem:n,immediate:r})}if(I&&(z.current||n>c.length-1))return z.current=!1,B.current=!0,void ae({slideMode:e,from:ve()+ue()*c.length,to:0,nextActiveItem:0,immediate:r});0===n&&(B.current=!0),n===c.length-1&&(z.current=!0),ae({slideMode:e,from:ve(),to:he("next",t),nextActiveItem:n,immediate:r})}function xe(){return E.current=O||Math.floor(ue()/2/2),E.current}l((()=>{q.current!==C&&Te({id:C,immediate:!N})}),[C]),l((()=>{if(u){if(C>c.length-1)throw new Error(`initialActiveItem (${C}) is greater than the total quantity available items (${c.length}).`);L>c.length&&console.warn(`itemsPerSlide (${L}) is greater than the total quantity available items (${c.length}). Fallback to ${c.length})`)}}),[C,c,L,u]),l((()=>{J.current=window.innerWidth}),[]),l((()=>{Y.current=de(),X.current||(R.current=!0,fe())}),[S,L,T,b,u,de]),l((()=>{I===Q.current&&y===U.current&&A===V.current||(Q.current=I,U.current=y,V.current=A,H.current&&(H.current.style.transform="translate3d(0px, 0px,0px)",te.start({val:0,immediate:!0})),Te({id:0,immediate:!0,shouldReset:!0}))}),[I,y,A]),n((()=>{H.current&&fe()}),[]),l((()=>{xe()}),[O,L,y]),l((()=>{if(G.current){let e;const t=new v((()=>{if(X.current)X.current=!1;else if(!Z.current&&!R.current){J.current=window.innerWidth;const t=fe();window.clearTimeout(e),e=setTimeout((()=>{Y.current=de(),"function"==typeof t&&t()}),100)}}));return t.observe(G.current),()=>{t.disconnect()}}}),[fe,de]),l((()=>{if(u)return document.addEventListener("visibilitychange",e),()=>{document.removeEventListener("visibilitychange",e)};function e(){document.hidden?Z.current=!0:Z.current=!1}}),[u]);const ye=m((e=>{const t=e.dragging,r=e.offset["x"===w?0:1],n=e.movement["x"===w?0:1],c=e.direction["x"===w?0:1],s=n>xe(),o=n<-xe(),l=de();if(t){if(P.current=c>0?"prev":"next",re(Object.assign(Object.assign({},e),{eventName:"onDrag",slideActionType:P.current})),A)return r>0?(te.start({from:{val:ve()},to:{val:0},config:{velocity:e.velocity,friction:50,tension:1e3}}),void e.cancel()):void te.start({from:{val:ve()},to:{val:-r},config:{velocity:e.velocity,friction:50,tension:1e3}});te.start({val:r,config:{velocity:e.velocity,friction:50,tension:1e3}}),M&&o?(pe({type:"drag"}),e.cancel()):M&&s&&(ge({type:"drag"}),e.cancel());l-Math.abs(r)<-2*ue()&&e.cancel()}else e.last&&A&&r>0?te.start({from:{val:ve()},to:{val:0},config:{velocity:e.velocity,friction:50,tension:1e3}}):(e.last&&!e.canceled&&A&&("prev"===P.current&&ge({type:"drag"}),"next"===P.current&&pe({type:"drag"})),!e.last||e.canceled||A||(o?!I&&z.current?te.start({val:-de(),config:Object.assign(Object.assign({},i.default),{velocity:e.velocity})}):pe({type:"drag"}):s?!I&&B.current?te.start({val:0,config:Object.assign(Object.assign({},i.default),{velocity:e.velocity})}):ge({type:"drag"}):te.start({val:K.current,config:Object.assign(Object.assign({},i.default),{velocity:e.velocity})})),e.last&&e.canceled&&te.start({val:K.current,config:Object.assign(Object.assign({},i.default),{velocity:e.velocity})}))}),{enabled:u&&!j&&!A||!!A&&!!F,axis:w,from:()=>A&&G.current?[-G.current.scrollLeft,-G.current.scrollTop]:[ee.val.get(),ee.val.get()]});function be(){G.current&&(K.current=G.current["x"===w?"scrollLeft":"scrollTop"],0===G.current["x"===w?"scrollLeft":"scrollTop"]&&(B.current=!0,z.current=!1),G.current["x"===w?"scrollLeft":"scrollTop"]>0&&G.current["x"===w?"scrollLeft":"scrollTop"]<de()&&(B.current=!1,z.current=!1),G.current["x"===w?"scrollLeft":"scrollTop"]===de()&&(B.current=!1,z.current=!0))}function Ie(e,t){let r=0;if(r="string"==typeof e?c.findIndex((t=>t.id===e)):e,r<0||r>=c.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 Te({id:e,immediate:t,shouldReset:r,type:n}){if(!u||Z.current)return;B.current=!1,z.current=!1;const i=Ie(e,"The item you want to slide to doesn't exist; check the provided id.");if(i===q.current&&!r)return;const s=Ie(c[q.current].id),o=Ie(c[i].id);o>s?pe({type:n||r?"initial":"click",index:o,immediate:t}):ge({type:n||r?"initial":"click",index:o,immediate:t})}function we(e){const t=Ie(e,"The item doesn't exist; check the provided id."),r=q.current;return I&&r===c.length-1?0===t:t===r+1}function je(e){const t=Ie(e,"The item doesn't exist; check the provided id."),r=q.current;return I&&0===r?t===c.length-1:t===r-1}function Oe(e){return Ie(e,"The item you want to check doesn't exist; check the provided id.")===q.current}const Me=A?{useListenToCustomEvent:ne,enterFullscreen:se,exitFullscreen:oe,getIsFullscreen:le,slideToPrevItem:(e=!0)=>{ge({type:"click",immediate:!e})},slideToNextItem:(e=!0)=>{pe({type:"click",immediate:!e})}}:{useListenToCustomEvent:ne,enterFullscreen:se,exitFullscreen:oe,getIsFullscreen:le,slideToPrevItem:(e=!0)=>{ge({type:"click",immediate:!e})},slideToNextItem:(e=!0)=>{pe({type:"click",immediate:!e})},slideToItem:(e,t=!0)=>{Te({id:e,immediate:!t})},getIsNextItem:we,getIsPrevItem:je,getIsActiveItem:Oe};l((()=>{$&&$({slideToNextItem:Me.slideToNextItem,slideToPrevItem:Me.slideToPrevItem,slideToItem:null==Me?void 0:Me.slideToItem})}),[$,Me.slideToItem,Me.slideToNextItem,Me.slideToPrevItem]);const Ae=e(g.Provider,Object.assign({value:Me},{children:ie})),Fe=e(g.Provider,Object.assign({value:Me},{children:e("div",Object.assign({className:"use-spring-carousel-main-wrapper",ref:G},A?{onWheel(){ee.val.stop(),be()}}:{},{style:Object.assign({display:"flex",position:"relative",width:"100%",height:"100%"},A?"x"===w?{overflowX:"auto"}:{overflowY:"auto"}:{})},{children:t("div",Object.assign({className:"use-spring-carousel-track-wrapper",ref:H},ye(),{style:Object.assign({position:"relative",display:"flex",flexDirection:"x"===w?"row":"column",touchAction:"none"},function(){const e=`calc(100% - ${2*T}px)`;return{width:"x"===w?e:"100%",height:"y"===w?e:"100%"}}())},{children:[!A&&I||!T?null:e("div",{style:{flexShrink:0,width:T}}),_.map(((t,r)=>{return console.log({curr:r,index:_.findIndex((e=>e.id===_[_.length-1].id))}),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=r===_.findIndex((e=>e.id===_[_.length-1].id)),"fixed"!==y||A?Object.assign({marginRight:`${n?0:b}px`}):{marginRight:`${n?0:b}px`,flex:`1 0 calc(100% / ${L} - ${b*(L-1)/L}px)`}))},{children:"function"==typeof t.renderItem?t.renderItem({getIsActiveItem:Oe,getIsNextItem:we,getIsPrevItem:je,useListenToCustomEvent:ne}):t.renderItem}),`${t.id}-${r}`);var n})),!A&&I||!T?null:e("div",{style:{flexShrink:0,width:T}})]}))}))}));return Object.assign(Object.assign({},Me),{carouselFragment:Fe,thumbsFragment:Ae})}const g=c(void 0);function p(){const e=u(g);if(!e)throw new Error("useSpringCarouselContext must be used within the carousel.");return e}export{h as useSpringCarousel,p as useSpringCarouselContext};
|
|
2
2
|
//# sourceMappingURL=useSpringCarousel.js.map
|