ngx-edge-slider 2.2.1 → 2.2.4

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.
@@ -0,0 +1 @@
1
+ :host{display:block;position:relative}.slider-main-product{display:inline-flex;height:520px}.slider-main{width:100%;height:600px;justify-content:center;display:flex}@media(max-width: 577px){.slider-main{height:100%;display:block}}.slider--main{height:100%;overflow:hidden}.slider--main .slider__wrapper{display:flex;will-change:transform}.slider--main .slider__wrapper .slide{flex:0 0 100%}.slider--main .slider__wrapper .slide .slide-content,.slider--main .slider__wrapper .slide picture{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center}.slider--main .slider__wrapper .slide .slide-content .drag-handle,.slider--main .slider__wrapper .slide picture .drag-handle{width:100%;height:100%;cursor:grab;z-index:10;pointer-events:all}.slider--main .slider__wrapper .slide .slide-content img,.slider--main .slider__wrapper .slide picture img{max-width:100%;max-height:100%;object-fit:contain;display:block;transform-origin:center;transform:translateZ(0);pointer-events:none}.slider--thumbs{margin-top:24px;margin-bottom:36px;height:70px !important}.slider--thumbs .slider__wrapper{display:flex;gap:8px;will-change:transform;transform:translateZ(0)}.slider--thumbs .slide{flex:0 0 auto;pointer-events:auto}.slider--thumbs .slide .slide-content{width:54px;height:68px;display:flex;align-items:center;justify-content:center;border:1px solid #ebebeb;cursor:pointer}.slider--thumbs .slide .slide-content img{max-width:100%;max-height:100%;object-fit:contain;display:block;transform:scale(0.9)}.slider--thumbs .slide .slide-content.slide--current{border-color:#212121}.slider{width:100%;height:100%;overflow:hidden;position:relative;touch-action:none;cursor:grab;user-select:none;-webkit-user-drag:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}.slider.slider-can-drag{cursor:grab}.slider.slider-is-dragging{cursor:grabbing}.slider.slider-dragged{box-shadow:0 0 10px rgba(0,0,0,.1)}.slider.slider-drag-prevent-click{pointer-events:none}.slider .slider__wrapper{display:flex;transition:transform 300ms cubic-bezier(0.25, 0.46, 0.45, 0.84);will-change:transform;transform:none;width:auto;height:100%}.slider .slide{display:flex;align-items:center;justify-content:center;height:100%;overflow:hidden;flex-shrink:0;position:relative;transition:transform 300ms cubic-bezier(0.25, 0.46, 0.45, 0.84)}@media(min-width: 1441px){.slider--thumbs .slide{flex:0 0 20%}}@media(max-width: 1024px){.slider--thumbs .slide{flex:0 0 33.333%}}@media(max-width: 1023px){.slider--thumbs .slide{flex:0 0 50%}}.slider-arrow-next,.slider-arrow-prev{position:absolute;top:50%;transform:translateY(-50%);width:32px;height:32px;background:hsla(0,0%,100%,.8) no-repeat center center;cursor:pointer;z-index:10}.slider-arrow-next.next,.slider-arrow-prev.next{right:10px}.slider-arrow-next.prev,.slider-arrow-prev.prev{left:10px}.thumbs-wrapper{position:relative}.thumb-nav{position:absolute;top:50%;transform:translateY(-50%);z-index:20;width:48px;height:48px;background:hsla(0,0%,100%,.9) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='4.51 0.01 10.99 19.97'%3E%3Cpath fill='%23000' d='m4.508 18.968 1.006 1.006 9.983-9.984L5.514.005 4.508 1.011l8.984 8.984-8.984 8.973Z'/%3E%3C/svg%3E") no-repeat center center/11px 18px;font-size:36px;line-height:56px;opacity:0;pointer-events:none;transition:opacity 200ms ease}.thumb-nav.activeArrow{opacity:1;pointer-events:all}.thumb-nav--left{left:-73px;transform:translateY(-50%) rotate(180deg) !important}.thumb-nav--right{right:-65px}.slider-pagination .thumb-dots-wrapper{display:flex;align-items:center;justify-content:center;gap:7px}.slider-pagination .thumb-dots-wrapper .thumb-dot{display:inline-block;width:4px;height:4px;margin:0 0 0 8px;border-radius:50%;background:#b3b3b3}.slider-pagination .thumb-dots-wrapper .thumb-dot.active{background:#212121;border:1px solid #212121}.slider-pagination .thumb-dots-wrapper .thumb-dot:hover{background:#212121;border:1px solid #212121}.slider-pagination .thumb-dots-wrapper .thumb-dot.hidden{opacity:0;pointer-events:none}.slider-container{position:relative;z-index:10}.slider-container .slider{position:relative;z-index:1}.slider-container .slider.slider-is-dragging{pointer-events:none}.slider-container .slider-nav{position:absolute;inset:0;pointer-events:none;z-index:20}.slider-container .slider-nav .nav-btn{pointer-events:auto;z-index:30;position:absolute;width:42px;height:42px;border-radius:2px;display:inline-flex;align-items:center;justify-content:center;border:0;cursor:pointer;background:rgba(0,0,0,0);font-size:32px;line-height:1;transition:transform .15s ease,opacity .15s ease}.slider-container .slider-nav .nav-btn:hover{transform:translateY(-1px);background:rgba(0,0,0,.6)}.slider-container .slider-nav .nav-btn.is-hidden{color:rgba(160,160,165,.5529411765);opacity:.3;cursor:not-allowed;pointer-events:auto}.slider-container .slider-nav.nav--top-left .nav-btn--prev{top:-50px;left:-20px}.slider-container .slider-nav.nav--top-left .nav-btn--next{top:-50px;left:42px}.slider-container .slider-nav.nav--top-center .nav-btn--prev{top:-50px;left:50%;transform:translateX(-50px)}.slider-container .slider-nav.nav--top-center .nav-btn--next{top:-50px;left:50%;transform:translateX(10px)}.slider-container .slider-nav.nav--top-right .nav-btn--prev{top:-50px;right:42px}.slider-container .slider-nav.nav--top-right .nav-btn--next{top:-50px;right:-20px}.slider-container .slider-nav.nav--bottom-left .nav-btn--prev{bottom:30px;left:-20px}.slider-container .slider-nav.nav--bottom-left .nav-btn--next{bottom:30px;left:42px}.slider-container .slider-nav.nav--bottom-center .nav-btn--prev{bottom:30px;left:50%;transform:translateX(-50px)}.slider-container .slider-nav.nav--bottom-center .nav-btn--next{bottom:30px;left:50%;transform:translateX(10px)}.slider-container .slider-nav.nav--bottom-right .nav-btn--prev{bottom:30px;right:42px}.slider-container .slider-nav.nav--bottom-right .nav-btn--next{bottom:30px;right:-20px}.slider-container .slider-nav.nav--center-sides .nav-btn{background:rgba(0,0,0,.7);color:#fff}.slider-container .slider-nav.nav--center-sides .nav-btn--prev{top:50%;left:-50px;transform:translateY(-50%)}.slider-container .slider-nav.nav--center-sides .nav-btn--next{top:50%;right:-50px;transform:translateY(-50%)}@media(max-width: 1024px){.slider-container .slider-nav .nav--top-left .nav-btn--prev,.slider-container .slider-nav .nav--top-center .nav-btn--prev,.slider-container .slider-nav .nav--top-right .nav-btn--prev,.slider-container .slider-nav .nav--bottom-left .nav-btn--prev,.slider-container .slider-nav .nav--bottom-center .nav-btn--prev,.slider-container .slider-nav .nav--bottom-right .nav-btn--prev,.slider-container .slider-nav .nav--center-sides .nav-btn--prev{left:clamp(8px,5%,40px);right:auto}.slider-container .slider-nav .nav--top-left .nav-btn--next,.slider-container .slider-nav .nav--top-center .nav-btn--next,.slider-container .slider-nav .nav--top-right .nav-btn--next,.slider-container .slider-nav .nav--bottom-left .nav-btn--next,.slider-container .slider-nav .nav--bottom-center .nav-btn--next,.slider-container .slider-nav .nav--bottom-right .nav-btn--next,.slider-container .slider-nav .nav--center-sides .nav-btn--next{right:clamp(8px,5%,20px);left:auto}}@media(max-width: 768px){.slider-container .slider-nav .nav-btn{width:36px;height:36px;font-size:24px}}@media(max-width: 480px){.slider-container .slider-nav .slider-container .slider-nav.nav--center-sides{pointer-events:auto}.slider-container .slider-nav .slider-container .slider-nav.nav--center-sides .nav-btn{width:32px;height:32px;font-size:20px;pointer-events:auto;z-index:20;background:rgba(0,0,0,.7);color:#fff}.slider-container .slider-nav .slider-container .slider__wrapper{position:relative}.slider-container .slider-nav .slider-container .slider__wrapper .slide-content{pointer-events:auto}.slider-container .slider-nav .nav-btn{width:32px;height:32px;font-size:20px}.slider-container .slider-nav .nav-btn--prev{left:8px !important;right:auto !important}.slider-container .slider-nav .nav-btn--next{right:8px !important;left:auto !important}}/*# sourceMappingURL=ngx-simple-slider.css.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sourceRoot":"","sources":["ngx-simple-slider.scss"],"names":[],"mappings":"AAMA,MACE,cACA,kBAIF,qBACE,oBACA,OAVY,MAad,aACE,WACA,aACA,uBACA,aAGF,yBACE,aACE,YACA,eAIJ,cACE,YACA,gBAEA,+BACE,aACA,sBAGA,sCACE,cAEA,mGAEE,kBACA,WACA,YACA,aACA,mBACA,uBAEA,6HACE,WACA,YACA,YACA,WACA,mBAGF,2GACE,eACA,gBACA,mBACA,cAEA,wBACA,wBACA,oBAQV,gBACE,gBACA,mBACA,uBAEA,iCACE,aACA,IAjFQ,IAmFR,sBACA,wBAGF,uBACE,cACA,oBAEA,sCACE,WACA,YAEA,aACA,mBACA,uBAEA,yBACA,eAEA,0CACE,eACA,gBACA,mBACA,cACA,qBAGF,qDACE,qBAOR,QACE,WACA,YACA,gBACA,kBACA,kBACA,YACA,iBACA,uBACA,0CAEA,wBACE,YAGF,2BACE,gBAGF,uBAEE,mCAGF,kCACE,oBAGF,yBACE,aACA,gEAEA,sBACA,eACA,WACA,YAIF,eACE,aACA,mBACA,uBACA,YACA,gBACA,cACA,kBACA,gEAIJ,0BACE,uBACE,cAIJ,0BACE,uBACE,kBAIJ,0BACE,uBACE,cAKJ,sCAEE,kBACA,QACA,2BACA,WACA,YACA,sDACA,eACA,WAEA,gDACE,WAGF,gDACE,UAKJ,gBACE,kBAGF,WACE,kBACA,QACA,2BACA,WACA,WACA,YAEA,+SAIA,eACA,iBAEA,UACA,oBACA,8BAEA,uBACE,UACA,mBAGF,iBACE,WACA,qDAGF,kBACE,YAKF,uCACE,aACA,mBACA,uBACA,QAEA,kDACE,qBACA,UACA,WACA,iBACA,kBACA,mBAEA,yDACE,mBACA,yBAGF,wDACE,mBACA,yBAGF,yDACE,UACA,oBAMR,kBACE,kBACA,WAEA,0BACE,kBACA,UAEF,6CACE,oBAEF,8BACE,kBACA,QACA,oBACA,WAEA,uCACE,oBACA,WAEA,kBAEA,WACA,YACA,kBACA,oBACA,mBACA,uBACA,SACA,eACA,yBACA,eACA,cACA,WACE,sCAGF,6CACE,2BACA,0BAGF,iDACE,oCACA,WACA,mBACA,oBAMF,2DACE,UACA,WAEF,2DACE,UACA,UAKF,6DACE,UACA,SACA,4BAEF,6DACE,UACA,SACA,2BAKF,4DACE,UACA,WAEF,4DACE,UACA,YAMF,8DACE,YACA,WAEF,8DACE,YACA,UAKF,gEACE,YACA,SACA,4BAEF,gEACE,YACA,SACA,2BAKF,+DACE,YACA,WAEF,+DACE,YACA,YAMF,yDACE,0BACA,WAEF,+DACE,QACA,WACA,2BAEF,+DACE,QACA,YACA,2BAKJ,0BASI,ubACE,wBACA,WAEF,ubACE,yBACA,WAKN,yBACE,uCACE,WACA,YACA,gBAIJ,yBAEI,8EACE,oBAEA,uFACE,WACA,YACA,eAEA,oBACA,WACA,0BACA,WAKJ,iEACE,kBAEA,gFACE,oBAIN,uCACE,WACA,YACA,eAIF,6CACE,oBACA,sBAEF,6CACE,qBACA","file":"ngx-simple-slider.css"}
@@ -0,0 +1 @@
1
+ :host{display:block;position:relative}.slider-main-product{display:inline-flex;height:520px}.slider-main{width:100%;height:600px;justify-content:center;display:flex}@media(max-width: 577px){.slider-main{height:100%;display:block}}.slider--main{height:100%;overflow:hidden}.slider--main .slider__wrapper{display:flex;will-change:transform}.slider--main .slider__wrapper .slide{flex:0 0 100%}.slider--main .slider__wrapper .slide .slide-content,.slider--main .slider__wrapper .slide picture{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center}.slider--main .slider__wrapper .slide .slide-content .drag-handle,.slider--main .slider__wrapper .slide picture .drag-handle{width:100%;height:100%;cursor:grab;z-index:10;pointer-events:all}.slider--main .slider__wrapper .slide .slide-content img,.slider--main .slider__wrapper .slide picture img{max-width:100%;max-height:100%;object-fit:contain;display:block;transform-origin:center;transform:translateZ(0);pointer-events:none}.slider--thumbs{margin-top:24px;margin-bottom:36px;height:70px !important}.slider--thumbs .slider__wrapper{display:flex;gap:8px;will-change:transform;transform:translateZ(0)}.slider--thumbs .slide{flex:0 0 auto;pointer-events:auto}.slider--thumbs .slide .slide-content{width:54px;height:68px;display:flex;align-items:center;justify-content:center;border:1px solid #ebebeb;cursor:pointer}.slider--thumbs .slide .slide-content img{max-width:100%;max-height:100%;object-fit:contain;display:block;transform:scale(0.9)}.slider--thumbs .slide .slide-content.slide--current{border-color:#212121}.slider{width:100%;height:100%;overflow:hidden;position:relative;touch-action:none;cursor:grab;user-select:none;-webkit-user-drag:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}.slider.slider-can-drag{cursor:grab}.slider.slider-is-dragging{cursor:grabbing}.slider.slider-dragged{box-shadow:0 0 10px rgba(0,0,0,.1)}.slider.slider-drag-prevent-click{pointer-events:none}.slider .slider__wrapper{display:flex;transition:transform 300ms cubic-bezier(0.25, 0.46, 0.45, 0.84);will-change:transform;transform:none;width:auto;height:100%}.slider .slide{display:flex;align-items:center;justify-content:center;height:100%;overflow:hidden;flex-shrink:0;position:relative;transition:transform 300ms cubic-bezier(0.25, 0.46, 0.45, 0.84)}@media(min-width: 1441px){.slider--thumbs .slide{flex:0 0 20%}}@media(max-width: 1024px){.slider--thumbs .slide{flex:0 0 33.333%}}@media(max-width: 1023px){.slider--thumbs .slide{flex:0 0 50%}}.slider-arrow-next,.slider-arrow-prev{position:absolute;top:50%;transform:translateY(-50%);width:32px;height:32px;background:hsla(0,0%,100%,.8) no-repeat center center;cursor:pointer;z-index:10}.slider-arrow-next.next,.slider-arrow-prev.next{right:10px}.slider-arrow-next.prev,.slider-arrow-prev.prev{left:10px}.thumbs-wrapper{position:relative}.thumb-nav{position:absolute;top:50%;transform:translateY(-50%);z-index:20;width:48px;height:48px;background:hsla(0,0%,100%,.9) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='4.51 0.01 10.99 19.97'%3E%3Cpath fill='%23000' d='m4.508 18.968 1.006 1.006 9.983-9.984L5.514.005 4.508 1.011l8.984 8.984-8.984 8.973Z'/%3E%3C/svg%3E") no-repeat center center/11px 18px;font-size:36px;line-height:56px;opacity:0;pointer-events:none;transition:opacity 200ms ease}.thumb-nav.activeArrow{opacity:1;pointer-events:all}.thumb-nav--left{left:-73px;transform:translateY(-50%) rotate(180deg) !important}.thumb-nav--right{right:-65px}.slider-pagination .thumb-dots-wrapper{display:flex;align-items:center;justify-content:center;gap:7px}.slider-pagination .thumb-dots-wrapper .thumb-dot{display:inline-block;width:4px;height:4px;margin:0 0 0 8px;border-radius:50%;background:#b3b3b3}.slider-pagination .thumb-dots-wrapper .thumb-dot.active{background:#212121;border:1px solid #212121}.slider-pagination .thumb-dots-wrapper .thumb-dot:hover{background:#212121;border:1px solid #212121}.slider-pagination .thumb-dots-wrapper .thumb-dot.hidden{opacity:0;pointer-events:none}.slider-container{position:relative;z-index:10}.slider-container .slider{position:relative;z-index:1}.slider-container .slider.slider-is-dragging{pointer-events:none}.slider-container .slider-nav{position:absolute;inset:0;pointer-events:none;z-index:20}.slider-container .slider-nav .nav-btn{pointer-events:auto;z-index:30;position:absolute;width:42px;height:42px;border-radius:2px;display:inline-flex;align-items:center;justify-content:center;border:0;cursor:pointer;background:rgba(0,0,0,0);font-size:32px;line-height:1;transition:transform .15s ease,opacity .15s ease}.slider-container .slider-nav .nav-btn:hover{transform:translateY(-1px);background:rgba(0,0,0,.6)}.slider-container .slider-nav .nav-btn.is-hidden{color:rgba(160,160,165,.5529411765);opacity:.3;cursor:not-allowed;pointer-events:auto}.slider-container .slider-nav.nav--top-left .nav-btn--prev{top:-50px;left:-20px}.slider-container .slider-nav.nav--top-left .nav-btn--next{top:-50px;left:42px}.slider-container .slider-nav.nav--top-center .nav-btn--prev{top:-50px;left:50%;transform:translateX(-50px)}.slider-container .slider-nav.nav--top-center .nav-btn--next{top:-50px;left:50%;transform:translateX(10px)}.slider-container .slider-nav.nav--top-right .nav-btn--prev{top:-50px;right:42px}.slider-container .slider-nav.nav--top-right .nav-btn--next{top:-50px;right:-20px}.slider-container .slider-nav.nav--bottom-left .nav-btn--prev{bottom:30px;left:-20px}.slider-container .slider-nav.nav--bottom-left .nav-btn--next{bottom:30px;left:42px}.slider-container .slider-nav.nav--bottom-center .nav-btn--prev{bottom:30px;left:50%;transform:translateX(-50px)}.slider-container .slider-nav.nav--bottom-center .nav-btn--next{bottom:30px;left:50%;transform:translateX(10px)}.slider-container .slider-nav.nav--bottom-right .nav-btn--prev{bottom:30px;right:42px}.slider-container .slider-nav.nav--bottom-right .nav-btn--next{bottom:30px;right:-20px}.slider-container .slider-nav.nav--center-sides .nav-btn{background:rgba(0,0,0,.7);color:#fff}.slider-container .slider-nav.nav--center-sides .nav-btn--prev{top:50%;left:-50px;transform:translateY(-50%)}.slider-container .slider-nav.nav--center-sides .nav-btn--next{top:50%;right:-50px;transform:translateY(-50%)}@media(max-width: 1024px){.slider-container .slider-nav .nav--top-left .nav-btn--prev,.slider-container .slider-nav .nav--top-center .nav-btn--prev,.slider-container .slider-nav .nav--top-right .nav-btn--prev,.slider-container .slider-nav .nav--bottom-left .nav-btn--prev,.slider-container .slider-nav .nav--bottom-center .nav-btn--prev,.slider-container .slider-nav .nav--bottom-right .nav-btn--prev,.slider-container .slider-nav .nav--center-sides .nav-btn--prev{left:clamp(8px,5%,40px);right:auto}.slider-container .slider-nav .nav--top-left .nav-btn--next,.slider-container .slider-nav .nav--top-center .nav-btn--next,.slider-container .slider-nav .nav--top-right .nav-btn--next,.slider-container .slider-nav .nav--bottom-left .nav-btn--next,.slider-container .slider-nav .nav--bottom-center .nav-btn--next,.slider-container .slider-nav .nav--bottom-right .nav-btn--next,.slider-container .slider-nav .nav--center-sides .nav-btn--next{right:clamp(8px,5%,20px);left:auto}}@media(max-width: 768px){.slider-container .slider-nav .nav-btn{width:36px;height:36px;font-size:24px}}@media(max-width: 480px){.slider-container .slider-nav .slider-container .slider-nav.nav--center-sides{pointer-events:auto}.slider-container .slider-nav .slider-container .slider-nav.nav--center-sides .nav-btn{width:32px;height:32px;font-size:20px;pointer-events:auto;z-index:20;background:rgba(0,0,0,.7);color:#fff}.slider-container .slider-nav .slider-container .slider__wrapper{position:relative}.slider-container .slider-nav .slider-container .slider__wrapper .slide-content{pointer-events:auto}.slider-container .slider-nav .nav-btn{width:32px;height:32px;font-size:20px}.slider-container .slider-nav .nav-btn--prev{left:8px !important;right:auto !important}.slider-container .slider-nav .nav-btn--next{right:8px !important;left:auto !important}}/*# sourceMappingURL=ngx-simple-slider.min.css.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sourceRoot":"","sources":["ngx-simple-slider.scss"],"names":[],"mappings":"AAMA,MACE,cACA,kBAIF,qBACE,oBACA,OAVY,MAad,aACE,WACA,aACA,uBACA,aAGF,yBACE,aACE,YACA,eAIJ,cACE,YACA,gBAEA,+BACE,aACA,sBAGA,sCACE,cAEA,mGAEE,kBACA,WACA,YACA,aACA,mBACA,uBAEA,6HACE,WACA,YACA,YACA,WACA,mBAGF,2GACE,eACA,gBACA,mBACA,cAEA,wBACA,wBACA,oBAQV,gBACE,gBACA,mBACA,uBAEA,iCACE,aACA,IAjFQ,IAmFR,sBACA,wBAGF,uBACE,cACA,oBAEA,sCACE,WACA,YAEA,aACA,mBACA,uBAEA,yBACA,eAEA,0CACE,eACA,gBACA,mBACA,cACA,qBAGF,qDACE,qBAOR,QACE,WACA,YACA,gBACA,kBACA,kBACA,YACA,iBACA,uBACA,0CAEA,wBACE,YAGF,2BACE,gBAGF,uBAEE,mCAGF,kCACE,oBAGF,yBACE,aACA,gEAEA,sBACA,eACA,WACA,YAIF,eACE,aACA,mBACA,uBACA,YACA,gBACA,cACA,kBACA,gEAIJ,0BACE,uBACE,cAIJ,0BACE,uBACE,kBAIJ,0BACE,uBACE,cAKJ,sCAEE,kBACA,QACA,2BACA,WACA,YACA,sDACA,eACA,WAEA,gDACE,WAGF,gDACE,UAKJ,gBACE,kBAGF,WACE,kBACA,QACA,2BACA,WACA,WACA,YAEA,+SAIA,eACA,iBAEA,UACA,oBACA,8BAEA,uBACE,UACA,mBAGF,iBACE,WACA,qDAGF,kBACE,YAKF,uCACE,aACA,mBACA,uBACA,QAEA,kDACE,qBACA,UACA,WACA,iBACA,kBACA,mBAEA,yDACE,mBACA,yBAGF,wDACE,mBACA,yBAGF,yDACE,UACA,oBAMR,kBACE,kBACA,WAEA,0BACE,kBACA,UAEF,6CACE,oBAEF,8BACE,kBACA,QACA,oBACA,WAEA,uCACE,oBACA,WAEA,kBAEA,WACA,YACA,kBACA,oBACA,mBACA,uBACA,SACA,eACA,yBACA,eACA,cACA,WACE,sCAGF,6CACE,2BACA,0BAGF,iDACE,oCACA,WACA,mBACA,oBAMF,2DACE,UACA,WAEF,2DACE,UACA,UAKF,6DACE,UACA,SACA,4BAEF,6DACE,UACA,SACA,2BAKF,4DACE,UACA,WAEF,4DACE,UACA,YAMF,8DACE,YACA,WAEF,8DACE,YACA,UAKF,gEACE,YACA,SACA,4BAEF,gEACE,YACA,SACA,2BAKF,+DACE,YACA,WAEF,+DACE,YACA,YAMF,yDACE,0BACA,WAEF,+DACE,QACA,WACA,2BAEF,+DACE,QACA,YACA,2BAKJ,0BASI,ubACE,wBACA,WAEF,ubACE,yBACA,WAKN,yBACE,uCACE,WACA,YACA,gBAIJ,yBAEI,8EACE,oBAEA,uFACE,WACA,YACA,eAEA,oBACA,WACA,0BACA,WAKJ,iEACE,kBAEA,gFACE,oBAIN,uCACE,WACA,YACA,eAIF,6CACE,oBACA,sBAEF,6CACE,qBACA","file":"ngx-simple-slider.min.css"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2luZ21hbkNvbHQtbmd4LWVkZ2Utc2xpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvbmd4LWVkZ2Utc2xpZGVyL3NyYy9XaW5nbWFuQ29sdC1uZ3gtZWRnZS1zbGlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -0,0 +1,824 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Injectable, EventEmitter, Component, ChangeDetectionStrategy, ViewEncapsulation, Input, Output, ViewChild, NgModule, Pipe } from '@angular/core';
3
+ import { BehaviorSubject, Subject, fromEvent, merge, auditTime, takeUntil } from 'rxjs';
4
+ import * as i7 from '@angular/common';
5
+ import { CommonModule } from '@angular/common';
6
+ import * as i1 from '@angular/platform-browser';
7
+
8
+ const DEFAULT_CONFIG = {
9
+ slides: [],
10
+ slidesPerView: 1,
11
+ slidesToSlide: 1,
12
+ loop: 0,
13
+ vertical: false,
14
+ changeToClickedSlide: false,
15
+ isThumbs: false,
16
+ plugins: {
17
+ draggable: false,
18
+ pagination: false,
19
+ navigation: false,
20
+ autoplay: undefined,
21
+ },
22
+ gap: 0,
23
+ showOn: { mobile: true, tablet: true, desktop: true },
24
+ };
25
+
26
+ const INITIAL_SLIDER_STATE = {
27
+ currentSlide: 0,
28
+ selectedSlide: -1,
29
+ slidesPerView: 1,
30
+ visibleSlides: [],
31
+ gap: 0,
32
+ maxStartIndex: 0,
33
+ canPrev: false,
34
+ canNext: false,
35
+ translate: "translateX(0px)",
36
+ transition: "transform 300ms ease",
37
+ pager: null,
38
+ isAnimating: false,
39
+ isVisible: false,
40
+ isDragging: false,
41
+ };
42
+
43
+ class SliderStore {
44
+ state$ = new BehaviorSubject({
45
+ currentSlide: 0,
46
+ selectedSlide: -1,
47
+ slidesPerView: 1,
48
+ visibleSlides: [],
49
+ translate: "translateX(0)",
50
+ transition: "transform 300ms ease",
51
+ pager: null,
52
+ isVisible: true,
53
+ isAnimating: false,
54
+ isDragging: false,
55
+ });
56
+ view$ = this.state$.asObservable();
57
+ get snapshot() {
58
+ return this.state$.value;
59
+ }
60
+ update(patch) {
61
+ this.state$.next({ ...this.snapshot, ...patch });
62
+ }
63
+ reset() {
64
+ this.state$.next(INITIAL_SLIDER_STATE);
65
+ }
66
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SliderStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
67
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SliderStore });
68
+ }
69
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SliderStore, decorators: [{
70
+ type: Injectable
71
+ }] });
72
+
73
+ class SliderEngine {
74
+ store;
75
+ config;
76
+ plugins = [];
77
+ syncThumbsEngine;
78
+ // RX lifecycle
79
+ destroy$ = new Subject();
80
+ // Container-based breakpoints
81
+ containerEl;
82
+ ro;
83
+ measuredSlideSizePx;
84
+ constructor(store) {
85
+ this.store = store;
86
+ }
87
+ /* ---------------- Public API ---------------- */
88
+ init(config, plugins = []) {
89
+ this.config = { ...DEFAULT_CONFIG, ...config, plugins: { ...(config.plugins ?? {}) } };
90
+ this.plugins = plugins;
91
+ this.plugins.forEach((p) => p.init?.(this));
92
+ this.setupViewportSignals();
93
+ this.applyBreakpoint();
94
+ this.clampIndicesAfterLayoutChange();
95
+ this.recalculate();
96
+ }
97
+ /** Call this from the component once you have the slider host element */
98
+ attachContainer(el) {
99
+ this.containerEl = el;
100
+ // Observe container size changes (robust in grids/sidebars/tabs)
101
+ this.ro?.disconnect();
102
+ this.ro = new ResizeObserver(() => {
103
+ // We reuse the same debounced layout handler
104
+ this.onLayoutSignal();
105
+ });
106
+ this.ro.observe(el);
107
+ this.measureSlideSize();
108
+ // Apply immediately based on real container width
109
+ this.onLayoutSignal();
110
+ }
111
+ measureSlideSize() {
112
+ if (!this.containerEl)
113
+ return;
114
+ const firstSlide = this.containerEl.querySelector(".slide");
115
+ if (!firstSlide)
116
+ return;
117
+ const rect = firstSlide.getBoundingClientRect();
118
+ if (rect.width > 0)
119
+ this.measuredSlideSizePx = rect.width;
120
+ }
121
+ destroy() {
122
+ // Stop Rx streams
123
+ this.destroy$.next();
124
+ this.destroy$.complete();
125
+ // Disconnect ResizeObserver
126
+ this.ro?.disconnect();
127
+ this.ro = undefined;
128
+ this.containerEl = undefined;
129
+ // Plugin cleanup
130
+ this.plugins.forEach((p) => p.destroy?.());
131
+ this.plugins = [];
132
+ // Reset store
133
+ this.store.reset();
134
+ }
135
+ next() {
136
+ this.goTo(this.store.snapshot.currentSlide + this.slideStep());
137
+ this.plugins.forEach((p) => p.onNext?.());
138
+ }
139
+ previous() {
140
+ this.goTo(this.store.snapshot.currentSlide - this.slideStep());
141
+ this.plugins.forEach((p) => p.onPrevious?.());
142
+ }
143
+ getContainerEl() {
144
+ return this.containerEl;
145
+ }
146
+ selectSlide(index) {
147
+ const slidesPerView = this.store.snapshot.slidesPerView;
148
+ // 1️⃣ Mark selected
149
+ this.store.update({ selectedSlide: index });
150
+ // 2️⃣ Calculate page start
151
+ let pageStart = Math.floor(index / slidesPerView) * slidesPerView;
152
+ // 3️⃣ Clamp to maxStartIndex
153
+ pageStart = Math.min(pageStart, this.maxStartIndex);
154
+ // 4️⃣ If synced with thumbs, also clamp to their max index
155
+ if (this.syncThumbsEngine) {
156
+ const thumbMaxIndex = this.syncThumbsEngine.getMaxStartIndex();
157
+ pageStart = Math.min(pageStart, thumbMaxIndex);
158
+ }
159
+ // 5️⃣ Move main slider
160
+ if (pageStart !== this.store.snapshot.currentSlide) {
161
+ this.goToSlide(pageStart);
162
+ }
163
+ // 6️⃣ Notify plugins
164
+ this.plugins.forEach((p) => p.onSlideClick?.(index));
165
+ }
166
+ /* ---------------- Drag ---------------- */
167
+ handleDragStart(event) {
168
+ this.store.update({ isDragging: true });
169
+ this.plugins.forEach((p) => p.onDragStart?.(event));
170
+ }
171
+ handleDragMove(event) {
172
+ this.plugins.forEach((p) => p.onDragMove?.(event));
173
+ }
174
+ handleDragEnd() {
175
+ this.store.update({ isDragging: false });
176
+ this.plugins.forEach((p) => p.onDragEnd?.());
177
+ }
178
+ goTo(index) {
179
+ this.goToSlide(index); // reuse your existing private method
180
+ }
181
+ /* ---------------- Internals ---------------- */
182
+ goToSlide(index) {
183
+ const clamped = Math.max(0, Math.min(index, this.maxStartIndex));
184
+ // console.log("[Engine] goToSlide index:", index, "clamped:", clamped);
185
+ this.store.update({ currentSlide: clamped });
186
+ this.recalculate();
187
+ // NOTE: calling onSlideClick here is a bit semantically odd (since it’s not always a click),
188
+ // but I preserved your behavior.
189
+ this.plugins.forEach((p) => p.onSlideClick?.(index));
190
+ }
191
+ recalculate() {
192
+ if (this.store.snapshot.isDragging)
193
+ return; // skip during drag
194
+ const slides = this.config.slides ?? [];
195
+ const maxStartIndex = this.getMaxStartIndex();
196
+ const current = this.store.snapshot.currentSlide;
197
+ this.store.update({
198
+ visibleSlides: slides,
199
+ translate: this.translate(current),
200
+ pager: this.buildPager(),
201
+ maxStartIndex,
202
+ canPrev: current > 0,
203
+ canNext: current < maxStartIndex,
204
+ });
205
+ }
206
+ translate(index) {
207
+ const axis = this.config.vertical ? "Y" : "X";
208
+ const containerSize = this.containerEl
209
+ ? this.config.vertical
210
+ ? this.containerEl.clientHeight
211
+ : this.containerEl.clientWidth
212
+ : this.config.vertical
213
+ ? window.innerHeight
214
+ : window.innerWidth;
215
+ const gap = this.store.snapshot.gap ?? 0;
216
+ const spv = this.store.snapshot.slidesPerView;
217
+ const slideSize = this.config.isThumbs && this.measuredSlideSizePx
218
+ ? this.measuredSlideSizePx
219
+ : spv > 0
220
+ ? (containerSize - gap * (spv - 1)) / spv
221
+ : containerSize;
222
+ // move by "pageStart * (slideSize + gap)"
223
+ const offset = index * (slideSize + gap);
224
+ return `translate${axis}(-${offset}px)`;
225
+ }
226
+ /** Debounced layout signals for resize/orientation/container changes */
227
+ setupViewportSignals() {
228
+ // If you want "only after resizing stops", replace auditTime with debounceTime(120)
229
+ const resize$ = fromEvent(window, "resize", { passive: true });
230
+ const orientation$ = fromEvent(window, "orientationchange", { passive: true });
231
+ merge(resize$, orientation$)
232
+ .pipe(auditTime(80), // good compromise: responsive without over-recalc
233
+ takeUntil(this.destroy$))
234
+ .subscribe(() => this.onLayoutSignal());
235
+ }
236
+ onLayoutSignal() {
237
+ const beforeSlidesPerView = this.store.snapshot.slidesPerView;
238
+ const beforeVisible = this.store.snapshot.isVisible;
239
+ this.applyBreakpoint();
240
+ const afterSlidesPerView = this.store.snapshot.slidesPerView;
241
+ const afterVisible = this.store.snapshot.isVisible;
242
+ if (beforeSlidesPerView !== afterSlidesPerView || beforeVisible !== afterVisible) {
243
+ this.clampIndicesAfterLayoutChange();
244
+ }
245
+ this.measureSlideSize();
246
+ this.recalculate();
247
+ }
248
+ getBreakpointWidth() {
249
+ if (this.containerEl) {
250
+ // Prefer clientWidth (layout), fallback to rect width
251
+ return this.containerEl.clientWidth || this.containerEl.getBoundingClientRect().width || window.innerWidth;
252
+ }
253
+ return window.innerWidth;
254
+ }
255
+ applyBreakpoint() {
256
+ const width = this.getBreakpointWidth();
257
+ const bp = this.config.breakpoints;
258
+ let override;
259
+ let device = "desktop";
260
+ if (width < 768) {
261
+ override = bp?.mobile;
262
+ device = "mobile";
263
+ }
264
+ else if (width < 1024) {
265
+ override = bp?.tablet;
266
+ device = "tablet";
267
+ }
268
+ else {
269
+ override = bp?.desktop;
270
+ device = "desktop";
271
+ }
272
+ // Merge overrides
273
+ this.config = { ...this.config, ...override };
274
+ this.store.update({
275
+ slidesPerView: this.config.slidesPerView,
276
+ gap: this.config.gap ?? 0, // ✅ NEW
277
+ isVisible: this.config.showOn?.[device] ?? true,
278
+ });
279
+ }
280
+ clampIndicesAfterLayoutChange() {
281
+ const max = this.getMaxStartIndex();
282
+ const current = this.store.snapshot.currentSlide;
283
+ const selected = this.store.snapshot.selectedSlide;
284
+ const clampedCurrent = Math.max(0, Math.min(current, max));
285
+ const clampedSelected = selected === -1 ? -1 : Math.max(0, Math.min(selected, (this.config.slides?.length ?? 0) - 1));
286
+ this.store.update({
287
+ currentSlide: clampedCurrent,
288
+ selectedSlide: clampedSelected,
289
+ });
290
+ }
291
+ buildPager() {
292
+ const totalSlides = this.config.slides.length;
293
+ const currentSlide = this.store.snapshot.selectedSlide !== -1 ? this.store.snapshot.selectedSlide : this.store.snapshot.currentSlide;
294
+ const maxVisibleDots = 5;
295
+ let start = Math.max(0, currentSlide - Math.floor(maxVisibleDots / 2));
296
+ let end = start + maxVisibleDots;
297
+ if (end > totalSlides) {
298
+ end = totalSlides;
299
+ start = Math.max(0, end - maxVisibleDots);
300
+ }
301
+ const visibleDots = Array.from({ length: end - start }, (_, i) => start + i);
302
+ const activeDotIndex = visibleDots.indexOf(currentSlide);
303
+ return {
304
+ currentPage: currentSlide,
305
+ totalPages: totalSlides,
306
+ visibleDots,
307
+ activeDotIndex,
308
+ };
309
+ }
310
+ slideStep() {
311
+ return this.store.snapshot.slidesPerView;
312
+ }
313
+ get maxStartIndex() {
314
+ const total = this.config.slides?.length ?? 0;
315
+ return Math.max(0, total - this.store.snapshot.slidesPerView);
316
+ }
317
+ getMaxStartIndex() {
318
+ const total = this.config.slides?.length ?? 0;
319
+ const spv = this.store.snapshot.slidesPerView || 1;
320
+ return Math.max(0, total - spv);
321
+ }
322
+ /* -------- Plugin-safe API -------- */
323
+ getState() {
324
+ return this.store.snapshot;
325
+ }
326
+ getStateObservable() {
327
+ return this.store.view$;
328
+ }
329
+ setState(patch) {
330
+ this.store.update(patch);
331
+ }
332
+ getConfig() {
333
+ return this.config;
334
+ }
335
+ /** Link this slider to thumbs */
336
+ syncWithThumbs(thumbsEngine) {
337
+ this.syncThumbsEngine = thumbsEngine;
338
+ }
339
+ /* -------- Read-only helpers -------- */
340
+ getSlidesPerView() {
341
+ return this.store.snapshot.slidesPerView;
342
+ }
343
+ getCurrentSlide() {
344
+ return this.store.snapshot.currentSlide;
345
+ }
346
+ getSelectedSlide() {
347
+ return this.store.snapshot.selectedSlide;
348
+ }
349
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SliderEngine, deps: [{ token: SliderStore }], target: i0.ɵɵFactoryTarget.Injectable });
350
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SliderEngine });
351
+ }
352
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SliderEngine, decorators: [{
353
+ type: Injectable
354
+ }], ctorParameters: () => [{ type: SliderStore }] });
355
+
356
+ class SliderAutoplayPlugin {
357
+ engine;
358
+ timerId;
359
+ delay = 4000; // default
360
+ init(engine) {
361
+ this.engine = engine;
362
+ this.start();
363
+ }
364
+ setConfig(config) {
365
+ if (!config)
366
+ return;
367
+ if (typeof config.delay === "number") {
368
+ this.delay = config.delay;
369
+ }
370
+ // restart autoplay with new config
371
+ this.start();
372
+ }
373
+ onDragStart() {
374
+ this.stop();
375
+ }
376
+ onDragEnd() {
377
+ this.start();
378
+ }
379
+ start() {
380
+ this.stop();
381
+ this.timerId = setInterval(() => {
382
+ this.engine.next();
383
+ }, this.delay);
384
+ }
385
+ stop() {
386
+ if (this.timerId) {
387
+ clearInterval(this.timerId);
388
+ this.timerId = null;
389
+ }
390
+ }
391
+ destroy() {
392
+ this.stop();
393
+ }
394
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SliderAutoplayPlugin, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
395
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SliderAutoplayPlugin });
396
+ }
397
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SliderAutoplayPlugin, decorators: [{
398
+ type: Injectable
399
+ }] });
400
+
401
+ class SliderDraggablePlugin {
402
+ engine;
403
+ startX = 0;
404
+ deltaX = 0;
405
+ hasDragged = false;
406
+ isDragging = false;
407
+ dragThreshold = 50;
408
+ // Expose drag state to template
409
+ get isDraggingPointer() {
410
+ return this.isDragging;
411
+ }
412
+ init(engine) {
413
+ this.engine = engine;
414
+ }
415
+ onDragStart(event) {
416
+ this.startX = event.clientX;
417
+ this.deltaX = 0;
418
+ this.hasDragged = false;
419
+ this.isDragging = true;
420
+ // Set engine dragging state
421
+ this.engine.setState({ isDragging: true });
422
+ }
423
+ onDragMove(event) {
424
+ if (!this.isDragging)
425
+ return;
426
+ const moveX = event.clientX - this.startX;
427
+ this.deltaX += moveX;
428
+ this.hasDragged = true;
429
+ const currentTranslate = this.extractTranslate(this.engine.getState().translate);
430
+ const newTranslate = currentTranslate + moveX;
431
+ this.engine.setState({ translate: `translateX(${newTranslate}px)` });
432
+ this.startX = event.clientX;
433
+ }
434
+ onDragEnd() {
435
+ if (this.hasDragged) {
436
+ if (this.deltaX > this.dragThreshold) {
437
+ this.engine.previous();
438
+ }
439
+ else if (this.deltaX < -this.dragThreshold) {
440
+ this.engine.next();
441
+ }
442
+ else {
443
+ // Small drag → snap back
444
+ this.engine.recalculate();
445
+ }
446
+ }
447
+ this.isDragging = false;
448
+ this.hasDragged = false;
449
+ this.deltaX = 0;
450
+ this.engine.setState({ isDragging: false });
451
+ }
452
+ /** Extract numeric value from 'translateX(-123px)' */
453
+ extractTranslate(transform) {
454
+ if (!transform)
455
+ return 0;
456
+ const match = transform.match(/-?\d+(\.\d+)?/);
457
+ return match ? parseFloat(match[0]) : 0;
458
+ }
459
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SliderDraggablePlugin, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
460
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SliderDraggablePlugin });
461
+ }
462
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SliderDraggablePlugin, decorators: [{
463
+ type: Injectable
464
+ }] });
465
+
466
+ class SliderNavigationPlugin {
467
+ engine;
468
+ isPagerMode = false;
469
+ _canPrev$ = new BehaviorSubject(false);
470
+ _canNext$ = new BehaviorSubject(false);
471
+ sub;
472
+ get canPrev$() {
473
+ return this._canPrev$.asObservable();
474
+ }
475
+ get canNext$() {
476
+ return this._canNext$.asObservable();
477
+ }
478
+ init(engine, isPagerMode = false) {
479
+ this.engine = engine;
480
+ this.isPagerMode = isPagerMode;
481
+ // Subscribe to state changes
482
+ this.sub = this.engine.getStateObservable?.()?.subscribe(() => this.updateArrows());
483
+ // ✅ Force initial check after a short delay (to catch async slides)
484
+ setTimeout(() => this.updateArrows());
485
+ }
486
+ destroy() {
487
+ this.sub?.unsubscribe();
488
+ }
489
+ next() {
490
+ if (!this.engine)
491
+ return;
492
+ if (this.isPagerMode) {
493
+ const state = this.engine.getState();
494
+ const cfg = this.engine.getConfig();
495
+ const totalSlides = cfg?.slides?.length ?? 0;
496
+ const perView = state?.slidesPerView ?? cfg?.slidesPerView ?? 1;
497
+ const step = cfg?.slidesToSlide ?? 1;
498
+ const maxIndex = Math.max(0, totalSlides - perView);
499
+ const current = state?.currentSlide ?? 0;
500
+ const newIndex = Math.min(maxIndex, current + step);
501
+ this.engine.goTo(newIndex);
502
+ }
503
+ else {
504
+ this.engine.next();
505
+ }
506
+ }
507
+ prev() {
508
+ if (!this.engine)
509
+ return;
510
+ if (this.isPagerMode) {
511
+ const state = this.engine.getState();
512
+ const cfg = this.engine.getConfig();
513
+ const step = cfg?.slidesToSlide ?? 1;
514
+ const current = state?.currentSlide ?? 0;
515
+ const newIndex = Math.max(0, current - step);
516
+ this.engine.goTo(newIndex);
517
+ }
518
+ else {
519
+ this.engine.previous();
520
+ }
521
+ }
522
+ updateArrows() {
523
+ if (!this.engine)
524
+ return;
525
+ const state = this.engine.getState();
526
+ const cfg = this.engine.getConfig();
527
+ const totalSlides = cfg?.slides?.length ?? 0;
528
+ const perView = state?.slidesPerView ?? 1;
529
+ const canPrev = totalSlides > 0 && (state?.currentSlide ?? 0) > 0;
530
+ const canNext = totalSlides > 0 && (state?.currentSlide ?? 0) < Math.max(0, totalSlides - perView);
531
+ if (this._canPrev$.value !== canPrev)
532
+ this._canPrev$.next(canPrev);
533
+ if (this._canNext$.value !== canNext)
534
+ this._canNext$.next(canNext);
535
+ }
536
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SliderNavigationPlugin, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
537
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SliderNavigationPlugin });
538
+ }
539
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SliderNavigationPlugin, decorators: [{
540
+ type: Injectable
541
+ }] });
542
+
543
+ class SliderPaginationPlugin {
544
+ engine;
545
+ maxVisibleDots = 10;
546
+ sub;
547
+ _pager$ = new BehaviorSubject(null);
548
+ pager$ = this._pager$.asObservable();
549
+ init(engine) {
550
+ this.engine = engine;
551
+ this.sub = this.engine.getStateObservable().subscribe(() => {
552
+ this.updatePager();
553
+ });
554
+ // initial
555
+ setTimeout(() => this.updatePager());
556
+ }
557
+ destroy() {
558
+ this.sub?.unsubscribe();
559
+ this._pager$.next(null);
560
+ }
561
+ /** Go to a slide by slide index (NOT dot index) */
562
+ goToSlide(slideIndex) {
563
+ this.engine.selectSlide(slideIndex);
564
+ }
565
+ updatePager() {
566
+ const state = this.engine.getState();
567
+ const totalSlides = state.visibleSlides?.length ?? 0;
568
+ if (totalSlides <= 0) {
569
+ this._pager$.next(null);
570
+ return;
571
+ }
572
+ // ✅ important: selectedSlide is -1 initially; fallback to currentSlide
573
+ const current = state.selectedSlide !== -1 ? state.selectedSlide : state.currentSlide;
574
+ const maxDots = Math.max(1, this.maxVisibleDots);
575
+ // ✅ clamp to >= 0
576
+ const safeCurrent = Math.max(0, Math.min(current, totalSlides - 1));
577
+ const pageStart = Math.max(0, Math.floor(safeCurrent / maxDots) * maxDots);
578
+ const pageEnd = Math.min(pageStart + maxDots, totalSlides);
579
+ const visibleDots = Array.from({ length: pageEnd - pageStart }, (_, i) => pageStart + i);
580
+ const activeDotIndex = visibleDots.indexOf(safeCurrent);
581
+ this._pager$.next({ visibleDots, activeDotIndex });
582
+ }
583
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SliderPaginationPlugin, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
584
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SliderPaginationPlugin });
585
+ }
586
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SliderPaginationPlugin, decorators: [{
587
+ type: Injectable
588
+ }] });
589
+
590
+ class SimpleSliderComponent {
591
+ engine;
592
+ store;
593
+ draggable;
594
+ pagination;
595
+ navigation;
596
+ autoplay;
597
+ config;
598
+ slideTemplate;
599
+ navigationTemplate;
600
+ paginationTemplate;
601
+ slideChange = new EventEmitter();
602
+ isDraggingPointer = false;
603
+ dragStartX = 0;
604
+ dragStartY = 0;
605
+ lastIndex = -1;
606
+ lastSlidesRef = null;
607
+ destroy$ = new Subject();
608
+ state$;
609
+ sliderHost;
610
+ constructor(engine, store, draggable, pagination, navigation, autoplay) {
611
+ this.engine = engine;
612
+ this.store = store;
613
+ this.draggable = draggable;
614
+ this.pagination = pagination;
615
+ this.navigation = navigation;
616
+ this.autoplay = autoplay;
617
+ }
618
+ ngOnInit() {
619
+ this.state$ = this.store.view$;
620
+ this.state$.pipe(takeUntil(this.destroy$)).subscribe((state) => {
621
+ if (state.currentSlide !== this.lastIndex) {
622
+ this.lastIndex = state.currentSlide;
623
+ this.slideChange.emit(state.currentSlide);
624
+ }
625
+ });
626
+ this.lastSlidesRef = this.config?.slides ?? null;
627
+ this.resolvePlugins(this.config);
628
+ }
629
+ ngAfterViewInit() {
630
+ if (this.sliderHost?.nativeElement) {
631
+ this.engine.attachContainer(this.sliderHost.nativeElement);
632
+ }
633
+ }
634
+ ngOnChanges(changes) {
635
+ if (!changes["config"] || !this.config)
636
+ return;
637
+ const newSlidesRef = this.config.slides ?? null;
638
+ if (newSlidesRef !== this.lastSlidesRef) {
639
+ this.lastSlidesRef = newSlidesRef;
640
+ this.engine.destroy();
641
+ this.resolvePlugins(this.config);
642
+ }
643
+ }
644
+ ngOnDestroy() {
645
+ this.destroySlider();
646
+ }
647
+ goTo(index) {
648
+ this.engine.selectSlide(index); // add this line
649
+ //this.slideChange.emit(index);
650
+ }
651
+ destroySlider() {
652
+ this.destroy$.next();
653
+ this.destroy$.complete();
654
+ this.engine.destroy();
655
+ } // destroys plugins and clears store
656
+ onNext() {
657
+ this.engine.next();
658
+ }
659
+ onPrevious() {
660
+ this.engine.previous();
661
+ }
662
+ selectSlide(index) {
663
+ this.engine.selectSlide(index);
664
+ }
665
+ onRecalculate() {
666
+ this.engine.recalculate();
667
+ }
668
+ // Navigation
669
+ /** Expose navigation observables safely */
670
+ get canPrev$() {
671
+ if (!this.navigation) {
672
+ console.warn("Navigation plugin is not enabled.");
673
+ return null;
674
+ }
675
+ return this.navigation.canPrev$;
676
+ }
677
+ get canNext$() {
678
+ if (!this.navigation) {
679
+ console.warn("Navigation plugin is not enabled.");
680
+ return null;
681
+ }
682
+ return this.navigation.canNext$;
683
+ }
684
+ /** Expose next/prev methods */
685
+ next() {
686
+ this.navigation?.next();
687
+ }
688
+ prev() {
689
+ this.navigation?.prev();
690
+ }
691
+ /** Expose pagination observable */
692
+ get pager$() {
693
+ if (!this.pagination) {
694
+ console.warn("Pagination plugin is not enabled for this slider.");
695
+ return null;
696
+ }
697
+ return this.pagination.pager$;
698
+ }
699
+ /** Expose a goToSlide method */
700
+ goToSlide(index) {
701
+ this.pagination.goToSlide(index);
702
+ }
703
+ // Handle Pointers
704
+ onPointerDown(event) {
705
+ // Only start drag if not clicking a nav button
706
+ if (event.target.closest(".nav-btn")) {
707
+ return; // ignore
708
+ }
709
+ this.dragStartX = event.clientX;
710
+ this.dragStartY = event.clientY;
711
+ this.isDraggingPointer = false;
712
+ // Do not capture yet; wait until movement exceeds threshold
713
+ this.engine.handleDragStart(event);
714
+ }
715
+ onPointerMove(event) {
716
+ const dx = Math.abs(event.clientX - this.dragStartX);
717
+ const dy = Math.abs(event.clientY - this.dragStartY);
718
+ if (!this.isDraggingPointer && (dx > 5 || dy > 5)) {
719
+ this.isDraggingPointer = true;
720
+ // Now start capturing pointer so dragging works outside the slider bounds
721
+ event.currentTarget.setPointerCapture(event.pointerId);
722
+ }
723
+ if (this.isDraggingPointer) {
724
+ this.engine.handleDragMove(event);
725
+ }
726
+ }
727
+ onPointerUp(event) {
728
+ if (!event)
729
+ return;
730
+ if (!this.isDraggingPointer) {
731
+ const target = event.target;
732
+ // Only select the slide if click is not on an interactive child
733
+ const slideEl = target.closest(".slide");
734
+ if (slideEl && !target.closest("button, video, a")) {
735
+ const indexAttr = slideEl.getAttribute("data-index");
736
+ const index = indexAttr ? parseInt(indexAttr, 10) : null;
737
+ if (index !== null)
738
+ this.engine.selectSlide(index);
739
+ }
740
+ }
741
+ this.engine.handleDragEnd();
742
+ this.isDraggingPointer = false;
743
+ // Release pointer capture if it was captured
744
+ try {
745
+ event.currentTarget.releasePointerCapture(event.pointerId);
746
+ }
747
+ catch { }
748
+ }
749
+ resolvePlugins(config) {
750
+ const runtimePlugins = [];
751
+ const cfg = config.plugins ?? {}; // <-- safe fallback
752
+ if (cfg.draggable)
753
+ runtimePlugins.push(this.draggable);
754
+ if (cfg.pagination)
755
+ runtimePlugins.push(this.pagination);
756
+ if (cfg.navigation)
757
+ runtimePlugins.push(this.navigation);
758
+ if (cfg.autoplay) {
759
+ this.autoplay.setConfig(cfg.autoplay);
760
+ runtimePlugins.push(this.autoplay);
761
+ }
762
+ this.engine.init({ ...config, plugins: undefined }, runtimePlugins);
763
+ if (cfg.navigation) {
764
+ setTimeout(() => this.navigation?.updateArrows?.());
765
+ }
766
+ }
767
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SimpleSliderComponent, deps: [{ token: SliderEngine }, { token: SliderStore }, { token: SliderDraggablePlugin }, { token: SliderPaginationPlugin }, { token: SliderNavigationPlugin }, { token: SliderAutoplayPlugin }], target: i0.ɵɵFactoryTarget.Component });
768
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: SimpleSliderComponent, isStandalone: true, selector: "app-simple-slider", inputs: { config: "config", slideTemplate: "slideTemplate", navigationTemplate: "navigationTemplate", paginationTemplate: "paginationTemplate" }, outputs: { slideChange: "slideChange" }, providers: [SliderEngine, SliderStore, SliderDraggablePlugin, SliderPaginationPlugin, SliderNavigationPlugin, SliderAutoplayPlugin], viewQueries: [{ propertyName: "sliderHost", first: true, predicate: ["sliderHost"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"state$ | async as state\">\r\n <div\r\n class=\"slider\"\r\n #sliderHost\r\n [class.slider-vertical]=\"state.vertical\"\r\n [class.slider-draggable]=\"state.isDragging\"\r\n [class.slider--main]=\"!config.isThumbs\"\r\n [class.slider--thumbs]=\"config.isThumbs\"\r\n *ngIf=\"state.visibleSlides?.length > 0 && state.isVisible\"\r\n (pointerdown)=\"onPointerDown($event)\"\r\n (pointermove)=\"onPointerMove($event)\"\r\n (pointerup)=\"onPointerUp($event)\"\r\n (pointercancel)=\"onPointerUp($event)\">\r\n <div\r\n class=\"slider__wrapper\"\r\n [ngStyle]=\"{\r\n transform: state.translate,\r\n transition: draggable.isDraggingPointer ? 'none' : 'transform 0.3s ease',\r\n display: 'flex',\r\n 'flex-direction': state.vertical ? 'column' : 'row',\r\n 'justify-content': state.visibleSlides?.length < state.slidesPerView ? 'center' : 'flex-start',\r\n gap: (state.slidesPerView > 1 ? state.gap || 0 : 0) + 'px',\r\n }\">\r\n <div\r\n *ngFor=\"let slide of state.visibleSlides; let i = index\"\r\n class=\"slide\"\r\n [attr.data-index]=\"i\"\r\n [class.slide--current]=\"state.selectedSlide === i\"\r\n [style.flex]=\"\r\n !config.isThumbs\r\n ? '0 0 calc(' +\r\n 100 / state.slidesPerView +\r\n '% - ' +\r\n ((state.gap || 0) * (state.slidesPerView - 1)) / state.slidesPerView +\r\n 'px)'\r\n : '0 0 ' + thumbSize + 'px'\r\n \"\r\n [style.width]=\"config.isThumbs ? thumbSize + 'px' : null\"\r\n [style.height]=\"config.isThumbs ? thumbSize + 'px' : null\"\r\n (click)=\"engine.selectSlide(i)\">\r\n <ng-container\r\n *ngTemplateOutlet=\"slideTemplate ? slideTemplate : defaultSlideTemplate; context: { slide: slide, index: i }\"></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-container>\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
769
+ }
770
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SimpleSliderComponent, decorators: [{
771
+ type: Component,
772
+ args: [{ selector: "app-simple-slider", changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, standalone: true, imports: [CommonModule], providers: [SliderEngine, SliderStore, SliderDraggablePlugin, SliderPaginationPlugin, SliderNavigationPlugin, SliderAutoplayPlugin], template: "<ng-container *ngIf=\"state$ | async as state\">\r\n <div\r\n class=\"slider\"\r\n #sliderHost\r\n [class.slider-vertical]=\"state.vertical\"\r\n [class.slider-draggable]=\"state.isDragging\"\r\n [class.slider--main]=\"!config.isThumbs\"\r\n [class.slider--thumbs]=\"config.isThumbs\"\r\n *ngIf=\"state.visibleSlides?.length > 0 && state.isVisible\"\r\n (pointerdown)=\"onPointerDown($event)\"\r\n (pointermove)=\"onPointerMove($event)\"\r\n (pointerup)=\"onPointerUp($event)\"\r\n (pointercancel)=\"onPointerUp($event)\">\r\n <div\r\n class=\"slider__wrapper\"\r\n [ngStyle]=\"{\r\n transform: state.translate,\r\n transition: draggable.isDraggingPointer ? 'none' : 'transform 0.3s ease',\r\n display: 'flex',\r\n 'flex-direction': state.vertical ? 'column' : 'row',\r\n 'justify-content': state.visibleSlides?.length < state.slidesPerView ? 'center' : 'flex-start',\r\n gap: (state.slidesPerView > 1 ? state.gap || 0 : 0) + 'px',\r\n }\">\r\n <div\r\n *ngFor=\"let slide of state.visibleSlides; let i = index\"\r\n class=\"slide\"\r\n [attr.data-index]=\"i\"\r\n [class.slide--current]=\"state.selectedSlide === i\"\r\n [style.flex]=\"\r\n !config.isThumbs\r\n ? '0 0 calc(' +\r\n 100 / state.slidesPerView +\r\n '% - ' +\r\n ((state.gap || 0) * (state.slidesPerView - 1)) / state.slidesPerView +\r\n 'px)'\r\n : '0 0 ' + thumbSize + 'px'\r\n \"\r\n [style.width]=\"config.isThumbs ? thumbSize + 'px' : null\"\r\n [style.height]=\"config.isThumbs ? thumbSize + 'px' : null\"\r\n (click)=\"engine.selectSlide(i)\">\r\n <ng-container\r\n *ngTemplateOutlet=\"slideTemplate ? slideTemplate : defaultSlideTemplate; context: { slide: slide, index: i }\"></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-container>\r\n" }]
773
+ }], ctorParameters: () => [{ type: SliderEngine }, { type: SliderStore }, { type: SliderDraggablePlugin }, { type: SliderPaginationPlugin }, { type: SliderNavigationPlugin }, { type: SliderAutoplayPlugin }], propDecorators: { config: [{
774
+ type: Input
775
+ }], slideTemplate: [{
776
+ type: Input
777
+ }], navigationTemplate: [{
778
+ type: Input
779
+ }], paginationTemplate: [{
780
+ type: Input
781
+ }], slideChange: [{
782
+ type: Output
783
+ }], sliderHost: [{
784
+ type: ViewChild,
785
+ args: ["sliderHost", { static: false }]
786
+ }] } });
787
+
788
+ class NgxEdgeSliderModule {
789
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NgxEdgeSliderModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
790
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: NgxEdgeSliderModule, imports: [SimpleSliderComponent], exports: [SimpleSliderComponent] });
791
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NgxEdgeSliderModule, imports: [SimpleSliderComponent] });
792
+ }
793
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NgxEdgeSliderModule, decorators: [{
794
+ type: NgModule,
795
+ args: [{
796
+ imports: [SimpleSliderComponent],
797
+ exports: [SimpleSliderComponent],
798
+ }]
799
+ }] });
800
+
801
+ class SafeUrlPipe {
802
+ sanitizer;
803
+ constructor(sanitizer) {
804
+ this.sanitizer = sanitizer;
805
+ }
806
+ transform(url) {
807
+ return this.sanitizer.bypassSecurityTrustResourceUrl(url);
808
+ }
809
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SafeUrlPipe, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Pipe });
810
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: SafeUrlPipe, name: "safeUrl" });
811
+ }
812
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SafeUrlPipe, decorators: [{
813
+ type: Pipe,
814
+ args: [{ name: "safeUrl" }]
815
+ }], ctorParameters: () => [{ type: i1.DomSanitizer }] });
816
+
817
+ // components
818
+
819
+ /**
820
+ * Generated bundle index. Do not edit.
821
+ */
822
+
823
+ export { DEFAULT_CONFIG, INITIAL_SLIDER_STATE, NgxEdgeSliderModule, SafeUrlPipe, SimpleSliderComponent, SliderAutoplayPlugin, SliderDraggablePlugin, SliderEngine, SliderNavigationPlugin, SliderPaginationPlugin, SliderStore };
824
+ //# sourceMappingURL=WingmanColt-ngx-edge-slider.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WingmanColt-ngx-edge-slider.mjs","sources":["../../../projects/ngx-edge-slider/src/lib/models/slider-config.model.ts","../../../projects/ngx-edge-slider/src/lib/models/slider-state.model.ts","../../../projects/ngx-edge-slider/src/lib/store/slider-store.service.ts","../../../projects/ngx-edge-slider/src/lib/engine/slider-engine.service.ts","../../../projects/ngx-edge-slider/src/lib/plugins/autoplay/autoplay.plugin.ts","../../../projects/ngx-edge-slider/src/lib/plugins/draggable/draggable.plugin.ts","../../../projects/ngx-edge-slider/src/lib/plugins/navigation/navigation.plugin.ts","../../../projects/ngx-edge-slider/src/lib/plugins/pagination/pagination.plugin.ts","../../../projects/ngx-edge-slider/src/lib/component/simple-slider.component.ts","../../../projects/ngx-edge-slider/src/lib/component/simple-slider.component.html","../../../projects/ngx-edge-slider/src/lib/ngx-edge-slider.module.ts","../../../projects/ngx-edge-slider/src/lib/safe-url.pipe.ts","../../../projects/ngx-edge-slider/src/public-api.ts","../../../projects/ngx-edge-slider/src/WingmanColt-ngx-edge-slider.ts"],"sourcesContent":["export interface AutoplayPluginConfig {\r\n delay?: number;\r\n}\r\nexport interface SliderPluginConfig {\r\n draggable?: boolean;\r\n autoplay?: { delay?: number };\r\n navigation?: boolean;\r\n pagination?: boolean;\r\n}\r\nexport interface SliderConfig {\r\n slides: any[];\r\n slidesPerView: number;\r\n slidesToSlide?: number;\r\n loop?: 0 | 1 | 2;\r\n vertical?: boolean;\r\n changeToClickedSlide?: boolean;\r\n isThumbs?: boolean;\r\n\r\n /** NEW: gap between slides in px */\r\n gap?: number;\r\n\r\n breakpoints?: {\r\n mobile?: Partial<SliderConfig>;\r\n tablet?: Partial<SliderConfig>;\r\n desktop?: Partial<SliderConfig>;\r\n };\r\n\r\n plugins?: SliderPluginConfig;\r\n\r\n showOn?: {\r\n mobile?: boolean;\r\n tablet?: boolean;\r\n desktop?: boolean;\r\n };\r\n}\r\n\r\nexport const DEFAULT_CONFIG: SliderConfig = {\r\n slides: [],\r\n slidesPerView: 1,\r\n slidesToSlide: 1,\r\n loop: 0,\r\n vertical: false,\r\n changeToClickedSlide: false,\r\n isThumbs: false,\r\n plugins: {\r\n draggable: false,\r\n pagination: false,\r\n navigation: false,\r\n autoplay: undefined,\r\n },\r\n gap: 0,\r\n\r\n showOn: { mobile: true, tablet: true, desktop: true },\r\n};\r\n","export interface SliderViewState {\r\n currentSlide: number;\r\n selectedSlide: number;\r\n\r\n slidesPerView: number;\r\n visibleSlides: any[];\r\n\r\n gap?: number;\r\n\r\n maxStartIndex?: number;\r\n canPrev?: boolean;\r\n canNext?: boolean;\r\n\r\n pager?: {\r\n currentPage: number;\r\n totalPages: number;\r\n visibleDots: number[];\r\n activeDotIndex: number;\r\n } | null;\r\n\r\n translate?: string;\r\n transition?: string;\r\n\r\n isAnimating?: boolean;\r\n isVisible?: boolean;\r\n isDragging?: boolean;\r\n}\r\n\r\nexport const INITIAL_SLIDER_STATE: SliderViewState = {\r\n currentSlide: 0,\r\n selectedSlide: -1,\r\n\r\n slidesPerView: 1,\r\n visibleSlides: [],\r\n\r\n gap: 0,\r\n maxStartIndex: 0,\r\n canPrev: false,\r\n canNext: false,\r\n\r\n translate: \"translateX(0px)\",\r\n transition: \"transform 300ms ease\",\r\n pager: null,\r\n\r\n isAnimating: false,\r\n isVisible: false,\r\n isDragging: false,\r\n};\r\n","import { Injectable } from \"@angular/core\";\r\nimport { BehaviorSubject } from \"rxjs\";\r\nimport { INITIAL_SLIDER_STATE, SliderViewState } from \"../models/slider-state.model\";\r\n\r\n@Injectable()\r\nexport class SliderStore {\r\n private readonly state$ = new BehaviorSubject<SliderViewState>({\r\n currentSlide: 0,\r\n selectedSlide: -1,\r\n\r\n slidesPerView: 1,\r\n visibleSlides: [],\r\n\r\n translate: \"translateX(0)\",\r\n transition: \"transform 300ms ease\",\r\n pager: null,\r\n isVisible: true,\r\n\r\n isAnimating: false,\r\n isDragging: false,\r\n });\r\n readonly view$ = this.state$.asObservable();\r\n\r\n get snapshot() {\r\n return this.state$.value;\r\n }\r\n\r\n update(patch: Partial<SliderViewState>) {\r\n this.state$.next({ ...this.snapshot, ...patch });\r\n }\r\n\r\n reset() {\r\n this.state$.next(INITIAL_SLIDER_STATE);\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { fromEvent, merge, Subject, auditTime, takeUntil } from \"rxjs\";\r\nimport { SliderConfig, DEFAULT_CONFIG } from \"../models/slider-config.model\";\r\nimport { SliderViewState } from \"../models/slider-state.model\";\r\nimport { SliderPlugin } from \"../plugins/slider-plugin\";\r\nimport { SliderStore } from \"../store/slider-store.service\";\r\n\r\n@Injectable()\r\nexport class SliderEngine {\r\n private config!: SliderConfig;\r\n private plugins: SliderPlugin[] = [];\r\n private syncThumbsEngine?: SliderEngine;\r\n\r\n // RX lifecycle\r\n private destroy$ = new Subject<void>();\r\n\r\n // Container-based breakpoints\r\n private containerEl?: HTMLElement;\r\n private ro?: ResizeObserver;\r\n\r\n private measuredSlideSizePx?: number;\r\n\r\n constructor(private store: SliderStore) {}\r\n\r\n /* ---------------- Public API ---------------- */\r\n\r\n init(config: SliderConfig, plugins: SliderPlugin[] = []) {\r\n this.config = { ...DEFAULT_CONFIG, ...config, plugins: { ...(config.plugins ?? {}) } };\r\n this.plugins = plugins;\r\n\r\n this.plugins.forEach((p) => p.init?.(this));\r\n\r\n this.setupViewportSignals();\r\n this.applyBreakpoint();\r\n this.clampIndicesAfterLayoutChange();\r\n this.recalculate();\r\n }\r\n\r\n /** Call this from the component once you have the slider host element */\r\n attachContainer(el: HTMLElement) {\r\n this.containerEl = el;\r\n\r\n // Observe container size changes (robust in grids/sidebars/tabs)\r\n this.ro?.disconnect();\r\n this.ro = new ResizeObserver(() => {\r\n // We reuse the same debounced layout handler\r\n this.onLayoutSignal();\r\n });\r\n this.ro.observe(el);\r\n\r\n this.measureSlideSize();\r\n // Apply immediately based on real container width\r\n this.onLayoutSignal();\r\n }\r\n private measureSlideSize() {\r\n if (!this.containerEl) return;\r\n const firstSlide = this.containerEl.querySelector<HTMLElement>(\".slide\");\r\n if (!firstSlide) return;\r\n const rect = firstSlide.getBoundingClientRect();\r\n if (rect.width > 0) this.measuredSlideSizePx = rect.width;\r\n }\r\n destroy() {\r\n // Stop Rx streams\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n\r\n // Disconnect ResizeObserver\r\n this.ro?.disconnect();\r\n this.ro = undefined;\r\n this.containerEl = undefined;\r\n\r\n // Plugin cleanup\r\n this.plugins.forEach((p) => p.destroy?.());\r\n this.plugins = [];\r\n\r\n // Reset store\r\n this.store.reset();\r\n }\r\n\r\n next() {\r\n this.goTo(this.store.snapshot.currentSlide + this.slideStep());\r\n this.plugins.forEach((p) => p.onNext?.());\r\n }\r\n\r\n previous() {\r\n this.goTo(this.store.snapshot.currentSlide - this.slideStep());\r\n this.plugins.forEach((p) => p.onPrevious?.());\r\n }\r\n public getContainerEl(): HTMLElement | undefined {\r\n return this.containerEl;\r\n }\r\n selectSlide(index: number) {\r\n const slidesPerView = this.store.snapshot.slidesPerView;\r\n\r\n // 1️⃣ Mark selected\r\n this.store.update({ selectedSlide: index });\r\n\r\n // 2️⃣ Calculate page start\r\n let pageStart = Math.floor(index / slidesPerView) * slidesPerView;\r\n\r\n // 3️⃣ Clamp to maxStartIndex\r\n pageStart = Math.min(pageStart, this.maxStartIndex);\r\n\r\n // 4️⃣ If synced with thumbs, also clamp to their max index\r\n if (this.syncThumbsEngine) {\r\n const thumbMaxIndex = this.syncThumbsEngine.getMaxStartIndex();\r\n pageStart = Math.min(pageStart, thumbMaxIndex);\r\n }\r\n\r\n // 5️⃣ Move main slider\r\n if (pageStart !== this.store.snapshot.currentSlide) {\r\n this.goToSlide(pageStart);\r\n }\r\n\r\n // 6️⃣ Notify plugins\r\n this.plugins.forEach((p) => p.onSlideClick?.(index));\r\n }\r\n\r\n /* ---------------- Drag ---------------- */\r\n\r\n handleDragStart(event: PointerEvent) {\r\n this.store.update({ isDragging: true });\r\n this.plugins.forEach((p) => p.onDragStart?.(event));\r\n }\r\n handleDragMove(event: PointerEvent) {\r\n this.plugins.forEach((p) => p.onDragMove?.(event));\r\n }\r\n handleDragEnd() {\r\n this.store.update({ isDragging: false });\r\n this.plugins.forEach((p) => p.onDragEnd?.());\r\n }\r\n public goTo(index: number) {\r\n this.goToSlide(index); // reuse your existing private method\r\n }\r\n /* ---------------- Internals ---------------- */\r\n\r\n private goToSlide(index: number) {\r\n const clamped = Math.max(0, Math.min(index, this.maxStartIndex));\r\n // console.log(\"[Engine] goToSlide index:\", index, \"clamped:\", clamped);\r\n\r\n this.store.update({ currentSlide: clamped });\r\n this.recalculate();\r\n\r\n // NOTE: calling onSlideClick here is a bit semantically odd (since it’s not always a click),\r\n // but I preserved your behavior.\r\n this.plugins.forEach((p) => p.onSlideClick?.(index));\r\n }\r\n\r\n public recalculate() {\r\n if (this.store.snapshot.isDragging) return; // skip during drag\r\n const slides = this.config.slides ?? [];\r\n const maxStartIndex = this.getMaxStartIndex();\r\n const current = this.store.snapshot.currentSlide;\r\n\r\n this.store.update({\r\n visibleSlides: slides,\r\n translate: this.translate(current),\r\n pager: this.buildPager(),\r\n maxStartIndex,\r\n canPrev: current > 0,\r\n canNext: current < maxStartIndex,\r\n });\r\n }\r\n\r\n private translate(index: number): string {\r\n const axis = this.config.vertical ? \"Y\" : \"X\";\r\n\r\n const containerSize = this.containerEl\r\n ? this.config.vertical\r\n ? this.containerEl.clientHeight\r\n : this.containerEl.clientWidth\r\n : this.config.vertical\r\n ? window.innerHeight\r\n : window.innerWidth;\r\n\r\n const gap = this.store.snapshot.gap ?? 0;\r\n\r\n const spv = this.store.snapshot.slidesPerView;\r\n const slideSize =\r\n this.config.isThumbs && this.measuredSlideSizePx\r\n ? this.measuredSlideSizePx\r\n : spv > 0\r\n ? (containerSize - gap * (spv - 1)) / spv\r\n : containerSize;\r\n\r\n // move by \"pageStart * (slideSize + gap)\"\r\n const offset = index * (slideSize + gap);\r\n\r\n return `translate${axis}(-${offset}px)`;\r\n }\r\n\r\n /** Debounced layout signals for resize/orientation/container changes */\r\n private setupViewportSignals() {\r\n // If you want \"only after resizing stops\", replace auditTime with debounceTime(120)\r\n const resize$ = fromEvent(window, \"resize\", { passive: true } as any);\r\n const orientation$ = fromEvent(window, \"orientationchange\", { passive: true } as any);\r\n\r\n merge(resize$, orientation$)\r\n .pipe(\r\n auditTime(80), // good compromise: responsive without over-recalc\r\n takeUntil(this.destroy$),\r\n )\r\n .subscribe(() => this.onLayoutSignal());\r\n }\r\n\r\n private onLayoutSignal() {\r\n const beforeSlidesPerView = this.store.snapshot.slidesPerView;\r\n const beforeVisible = this.store.snapshot.isVisible;\r\n\r\n this.applyBreakpoint();\r\n\r\n const afterSlidesPerView = this.store.snapshot.slidesPerView;\r\n const afterVisible = this.store.snapshot.isVisible;\r\n\r\n if (beforeSlidesPerView !== afterSlidesPerView || beforeVisible !== afterVisible) {\r\n this.clampIndicesAfterLayoutChange();\r\n }\r\n\r\n this.measureSlideSize();\r\n\r\n this.recalculate();\r\n }\r\n\r\n private getBreakpointWidth(): number {\r\n if (this.containerEl) {\r\n // Prefer clientWidth (layout), fallback to rect width\r\n return this.containerEl.clientWidth || this.containerEl.getBoundingClientRect().width || window.innerWidth;\r\n }\r\n return window.innerWidth;\r\n }\r\n\r\n private applyBreakpoint() {\r\n const width = this.getBreakpointWidth();\r\n const bp = this.config.breakpoints;\r\n\r\n let override: Partial<SliderConfig> | undefined;\r\n let device: \"mobile\" | \"tablet\" | \"desktop\" = \"desktop\";\r\n\r\n if (width < 768) {\r\n override = bp?.mobile;\r\n device = \"mobile\";\r\n } else if (width < 1024) {\r\n override = bp?.tablet;\r\n device = \"tablet\";\r\n } else {\r\n override = bp?.desktop;\r\n device = \"desktop\";\r\n }\r\n\r\n // Merge overrides\r\n this.config = { ...this.config, ...override };\r\n\r\n this.store.update({\r\n slidesPerView: this.config.slidesPerView,\r\n gap: this.config.gap ?? 0, // ✅ NEW\r\n isVisible: this.config.showOn?.[device] ?? true,\r\n });\r\n }\r\n\r\n private clampIndicesAfterLayoutChange() {\r\n const max = this.getMaxStartIndex();\r\n\r\n const current = this.store.snapshot.currentSlide;\r\n const selected = this.store.snapshot.selectedSlide;\r\n\r\n const clampedCurrent = Math.max(0, Math.min(current, max));\r\n const clampedSelected = selected === -1 ? -1 : Math.max(0, Math.min(selected, (this.config.slides?.length ?? 0) - 1));\r\n\r\n this.store.update({\r\n currentSlide: clampedCurrent,\r\n selectedSlide: clampedSelected,\r\n });\r\n }\r\n\r\n private buildPager() {\r\n const totalSlides = this.config.slides.length;\r\n const currentSlide = this.store.snapshot.selectedSlide !== -1 ? this.store.snapshot.selectedSlide : this.store.snapshot.currentSlide;\r\n\r\n const maxVisibleDots = 5;\r\n\r\n let start = Math.max(0, currentSlide - Math.floor(maxVisibleDots / 2));\r\n let end = start + maxVisibleDots;\r\n\r\n if (end > totalSlides) {\r\n end = totalSlides;\r\n start = Math.max(0, end - maxVisibleDots);\r\n }\r\n\r\n const visibleDots = Array.from({ length: end - start }, (_, i) => start + i);\r\n const activeDotIndex = visibleDots.indexOf(currentSlide);\r\n\r\n return {\r\n currentPage: currentSlide,\r\n totalPages: totalSlides,\r\n visibleDots,\r\n activeDotIndex,\r\n };\r\n }\r\n\r\n private slideStep() {\r\n return this.store.snapshot.slidesPerView;\r\n }\r\n\r\n private get maxStartIndex() {\r\n const total = this.config.slides?.length ?? 0;\r\n return Math.max(0, total - this.store.snapshot.slidesPerView);\r\n }\r\n getMaxStartIndex() {\r\n const total = this.config.slides?.length ?? 0;\r\n const spv = this.store.snapshot.slidesPerView || 1;\r\n return Math.max(0, total - spv);\r\n }\r\n /* -------- Plugin-safe API -------- */\r\n\r\n getState() {\r\n return this.store.snapshot;\r\n }\r\n\r\n getStateObservable() {\r\n return this.store.view$;\r\n }\r\n\r\n setState(patch: Partial<SliderViewState>) {\r\n this.store.update(patch);\r\n }\r\n\r\n getConfig() {\r\n return this.config;\r\n }\r\n\r\n /** Link this slider to thumbs */\r\n syncWithThumbs(thumbsEngine: SliderEngine) {\r\n this.syncThumbsEngine = thumbsEngine;\r\n }\r\n\r\n /* -------- Read-only helpers -------- */\r\n\r\n getSlidesPerView(): number {\r\n return this.store.snapshot.slidesPerView;\r\n }\r\n\r\n getCurrentSlide(): number {\r\n return this.store.snapshot.currentSlide;\r\n }\r\n\r\n getSelectedSlide(): number {\r\n return this.store.snapshot.selectedSlide;\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { SliderPlugin } from \"../slider-plugin\";\r\nimport { SliderEngine } from \"../../engine/slider-engine.service\";\r\nimport { AutoplayPluginConfig } from \"../../models/slider-config.model\";\r\n@Injectable()\r\nexport class SliderAutoplayPlugin implements SliderPlugin {\r\n private engine!: SliderEngine;\r\n private timerId: any;\r\n private delay = 4000; // default\r\n\r\n init(engine: SliderEngine) {\r\n this.engine = engine;\r\n this.start();\r\n }\r\n\r\n setConfig(config?: AutoplayPluginConfig) {\r\n if (!config) return;\r\n\r\n if (typeof config.delay === \"number\") {\r\n this.delay = config.delay;\r\n }\r\n\r\n // restart autoplay with new config\r\n this.start();\r\n }\r\n\r\n onDragStart() {\r\n this.stop();\r\n }\r\n\r\n onDragEnd() {\r\n this.start();\r\n }\r\n\r\n private start() {\r\n this.stop();\r\n this.timerId = setInterval(() => {\r\n this.engine.next();\r\n }, this.delay);\r\n }\r\n\r\n private stop() {\r\n if (this.timerId) {\r\n clearInterval(this.timerId);\r\n this.timerId = null;\r\n }\r\n }\r\n\r\n destroy() {\r\n this.stop();\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { SliderPlugin } from \"../slider-plugin\";\r\nimport { SliderEngine } from \"../../engine/slider-engine.service\";\r\n\r\n@Injectable()\r\nexport class SliderDraggablePlugin implements SliderPlugin {\r\n private engine!: SliderEngine;\r\n private startX = 0;\r\n private deltaX = 0;\r\n private hasDragged = false;\r\n private isDragging = false;\r\n private readonly dragThreshold = 50;\r\n\r\n // Expose drag state to template\r\n public get isDraggingPointer(): boolean {\r\n return this.isDragging;\r\n }\r\n\r\n init(engine: SliderEngine) {\r\n this.engine = engine;\r\n }\r\n\r\n onDragStart(event: PointerEvent) {\r\n this.startX = event.clientX;\r\n this.deltaX = 0;\r\n this.hasDragged = false;\r\n this.isDragging = true;\r\n\r\n // Set engine dragging state\r\n this.engine.setState({ isDragging: true });\r\n }\r\n\r\n onDragMove(event: PointerEvent) {\r\n if (!this.isDragging) return;\r\n\r\n const moveX = event.clientX - this.startX;\r\n this.deltaX += moveX;\r\n this.hasDragged = true;\r\n\r\n const currentTranslate = this.extractTranslate(this.engine.getState().translate);\r\n const newTranslate = currentTranslate + moveX;\r\n\r\n this.engine.setState({ translate: `translateX(${newTranslate}px)` });\r\n\r\n this.startX = event.clientX;\r\n }\r\n\r\n onDragEnd() {\r\n if (this.hasDragged) {\r\n if (this.deltaX > this.dragThreshold) {\r\n this.engine.previous();\r\n } else if (this.deltaX < -this.dragThreshold) {\r\n this.engine.next();\r\n } else {\r\n // Small drag → snap back\r\n this.engine.recalculate();\r\n }\r\n }\r\n\r\n this.isDragging = false;\r\n this.hasDragged = false;\r\n this.deltaX = 0;\r\n\r\n this.engine.setState({ isDragging: false });\r\n }\r\n\r\n /** Extract numeric value from 'translateX(-123px)' */\r\n private extractTranslate(transform: string | undefined): number {\r\n if (!transform) return 0;\r\n const match = transform.match(/-?\\d+(\\.\\d+)?/);\r\n return match ? parseFloat(match[0]) : 0;\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { SliderPlugin } from \"../slider-plugin\";\r\nimport { SliderEngine } from \"../../engine/slider-engine.service\";\r\nimport { BehaviorSubject, Subscription } from \"rxjs\";\r\n\r\n@Injectable()\r\nexport class SliderNavigationPlugin implements SliderPlugin {\r\n private engine!: SliderEngine;\r\n\r\n private isPagerMode = false;\r\n\r\n private _canPrev$ = new BehaviorSubject<boolean>(false);\r\n private _canNext$ = new BehaviorSubject<boolean>(false);\r\n\r\n private sub!: Subscription;\r\n\r\n get canPrev$() {\r\n return this._canPrev$.asObservable();\r\n }\r\n get canNext$() {\r\n return this._canNext$.asObservable();\r\n }\r\n\r\n init(engine: SliderEngine, isPagerMode: boolean = false) {\r\n this.engine = engine;\r\n this.isPagerMode = isPagerMode;\r\n\r\n // Subscribe to state changes\r\n this.sub = this.engine.getStateObservable?.()?.subscribe(() => this.updateArrows());\r\n\r\n // ✅ Force initial check after a short delay (to catch async slides)\r\n setTimeout(() => this.updateArrows());\r\n }\r\n\r\n destroy() {\r\n this.sub?.unsubscribe();\r\n }\r\n next() {\r\n if (!this.engine) return;\r\n\r\n if (this.isPagerMode) {\r\n const state = this.engine.getState();\r\n const cfg = this.engine.getConfig();\r\n\r\n const totalSlides = cfg?.slides?.length ?? 0;\r\n const perView = state?.slidesPerView ?? cfg?.slidesPerView ?? 1;\r\n const step = cfg?.slidesToSlide ?? 1;\r\n\r\n const maxIndex = Math.max(0, totalSlides - perView);\r\n const current = state?.currentSlide ?? 0;\r\n\r\n const newIndex = Math.min(maxIndex, current + step);\r\n this.engine.goTo(newIndex);\r\n } else {\r\n this.engine.next();\r\n }\r\n }\r\n\r\n prev() {\r\n if (!this.engine) return;\r\n\r\n if (this.isPagerMode) {\r\n const state = this.engine.getState();\r\n const cfg = this.engine.getConfig();\r\n\r\n const step = cfg?.slidesToSlide ?? 1;\r\n const current = state?.currentSlide ?? 0;\r\n\r\n const newIndex = Math.max(0, current - step);\r\n this.engine.goTo(newIndex);\r\n } else {\r\n this.engine.previous();\r\n }\r\n }\r\n\r\n public updateArrows() {\r\n if (!this.engine) return;\r\n\r\n const state = this.engine.getState();\r\n const cfg = this.engine.getConfig();\r\n const totalSlides = cfg?.slides?.length ?? 0;\r\n const perView = state?.slidesPerView ?? 1;\r\n\r\n const canPrev = totalSlides > 0 && (state?.currentSlide ?? 0) > 0;\r\n const canNext = totalSlides > 0 && (state?.currentSlide ?? 0) < Math.max(0, totalSlides - perView);\r\n\r\n if (this._canPrev$.value !== canPrev) this._canPrev$.next(canPrev);\r\n if (this._canNext$.value !== canNext) this._canNext$.next(canNext);\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { Pager, SliderPlugin } from \"../slider-plugin\";\r\nimport { SliderEngine } from \"../../engine/slider-engine.service\";\r\nimport { BehaviorSubject, Subscription } from \"rxjs\";\r\n\r\n@Injectable()\r\nexport class SliderPaginationPlugin implements SliderPlugin {\r\n private engine!: SliderEngine;\r\n private maxVisibleDots = 10;\r\n private sub!: Subscription;\r\n\r\n private _pager$ = new BehaviorSubject<Pager | null>(null);\r\n public pager$ = this._pager$.asObservable();\r\n\r\n init(engine: SliderEngine) {\r\n this.engine = engine;\r\n\r\n this.sub = this.engine.getStateObservable().subscribe(() => {\r\n this.updatePager();\r\n });\r\n\r\n // initial\r\n setTimeout(() => this.updatePager());\r\n }\r\n\r\n destroy() {\r\n this.sub?.unsubscribe();\r\n this._pager$.next(null);\r\n }\r\n\r\n /** Go to a slide by slide index (NOT dot index) */\r\n goToSlide(slideIndex: number) {\r\n this.engine.selectSlide(slideIndex);\r\n }\r\n\r\n private updatePager() {\r\n const state = this.engine.getState();\r\n const totalSlides = state.visibleSlides?.length ?? 0;\r\n if (totalSlides <= 0) {\r\n this._pager$.next(null);\r\n return;\r\n }\r\n\r\n // ✅ important: selectedSlide is -1 initially; fallback to currentSlide\r\n const current = state.selectedSlide !== -1 ? state.selectedSlide : state.currentSlide;\r\n\r\n const maxDots = Math.max(1, this.maxVisibleDots);\r\n\r\n // ✅ clamp to >= 0\r\n const safeCurrent = Math.max(0, Math.min(current, totalSlides - 1));\r\n\r\n const pageStart = Math.max(0, Math.floor(safeCurrent / maxDots) * maxDots);\r\n const pageEnd = Math.min(pageStart + maxDots, totalSlides);\r\n\r\n const visibleDots = Array.from({ length: pageEnd - pageStart }, (_, i) => pageStart + i);\r\n\r\n const activeDotIndex = visibleDots.indexOf(safeCurrent);\r\n\r\n this._pager$.next({ visibleDots, activeDotIndex });\r\n }\r\n}\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n OnInit,\r\n TemplateRef,\r\n Input,\r\n EventEmitter,\r\n Output,\r\n SimpleChanges,\r\n OnChanges,\r\n OnDestroy,\r\n ViewChild,\r\n ElementRef,\r\n AfterViewInit,\r\n ViewEncapsulation,\r\n} from \"@angular/core\";\r\nimport { SliderViewState } from \"../models/slider-state.model\";\r\nimport { Observable, Subject, takeUntil } from \"rxjs\";\r\nimport { SliderConfig } from \"../models/slider-config.model\";\r\nimport { SliderEngine } from \"../engine/slider-engine.service\";\r\nimport { SliderStore } from \"../store/slider-store.service\";\r\nimport { SliderAutoplayPlugin } from \"../plugins/autoplay/autoplay.plugin\";\r\nimport { SliderDraggablePlugin } from \"../plugins/draggable/draggable.plugin\";\r\nimport { SliderNavigationPlugin } from \"../plugins/navigation/navigation.plugin\";\r\nimport { SliderPaginationPlugin } from \"../plugins/pagination/pagination.plugin\";\r\nimport { Pager, SliderPlugin } from \"../plugins/slider-plugin\";\r\nimport { CommonModule } from \"@angular/common\";\r\n\r\n@Component({\r\n selector: \"app-simple-slider\",\r\n templateUrl: \"./simple-slider.component.html\",\r\n styleUrl: \"./simple-slider.component.scss\",\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n standalone: true,\r\n imports: [CommonModule],\r\n providers: [SliderEngine, SliderStore, SliderDraggablePlugin, SliderPaginationPlugin, SliderNavigationPlugin, SliderAutoplayPlugin],\r\n})\r\nexport class SimpleSliderComponent implements OnInit, AfterViewInit, OnChanges, OnDestroy {\r\n @Input() config!: SliderConfig;\r\n @Input() slideTemplate?: TemplateRef<any>;\r\n @Input() navigationTemplate?: TemplateRef<any>;\r\n @Input() paginationTemplate?: TemplateRef<any>;\r\n @Output() slideChange = new EventEmitter<number>();\r\n\r\n private isDraggingPointer = false;\r\n private dragStartX = 0;\r\n private dragStartY = 0;\r\n private lastIndex = -1;\r\n private lastSlidesRef: any[] | null = null;\r\n private destroy$ = new Subject<void>();\r\n\r\n state$!: Observable<SliderViewState>;\r\n @ViewChild(\"sliderHost\", { static: false }) sliderHost?: ElementRef<HTMLElement>;\r\n\r\n constructor(\r\n private engine: SliderEngine,\r\n private store: SliderStore,\r\n private draggable: SliderDraggablePlugin,\r\n private pagination: SliderPaginationPlugin,\r\n private navigation: SliderNavigationPlugin,\r\n private autoplay: SliderAutoplayPlugin,\r\n ) {}\r\n\r\n ngOnInit() {\r\n this.state$ = this.store.view$;\r\n\r\n this.state$.pipe(takeUntil(this.destroy$)).subscribe((state) => {\r\n if (state.currentSlide !== this.lastIndex) {\r\n this.lastIndex = state.currentSlide;\r\n this.slideChange.emit(state.currentSlide);\r\n }\r\n });\r\n this.lastSlidesRef = this.config?.slides ?? null;\r\n this.resolvePlugins(this.config);\r\n }\r\n ngAfterViewInit() {\r\n if (this.sliderHost?.nativeElement) {\r\n this.engine.attachContainer(this.sliderHost.nativeElement);\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (!changes[\"config\"] || !this.config) return;\r\n\r\n const newSlidesRef = this.config.slides ?? null;\r\n\r\n if (newSlidesRef !== this.lastSlidesRef) {\r\n this.lastSlidesRef = newSlidesRef;\r\n this.engine.destroy();\r\n this.resolvePlugins(this.config);\r\n }\r\n }\r\n ngOnDestroy() {\r\n this.destroySlider();\r\n }\r\n\r\n public goTo(index: number) {\r\n this.engine.selectSlide(index); // add this line\r\n //this.slideChange.emit(index);\r\n }\r\n\r\n destroySlider() {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n this.engine.destroy();\r\n } // destroys plugins and clears store\r\n\r\n onNext() {\r\n this.engine.next();\r\n }\r\n onPrevious() {\r\n this.engine.previous();\r\n }\r\n selectSlide(index: number) {\r\n this.engine.selectSlide(index);\r\n }\r\n onRecalculate() {\r\n this.engine.recalculate();\r\n }\r\n // Navigation\r\n /** Expose navigation observables safely */\r\n get canPrev$(): Observable<boolean> | null {\r\n if (!this.navigation) {\r\n console.warn(\"Navigation plugin is not enabled.\");\r\n return null;\r\n }\r\n return this.navigation.canPrev$;\r\n }\r\n\r\n get canNext$(): Observable<boolean> | null {\r\n if (!this.navigation) {\r\n console.warn(\"Navigation plugin is not enabled.\");\r\n return null;\r\n }\r\n return this.navigation.canNext$;\r\n }\r\n\r\n /** Expose next/prev methods */\r\n public next() {\r\n this.navigation?.next();\r\n }\r\n\r\n public prev() {\r\n this.navigation?.prev();\r\n }\r\n\r\n /** Expose pagination observable */\r\n get pager$(): Observable<Pager | null> | null {\r\n if (!this.pagination) {\r\n console.warn(\"Pagination plugin is not enabled for this slider.\");\r\n return null;\r\n }\r\n return this.pagination.pager$;\r\n }\r\n\r\n /** Expose a goToSlide method */\r\n public goToSlide(index: number) {\r\n this.pagination.goToSlide(index);\r\n }\r\n\r\n // Handle Pointers\r\n\r\n onPointerDown(event: PointerEvent) {\r\n // Only start drag if not clicking a nav button\r\n if ((event.target as HTMLElement).closest(\".nav-btn\")) {\r\n return; // ignore\r\n }\r\n this.dragStartX = event.clientX;\r\n this.dragStartY = event.clientY;\r\n this.isDraggingPointer = false;\r\n\r\n // Do not capture yet; wait until movement exceeds threshold\r\n this.engine.handleDragStart(event);\r\n }\r\n\r\n onPointerMove(event: PointerEvent) {\r\n const dx = Math.abs(event.clientX - this.dragStartX);\r\n const dy = Math.abs(event.clientY - this.dragStartY);\r\n\r\n if (!this.isDraggingPointer && (dx > 5 || dy > 5)) {\r\n this.isDraggingPointer = true;\r\n\r\n // Now start capturing pointer so dragging works outside the slider bounds\r\n (event.currentTarget as HTMLElement).setPointerCapture(event.pointerId);\r\n }\r\n\r\n if (this.isDraggingPointer) {\r\n this.engine.handleDragMove(event);\r\n }\r\n }\r\n\r\n onPointerUp(event: PointerEvent) {\r\n if (!event) return;\r\n\r\n if (!this.isDraggingPointer) {\r\n const target = event.target as HTMLElement;\r\n\r\n // Only select the slide if click is not on an interactive child\r\n const slideEl = target.closest(\".slide\");\r\n if (slideEl && !target.closest(\"button, video, a\")) {\r\n const indexAttr = slideEl.getAttribute(\"data-index\");\r\n const index = indexAttr ? parseInt(indexAttr, 10) : null;\r\n if (index !== null) this.engine.selectSlide(index);\r\n }\r\n }\r\n\r\n this.engine.handleDragEnd();\r\n this.isDraggingPointer = false;\r\n\r\n // Release pointer capture if it was captured\r\n try {\r\n (event.currentTarget as HTMLElement).releasePointerCapture(event.pointerId);\r\n } catch {}\r\n }\r\n\r\n private resolvePlugins(config: SliderConfig) {\r\n const runtimePlugins: SliderPlugin[] = [];\r\n\r\n const cfg = config.plugins ?? {}; // <-- safe fallback\r\n\r\n if (cfg.draggable) runtimePlugins.push(this.draggable);\r\n if (cfg.pagination) runtimePlugins.push(this.pagination);\r\n if (cfg.navigation) runtimePlugins.push(this.navigation);\r\n\r\n if (cfg.autoplay) {\r\n this.autoplay.setConfig(cfg.autoplay);\r\n runtimePlugins.push(this.autoplay);\r\n }\r\n\r\n this.engine.init({ ...config, plugins: undefined }, runtimePlugins);\r\n\r\n if (cfg.navigation) {\r\n setTimeout(() => this.navigation?.updateArrows?.());\r\n }\r\n }\r\n}\r\n","<ng-container *ngIf=\"state$ | async as state\">\r\n <div\r\n class=\"slider\"\r\n #sliderHost\r\n [class.slider-vertical]=\"state.vertical\"\r\n [class.slider-draggable]=\"state.isDragging\"\r\n [class.slider--main]=\"!config.isThumbs\"\r\n [class.slider--thumbs]=\"config.isThumbs\"\r\n *ngIf=\"state.visibleSlides?.length > 0 && state.isVisible\"\r\n (pointerdown)=\"onPointerDown($event)\"\r\n (pointermove)=\"onPointerMove($event)\"\r\n (pointerup)=\"onPointerUp($event)\"\r\n (pointercancel)=\"onPointerUp($event)\">\r\n <div\r\n class=\"slider__wrapper\"\r\n [ngStyle]=\"{\r\n transform: state.translate,\r\n transition: draggable.isDraggingPointer ? 'none' : 'transform 0.3s ease',\r\n display: 'flex',\r\n 'flex-direction': state.vertical ? 'column' : 'row',\r\n 'justify-content': state.visibleSlides?.length < state.slidesPerView ? 'center' : 'flex-start',\r\n gap: (state.slidesPerView > 1 ? state.gap || 0 : 0) + 'px',\r\n }\">\r\n <div\r\n *ngFor=\"let slide of state.visibleSlides; let i = index\"\r\n class=\"slide\"\r\n [attr.data-index]=\"i\"\r\n [class.slide--current]=\"state.selectedSlide === i\"\r\n [style.flex]=\"\r\n !config.isThumbs\r\n ? '0 0 calc(' +\r\n 100 / state.slidesPerView +\r\n '% - ' +\r\n ((state.gap || 0) * (state.slidesPerView - 1)) / state.slidesPerView +\r\n 'px)'\r\n : '0 0 ' + thumbSize + 'px'\r\n \"\r\n [style.width]=\"config.isThumbs ? thumbSize + 'px' : null\"\r\n [style.height]=\"config.isThumbs ? thumbSize + 'px' : null\"\r\n (click)=\"engine.selectSlide(i)\">\r\n <ng-container\r\n *ngTemplateOutlet=\"slideTemplate ? slideTemplate : defaultSlideTemplate; context: { slide: slide, index: i }\"></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-container>\r\n","import { NgModule } from \"@angular/core\";\r\nimport { SimpleSliderComponent } from \"./component/simple-slider.component\";\r\n\r\n@NgModule({\r\n imports: [SimpleSliderComponent],\r\n exports: [SimpleSliderComponent],\r\n})\r\nexport class NgxEdgeSliderModule {}\r\n","import { Pipe, PipeTransform } from \"@angular/core\";\r\nimport { DomSanitizer, SafeResourceUrl } from \"@angular/platform-browser\";\r\n\r\n@Pipe({ name: \"safeUrl\" })\r\nexport class SafeUrlPipe implements PipeTransform {\r\n constructor(private sanitizer: DomSanitizer) {}\r\n\r\n transform(url: string): SafeResourceUrl {\r\n return this.sanitizer.bypassSecurityTrustResourceUrl(url);\r\n }\r\n}\r\n","// components\r\nexport * from \"./lib/component/simple-slider.component\";\r\n\r\n// module\r\nexport * from \"./lib/ngx-edge-slider.module\";\r\n\r\n// engine\r\nexport * from \"./lib/engine/slider-engine.service\";\r\n\r\n// plugins\r\nexport * from \"./lib/plugins/draggable/draggable.plugin\";\r\nexport * from \"./lib/plugins/navigation/navigation.plugin\";\r\nexport * from \"./lib/plugins/pagination/pagination.plugin\";\r\nexport * from \"./lib/plugins/autoplay/autoplay.plugin\";\r\nexport * from \"./lib/plugins/slider-plugin\";\r\n\r\n// models\r\nexport * from \"./lib/models/slider-config.model\";\r\nexport * from \"./lib/models/slider-state.model\";\r\n\r\n// store\r\nexport * from \"./lib/store/slider-store.service\";\r\n\r\n// pipe\r\nexport * from \"./lib/safe-url.pipe\";\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.SliderStore","i1.SliderEngine","i2.SliderStore","i3.SliderDraggablePlugin","i4.SliderPaginationPlugin","i5.SliderNavigationPlugin","i6.SliderAutoplayPlugin"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,9 @@
1
1
  {
2
2
  "name": "ngx-edge-slider",
3
- "version": "2.2.1",
3
+ "version": "2.2.4",
4
+ "description": "A simple slider library for Angular",
5
+ "author": "Gyoksel Ahmedov",
6
+ "license": "MIT",
4
7
  "peerDependencies": {
5
8
  "@angular/common": ">=18.0.0",
6
9
  "@angular/core": ">=18.0.0",