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.
- package/assets/ngx-simple-slider.css +1 -0
- package/assets/ngx-simple-slider.css.map +1 -0
- package/assets/ngx-simple-slider.min.css +1 -0
- package/assets/ngx-simple-slider.min.css.map +1 -0
- package/esm2022/WingmanColt-ngx-edge-slider.mjs +5 -0
- package/fesm2022/WingmanColt-ngx-edge-slider.mjs +824 -0
- package/fesm2022/WingmanColt-ngx-edge-slider.mjs.map +1 -0
- package/package.json +4 -1
|
@@ -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.
|
|
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",
|