{"version":3,"file":"nw-style-guide-carousel.mjs","sources":["../../../projects/nw-style-guide/carousel/carousel-slide.directive.ts","../../../projects/nw-style-guide/carousel/carousel.component.ts","../../../projects/nw-style-guide/carousel/public-api.ts","../../../projects/nw-style-guide/carousel/nw-style-guide-carousel.ts"],"sourcesContent":["import { Directive, Input, HostBinding } from '@angular/core';\n\n@Directive({\n    selector: '[nwCarouselSlide]',\n    exportAs: 'nw-carousel-slide'\n})\nexport class CarouselSlideDirective {\n    @HostBinding('style.scroll-snap-align')\n    @Input()\n    snapAlign: 'none' | 'start' | 'end' | 'center' = 'start';\n}\n","import {\n    Component,\n    ChangeDetectionStrategy,\n    Input,\n    ElementRef,\n    ViewChild,\n    Renderer2,\n    ChangeDetectorRef,\n    AfterViewInit,\n    OnDestroy,\n    OnInit,\n    Output,\n    EventEmitter,\n    OnChanges,\n    SimpleChanges,\n    ContentChildren,\n    QueryList,\n    AfterContentInit,\n    inject\n} from '@angular/core';\nimport { debounceTime } from 'rxjs/operators';\nimport { CarouselSlideDirective } from './carousel-slide.directive';\nimport { Subscription, fromEvent } from 'rxjs';\nimport { NgStyle, NgClass } from '@angular/common';\n\n@Component({\n    selector: 'nw-carousel',\n    template: `\n        <div class=\"carousel-container\">\n            @if (showPagination && !isFirstPage) {\n                <div class=\"pagination-container\">\n                    <button\n                        class=\"btn btn-carousel btn-carousel-prev\"\n                        (click)=\"prev()\"></button>\n                </div>\n            }\n\n            <ng-content select=\".pagination-left\"></ng-content>\n\n            <div class=\"carousel-content\">\n                @if (showMask && pages.length > 1) {\n                    <div class=\"pagination-masks\">\n                        @if (!isFirstPage) {\n                            <div\n                                class=\"collapse-expand-grid-container collapse-expand-container-start\"\n                                animate.leave=\"collapse-animation\">\n                                <div\n                                    class=\"pagination-mask pagination-mask-start\"\n                                    [ngStyle]=\"maskStyles\"></div>\n                            </div>\n                        }\n\n                        @if (!isFirstPage) {\n                            <div\n                                class=\"collapse-expand-grid-container collapse-expand-container-end\"\n                                animate.leave=\"collapse-animation\">\n                                <div\n                                    class=\"pagination-mask pagination-mask-end\"\n                                    [ngStyle]=\"maskStyles\"></div>\n                            </div>\n                        }\n                    </div>\n                }\n\n                <div\n                    class=\"carousel\"\n                    #carousel\n                    [ngClass]=\"containerClass\">\n                    <ng-content></ng-content>\n\n                    @if (slides.length === 0) {\n                        <p class=\"nw-text text-center\">{{ noResultsText }}</p>\n                    }\n                </div>\n            </div>\n\n            @if (showPagination && !isLastPage) {\n                <div class=\"pagination-container\">\n                    <button\n                        class=\"btn btn-carousel btn-carousel-next\"\n                        (click)=\"next()\"></button>\n                </div>\n            }\n\n            <ng-content select=\".pagination-right\"></ng-content>\n        </div>\n\n        @if (showPageIndicator && pages.length > 1) {\n            <div class=\"page-indicators\">\n                @for (page of pages; track page) {\n                    <a\n                        href=\"javascript:;\"\n                        class=\"page-indicator\"\n                        [class.active]=\"page === currPage\"\n                        (click)=\"goToPage(page)\"></a>\n                }\n            </div>\n        }\n\n        <ng-content select=\".pagination-indicators\"></ng-content>\n    `,\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    exportAs: 'nw-carousel',\n    imports: [NgStyle, NgClass]\n})\nexport class CarouselComponent implements OnInit, AfterViewInit, AfterContentInit, OnChanges, OnDestroy {\n    private _renderer = inject(Renderer2);\n    private _cdRef = inject(ChangeDetectorRef);\n\n    @Input() showPageIndicator: boolean = true;\n    @Input() showPagination: boolean = true;\n    @Input() showMask: boolean = true;\n    @Input() maskColor: string = '#ffffff';\n    @Input() containerClass: string;\n    @Input() currPage: number = 0;\n    @Input() noResultsText: string = 'No results';\n\n    @Output() currPageChange: EventEmitter<number> = new EventEmitter();\n\n    @ViewChild('carousel', { static: true }) carousel: ElementRef;\n\n    @ContentChildren(CarouselSlideDirective) slides: QueryList<CarouselSlideDirective>;\n\n    public pages: number[] = [];\n\n    private _windowResizeSub: Subscription;\n    private _slidesSub: Subscription;\n\n    ngOnInit() {\n        this.subscribeToWindowResize();\n    }\n\n    ngOnChanges(changes: SimpleChanges) {\n        if (changes.currPage && changes.currPage.previousValue !== changes.currPage.currentValue) {\n            this._setScrollPosition(this.currPage);\n        }\n    }\n\n    ngAfterViewInit() {\n        this.updatePages();\n\n        if (this.currPage !== 0) {\n            this._setScrollPosition(this.currPage);\n        }\n    }\n\n    ngAfterContentInit() {\n        this._slidesSub = this.slides.changes.subscribe(res => {\n            this.updatePages();\n        });\n    }\n\n    next() {\n        this.goToPage(Math.min(this.pages.length - 1, this.currPage + 1));\n    }\n\n    prev() {\n        this.goToPage(Math.max(0, this.currPage - 1));\n    }\n\n    goToPage(page: number) {\n        this.currPage = page;\n        this.currPageChange.emit(this.currPage);\n\n        this._setScrollPosition(page);\n    }\n\n    private _setScrollPosition(page: number): void {\n        const carouselWidth: number = this.carouselNativeElement.clientWidth;\n        const newScrollPosition: number = page * carouselWidth;\n\n        this._renderer.setProperty(this.carouselNativeElement, 'scrollLeft', newScrollPosition);\n    }\n\n    getPages() {\n        const estimatedPages: number = +(\n            this.carouselNativeElement.scrollWidth / this.carouselNativeElement.clientWidth\n        ).toFixed(1);\n        const numOfPages: number = Math.ceil(estimatedPages);\n\n        return [...Array(numOfPages).fill(1)].map((_, i) => i);\n    }\n\n    updatePages(): void {\n        this.pages = this.getPages();\n        this._cdRef.detectChanges();\n    }\n\n    get carouselNativeElement(): HTMLDivElement {\n        return this.carousel.nativeElement as HTMLDivElement;\n    }\n\n    get isFirstPage(): boolean {\n        return this.currPage === 0;\n    }\n\n    get isLastPage(): boolean {\n        return this.currPage === this.pages[this.pages.length - 1];\n    }\n\n    get maskStyles() {\n        return {\n            '-webkit-mask-image': `linear-gradient(to left, rgba(0,0,0,0), ${this.maskColor})`,\n            'background-color': `${this.maskColor}`\n        };\n    }\n\n    get maskGradient() {\n        return `linear-gradient(to left, rgba(0,0,0,0), ${this.maskColor})`;\n    }\n\n    subscribeToWindowResize() {\n        this._windowResizeSub = fromEvent(window, 'resize')\n            .pipe(debounceTime(100))\n            .subscribe(_ => {\n                this.goToPage(0);\n                this.updatePages();\n            });\n    }\n\n    ngOnDestroy() {\n        this._windowResizeSub.unsubscribe();\n        this._slidesSub.unsubscribe();\n    }\n}\n","export { CarouselComponent } from './carousel.component';\nexport { CarouselSlideDirective } from './carousel-slide.directive';\n\nimport { CarouselComponent } from './carousel.component';\nimport { CarouselSlideDirective } from './carousel-slide.directive';\n\n/**\n * Export cooperating directives\n * https://v17.angular.io/guide/standalone-components#standalone-components-for-library-authors\n */\nexport const CAROUSEL_DIRECTIVES = [CarouselComponent, CarouselSlideDirective] as const;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}