ngx-freshok-carousel 0.0.2 → 0.0.3
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.
|
@@ -282,11 +282,11 @@ class NgxCarouselControlsComponent {
|
|
|
282
282
|
carousel = inject(NgxCarouselService);
|
|
283
283
|
state = inject(NgxStateService);
|
|
284
284
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: NgxCarouselControlsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
285
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: NgxCarouselControlsComponent, isStandalone: true, selector: "lib-ngx-carousel-controls", ngImport: i0, template: "@if(state.isArrows()) {\r\n <div class=\"ngx-carousel__controls\">\r\n <button\r\n (click)=\"carousel.prev()\"\r\n >\r\n
|
|
285
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: NgxCarouselControlsComponent, isStandalone: true, selector: "lib-ngx-carousel-controls", ngImport: i0, template: "@if(state.isArrows()) {\r\n <div class=\"ngx-carousel__controls\">\r\n <button\r\n type=\"button\"\r\n class=\"ngx-carousel__btn\"\r\n (click)=\"carousel.prev()\"\r\n aria-label=\"Previous slide\"\r\n >\r\n <svg width=\"11\" height=\"20\" viewBox=\"0 0 11 20\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10.617 20.0762C10.8882 19.805 10.8882 19.3654 10.617 19.0942L1.80242 10.2796L10.617 1.46497C10.8882 1.19379 10.8882 0.754138 10.617 0.482966C10.3459 0.211794 9.90621 0.211794 9.63504 0.482966L0.565868 9.55214C0.164103 9.9539 0.164103 10.6053 0.565868 11.007L9.63504 20.0762C9.90621 20.3474 10.3459 20.3474 10.617 20.0762Z\"></path></svg>\r\n </button>\r\n \r\n <button\r\n type=\"button\"\r\n class=\"ngx-carousel__btn\"\r\n aria-label=\"Next slide\"\r\n (click)=\"carousel.next()\"\r\n >\r\n <svg width=\"11\" height=\"20\" viewBox=\"0 0 11 20\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M0.38296 20.0762C0.111788 19.805 0.111788 19.3654 0.38296 19.0942L9.19758 10.2796L0.38296 1.46497C0.111788 1.19379 0.111788 0.754138 0.38296 0.482966C0.654131 0.211794 1.09379 0.211794 1.36496 0.482966L10.4341 9.55214C10.8359 9.9539 10.8359 10.6053 10.4341 11.007L1.36496 20.0762C1.09379 20.3474 0.654131 20.3474 0.38296 20.0762Z\"></path></svg>\r\n </button>\r\n </div>\r\n}\r\n\r\n@if(state.isDots()) {\r\n <div class=\"ngx-carousel__controls bullets\">\r\n <div \r\n role=\"tablist\"\r\n aria-label=\"Carousel indicators\"\r\n class=\"ngx-carousel__dots\"\r\n >\r\n @for(dot of state.slides(); track $index; let i = $index) {\r\n <button\r\n type=\"button\"\r\n [attr.aria-selected]=\"carousel.getDisplayIndex() == i\"\r\n class=\"ngx-carousel__dot\"\r\n [class.active]=\"carousel.getDisplayIndex() == i\"\r\n (click)=\"carousel.goTo(i)\"\r\n ></button>\r\n }\r\n </div>\r\n </div>\r\n}\r\n\r\n\r\n", styles: [".ngx-carousel__controls{position:absolute;display:flex;align-items:center;justify-content:space-between;padding:var(--user-controls-padding, 0 20px);top:var(--user-controls-top, 50%);transform:translateY(-50%);left:0;right:0;pointer-events:none}.ngx-carousel__controls.bullets{top:unset;bottom:10px}.ngx-carousel__btn{pointer-events:auto;cursor:pointer;width:var(--user-controls-btn-width, auto);height:var(--user-controls-btn-heigth, auto);border:var(--user-controls-btn-border, 2px solid black);background-color:var(--user-controls-btn-bg, transparent);border-radius:var(--user-controls-btn-radius, 4px);transition:background-color .2s ease-in-out;padding:var(--user-controls-btn-padding, 10px)}.ngx-carousel__btn:hover{background-color:var(--user-controls-btn-hover-bg, lightgray)}.ngx-carousel__btn:hover svg{fill:var(--user-controls-btn-hover-fill, brown)}.ngx-carousel__btn svg{width:var(--user-controls-btn-svg-width, auto);height:var(--user-controls-btn-svg-height, auto);fill:var(--user-controls-btn-fill, red)}.ngx-carousel__dots{position:absolute;top:var(--user-controls-dots-top, unset);bottom:var(--user-controls-dots-bottom, 20px);left:50%;transform:translate(-50%);display:flex;align-items:center;justify-content:center;gap:var(--user-controls-dots-gap, 20px)}.ngx-carousel__dot{pointer-events:auto;cursor:pointer;width:var(--user-controls-dot-width, 20px);height:var(--user-controls-dot-height, 20px);border:var(--user-controls-dot-border, 2px solid blue);background-color:var(--user-controls-dot-bg, yellow);border-radius:var(--user-controls-dot-radius, 50%)}.ngx-carousel__dot:hover{background-color:var(--user-controls-dot-hover-bg, green)}.ngx-carousel__dot.active{background-color:var(--user-controls-dot-active-bg, orange)}.ngx-carousel__dot.active:hover{background-color:var(--user-controls-dot-active-bg-hover, blue)}\n"] });
|
|
286
286
|
}
|
|
287
287
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: NgxCarouselControlsComponent, decorators: [{
|
|
288
288
|
type: Component,
|
|
289
|
-
args: [{ selector: 'lib-ngx-carousel-controls', imports: [], template: "@if(state.isArrows()) {\r\n <div class=\"ngx-carousel__controls\">\r\n <button\r\n (click)=\"carousel.prev()\"\r\n >\r\n
|
|
289
|
+
args: [{ selector: 'lib-ngx-carousel-controls', imports: [], template: "@if(state.isArrows()) {\r\n <div class=\"ngx-carousel__controls\">\r\n <button\r\n type=\"button\"\r\n class=\"ngx-carousel__btn\"\r\n (click)=\"carousel.prev()\"\r\n aria-label=\"Previous slide\"\r\n >\r\n <svg width=\"11\" height=\"20\" viewBox=\"0 0 11 20\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10.617 20.0762C10.8882 19.805 10.8882 19.3654 10.617 19.0942L1.80242 10.2796L10.617 1.46497C10.8882 1.19379 10.8882 0.754138 10.617 0.482966C10.3459 0.211794 9.90621 0.211794 9.63504 0.482966L0.565868 9.55214C0.164103 9.9539 0.164103 10.6053 0.565868 11.007L9.63504 20.0762C9.90621 20.3474 10.3459 20.3474 10.617 20.0762Z\"></path></svg>\r\n </button>\r\n \r\n <button\r\n type=\"button\"\r\n class=\"ngx-carousel__btn\"\r\n aria-label=\"Next slide\"\r\n (click)=\"carousel.next()\"\r\n >\r\n <svg width=\"11\" height=\"20\" viewBox=\"0 0 11 20\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M0.38296 20.0762C0.111788 19.805 0.111788 19.3654 0.38296 19.0942L9.19758 10.2796L0.38296 1.46497C0.111788 1.19379 0.111788 0.754138 0.38296 0.482966C0.654131 0.211794 1.09379 0.211794 1.36496 0.482966L10.4341 9.55214C10.8359 9.9539 10.8359 10.6053 10.4341 11.007L1.36496 20.0762C1.09379 20.3474 0.654131 20.3474 0.38296 20.0762Z\"></path></svg>\r\n </button>\r\n </div>\r\n}\r\n\r\n@if(state.isDots()) {\r\n <div class=\"ngx-carousel__controls bullets\">\r\n <div \r\n role=\"tablist\"\r\n aria-label=\"Carousel indicators\"\r\n class=\"ngx-carousel__dots\"\r\n >\r\n @for(dot of state.slides(); track $index; let i = $index) {\r\n <button\r\n type=\"button\"\r\n [attr.aria-selected]=\"carousel.getDisplayIndex() == i\"\r\n class=\"ngx-carousel__dot\"\r\n [class.active]=\"carousel.getDisplayIndex() == i\"\r\n (click)=\"carousel.goTo(i)\"\r\n ></button>\r\n }\r\n </div>\r\n </div>\r\n}\r\n\r\n\r\n", styles: [".ngx-carousel__controls{position:absolute;display:flex;align-items:center;justify-content:space-between;padding:var(--user-controls-padding, 0 20px);top:var(--user-controls-top, 50%);transform:translateY(-50%);left:0;right:0;pointer-events:none}.ngx-carousel__controls.bullets{top:unset;bottom:10px}.ngx-carousel__btn{pointer-events:auto;cursor:pointer;width:var(--user-controls-btn-width, auto);height:var(--user-controls-btn-heigth, auto);border:var(--user-controls-btn-border, 2px solid black);background-color:var(--user-controls-btn-bg, transparent);border-radius:var(--user-controls-btn-radius, 4px);transition:background-color .2s ease-in-out;padding:var(--user-controls-btn-padding, 10px)}.ngx-carousel__btn:hover{background-color:var(--user-controls-btn-hover-bg, lightgray)}.ngx-carousel__btn:hover svg{fill:var(--user-controls-btn-hover-fill, brown)}.ngx-carousel__btn svg{width:var(--user-controls-btn-svg-width, auto);height:var(--user-controls-btn-svg-height, auto);fill:var(--user-controls-btn-fill, red)}.ngx-carousel__dots{position:absolute;top:var(--user-controls-dots-top, unset);bottom:var(--user-controls-dots-bottom, 20px);left:50%;transform:translate(-50%);display:flex;align-items:center;justify-content:center;gap:var(--user-controls-dots-gap, 20px)}.ngx-carousel__dot{pointer-events:auto;cursor:pointer;width:var(--user-controls-dot-width, 20px);height:var(--user-controls-dot-height, 20px);border:var(--user-controls-dot-border, 2px solid blue);background-color:var(--user-controls-dot-bg, yellow);border-radius:var(--user-controls-dot-radius, 50%)}.ngx-carousel__dot:hover{background-color:var(--user-controls-dot-hover-bg, green)}.ngx-carousel__dot.active{background-color:var(--user-controls-dot-active-bg, orange)}.ngx-carousel__dot.active:hover{background-color:var(--user-controls-dot-active-bg-hover, blue)}\n"] }]
|
|
290
290
|
}] });
|
|
291
291
|
|
|
292
292
|
class NgxAutoplayService {
|
|
@@ -507,7 +507,7 @@ class NgxCarouselComponent {
|
|
|
507
507
|
NgxSwipeService,
|
|
508
508
|
NgxStateService,
|
|
509
509
|
NgxLayoutService,
|
|
510
|
-
], queries: [{ propertyName: "slideTemplate", first: true, predicate: ["slideTemplate"], descendants: true, static: true }, { propertyName: "controlsTemplate", first: true, predicate: ["controlsTemplate"], descendants: true, static: true }], viewQueries: [{ propertyName: "carouselList", first: true, predicate: ["carouselList"], descendants: true, static: true }], ngImport: i0, template: "<div\r\n class=\"ngx-carousel\"\r\n (keydown.arrowRight)=\"carousel.next()\"\r\n (keydown.arrowLeft)=\"carousel.prev()\"\r\n (mouseleave)=\"autoplay.resume()\"\r\n (mouseover)=\"autoplay.pause()\"\r\n (focusin)=\"autoplay.pause()\"\r\n (focusout)=\"autoplay.resume()\"\r\n>\r\n <ul\r\n #carouselList\r\n class=\"ngx-carousel__list\"\r\n [class.no-transition]=\"carousel.disableTransition()\"\r\n [style.transform]=\"layout.translatePx()\"\r\n [style.transition]=\"`transform ${state.speed()}ms ease`\"\r\n (pointerdown)=\"swipe.onPointerDown($event)\"\r\n (pointermove)=\"swipe.onPointerMove($event)\"\r\n (pointerup)=\"swipe.onPointerUp($event)\"\r\n (pointercancel)=\"swipe.onPointerUp($event)\"\r\n (pointerleave)=\"swipe.onPointerUp($event)\"\r\n >\r\n @for(slideData of state.slidesWithClones(); track $index; let i = $index) {\r\n <li\r\n class=\"ngx-carousel__slide\"\r\n [class.active]=\"i === state.currentSlide()\"\r\n [style.width]=\"layout.slideWidthPx() + 'px'\"\r\n [style.marginRight.px]=\"state.space()\"\r\n >\r\n <ng-container \r\n [ngTemplateOutlet]=\"slideTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: slideData, index: i }\"\r\n ></ng-container>\r\n </li>\r\n } \r\n </ul>\r\n\r\n @if(controlsTemplate) {\r\n <ng-container \r\n [ngTemplateOutlet]=\"controlsTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: carousel}\"\r\n />\r\n } @else {\r\n <lib-ngx-carousel-controls />\r\n }\r\n</div>\r\n", styles: [".ngx-carousel{outline:none;overflow:hidden;position:relative;width:100%;height:auto}.ngx-carousel__list{display:flex;position:relative;width:100%;height:var(--carousel-list-height, 100%);margin:0;padding:0;list-style:none;-webkit-user-select:none;user-select:none;touch-action:pan-y;cursor:grab}.ngx-carousel__list.no-transition{transition:none!important}.ngx-carousel__slide{width:100%;height:100%;display:flex;flex-shrink:0;position:relative}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: NgxCarouselControlsComponent, selector: "lib-ngx-carousel-controls" }] });
|
|
510
|
+
], queries: [{ propertyName: "slideTemplate", first: true, predicate: ["slideTemplate"], descendants: true, static: true }, { propertyName: "controlsTemplate", first: true, predicate: ["controlsTemplate"], descendants: true, static: true }], viewQueries: [{ propertyName: "carouselList", first: true, predicate: ["carouselList"], descendants: true, static: true }], ngImport: i0, template: "<div\r\n class=\"ngx-carousel\"\r\n tabindex=\"0\"\r\n aria-roledescription=\"carousel\"\r\n aria-live=\"polite\"\r\n (keydown.arrowRight)=\"carousel.next()\"\r\n (keydown.arrowLeft)=\"carousel.prev()\"\r\n (mouseleave)=\"autoplay.resume()\"\r\n (mouseover)=\"autoplay.pause()\"\r\n (focusin)=\"autoplay.pause()\"\r\n (focusout)=\"autoplay.resume()\"\r\n>\r\n <ul\r\n #carouselList\r\n role=\"listbox\"\r\n class=\"ngx-carousel__list\"\r\n [class.no-transition]=\"carousel.disableTransition()\"\r\n [style.transform]=\"layout.translatePx()\"\r\n [style.transition]=\"`transform ${state.speed()}ms ease`\"\r\n (pointerdown)=\"swipe.onPointerDown($event)\"\r\n (pointermove)=\"swipe.onPointerMove($event)\"\r\n (pointerup)=\"swipe.onPointerUp($event)\"\r\n (pointercancel)=\"swipe.onPointerUp($event)\"\r\n (pointerleave)=\"swipe.onPointerUp($event)\"\r\n >\r\n @for(slideData of state.slidesWithClones(); track $index; let i = $index) {\r\n <li\r\n role=\"option\"\r\n class=\"ngx-carousel__slide\"\r\n [class.active]=\"i === state.currentSlide()\"\r\n [style.width]=\"layout.slideWidthPx() + 'px'\"\r\n [style.marginRight.px]=\"state.space()\"\r\n >\r\n <ng-container \r\n [ngTemplateOutlet]=\"slideTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: slideData, index: i }\"\r\n ></ng-container>\r\n </li>\r\n } \r\n </ul>\r\n\r\n @if(controlsTemplate) {\r\n <ng-container \r\n [ngTemplateOutlet]=\"controlsTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: carousel}\"\r\n />\r\n } @else {\r\n <lib-ngx-carousel-controls />\r\n }\r\n</div>\r\n", styles: [".ngx-carousel{outline:none;overflow:hidden;position:relative;width:100%;height:auto}.ngx-carousel__list{display:flex;position:relative;width:100%;height:var(--carousel-list-height, 100%);margin:0;padding:0;list-style:none;-webkit-user-select:none;user-select:none;touch-action:pan-y;cursor:grab}.ngx-carousel__list.no-transition{transition:none!important}.ngx-carousel__slide{width:100%;height:100%;display:flex;flex-shrink:0;position:relative}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: NgxCarouselControlsComponent, selector: "lib-ngx-carousel-controls" }] });
|
|
511
511
|
}
|
|
512
512
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: NgxCarouselComponent, decorators: [{
|
|
513
513
|
type: Component,
|
|
@@ -517,7 +517,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImpo
|
|
|
517
517
|
NgxSwipeService,
|
|
518
518
|
NgxStateService,
|
|
519
519
|
NgxLayoutService,
|
|
520
|
-
], template: "<div\r\n class=\"ngx-carousel\"\r\n (keydown.arrowRight)=\"carousel.next()\"\r\n (keydown.arrowLeft)=\"carousel.prev()\"\r\n (mouseleave)=\"autoplay.resume()\"\r\n (mouseover)=\"autoplay.pause()\"\r\n (focusin)=\"autoplay.pause()\"\r\n (focusout)=\"autoplay.resume()\"\r\n>\r\n <ul\r\n #carouselList\r\n class=\"ngx-carousel__list\"\r\n [class.no-transition]=\"carousel.disableTransition()\"\r\n [style.transform]=\"layout.translatePx()\"\r\n [style.transition]=\"`transform ${state.speed()}ms ease`\"\r\n (pointerdown)=\"swipe.onPointerDown($event)\"\r\n (pointermove)=\"swipe.onPointerMove($event)\"\r\n (pointerup)=\"swipe.onPointerUp($event)\"\r\n (pointercancel)=\"swipe.onPointerUp($event)\"\r\n (pointerleave)=\"swipe.onPointerUp($event)\"\r\n >\r\n @for(slideData of state.slidesWithClones(); track $index; let i = $index) {\r\n <li\r\n class=\"ngx-carousel__slide\"\r\n [class.active]=\"i === state.currentSlide()\"\r\n [style.width]=\"layout.slideWidthPx() + 'px'\"\r\n [style.marginRight.px]=\"state.space()\"\r\n >\r\n <ng-container \r\n [ngTemplateOutlet]=\"slideTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: slideData, index: i }\"\r\n ></ng-container>\r\n </li>\r\n } \r\n </ul>\r\n\r\n @if(controlsTemplate) {\r\n <ng-container \r\n [ngTemplateOutlet]=\"controlsTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: carousel}\"\r\n />\r\n } @else {\r\n <lib-ngx-carousel-controls />\r\n }\r\n</div>\r\n", styles: [".ngx-carousel{outline:none;overflow:hidden;position:relative;width:100%;height:auto}.ngx-carousel__list{display:flex;position:relative;width:100%;height:var(--carousel-list-height, 100%);margin:0;padding:0;list-style:none;-webkit-user-select:none;user-select:none;touch-action:pan-y;cursor:grab}.ngx-carousel__list.no-transition{transition:none!important}.ngx-carousel__slide{width:100%;height:100%;display:flex;flex-shrink:0;position:relative}\n"] }]
|
|
520
|
+
], template: "<div\r\n class=\"ngx-carousel\"\r\n tabindex=\"0\"\r\n aria-roledescription=\"carousel\"\r\n aria-live=\"polite\"\r\n (keydown.arrowRight)=\"carousel.next()\"\r\n (keydown.arrowLeft)=\"carousel.prev()\"\r\n (mouseleave)=\"autoplay.resume()\"\r\n (mouseover)=\"autoplay.pause()\"\r\n (focusin)=\"autoplay.pause()\"\r\n (focusout)=\"autoplay.resume()\"\r\n>\r\n <ul\r\n #carouselList\r\n role=\"listbox\"\r\n class=\"ngx-carousel__list\"\r\n [class.no-transition]=\"carousel.disableTransition()\"\r\n [style.transform]=\"layout.translatePx()\"\r\n [style.transition]=\"`transform ${state.speed()}ms ease`\"\r\n (pointerdown)=\"swipe.onPointerDown($event)\"\r\n (pointermove)=\"swipe.onPointerMove($event)\"\r\n (pointerup)=\"swipe.onPointerUp($event)\"\r\n (pointercancel)=\"swipe.onPointerUp($event)\"\r\n (pointerleave)=\"swipe.onPointerUp($event)\"\r\n >\r\n @for(slideData of state.slidesWithClones(); track $index; let i = $index) {\r\n <li\r\n role=\"option\"\r\n class=\"ngx-carousel__slide\"\r\n [class.active]=\"i === state.currentSlide()\"\r\n [style.width]=\"layout.slideWidthPx() + 'px'\"\r\n [style.marginRight.px]=\"state.space()\"\r\n >\r\n <ng-container \r\n [ngTemplateOutlet]=\"slideTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: slideData, index: i }\"\r\n ></ng-container>\r\n </li>\r\n } \r\n </ul>\r\n\r\n @if(controlsTemplate) {\r\n <ng-container \r\n [ngTemplateOutlet]=\"controlsTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: carousel}\"\r\n />\r\n } @else {\r\n <lib-ngx-carousel-controls />\r\n }\r\n</div>\r\n", styles: [".ngx-carousel{outline:none;overflow:hidden;position:relative;width:100%;height:auto}.ngx-carousel__list{display:flex;position:relative;width:100%;height:var(--carousel-list-height, 100%);margin:0;padding:0;list-style:none;-webkit-user-select:none;user-select:none;touch-action:pan-y;cursor:grab}.ngx-carousel__list.no-transition{transition:none!important}.ngx-carousel__slide{width:100%;height:100%;display:flex;flex-shrink:0;position:relative}\n"] }]
|
|
521
521
|
}], propDecorators: { slides: [{
|
|
522
522
|
type: Input,
|
|
523
523
|
args: [{ required: true }]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngx-freshok-carousel.mjs","sources":["../../../projects/carousel/src/lib/ngx-carousel.types.ts","../../../projects/carousel/src/lib/services/ngx-state.service.ts","../../../projects/carousel/src/lib/services/ngx-carousel.service.ts","../../../projects/carousel/src/lib/components/ngx-carousel-controls/ngx-carousel-controls.component.ts","../../../projects/carousel/src/lib/components/ngx-carousel-controls/ngx-carousel-controls.component.html","../../../projects/carousel/src/lib/services/ngx-autoplay..service.ts","../../../projects/carousel/src/lib/services/ngx-layout.service.ts","../../../projects/carousel/src/lib/services/ngx-swipe.service.ts","../../../projects/carousel/src/lib/ngx-carousel.component.ts","../../../projects/carousel/src/lib/ngx-carousel.component.html","../../../projects/carousel/src/public-api.ts","../../../projects/carousel/src/ngx-freshok-carousel.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\nexport interface NgxCarouselBreakpoint extends NgxCarouselConfig {\r\n breakpoint: number; // Ширина экрана, при которой применяется конфигурация (max-width)\r\n}\r\n\r\nexport interface NgxCarouselConfig {\r\n autoplay?: boolean,\r\n interval?: number,\r\n loop?: boolean,\r\n pauseOnHover?: boolean;\r\n animation?: 'slide' | 'fade',\r\n startIndex?: number,\r\n slidesToShow?: number\r\n showArrows?: boolean;\r\n showDots?: boolean;\r\n spaceBetween?: number;\r\n speed?: number;\r\n breakpoints?: NgxCarouselBreakpoint[],\r\n}\r\n\r\nexport const DEFAULT_CAROUSEL_CONFIG: NgxCarouselConfig = {\r\n autoplay: true, // автопроигрывание слайдов\r\n interval: 5000, // время переключения слайдов\r\n loop: true, // бесконечная прокрутка\r\n pauseOnHover: true, // останавливать автопрокрутку при наведении\r\n animation: 'slide', // тип анимации\r\n startIndex: 0, // начальный номер слайда\r\n slidesToShow: 1, // по умолчанию показываем 1 слайд\r\n showArrows: true,\r\n showDots: true,\r\n spaceBetween: 0,\r\n speed: 500,\r\n breakpoints: [], // по умолчанию нет брейкпоинтов\r\n}\r\n\r\nexport const NGX_CAROUSEL_CONFIG = new InjectionToken<NgxCarouselConfig>(\r\n 'NGX_CAROUSEL_CONFIG'\r\n);\r\n","import { computed, effect, inject, Injectable, signal } from '@angular/core';\r\nimport { DEFAULT_CAROUSEL_CONFIG, NGX_CAROUSEL_CONFIG, NgxCarouselConfig } from '../ngx-carousel.types';\r\n\r\n@Injectable()\r\nexport class NgxStateService {\r\n private config = signal<NgxCarouselConfig>({});\r\n width = signal(0)\r\n slides = signal<any[]>([]);\r\n currentSlide = signal(0);\r\n\r\n private appCfg = inject(NGX_CAROUSEL_CONFIG, { optional: true });\r\n\r\n /* ========= ACTIVECONFIG ========= */\r\n activeConfig = computed(() => {\r\n return {\r\n ...DEFAULT_CAROUSEL_CONFIG,\r\n ...this.appCfg ?? {},\r\n ...this.config(),\r\n ...this.activeBreakpoint() ?? {}\r\n }\r\n })\r\n\r\n slidesToShow = computed(() => this.activeConfig().slidesToShow ?? 1);\r\n autoplay = computed(() => this.activeConfig().autoplay ?? true);\r\n interval = computed(() => this.activeConfig().interval ?? 5000);\r\n pauseOnHover = computed(() => this.activeConfig().pauseOnHover ?? true);\r\n space = computed(() => this.activeConfig().spaceBetween ?? 0);\r\n isFade = computed(() => this.activeConfig().animation === 'fade');\r\n loop = computed(() => this.activeConfig().loop)\r\n isArrows = computed(() => this.activeConfig().showArrows)\r\n isDots = computed(() => this.activeConfig().showDots)\r\n speed = computed(() => this.activeConfig().speed ?? 500)\r\n\r\n /* ========= BREAKPOINTS ========= */\r\n activeBreakpoint = computed<Partial<NgxCarouselConfig> | null>(() => {\r\n const breakpoints = this.config().breakpoints ?? []\r\n const w = this.width();\r\n\r\n return [...breakpoints]\r\n .sort((a, b) => b.breakpoint - a.breakpoint)\r\n .find(bp => w >= bp.breakpoint) ?? null\r\n })\r\n\r\n /* ========= CLONES ========= */\r\n slidesWithClones = computed(() => {\r\n if (this.isFade()) {\r\n return this.slides();\r\n }\r\n\r\n const slides = this.slides();\r\n const count = this.slidesToShow();\r\n\r\n if (!this.loop() || slides.length < count) {\r\n return slides;\r\n }\r\n\r\n return [\r\n ...slides.slice(-count),\r\n ...slides,\r\n ...slides.slice(0, count),\r\n ];\r\n });\r\n\r\n constructor() {\r\n effect(() => {\r\n const slides = this.slides()\r\n const cfg = this.activeConfig()\r\n\r\n if (!slides.length) return\r\n\r\n const index = this.loop() ?\r\n (cfg.startIndex ?? 0) + this.slidesToShow() :\r\n cfg.startIndex ?? 0\r\n\r\n this.setCurrentSlide(index)\r\n })\r\n\r\n // setInterval(() => {\r\n // console.log(\"ACTIVE\", this.activeConfig())\r\n\r\n // }, 1000)\r\n setTimeout(() => {\r\n console.log(\"ACTIVE\", this.activeConfig())\r\n\r\n }, 2000)\r\n }\r\n\r\n /* ========= INIT ========= */\r\n init(customConfig: NgxCarouselConfig = {}) {\r\n this.config.set({\r\n ...DEFAULT_CAROUSEL_CONFIG,\r\n ...this.appCfg ?? {},\r\n ...customConfig\r\n });\r\n // console.log(\"🔸 this.config:\", this.config())\r\n }\r\n\r\n setWidth(width: number) {\r\n this.width.set(width)\r\n // console.log(\"ACTIVE\", this.activeConfig())\r\n }\r\n\r\n setSlides(slides: any[]) {\r\n this.slides.set(slides);\r\n }\r\n\r\n setCurrentSlide(index: number) {\r\n this.currentSlide.set(index);\r\n }\r\n}\r\n","import { inject, Injectable, signal } from '@angular/core';\r\nimport { NgxStateService } from './ngx-state.service';\r\n\r\n@Injectable()\r\nexport class NgxCarouselService {\r\n private state = inject(NgxStateService)\r\n\r\n private jumpTimer: any = null;\r\n\r\n disableTransition = signal(false);\r\n isAnimating = signal(false);\r\n\r\n\r\n next() {\r\n if (!this.startAnimation()) return\r\n\r\n const length = this.state.slidesWithClones().length\r\n if (length <= 1) return;\r\n\r\n if (this.state.isFade()) {\r\n const nextNum = (this.state.currentSlide() + 1) % length\r\n this.state.setCurrentSlide(nextNum)\r\n return\r\n }\r\n\r\n this.disableTransition.set(false);\r\n const current = this.state.currentSlide();\r\n const slidesToShow = this.state.slidesToShow()\r\n\r\n if (this.state.loop()) {\r\n // Переходим к следующему слайду (даже если это клон)\r\n this.state.setCurrentSlide(current + 1);\r\n\r\n // Если достигли клона\r\n if (current + slidesToShow >= length - 1) {\r\n // Сбрасываем на первый оригинальный слайд\r\n const index = this.getRealIndex(current + 1)\r\n this.scheduleJumpToReal(index);\r\n }\r\n } else if (current + 1 < length) {\r\n // В режиме без loop просто проверяем границы\r\n this.state.setCurrentSlide(current + 1);\r\n }\r\n }\r\n\r\n prev() {\r\n if (!this.startAnimation()) return;\r\n\r\n const length = this.state.slidesWithClones().length;\r\n if (length <= 1) return;\r\n\r\n if (this.state.isFade()) {\r\n const prev = (this.state.currentSlide() - 1 + length) % length;\r\n this.state.setCurrentSlide(prev);\r\n return;\r\n }\r\n\r\n this.disableTransition.set(false);\r\n const current = this.state.currentSlide();\r\n const slidesToShow = this.state.slidesToShow();\r\n\r\n if (this.state.activeConfig().loop) {\r\n // Переходим к предыдущему слайду (даже если это клон)\r\n this.state.setCurrentSlide(current - 1);\r\n\r\n if (current - slidesToShow <= 0) {\r\n const index = this.getRealIndex(current - 1);\r\n this.scheduleJumpToReal(index);\r\n }\r\n } else if (current > 0) {\r\n this.state.setCurrentSlide(current - 1);\r\n }\r\n }\r\n\r\n private scheduleJumpToReal(realIndex: number) {\r\n //Если таймер уже запущен, то остановить и обнулить\r\n if (this.jumpTimer) {\r\n clearTimeout(this.jumpTimer)\r\n this.jumpTimer = null\r\n }\r\n\r\n const slidesToShow = this.state.slidesToShow()\r\n const realTarget = realIndex + slidesToShow\r\n\r\n // Заново запысываем новый таймер\r\n this.jumpTimer = setTimeout(() => {\r\n this.disableTransition.set(true)\r\n this.state.setCurrentSlide(realTarget)\r\n\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(() => {\r\n this.disableTransition.set(false)\r\n if (this.jumpTimer) {\r\n clearTimeout(this.jumpTimer)\r\n this.jumpTimer = null\r\n }\r\n })\r\n })\r\n }, this.state.speed());\r\n }\r\n\r\n goTo(index: number) {\r\n const length = this.state.slides().length\r\n if (length <= 0) return;\r\n\r\n const slidestToShow = this.state.slidesToShow();\r\n\r\n if (this.state.loop()) {\r\n // В режиме loop просто устанавливаем целевой индекс\r\n this.state.setCurrentSlide(index + slidestToShow);\r\n } else {\r\n this.state.setCurrentSlide(index);\r\n }\r\n }\r\n\r\n getDisplayIndex(): number {\r\n const length = this.state.slidesWithClones().length;\r\n if (length <= 0) return 0;\r\n\r\n const current = this.state.currentSlide();\r\n const slidesToShow = this.state.slidesToShow();\r\n\r\n // Если loop отключен, то просто вернем индекс текущего слайда\r\n if (!this.state.loop()) return current;\r\n\r\n // Если на клоне последнего (индекс 0), показываем последний реальный\r\n if (current === 0) return length - 1;\r\n\r\n // Если на клоне первого (индекс len + 1), показываем первый реальный\r\n if (current === length - slidesToShow) return 0;\r\n\r\n // Иначе вычитаем slidesToShow, так как реальные слайды начинаются с индекса slidesToShow\r\n return current - slidesToShow;\r\n }\r\n\r\n startAnimation(): boolean {\r\n if (this.isAnimating()) return false;\r\n this.isAnimating.set(true);\r\n\r\n const duration = this.state.speed();\r\n\r\n setTimeout(() => {\r\n this.isAnimating.set(false);\r\n }, duration);\r\n\r\n return true;\r\n }\r\n\r\n private getRealIndex(virtualIndex: number): number {\r\n const length = this.state.slides().length\r\n const slidesToShow = this.state.slidesToShow()\r\n\r\n if (!this.state.loop()) return virtualIndex\r\n\r\n let real = virtualIndex - slidesToShow\r\n\r\n if (real < 0) real += length\r\n if (real >= length) real -= length\r\n\r\n return real\r\n }\r\n\r\n shiftBy(slidesDragged: number) {\r\n if (slidesDragged === 0) return;\r\n if (!this.startAnimation()) return;\r\n\r\n const current = this.state.currentSlide();\r\n const slidesToShow = this.state.slidesToShow();\r\n const total = this.state.slidesWithClones().length;\r\n\r\n let target = current + slidesDragged;\r\n\r\n this.disableTransition.set(false);\r\n\r\n if (!this.state.loop()) {\r\n const max = total - slidesToShow;\r\n target = Math.max(0, Math.min(target, max));\r\n this.state.setCurrentSlide(target);\r\n return;\r\n }\r\n\r\n this.state.setCurrentSlide(target);\r\n\r\n // вычисляем РЕАЛЬНЫЙ индекс\r\n const realIndex = this.getRealIndex(target);\r\n\r\n // если ушли в клоны — снапаемся туда же, но в реальной зоне\r\n if (target < slidesToShow || target >= total - slidesToShow) {\r\n this.scheduleJumpToReal(realIndex);\r\n }\r\n }\r\n}\r\n","import { Component, inject, } from '@angular/core';\r\nimport { NgxCarouselService } from '../../services/ngx-carousel.service';\r\nimport { NgxStateService } from '../../services/ngx-state.service';\r\n\r\n@Component({\r\n selector: 'lib-ngx-carousel-controls',\r\n imports: [],\r\n templateUrl: './ngx-carousel-controls.component.html',\r\n styleUrl: './ngx-carousel-controls.component.scss',\r\n})\r\nexport class NgxCarouselControlsComponent {\r\n carousel = inject(NgxCarouselService);\r\n state = inject(NgxStateService)\r\n}\r\n","@if(state.isArrows()) {\r\n <div class=\"ngx-carousel__controls\">\r\n <button\r\n (click)=\"carousel.prev()\"\r\n >\r\n Prev\r\n </button>\r\n \r\n <button\r\n (click)=\"carousel.next()\"\r\n >\r\n Next\r\n </button>\r\n </div>\r\n}\r\n\r\n@if(state.isDots()) {\r\n <div class=\"ngx-carousel__controls bullets\">\r\n <div \r\n class=\"ngx-carousel__dots\"\r\n >\r\n @for(dot of state.slides(); track $index; let i = $index) {\r\n <button\r\n class=\"ngx-carousel__dot\"\r\n [class.active]=\"carousel.getDisplayIndex() == i\"\r\n (click)=\"carousel.goTo(i)\"\r\n ></button>\r\n }\r\n </div>\r\n </div>\r\n}\r\n\r\n\r\n","import { effect, inject, Injectable, signal } from '@angular/core';\r\nimport { NgxCarouselService } from './ngx-carousel.service';\r\nimport { NgxStateService } from './ngx-state.service';\r\n\r\n@Injectable()\r\nexport class NgxAutoplayService {\r\n private carousel = inject(NgxCarouselService)\r\n state = inject(NgxStateService)\r\n private isPlaying = signal(true)\r\n private timerAutoplay: any = null\r\n\r\n constructor() {\r\n effect(() => {\r\n if(!this.state.autoplay() || this.state.slides().length <= 1) {\r\n this.stop()\r\n return\r\n }\r\n\r\n this.state.autoplay() ?\r\n this.resume() :\r\n this.stop()\r\n })\r\n }\r\n\r\n private start() {\r\n\r\n if (!this.state.autoplay() || !this.isPlaying()) return\r\n \r\n this.stop()\r\n const delay = this.state.interval() ?? 5000\r\n this.timerAutoplay = setInterval(() => this.carousel.next(), delay )\r\n }\r\n\r\n stop() {\r\n this.isPlaying.set(false)\r\n if (this.timerAutoplay) {\r\n clearInterval(this.timerAutoplay)\r\n this.timerAutoplay = null\r\n }\r\n }\r\n\r\n pause() {\r\n if(this.state.pauseOnHover()) {\r\n this.stop();\r\n }\r\n }\r\n\r\n resume() {\r\n if(this.state.autoplay()) {\r\n this.isPlaying.set(true);\r\n\r\n setTimeout(() => this.start(), 0);\r\n }\r\n }\r\n}\r\n","import { computed, inject, Injectable, signal } from '@angular/core';\r\nimport { NgxStateService } from './ngx-state.service';\r\n\r\n@Injectable()\r\nexport class NgxLayoutService {\r\n\r\n private state = inject(NgxStateService);\r\n\r\n /* ========= GEOMETRY ========= */\r\n slideWidthPx = computed(() => \r\n this.state.width() / this.state.slidesToShow() - this.state.space() / 2\r\n );\r\n\r\n slideStepPx = computed(() => this.slideWidthPx() + this.state.space());\r\n\r\n translatePx = computed(() => {\r\n if (this.state.isFade()) return 'none';\r\n return `translate(-${this.state.currentSlide() * this.slideStepPx()}px)`;\r\n });\r\n}\r\n","import { ElementRef, inject, Injectable, Renderer2, signal } from '@angular/core';\r\nimport { NgxCarouselService } from './ngx-carousel.service';\r\nimport { NgxAutoplayService } from './ngx-autoplay..service';\r\nimport { NgxStateService } from './ngx-state.service';\r\nimport { NgxLayoutService } from './ngx-layout.service';\r\n\r\n@Injectable()\r\nexport class NgxSwipeService {\r\n // Порог в пикселях для различения клика и свайпа\r\n private readonly CLICK_LIMIT = 5; // px\r\n private readonly SWIPE_LIMIT = 0.05; // %\r\n\r\n private carousel = inject(NgxCarouselService);\r\n private autoplay = inject(NgxAutoplayService);\r\n private state = inject(NgxStateService)\r\n private layout = inject(NgxLayoutService)\r\n\r\n private renderer!: Renderer2;\r\n private carouselList!: ElementRef<HTMLDivElement>;\r\n private startX = 0;\r\n private currentX = 0;\r\n\r\n private isSwiping = signal(false);\r\n // private config = computed(() => this.carousel.getConfig())\r\n\r\n // Определяем, был ли свайп достаточным, чтобы считать его жестом, а не кликом.\r\n // Будет использоваться для блокировки кликов по ссылкам.\r\n isSwipedEnough = signal(false);\r\n\r\n registerSlideList(element: ElementRef<HTMLDivElement>) {\r\n this.carouselList = element;\r\n }\r\n\r\n setRenderer(renderer: Renderer2) {\r\n this.renderer = renderer;\r\n }\r\n\r\n onPointerDown(event: PointerEvent) {\r\n if (this.carousel.isAnimating()) return\r\n\r\n this.startX = event.clientX;\r\n this.currentX = 0;\r\n this.isSwipedEnough.set(false);\r\n this.isSwiping.set(true);\r\n this.autoplay.stop();\r\n\r\n // Отключаем transition в начале свайпа (через Renderer2)\r\n this.renderer.setStyle(this.carouselList.nativeElement, 'transition', 'none');\r\n }\r\n\r\n onPointerMove(event: PointerEvent) {\r\n this.currentX = event.clientX - this.startX\r\n\r\n if (this.state.isFade()) return\r\n if (!this.isSwiping()) return;\r\n\r\n // Если отключена бесконечная прокрутка, то останавливаем свайп\r\n // при достижении первого и последнего слайда\r\n if (!this.state.loop()) {\r\n const length = this.state.slides().length\r\n const current = this.state.currentSlide();\r\n const slidesToshow = this.state.slidesToShow()\r\n\r\n if ((current <= 0) && (this.currentX > 0)) return // свайпаем на предыдущий слайд\r\n if ((current >= length - slidesToshow) && (this.currentX < 0)) return // свайпаем на следующий слайд\r\n }\r\n\r\n // Проверяем, превысили ли мы порог, чтобы считать это \"свайпом\", а не кликом\r\n if (Math.abs(this.currentX) > this.CLICK_LIMIT) {\r\n this.isSwipedEnough.set(true);\r\n\r\n // pointercapture гарантирует, что все pointermove события будут приходить на этот элемент, \r\n // даже если палец/мышь вышли за пределы слайдера.\r\n // Без него свайп часто \"обрывается\", если пользователь ведёт чуть в сторону.\r\n this.carouselList.nativeElement.setPointerCapture(event.pointerId);\r\n }\r\n\r\n // Смещение в пикселях к текущему слайду\r\n const baseTranslate = -this.state.currentSlide() * this.layout.slideStepPx()\r\n\r\n // Смещение в пикселях (текущее + пользовательское)\r\n const offsetPx = baseTranslate + this.currentX\r\n\r\n // Обновляем transform напрямую\r\n this.renderer.setStyle(\r\n this.carouselList.nativeElement,\r\n 'transform',\r\n `translateX(${offsetPx}px)`\r\n );\r\n }\r\n\r\n onPointerUp(event: PointerEvent) {\r\n if (this.state.isFade()) {\r\n if (this.currentX < -50) this.carousel.next()\r\n if (this.currentX > 50) this.carousel.prev()\r\n\r\n this.isSwiping.set(false)\r\n return\r\n }\r\n\r\n if (!this.isSwiping()) return;\r\n\r\n // 1. Включаем transition обратно, прежде чем менять currentSlide()\r\n this.renderer.setStyle(\r\n this.carouselList.nativeElement,\r\n 'transition',\r\n `transform ${this.state.speed()}ms ease`\r\n );\r\n\r\n const swipeDistance = this.currentX;\r\n const limit = this.carouselList.nativeElement.clientWidth * this.SWIPE_LIMIT;\r\n const step = this.layout.slideStepPx()\r\n const slidesDragged = Math.round(swipeDistance / step) * -1 // сколько слайдов было пролистано за одно перерягивание. Домножаем на -1 так как направление перетягивания swipeDistance по своему знаку противоположно той стороне, куда нужно сместить слайды. То есть при свайпе вправо (листаем вперед), swipeDistance станет отрицательным, а слайды нам нужно сдвинуть в бОльшую сторону\r\n\r\n if (swipeDistance < -limit) {\r\n Math.abs(slidesDragged) > 0 ?\r\n this.carousel.shiftBy(slidesDragged) :\r\n this.carousel.next()\r\n } else if (swipeDistance > limit) {\r\n Math.abs(slidesDragged) > 0 ?\r\n this.carousel.shiftBy(slidesDragged) :\r\n this.carousel.prev()\r\n } else {\r\n // Возврат на место, так как длинна свайпа недостаточная по длинне \r\n // (так как transition уже включен, это будет плавно)\r\n this.snapBack();\r\n }\r\n\r\n // 2. Сбрасываем флаги\r\n this.isSwiping.set(false);\r\n this.isSwipedEnough.set(false);\r\n this.currentX = 0;\r\n this.autoplay.resume();\r\n }\r\n\r\n private snapBack() {\r\n const offsetPx = -this.state.currentSlide() * this.layout.slideStepPx();\r\n\r\n // Просто устанавливаем transform в текущую позицию. Transition уже включен в onPointerUp.\r\n this.renderer\r\n .setStyle(\r\n this.carouselList.nativeElement,\r\n 'transform',\r\n `translateX(${offsetPx}px)`\r\n )\r\n }\r\n}","import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n AfterViewInit,\r\n Component,\r\n ContentChild,\r\n ElementRef,\r\n inject,\r\n Input,\r\n OnInit,\r\n Renderer2,\r\n TemplateRef,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { NgxCarouselService } from './services/ngx-carousel.service';\r\nimport { NgxCarouselControlsComponent } from './components/ngx-carousel-controls/ngx-carousel-controls.component';\r\nimport { NgxAutoplayService } from './services/ngx-autoplay..service';\r\nimport { NgxSwipeService } from './services/ngx-swipe.service';\r\nimport { NgxStateService } from './services/ngx-state.service';\r\nimport { NgxCarouselConfig } from './ngx-carousel.types';\r\nimport { NgxLayoutService } from './services/ngx-layout.service';\r\n\r\n@Component({\r\n selector: 'lib-ngx-carousel',\r\n imports: [NgTemplateOutlet, NgxCarouselControlsComponent],\r\n templateUrl: './ngx-carousel.component.html',\r\n styleUrl: './ngx-carousel.component.scss',\r\n providers: [\r\n NgxCarouselService,\r\n NgxAutoplayService,\r\n NgxSwipeService,\r\n NgxStateService,\r\n NgxLayoutService,\r\n ],\r\n})\r\nexport class NgxCarouselComponent implements OnInit, AfterViewInit {\r\n @Input({ required: true }) slides!: any[];\r\n @Input() config!: NgxCarouselConfig;\r\n\r\n @ViewChild('carouselList', { static: true }) \r\n carouselList!: ElementRef<HTMLDivElement>;\r\n @ContentChild('slideTemplate', { static: true }) \r\n slideTemplate!: TemplateRef<any>;\r\n @ContentChild('controlsTemplate', {static: true}) \r\n controlsTemplate!: TemplateRef<any>\r\n\r\n private readonly renderer = inject(Renderer2);\r\n private resizeObserver!: ResizeObserver;\r\n\r\n carousel = inject(NgxCarouselService);\r\n autoplay = inject(NgxAutoplayService);\r\n swipe = inject(NgxSwipeService);\r\n state = inject(NgxStateService);\r\n layout = inject(NgxLayoutService);\r\n\r\n ngOnInit() {\r\n this.watchResize();\r\n this.state.init(this.config)\r\n this.state.setSlides(this.slides)\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.swipe.registerSlideList(this.carouselList);\r\n this.swipe.setRenderer(this.renderer);\r\n\r\n this.resizeObserver.observe(this.carouselList.nativeElement);\r\n }\r\n\r\n private watchResize() {\r\n this.resizeObserver = new ResizeObserver((entries) => {\r\n const width = entries[0].contentRect.width;\r\n this.state.setWidth(width);\r\n });\r\n }\r\n}\r\n","<div\r\n class=\"ngx-carousel\"\r\n (keydown.arrowRight)=\"carousel.next()\"\r\n (keydown.arrowLeft)=\"carousel.prev()\"\r\n (mouseleave)=\"autoplay.resume()\"\r\n (mouseover)=\"autoplay.pause()\"\r\n (focusin)=\"autoplay.pause()\"\r\n (focusout)=\"autoplay.resume()\"\r\n>\r\n <ul\r\n #carouselList\r\n class=\"ngx-carousel__list\"\r\n [class.no-transition]=\"carousel.disableTransition()\"\r\n [style.transform]=\"layout.translatePx()\"\r\n [style.transition]=\"`transform ${state.speed()}ms ease`\"\r\n (pointerdown)=\"swipe.onPointerDown($event)\"\r\n (pointermove)=\"swipe.onPointerMove($event)\"\r\n (pointerup)=\"swipe.onPointerUp($event)\"\r\n (pointercancel)=\"swipe.onPointerUp($event)\"\r\n (pointerleave)=\"swipe.onPointerUp($event)\"\r\n >\r\n @for(slideData of state.slidesWithClones(); track $index; let i = $index) {\r\n <li\r\n class=\"ngx-carousel__slide\"\r\n [class.active]=\"i === state.currentSlide()\"\r\n [style.width]=\"layout.slideWidthPx() + 'px'\"\r\n [style.marginRight.px]=\"state.space()\"\r\n >\r\n <ng-container \r\n [ngTemplateOutlet]=\"slideTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: slideData, index: i }\"\r\n ></ng-container>\r\n </li>\r\n } \r\n </ul>\r\n\r\n @if(controlsTemplate) {\r\n <ng-container \r\n [ngTemplateOutlet]=\"controlsTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: carousel}\"\r\n />\r\n } @else {\r\n <lib-ngx-carousel-controls />\r\n }\r\n</div>\r\n","/*\r\n * Public API Surface of carousel\r\n */\r\n\r\nexport * from './lib/ngx-carousel.component';\r\nexport * from './lib/ngx-carousel.types';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngx-freshok-carousel.mjs","sources":["../../../projects/carousel/src/lib/ngx-carousel.types.ts","../../../projects/carousel/src/lib/services/ngx-state.service.ts","../../../projects/carousel/src/lib/services/ngx-carousel.service.ts","../../../projects/carousel/src/lib/components/ngx-carousel-controls/ngx-carousel-controls.component.ts","../../../projects/carousel/src/lib/components/ngx-carousel-controls/ngx-carousel-controls.component.html","../../../projects/carousel/src/lib/services/ngx-autoplay..service.ts","../../../projects/carousel/src/lib/services/ngx-layout.service.ts","../../../projects/carousel/src/lib/services/ngx-swipe.service.ts","../../../projects/carousel/src/lib/ngx-carousel.component.ts","../../../projects/carousel/src/lib/ngx-carousel.component.html","../../../projects/carousel/src/public-api.ts","../../../projects/carousel/src/ngx-freshok-carousel.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\nexport interface NgxCarouselBreakpoint extends NgxCarouselConfig {\r\n breakpoint: number; // Ширина экрана, при которой применяется конфигурация (max-width)\r\n}\r\n\r\nexport interface NgxCarouselConfig {\r\n autoplay?: boolean,\r\n interval?: number,\r\n loop?: boolean,\r\n pauseOnHover?: boolean;\r\n animation?: 'slide' | 'fade',\r\n startIndex?: number,\r\n slidesToShow?: number\r\n showArrows?: boolean;\r\n showDots?: boolean;\r\n spaceBetween?: number;\r\n speed?: number;\r\n breakpoints?: NgxCarouselBreakpoint[],\r\n}\r\n\r\nexport const DEFAULT_CAROUSEL_CONFIG: NgxCarouselConfig = {\r\n autoplay: true, // автопроигрывание слайдов\r\n interval: 5000, // время переключения слайдов\r\n loop: true, // бесконечная прокрутка\r\n pauseOnHover: true, // останавливать автопрокрутку при наведении\r\n animation: 'slide', // тип анимации\r\n startIndex: 0, // начальный номер слайда\r\n slidesToShow: 1, // по умолчанию показываем 1 слайд\r\n showArrows: true,\r\n showDots: true,\r\n spaceBetween: 0,\r\n speed: 500,\r\n breakpoints: [], // по умолчанию нет брейкпоинтов\r\n}\r\n\r\nexport const NGX_CAROUSEL_CONFIG = new InjectionToken<NgxCarouselConfig>(\r\n 'NGX_CAROUSEL_CONFIG'\r\n);\r\n","import { computed, effect, inject, Injectable, signal } from '@angular/core';\r\nimport { DEFAULT_CAROUSEL_CONFIG, NGX_CAROUSEL_CONFIG, NgxCarouselConfig } from '../ngx-carousel.types';\r\n\r\n@Injectable()\r\nexport class NgxStateService {\r\n private config = signal<NgxCarouselConfig>({});\r\n width = signal(0)\r\n slides = signal<any[]>([]);\r\n currentSlide = signal(0);\r\n\r\n private appCfg = inject(NGX_CAROUSEL_CONFIG, { optional: true });\r\n\r\n /* ========= ACTIVECONFIG ========= */\r\n activeConfig = computed(() => {\r\n return {\r\n ...DEFAULT_CAROUSEL_CONFIG,\r\n ...this.appCfg ?? {},\r\n ...this.config(),\r\n ...this.activeBreakpoint() ?? {}\r\n }\r\n })\r\n\r\n slidesToShow = computed(() => this.activeConfig().slidesToShow ?? 1);\r\n autoplay = computed(() => this.activeConfig().autoplay ?? true);\r\n interval = computed(() => this.activeConfig().interval ?? 5000);\r\n pauseOnHover = computed(() => this.activeConfig().pauseOnHover ?? true);\r\n space = computed(() => this.activeConfig().spaceBetween ?? 0);\r\n isFade = computed(() => this.activeConfig().animation === 'fade');\r\n loop = computed(() => this.activeConfig().loop)\r\n isArrows = computed(() => this.activeConfig().showArrows)\r\n isDots = computed(() => this.activeConfig().showDots)\r\n speed = computed(() => this.activeConfig().speed ?? 500)\r\n\r\n /* ========= BREAKPOINTS ========= */\r\n activeBreakpoint = computed<Partial<NgxCarouselConfig> | null>(() => {\r\n const breakpoints = this.config().breakpoints ?? []\r\n const w = this.width();\r\n\r\n return [...breakpoints]\r\n .sort((a, b) => b.breakpoint - a.breakpoint)\r\n .find(bp => w >= bp.breakpoint) ?? null\r\n })\r\n\r\n /* ========= CLONES ========= */\r\n slidesWithClones = computed(() => {\r\n if (this.isFade()) {\r\n return this.slides();\r\n }\r\n\r\n const slides = this.slides();\r\n const count = this.slidesToShow();\r\n\r\n if (!this.loop() || slides.length < count) {\r\n return slides;\r\n }\r\n\r\n return [\r\n ...slides.slice(-count),\r\n ...slides,\r\n ...slides.slice(0, count),\r\n ];\r\n });\r\n\r\n constructor() {\r\n effect(() => {\r\n const slides = this.slides()\r\n const cfg = this.activeConfig()\r\n\r\n if (!slides.length) return\r\n\r\n const index = this.loop() ?\r\n (cfg.startIndex ?? 0) + this.slidesToShow() :\r\n cfg.startIndex ?? 0\r\n\r\n this.setCurrentSlide(index)\r\n })\r\n\r\n // setInterval(() => {\r\n // console.log(\"ACTIVE\", this.activeConfig())\r\n\r\n // }, 1000)\r\n setTimeout(() => {\r\n console.log(\"ACTIVE\", this.activeConfig())\r\n\r\n }, 2000)\r\n }\r\n\r\n /* ========= INIT ========= */\r\n init(customConfig: NgxCarouselConfig = {}) {\r\n this.config.set({\r\n ...DEFAULT_CAROUSEL_CONFIG,\r\n ...this.appCfg ?? {},\r\n ...customConfig\r\n });\r\n // console.log(\"🔸 this.config:\", this.config())\r\n }\r\n\r\n setWidth(width: number) {\r\n this.width.set(width)\r\n // console.log(\"ACTIVE\", this.activeConfig())\r\n }\r\n\r\n setSlides(slides: any[]) {\r\n this.slides.set(slides);\r\n }\r\n\r\n setCurrentSlide(index: number) {\r\n this.currentSlide.set(index);\r\n }\r\n}\r\n","import { inject, Injectable, signal } from '@angular/core';\r\nimport { NgxStateService } from './ngx-state.service';\r\n\r\n@Injectable()\r\nexport class NgxCarouselService {\r\n private state = inject(NgxStateService)\r\n\r\n private jumpTimer: any = null;\r\n\r\n disableTransition = signal(false);\r\n isAnimating = signal(false);\r\n\r\n\r\n next() {\r\n if (!this.startAnimation()) return\r\n\r\n const length = this.state.slidesWithClones().length\r\n if (length <= 1) return;\r\n\r\n if (this.state.isFade()) {\r\n const nextNum = (this.state.currentSlide() + 1) % length\r\n this.state.setCurrentSlide(nextNum)\r\n return\r\n }\r\n\r\n this.disableTransition.set(false);\r\n const current = this.state.currentSlide();\r\n const slidesToShow = this.state.slidesToShow()\r\n\r\n if (this.state.loop()) {\r\n // Переходим к следующему слайду (даже если это клон)\r\n this.state.setCurrentSlide(current + 1);\r\n\r\n // Если достигли клона\r\n if (current + slidesToShow >= length - 1) {\r\n // Сбрасываем на первый оригинальный слайд\r\n const index = this.getRealIndex(current + 1)\r\n this.scheduleJumpToReal(index);\r\n }\r\n } else if (current + 1 < length) {\r\n // В режиме без loop просто проверяем границы\r\n this.state.setCurrentSlide(current + 1);\r\n }\r\n }\r\n\r\n prev() {\r\n if (!this.startAnimation()) return;\r\n\r\n const length = this.state.slidesWithClones().length;\r\n if (length <= 1) return;\r\n\r\n if (this.state.isFade()) {\r\n const prev = (this.state.currentSlide() - 1 + length) % length;\r\n this.state.setCurrentSlide(prev);\r\n return;\r\n }\r\n\r\n this.disableTransition.set(false);\r\n const current = this.state.currentSlide();\r\n const slidesToShow = this.state.slidesToShow();\r\n\r\n if (this.state.activeConfig().loop) {\r\n // Переходим к предыдущему слайду (даже если это клон)\r\n this.state.setCurrentSlide(current - 1);\r\n\r\n if (current - slidesToShow <= 0) {\r\n const index = this.getRealIndex(current - 1);\r\n this.scheduleJumpToReal(index);\r\n }\r\n } else if (current > 0) {\r\n this.state.setCurrentSlide(current - 1);\r\n }\r\n }\r\n\r\n private scheduleJumpToReal(realIndex: number) {\r\n //Если таймер уже запущен, то остановить и обнулить\r\n if (this.jumpTimer) {\r\n clearTimeout(this.jumpTimer)\r\n this.jumpTimer = null\r\n }\r\n\r\n const slidesToShow = this.state.slidesToShow()\r\n const realTarget = realIndex + slidesToShow\r\n\r\n // Заново запысываем новый таймер\r\n this.jumpTimer = setTimeout(() => {\r\n this.disableTransition.set(true)\r\n this.state.setCurrentSlide(realTarget)\r\n\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(() => {\r\n this.disableTransition.set(false)\r\n if (this.jumpTimer) {\r\n clearTimeout(this.jumpTimer)\r\n this.jumpTimer = null\r\n }\r\n })\r\n })\r\n }, this.state.speed());\r\n }\r\n\r\n goTo(index: number) {\r\n const length = this.state.slides().length\r\n if (length <= 0) return;\r\n\r\n const slidestToShow = this.state.slidesToShow();\r\n\r\n if (this.state.loop()) {\r\n // В режиме loop просто устанавливаем целевой индекс\r\n this.state.setCurrentSlide(index + slidestToShow);\r\n } else {\r\n this.state.setCurrentSlide(index);\r\n }\r\n }\r\n\r\n getDisplayIndex(): number {\r\n const length = this.state.slidesWithClones().length;\r\n if (length <= 0) return 0;\r\n\r\n const current = this.state.currentSlide();\r\n const slidesToShow = this.state.slidesToShow();\r\n\r\n // Если loop отключен, то просто вернем индекс текущего слайда\r\n if (!this.state.loop()) return current;\r\n\r\n // Если на клоне последнего (индекс 0), показываем последний реальный\r\n if (current === 0) return length - 1;\r\n\r\n // Если на клоне первого (индекс len + 1), показываем первый реальный\r\n if (current === length - slidesToShow) return 0;\r\n\r\n // Иначе вычитаем slidesToShow, так как реальные слайды начинаются с индекса slidesToShow\r\n return current - slidesToShow;\r\n }\r\n\r\n startAnimation(): boolean {\r\n if (this.isAnimating()) return false;\r\n this.isAnimating.set(true);\r\n\r\n const duration = this.state.speed();\r\n\r\n setTimeout(() => {\r\n this.isAnimating.set(false);\r\n }, duration);\r\n\r\n return true;\r\n }\r\n\r\n private getRealIndex(virtualIndex: number): number {\r\n const length = this.state.slides().length\r\n const slidesToShow = this.state.slidesToShow()\r\n\r\n if (!this.state.loop()) return virtualIndex\r\n\r\n let real = virtualIndex - slidesToShow\r\n\r\n if (real < 0) real += length\r\n if (real >= length) real -= length\r\n\r\n return real\r\n }\r\n\r\n shiftBy(slidesDragged: number) {\r\n if (slidesDragged === 0) return;\r\n if (!this.startAnimation()) return;\r\n\r\n const current = this.state.currentSlide();\r\n const slidesToShow = this.state.slidesToShow();\r\n const total = this.state.slidesWithClones().length;\r\n\r\n let target = current + slidesDragged;\r\n\r\n this.disableTransition.set(false);\r\n\r\n if (!this.state.loop()) {\r\n const max = total - slidesToShow;\r\n target = Math.max(0, Math.min(target, max));\r\n this.state.setCurrentSlide(target);\r\n return;\r\n }\r\n\r\n this.state.setCurrentSlide(target);\r\n\r\n // вычисляем РЕАЛЬНЫЙ индекс\r\n const realIndex = this.getRealIndex(target);\r\n\r\n // если ушли в клоны — снапаемся туда же, но в реальной зоне\r\n if (target < slidesToShow || target >= total - slidesToShow) {\r\n this.scheduleJumpToReal(realIndex);\r\n }\r\n }\r\n}\r\n","import { Component, inject, } from '@angular/core';\r\nimport { NgxCarouselService } from '../../services/ngx-carousel.service';\r\nimport { NgxStateService } from '../../services/ngx-state.service';\r\n\r\n@Component({\r\n selector: 'lib-ngx-carousel-controls',\r\n imports: [],\r\n templateUrl: './ngx-carousel-controls.component.html',\r\n styleUrl: './ngx-carousel-controls.component.scss',\r\n})\r\nexport class NgxCarouselControlsComponent {\r\n carousel = inject(NgxCarouselService);\r\n state = inject(NgxStateService)\r\n}\r\n","@if(state.isArrows()) {\r\n <div class=\"ngx-carousel__controls\">\r\n <button\r\n type=\"button\"\r\n class=\"ngx-carousel__btn\"\r\n (click)=\"carousel.prev()\"\r\n aria-label=\"Previous slide\"\r\n >\r\n <svg width=\"11\" height=\"20\" viewBox=\"0 0 11 20\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10.617 20.0762C10.8882 19.805 10.8882 19.3654 10.617 19.0942L1.80242 10.2796L10.617 1.46497C10.8882 1.19379 10.8882 0.754138 10.617 0.482966C10.3459 0.211794 9.90621 0.211794 9.63504 0.482966L0.565868 9.55214C0.164103 9.9539 0.164103 10.6053 0.565868 11.007L9.63504 20.0762C9.90621 20.3474 10.3459 20.3474 10.617 20.0762Z\"></path></svg>\r\n </button>\r\n \r\n <button\r\n type=\"button\"\r\n class=\"ngx-carousel__btn\"\r\n aria-label=\"Next slide\"\r\n (click)=\"carousel.next()\"\r\n >\r\n <svg width=\"11\" height=\"20\" viewBox=\"0 0 11 20\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M0.38296 20.0762C0.111788 19.805 0.111788 19.3654 0.38296 19.0942L9.19758 10.2796L0.38296 1.46497C0.111788 1.19379 0.111788 0.754138 0.38296 0.482966C0.654131 0.211794 1.09379 0.211794 1.36496 0.482966L10.4341 9.55214C10.8359 9.9539 10.8359 10.6053 10.4341 11.007L1.36496 20.0762C1.09379 20.3474 0.654131 20.3474 0.38296 20.0762Z\"></path></svg>\r\n </button>\r\n </div>\r\n}\r\n\r\n@if(state.isDots()) {\r\n <div class=\"ngx-carousel__controls bullets\">\r\n <div \r\n role=\"tablist\"\r\n aria-label=\"Carousel indicators\"\r\n class=\"ngx-carousel__dots\"\r\n >\r\n @for(dot of state.slides(); track $index; let i = $index) {\r\n <button\r\n type=\"button\"\r\n [attr.aria-selected]=\"carousel.getDisplayIndex() == i\"\r\n class=\"ngx-carousel__dot\"\r\n [class.active]=\"carousel.getDisplayIndex() == i\"\r\n (click)=\"carousel.goTo(i)\"\r\n ></button>\r\n }\r\n </div>\r\n </div>\r\n}\r\n\r\n\r\n","import { effect, inject, Injectable, signal } from '@angular/core';\r\nimport { NgxCarouselService } from './ngx-carousel.service';\r\nimport { NgxStateService } from './ngx-state.service';\r\n\r\n@Injectable()\r\nexport class NgxAutoplayService {\r\n private carousel = inject(NgxCarouselService)\r\n state = inject(NgxStateService)\r\n private isPlaying = signal(true)\r\n private timerAutoplay: any = null\r\n\r\n constructor() {\r\n effect(() => {\r\n if(!this.state.autoplay() || this.state.slides().length <= 1) {\r\n this.stop()\r\n return\r\n }\r\n\r\n this.state.autoplay() ?\r\n this.resume() :\r\n this.stop()\r\n })\r\n }\r\n\r\n private start() {\r\n\r\n if (!this.state.autoplay() || !this.isPlaying()) return\r\n \r\n this.stop()\r\n const delay = this.state.interval() ?? 5000\r\n this.timerAutoplay = setInterval(() => this.carousel.next(), delay )\r\n }\r\n\r\n stop() {\r\n this.isPlaying.set(false)\r\n if (this.timerAutoplay) {\r\n clearInterval(this.timerAutoplay)\r\n this.timerAutoplay = null\r\n }\r\n }\r\n\r\n pause() {\r\n if(this.state.pauseOnHover()) {\r\n this.stop();\r\n }\r\n }\r\n\r\n resume() {\r\n if(this.state.autoplay()) {\r\n this.isPlaying.set(true);\r\n\r\n setTimeout(() => this.start(), 0);\r\n }\r\n }\r\n}\r\n","import { computed, inject, Injectable, signal } from '@angular/core';\r\nimport { NgxStateService } from './ngx-state.service';\r\n\r\n@Injectable()\r\nexport class NgxLayoutService {\r\n\r\n private state = inject(NgxStateService);\r\n\r\n /* ========= GEOMETRY ========= */\r\n slideWidthPx = computed(() => \r\n this.state.width() / this.state.slidesToShow() - this.state.space() / 2\r\n );\r\n\r\n slideStepPx = computed(() => this.slideWidthPx() + this.state.space());\r\n\r\n translatePx = computed(() => {\r\n if (this.state.isFade()) return 'none';\r\n return `translate(-${this.state.currentSlide() * this.slideStepPx()}px)`;\r\n });\r\n}\r\n","import { ElementRef, inject, Injectable, Renderer2, signal } from '@angular/core';\r\nimport { NgxCarouselService } from './ngx-carousel.service';\r\nimport { NgxAutoplayService } from './ngx-autoplay..service';\r\nimport { NgxStateService } from './ngx-state.service';\r\nimport { NgxLayoutService } from './ngx-layout.service';\r\n\r\n@Injectable()\r\nexport class NgxSwipeService {\r\n // Порог в пикселях для различения клика и свайпа\r\n private readonly CLICK_LIMIT = 5; // px\r\n private readonly SWIPE_LIMIT = 0.05; // %\r\n\r\n private carousel = inject(NgxCarouselService);\r\n private autoplay = inject(NgxAutoplayService);\r\n private state = inject(NgxStateService)\r\n private layout = inject(NgxLayoutService)\r\n\r\n private renderer!: Renderer2;\r\n private carouselList!: ElementRef<HTMLDivElement>;\r\n private startX = 0;\r\n private currentX = 0;\r\n\r\n private isSwiping = signal(false);\r\n // private config = computed(() => this.carousel.getConfig())\r\n\r\n // Определяем, был ли свайп достаточным, чтобы считать его жестом, а не кликом.\r\n // Будет использоваться для блокировки кликов по ссылкам.\r\n isSwipedEnough = signal(false);\r\n\r\n registerSlideList(element: ElementRef<HTMLDivElement>) {\r\n this.carouselList = element;\r\n }\r\n\r\n setRenderer(renderer: Renderer2) {\r\n this.renderer = renderer;\r\n }\r\n\r\n onPointerDown(event: PointerEvent) {\r\n if (this.carousel.isAnimating()) return\r\n\r\n this.startX = event.clientX;\r\n this.currentX = 0;\r\n this.isSwipedEnough.set(false);\r\n this.isSwiping.set(true);\r\n this.autoplay.stop();\r\n\r\n // Отключаем transition в начале свайпа (через Renderer2)\r\n this.renderer.setStyle(this.carouselList.nativeElement, 'transition', 'none');\r\n }\r\n\r\n onPointerMove(event: PointerEvent) {\r\n this.currentX = event.clientX - this.startX\r\n\r\n if (this.state.isFade()) return\r\n if (!this.isSwiping()) return;\r\n\r\n // Если отключена бесконечная прокрутка, то останавливаем свайп\r\n // при достижении первого и последнего слайда\r\n if (!this.state.loop()) {\r\n const length = this.state.slides().length\r\n const current = this.state.currentSlide();\r\n const slidesToshow = this.state.slidesToShow()\r\n\r\n if ((current <= 0) && (this.currentX > 0)) return // свайпаем на предыдущий слайд\r\n if ((current >= length - slidesToshow) && (this.currentX < 0)) return // свайпаем на следующий слайд\r\n }\r\n\r\n // Проверяем, превысили ли мы порог, чтобы считать это \"свайпом\", а не кликом\r\n if (Math.abs(this.currentX) > this.CLICK_LIMIT) {\r\n this.isSwipedEnough.set(true);\r\n\r\n // pointercapture гарантирует, что все pointermove события будут приходить на этот элемент, \r\n // даже если палец/мышь вышли за пределы слайдера.\r\n // Без него свайп часто \"обрывается\", если пользователь ведёт чуть в сторону.\r\n this.carouselList.nativeElement.setPointerCapture(event.pointerId);\r\n }\r\n\r\n // Смещение в пикселях к текущему слайду\r\n const baseTranslate = -this.state.currentSlide() * this.layout.slideStepPx()\r\n\r\n // Смещение в пикселях (текущее + пользовательское)\r\n const offsetPx = baseTranslate + this.currentX\r\n\r\n // Обновляем transform напрямую\r\n this.renderer.setStyle(\r\n this.carouselList.nativeElement,\r\n 'transform',\r\n `translateX(${offsetPx}px)`\r\n );\r\n }\r\n\r\n onPointerUp(event: PointerEvent) {\r\n if (this.state.isFade()) {\r\n if (this.currentX < -50) this.carousel.next()\r\n if (this.currentX > 50) this.carousel.prev()\r\n\r\n this.isSwiping.set(false)\r\n return\r\n }\r\n\r\n if (!this.isSwiping()) return;\r\n\r\n // 1. Включаем transition обратно, прежде чем менять currentSlide()\r\n this.renderer.setStyle(\r\n this.carouselList.nativeElement,\r\n 'transition',\r\n `transform ${this.state.speed()}ms ease`\r\n );\r\n\r\n const swipeDistance = this.currentX;\r\n const limit = this.carouselList.nativeElement.clientWidth * this.SWIPE_LIMIT;\r\n const step = this.layout.slideStepPx()\r\n const slidesDragged = Math.round(swipeDistance / step) * -1 // сколько слайдов было пролистано за одно перерягивание. Домножаем на -1 так как направление перетягивания swipeDistance по своему знаку противоположно той стороне, куда нужно сместить слайды. То есть при свайпе вправо (листаем вперед), swipeDistance станет отрицательным, а слайды нам нужно сдвинуть в бОльшую сторону\r\n\r\n if (swipeDistance < -limit) {\r\n Math.abs(slidesDragged) > 0 ?\r\n this.carousel.shiftBy(slidesDragged) :\r\n this.carousel.next()\r\n } else if (swipeDistance > limit) {\r\n Math.abs(slidesDragged) > 0 ?\r\n this.carousel.shiftBy(slidesDragged) :\r\n this.carousel.prev()\r\n } else {\r\n // Возврат на место, так как длинна свайпа недостаточная по длинне \r\n // (так как transition уже включен, это будет плавно)\r\n this.snapBack();\r\n }\r\n\r\n // 2. Сбрасываем флаги\r\n this.isSwiping.set(false);\r\n this.isSwipedEnough.set(false);\r\n this.currentX = 0;\r\n this.autoplay.resume();\r\n }\r\n\r\n private snapBack() {\r\n const offsetPx = -this.state.currentSlide() * this.layout.slideStepPx();\r\n\r\n // Просто устанавливаем transform в текущую позицию. Transition уже включен в onPointerUp.\r\n this.renderer\r\n .setStyle(\r\n this.carouselList.nativeElement,\r\n 'transform',\r\n `translateX(${offsetPx}px)`\r\n )\r\n }\r\n}","import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n AfterViewInit,\r\n Component,\r\n ContentChild,\r\n ElementRef,\r\n inject,\r\n Input,\r\n OnInit,\r\n Renderer2,\r\n TemplateRef,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { NgxCarouselService } from './services/ngx-carousel.service';\r\nimport { NgxCarouselControlsComponent } from './components/ngx-carousel-controls/ngx-carousel-controls.component';\r\nimport { NgxAutoplayService } from './services/ngx-autoplay..service';\r\nimport { NgxSwipeService } from './services/ngx-swipe.service';\r\nimport { NgxStateService } from './services/ngx-state.service';\r\nimport { NgxCarouselConfig } from './ngx-carousel.types';\r\nimport { NgxLayoutService } from './services/ngx-layout.service';\r\n\r\n@Component({\r\n selector: 'lib-ngx-carousel',\r\n imports: [NgTemplateOutlet, NgxCarouselControlsComponent],\r\n templateUrl: './ngx-carousel.component.html',\r\n styleUrl: './ngx-carousel.component.scss',\r\n providers: [\r\n NgxCarouselService,\r\n NgxAutoplayService,\r\n NgxSwipeService,\r\n NgxStateService,\r\n NgxLayoutService,\r\n ],\r\n})\r\nexport class NgxCarouselComponent implements OnInit, AfterViewInit {\r\n @Input({ required: true }) slides!: any[];\r\n @Input() config!: NgxCarouselConfig;\r\n\r\n \r\n\r\n @ViewChild('carouselList', { static: true }) \r\n carouselList!: ElementRef<HTMLDivElement>;\r\n @ContentChild('slideTemplate', { static: true }) \r\n slideTemplate!: TemplateRef<any>;\r\n @ContentChild('controlsTemplate', {static: true}) \r\n controlsTemplate!: TemplateRef<any>\r\n\r\n private readonly renderer = inject(Renderer2);\r\n private resizeObserver!: ResizeObserver;\r\n\r\n carousel = inject(NgxCarouselService);\r\n autoplay = inject(NgxAutoplayService);\r\n swipe = inject(NgxSwipeService);\r\n state = inject(NgxStateService);\r\n layout = inject(NgxLayoutService);\r\n\r\n ngOnInit() {\r\n this.watchResize();\r\n this.state.init(this.config)\r\n this.state.setSlides(this.slides)\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.swipe.registerSlideList(this.carouselList);\r\n this.swipe.setRenderer(this.renderer);\r\n\r\n this.resizeObserver.observe(this.carouselList.nativeElement);\r\n }\r\n\r\n private watchResize() {\r\n this.resizeObserver = new ResizeObserver((entries) => {\r\n const width = entries[0].contentRect.width;\r\n this.state.setWidth(width);\r\n });\r\n }\r\n}\r\n","<div\r\n class=\"ngx-carousel\"\r\n tabindex=\"0\"\r\n aria-roledescription=\"carousel\"\r\n aria-live=\"polite\"\r\n (keydown.arrowRight)=\"carousel.next()\"\r\n (keydown.arrowLeft)=\"carousel.prev()\"\r\n (mouseleave)=\"autoplay.resume()\"\r\n (mouseover)=\"autoplay.pause()\"\r\n (focusin)=\"autoplay.pause()\"\r\n (focusout)=\"autoplay.resume()\"\r\n>\r\n <ul\r\n #carouselList\r\n role=\"listbox\"\r\n class=\"ngx-carousel__list\"\r\n [class.no-transition]=\"carousel.disableTransition()\"\r\n [style.transform]=\"layout.translatePx()\"\r\n [style.transition]=\"`transform ${state.speed()}ms ease`\"\r\n (pointerdown)=\"swipe.onPointerDown($event)\"\r\n (pointermove)=\"swipe.onPointerMove($event)\"\r\n (pointerup)=\"swipe.onPointerUp($event)\"\r\n (pointercancel)=\"swipe.onPointerUp($event)\"\r\n (pointerleave)=\"swipe.onPointerUp($event)\"\r\n >\r\n @for(slideData of state.slidesWithClones(); track $index; let i = $index) {\r\n <li\r\n role=\"option\"\r\n class=\"ngx-carousel__slide\"\r\n [class.active]=\"i === state.currentSlide()\"\r\n [style.width]=\"layout.slideWidthPx() + 'px'\"\r\n [style.marginRight.px]=\"state.space()\"\r\n >\r\n <ng-container \r\n [ngTemplateOutlet]=\"slideTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: slideData, index: i }\"\r\n ></ng-container>\r\n </li>\r\n } \r\n </ul>\r\n\r\n @if(controlsTemplate) {\r\n <ng-container \r\n [ngTemplateOutlet]=\"controlsTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: carousel}\"\r\n />\r\n } @else {\r\n <lib-ngx-carousel-controls />\r\n }\r\n</div>\r\n","/*\r\n * Public API Surface of carousel\r\n */\r\n\r\nexport * from './lib/ngx-carousel.component';\r\nexport * from './lib/ngx-carousel.types';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;AAqBa,MAAA,uBAAuB,GAAsB;IACxD,QAAQ,EAAE,IAAI;IACd,QAAQ,EAAE,IAAI;IACd,IAAI,EAAE,IAAI;IACV,YAAY,EAAE,IAAI;IAClB,SAAS,EAAE,OAAO;IAClB,UAAU,EAAE,CAAC;IACb,YAAY,EAAE,CAAC;AACf,IAAA,UAAU,EAAE,IAAI;AAChB,IAAA,QAAQ,EAAE,IAAI;AACd,IAAA,YAAY,EAAE,CAAC;AACf,IAAA,KAAK,EAAE,GAAG;IACV,WAAW,EAAE,EAAE;;MAGJ,mBAAmB,GAAG,IAAI,cAAc,CACnD,qBAAqB;;MCjCV,eAAe,CAAA;AAClB,IAAA,MAAM,GAAG,MAAM,CAAoB,EAAE,CAAC;AAC9C,IAAA,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC;AACjB,IAAA,MAAM,GAAG,MAAM,CAAQ,EAAE,CAAC;AAC1B,IAAA,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC;IAEhB,MAAM,GAAG,MAAM,CAAC,mBAAmB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;AAGhE,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;QAC3B,OAAO;AACL,YAAA,GAAG,uBAAuB;AAC1B,YAAA,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE;YACpB,GAAG,IAAI,CAAC,MAAM,EAAE;AAChB,YAAA,GAAG,IAAI,CAAC,gBAAgB,EAAE,IAAI;SAC/B;AACH,KAAC,CAAC;AAEF,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC,YAAY,IAAI,CAAC,CAAC;AACpE,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC,QAAQ,IAAI,IAAI,CAAC;AAC/D,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC,QAAQ,IAAI,IAAI,CAAC;AAC/D,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC,YAAY,IAAI,IAAI,CAAC;AACvE,IAAA,KAAK,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC,YAAY,IAAI,CAAC,CAAC;AAC7D,IAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC,SAAS,KAAK,MAAM,CAAC;AACjE,IAAA,IAAI,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC;AAC/C,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC,UAAU,CAAC;AACzD,IAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC,QAAQ,CAAC;AACrD,IAAA,KAAK,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC,KAAK,IAAI,GAAG,CAAC;;AAGxD,IAAA,gBAAgB,GAAG,QAAQ,CAAoC,MAAK;QAClE,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,WAAW,IAAI,EAAE;AACnD,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;QAEtB,OAAO,CAAC,GAAG,WAAW;AACnB,aAAA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU;AAC1C,aAAA,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,IAAI;AAC3C,KAAC,CAAC;;AAGF,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAK;AAC/B,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;AACjB,YAAA,OAAO,IAAI,CAAC,MAAM,EAAE;;AAGtB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AAC5B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE;AAEjC,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,MAAM,GAAG,KAAK,EAAE;AACzC,YAAA,OAAO,MAAM;;QAGf,OAAO;AACL,YAAA,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;AACvB,YAAA,GAAG,MAAM;AACT,YAAA,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;SAC1B;AACH,KAAC,CAAC;AAEF,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AAC5B,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE;YAE/B,IAAI,CAAC,MAAM,CAAC,MAAM;gBAAE;AAEpB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE;AACvB,gBAAA,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE;AAC3C,gBAAA,GAAG,CAAC,UAAU,IAAI,CAAC;AAErB,YAAA,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;AAC7B,SAAC,CAAC;;;;QAMF,UAAU,CAAC,MAAK;YACV,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;SAE/C,EAAE,IAAI,CAAC;;;IAIV,IAAI,CAAC,eAAkC,EAAE,EAAA;AACvC,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;AACd,YAAA,GAAG,uBAAuB;AAC1B,YAAA,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE;AACpB,YAAA,GAAG;AACJ,SAAA,CAAC;;;AAIJ,IAAA,QAAQ,CAAC,KAAa,EAAA;AACpB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;;;AAIvB,IAAA,SAAS,CAAC,MAAa,EAAA;AACrB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;;AAGzB,IAAA,eAAe,CAAC,KAAa,EAAA;AAC3B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;;wGAvGnB,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAAf,eAAe,EAAA,CAAA;;4FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B;;;MCCY,kBAAkB,CAAA;AACrB,IAAA,KAAK,GAAG,MAAM,CAAC,eAAe,CAAC;IAE/B,SAAS,GAAQ,IAAI;AAE7B,IAAA,iBAAiB,GAAG,MAAM,CAAC,KAAK,CAAC;AACjC,IAAA,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC;IAG3B,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;YAAE;QAE5B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC,MAAM;QACnD,IAAI,MAAM,IAAI,CAAC;YAAE;AAEjB,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE;AACvB,YAAA,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,GAAG,CAAC,IAAI,MAAM;AACxD,YAAA,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC;YACnC;;AAGF,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;QACzC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;AAE9C,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE;;YAErB,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO,GAAG,CAAC,CAAC;;YAGvC,IAAI,OAAO,GAAG,YAAY,IAAI,MAAM,GAAG,CAAC,EAAE;;gBAExC,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,GAAG,CAAC,CAAC;AAC5C,gBAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;;;AAE3B,aAAA,IAAI,OAAO,GAAG,CAAC,GAAG,MAAM,EAAE;;YAE/B,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO,GAAG,CAAC,CAAC;;;IAI3C,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;YAAE;QAE5B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC,MAAM;QACnD,IAAI,MAAM,IAAI,CAAC;YAAE;AAEjB,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE;AACvB,YAAA,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,GAAG,CAAC,GAAG,MAAM,IAAI,MAAM;AAC9D,YAAA,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC;YAChC;;AAGF,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;QACzC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;QAE9C,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE;;YAElC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO,GAAG,CAAC,CAAC;AAEvC,YAAA,IAAI,OAAO,GAAG,YAAY,IAAI,CAAC,EAAE;gBAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,GAAG,CAAC,CAAC;AAC5C,gBAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;;;AAE3B,aAAA,IAAI,OAAO,GAAG,CAAC,EAAE;YACtB,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO,GAAG,CAAC,CAAC;;;AAInC,IAAA,kBAAkB,CAAC,SAAiB,EAAA;;AAE1C,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;AAC5B,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI;;QAGvB,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;AAC9C,QAAA,MAAM,UAAU,GAAG,SAAS,GAAG,YAAY;;AAG3C,QAAA,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,MAAK;AAC/B,YAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;AAChC,YAAA,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,UAAU,CAAC;YAEtC,qBAAqB,CAAC,MAAK;gBACzB,qBAAqB,CAAC,MAAK;AACzB,oBAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC;AACjC,oBAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,wBAAA,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;AAC5B,wBAAA,IAAI,CAAC,SAAS,GAAG,IAAI;;AAEzB,iBAAC,CAAC;AACJ,aAAC,CAAC;SACH,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;;AAGxB,IAAA,IAAI,CAAC,KAAa,EAAA;QAChB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,MAAM;QACzC,IAAI,MAAM,IAAI,CAAC;YAAE;QAEjB,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;AAE/C,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE;;YAErB,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,GAAG,aAAa,CAAC;;aAC5C;AACL,YAAA,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC;;;IAIrC,eAAe,GAAA;QACb,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC,MAAM;QACnD,IAAI,MAAM,IAAI,CAAC;AAAE,YAAA,OAAO,CAAC;QAEzB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;QACzC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;;AAG9C,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;AAAE,YAAA,OAAO,OAAO;;QAGtC,IAAI,OAAO,KAAK,CAAC;YAAE,OAAO,MAAM,GAAG,CAAC;;AAGpC,QAAA,IAAI,OAAO,KAAK,MAAM,GAAG,YAAY;AAAE,YAAA,OAAO,CAAC;;QAG/C,OAAO,OAAO,GAAG,YAAY;;IAG/B,cAAc,GAAA;QACZ,IAAI,IAAI,CAAC,WAAW,EAAE;AAAE,YAAA,OAAO,KAAK;AACpC,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;QAE1B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;QAEnC,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;SAC5B,EAAE,QAAQ,CAAC;AAEZ,QAAA,OAAO,IAAI;;AAGL,IAAA,YAAY,CAAC,YAAoB,EAAA;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,MAAM;QACzC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;AAE9C,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;AAAE,YAAA,OAAO,YAAY;AAE3C,QAAA,IAAI,IAAI,GAAG,YAAY,GAAG,YAAY;QAEtC,IAAI,IAAI,GAAG,CAAC;YAAE,IAAI,IAAI,MAAM;QAC5B,IAAI,IAAI,IAAI,MAAM;YAAE,IAAI,IAAI,MAAM;AAElC,QAAA,OAAO,IAAI;;AAGb,IAAA,OAAO,CAAC,aAAqB,EAAA;QAC3B,IAAI,aAAa,KAAK,CAAC;YAAE;AACzB,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;YAAE;QAE5B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;QACzC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC,MAAM;AAElD,QAAA,IAAI,MAAM,GAAG,OAAO,GAAG,aAAa;AAEpC,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC;QAEjC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE;AACtB,YAAA,MAAM,GAAG,GAAG,KAAK,GAAG,YAAY;AAChC,YAAA,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC3C,YAAA,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC;YAClC;;AAGF,QAAA,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC;;QAGlC,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;;QAG3C,IAAI,MAAM,GAAG,YAAY,IAAI,MAAM,IAAI,KAAK,GAAG,YAAY,EAAE;AAC3D,YAAA,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC;;;wGAxL3B,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAAlB,kBAAkB,EAAA,CAAA;;4FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAD9B;;;MCOY,4BAA4B,CAAA;AACvC,IAAA,QAAQ,GAAG,MAAM,CAAC,kBAAkB,CAAC;AACrC,IAAA,KAAK,GAAG,MAAM,CAAC,eAAe,CAAC;wGAFpB,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA5B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,4BAA4B,qFCVzC,o7DA2CA,EAAA,MAAA,EAAA,CAAA,qzDAAA,CAAA,EAAA,CAAA;;4FDjCa,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBANxC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,2BAA2B,WAC5B,EAAE,EAAA,QAAA,EAAA,o7DAAA,EAAA,MAAA,EAAA,CAAA,qzDAAA,CAAA,EAAA;;;MEDA,kBAAkB,CAAA;AACrB,IAAA,QAAQ,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAC7C,IAAA,KAAK,GAAG,MAAM,CAAC,eAAe,CAAC;AACvB,IAAA,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC;IACxB,aAAa,GAAQ,IAAI;AAEjC,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,IAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,MAAM,IAAI,CAAC,EAAE;gBAC5D,IAAI,CAAC,IAAI,EAAE;gBACX;;AAGF,YAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;AACnB,gBAAA,IAAI,CAAC,MAAM,EAAE;gBACb,IAAI,CAAC,IAAI,EAAE;AACf,SAAC,CAAC;;IAGI,KAAK,GAAA;AAEX,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE;QAEjD,IAAI,CAAC,IAAI,EAAE;QACX,MAAM,KAAK,GAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,IAAI;AAC5C,QAAA,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,KAAK,CAAE;;IAGtE,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;AACzB,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC;AACjC,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;;;IAI7B,KAAK,GAAA;AACH,QAAA,IAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE;YAC5B,IAAI,CAAC,IAAI,EAAE;;;IAIf,MAAM,GAAA;AACJ,QAAA,IAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE;AACxB,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;YAExB,UAAU,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;;;wGA9C1B,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAAlB,kBAAkB,EAAA,CAAA;;4FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAD9B;;;MCAY,gBAAgB,CAAA;AAEnB,IAAA,KAAK,GAAG,MAAM,CAAC,eAAe,CAAC;;AAGvC,IAAA,YAAY,GAAG,QAAQ,CAAC,MACpB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAC1E;AAED,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;AAEtE,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AAC1B,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;AAAE,YAAA,OAAO,MAAM;AACtC,QAAA,OAAO,CAAc,WAAA,EAAA,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK;AAC1E,KAAC,CAAC;wGAdS,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAAhB,gBAAgB,EAAA,CAAA;;4FAAhB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAD5B;;;MCIY,eAAe,CAAA;;AAET,IAAA,WAAW,GAAG,CAAC,CAAC;AAChB,IAAA,WAAW,GAAG,IAAI,CAAC;AAE5B,IAAA,QAAQ,GAAG,MAAM,CAAC,kBAAkB,CAAC;AACrC,IAAA,QAAQ,GAAG,MAAM,CAAC,kBAAkB,CAAC;AACrC,IAAA,KAAK,GAAG,MAAM,CAAC,eAAe,CAAC;AAC/B,IAAA,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAEjC,IAAA,QAAQ;AACR,IAAA,YAAY;IACZ,MAAM,GAAG,CAAC;IACV,QAAQ,GAAG,CAAC;AAEZ,IAAA,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC;;;;AAKjC,IAAA,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC;AAE9B,IAAA,iBAAiB,CAAC,OAAmC,EAAA;AACnD,QAAA,IAAI,CAAC,YAAY,GAAG,OAAO;;AAG7B,IAAA,WAAW,CAAC,QAAmB,EAAA;AAC7B,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;;AAG1B,IAAA,aAAa,CAAC,KAAmB,EAAA;AAC/B,QAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE;YAAE;AAEjC,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO;AAC3B,QAAA,IAAI,CAAC,QAAQ,GAAG,CAAC;AACjB,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;AAC9B,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;;AAGpB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,YAAY,EAAE,MAAM,CAAC;;AAG/E,IAAA,aAAa,CAAC,KAAmB,EAAA;QAC/B,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM;AAE3C,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;YAAE;AACzB,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE;;;QAIvB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE;YACtB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,MAAM;YACzC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;YACzC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;AAE9C,YAAA,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;AAAE,gBAAA,OAAM;AACjD,YAAA,IAAI,CAAC,OAAO,IAAI,MAAM,GAAG,YAAY,MAAM,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;AAAE,gBAAA,OAAM;;;AAIvE,QAAA,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE;AAC9C,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;;;;YAK7B,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,iBAAiB,CAAC,KAAK,CAAC,SAAS,CAAC;;;AAIpE,QAAA,MAAM,aAAa,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;;AAG5E,QAAA,MAAM,QAAQ,GAAG,aAAa,GAAG,IAAI,CAAC,QAAQ;;AAG9C,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CACpB,IAAI,CAAC,YAAY,CAAC,aAAa,EAC/B,WAAW,EACX,cAAc,QAAQ,CAAA,GAAA,CAAK,CAC5B;;AAGH,IAAA,WAAW,CAAC,KAAmB,EAAA;AAC7B,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE;AACvB,YAAA,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE;AAAE,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AAC7C,YAAA,IAAI,IAAI,CAAC,QAAQ,GAAG,EAAE;AAAE,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AAE5C,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB;;AAGF,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE;;QAGvB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CACpB,IAAI,CAAC,YAAY,CAAC,aAAa,EAC/B,YAAY,EACZ,CAAA,UAAA,EAAa,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAS,OAAA,CAAA,CACzC;AAED,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ;AACnC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW;QAC5E,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;AACtC,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AAE3D,QAAA,IAAI,aAAa,GAAG,CAAC,KAAK,EAAE;YAC1B,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC;gBACzB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC;AACpC,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;;AACjB,aAAA,IAAI,aAAa,GAAG,KAAK,EAAE;YAChC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC;gBACzB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC;AACpC,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;;aACjB;;;YAGL,IAAI,CAAC,QAAQ,EAAE;;;AAIjB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;AACzB,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;AAC9B,QAAA,IAAI,CAAC,QAAQ,GAAG,CAAC;AACjB,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;;IAGhB,QAAQ,GAAA;AACd,QAAA,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;;AAGvE,QAAA,IAAI,CAAC;AACF,aAAA,QAAQ,CACP,IAAI,CAAC,YAAY,CAAC,aAAa,EAC/B,WAAW,EACX,CAAA,WAAA,EAAc,QAAQ,CAAA,GAAA,CAAK,CAC5B;;wGAzIM,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAAf,eAAe,EAAA,CAAA;;4FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B;;;MC4BY,oBAAoB,CAAA;AACJ,IAAA,MAAM;AACxB,IAAA,MAAM;AAKf,IAAA,YAAY;AAEZ,IAAA,aAAa;AAEb,IAAA,gBAAgB;AAEC,IAAA,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;AACrC,IAAA,cAAc;AAEtB,IAAA,QAAQ,GAAG,MAAM,CAAC,kBAAkB,CAAC;AACrC,IAAA,QAAQ,GAAG,MAAM,CAAC,kBAAkB,CAAC;AACrC,IAAA,KAAK,GAAG,MAAM,CAAC,eAAe,CAAC;AAC/B,IAAA,KAAK,GAAG,MAAM,CAAC,eAAe,CAAC;AAC/B,IAAA,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC;IAEjC,QAAQ,GAAA;QACN,IAAI,CAAC,WAAW,EAAE;QAClB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;;IAGnC,eAAe,GAAA;QACb,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC;QAC/C,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;QAErC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC;;IAGtD,WAAW,GAAA;QACjB,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,CAAC,OAAO,KAAI;YACnD,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK;AAC1C,YAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;AAC5B,SAAC,CAAC;;wGAvCO,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAApB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,EARpB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,SAAA,EAAA;YACT,kBAAkB;YAClB,kBAAkB;YAClB,eAAe;YACf,eAAe;YACf,gBAAgB;AACjB,SAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,eAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,cAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EChCH,8qDAkDA,EAAA,MAAA,EAAA,CAAA,gcAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED3BY,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,4BAA4B,EAAA,QAAA,EAAA,2BAAA,EAAA,CAAA,EAAA,CAAA;;4FAW7C,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAbhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,WACnB,CAAC,gBAAgB,EAAE,4BAA4B,CAAC,EAG9C,SAAA,EAAA;wBACT,kBAAkB;wBAClB,kBAAkB;wBAClB,eAAe;wBACf,eAAe;wBACf,gBAAgB;AACjB,qBAAA,EAAA,QAAA,EAAA,8qDAAA,EAAA,MAAA,EAAA,CAAA,gcAAA,CAAA,EAAA;8BAG0B,MAAM,EAAA,CAAA;sBAAhC,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAChB,MAAM,EAAA,CAAA;sBAAd;gBAKD,YAAY,EAAA,CAAA;sBADX,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,cAAc,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;gBAG3C,aAAa,EAAA,CAAA;sBADZ,YAAY;AAAC,gBAAA,IAAA,EAAA,CAAA,eAAe,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;gBAG/C,gBAAgB,EAAA,CAAA;sBADf,YAAY;AAAC,gBAAA,IAAA,EAAA,CAAA,kBAAkB,EAAE,EAAC,MAAM,EAAE,IAAI,EAAC;;;AE5ClD;;AAEG;;ACFH;;AAEG;;;;"}
|