UNPKG

@serene-dev/ng-carousel

Version:

The library was created to help with Carousel implementations.

1 lines 17.8 kB
{"version":3,"file":"serene-dev-ng-carousel.mjs","sources":["../../../../projects/ng-carousel/src/lib/ng-carousel.component.ts","../../../../projects/ng-carousel/src/lib/ng-carousel.component.html","../../../../projects/ng-carousel/src/public-api.ts","../../../../projects/ng-carousel/src/serene-dev-ng-carousel.ts"],"sourcesContent":["import {\n Component,\n EventEmitter,\n Input,\n Output,\n SimpleChange,\n SimpleChanges,\n TemplateRef,\n computed,\n input,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n/**\n * Vanilla Carousel for Angular\n */\n@Component({\n selector: 'ng-carousel',\n imports: [CommonModule],\n templateUrl: './ng-carousel.component.html',\n styleUrls: ['./ng-carousel.component.scss']\n})\nexport class NgCarouselComponent {\n /**\n * Items to show in the slideshow\n */\n @Input({ required: true }) items?: ICarouselItem[];\n /**\n * Template to show if the items array is empty\n */\n readonly noItemsTemplate = input<TemplateRef<any>>();\n /**\n * It should be set when you select template as an item type. It will be used to render the custom content for the item's slide.\n *\n * A reference of the slide will be sent as a parameter into the template\n */\n readonly customItemTemplate = input<TemplateRef<any>>();\n /**\n * It will be embedded inside the buttons.\n *\n * A reference of the arrow navigation button will be sent as a parameter into the template\n */\n readonly customArrowContentTemplate = input<TemplateRef<any>>();\n /**\n * Number of items to show per view\n */\n readonly numberPerView = input(1);\n /**\n * Use the current index indicators\n */\n readonly useIndicators = input(true);\n /**\n * Use the arrow buttons\n */\n readonly useArrowButtons = input(true);\n /**\n * Automatically play carousel\n */\n @Input() autoplay = true;\n /**\n * Speed of autoplay in milliseconds\n */\n @Input() autoplaySpeed = 2000;\n /**\n * Automatically play videos\n */\n readonly autoplayVideo = input(true);\n /**\n * Make slide show restart at the end of the show\n */\n readonly continuous = input(true);\n /**\n * Custom class on the navigation buttons\n */\n readonly navBtnClass = input<string>();\n /**\n * Custom class for the item label\n */\n readonly labelClass = input<string>();\n /**\n * Pause slider on hover\n */\n @Input() pauseOnHover: boolean = true;\n /**\n * Custom class for the item sublabel\n */\n readonly subLabelClass = input<string>();\n /**\n * Object fit for the items in the slide show\n */\n readonly contentFit = input<'contain' | 'cover'>('cover');\n /**\n * Emitted when the current index changes. The current index and items are emitted.\n */\n @Output() slideChanged = new EventEmitter<{\n index: number;\n currentItems: ICarouselItem[];\n }>();\n\n /**\n * The current index.\n */\n protected readonly currentIndex = signal(0);\n /**\n * Group of items\n */\n protected readonly itemsGroup = signal<{ isActive?: boolean; group: ICarouselItem[] }[]>([]);\n protected readonly hasItemsGroup = computed(() => this.itemsGroup()?.length > 0);\n protected readonly itemsGroupLength = computed(() => this.itemsGroup()?.length);\n protected readonly disableNext = computed(() => {\n const currentIndex = this.currentIndex(),\n itemsGroupLength = this.itemsGroupLength(),\n continuous = this.continuous();\n return currentIndex == itemsGroupLength && !continuous;\n });\n\n protected intervaler?: any;\n\n protected onHover = false;\n\n protected ngOnChanges(changes: {\n [x in keyof NgCarouselComponent]: SimpleChange;\n }): void {\n this.calculateGroup();\n // debugger\n // if(changes.items.)\n // this.items?.forEach((item) => {\n // if (item.type == 'template' && !this.customItemTemplate)\n // throw (\n // item.src +\n // ` needs a custom template because the item type is template`\n // );\n // });\n this.resetInterval();\n }\n\n protected resetInterval() {\n if (this.intervaler) clearInterval(this.intervaler);\n if (this.autoplay)\n this.intervaler = setInterval(() => {\n if (!this.onHover) this.next();\n }, this.autoplaySpeed);\n }\n\n protected ngOnDestroy(): void {\n if (this.intervaler) clearInterval(this.intervaler);\n }\n\n protected handleMouseOver() {\n if (this.pauseOnHover) this.onHover = true;\n }\n protected handleMouseOut() {\n if (this.pauseOnHover) this.onHover = false;\n }\n\n protected calculateGroup() {\n const numberPerView = this.numberPerView();\n if (this.items)\n this.itemsGroup.set(\n new Array(Math.ceil((this.items.length || 0) / (numberPerView || 1)))\n .fill(null)\n .map((x, index) => {\n const end = index * (numberPerView || 1) + (numberPerView || 1);\n // debugger;\n return {\n group: this.items!.slice(\n index * (numberPerView || 1),\n index * (numberPerView || 1) + (numberPerView || 1),\n ),\n };\n }),\n );\n else this.itemsGroup.set([]);\n\n // debugger;\n }\n\n /**\n * Show the next slide\n */\n next() {\n const currentIndex = this.currentIndex();\n if (this.itemsGroupLength() > currentIndex + 1) this.currentIndex.set(currentIndex + 1);\n else if (this.continuous()) this.currentIndex.set(0);\n this.slideChanged.emit({\n index: this.currentIndex(),\n currentItems: this.itemsGroup()[this.currentIndex()]?.group,\n });\n }\n\n /**\n * Show the previous slide\n */\n previous() {\n const currentIndex = this.currentIndex();\n if (this.itemsGroupLength() > currentIndex + 1) this.currentIndex.set(currentIndex - 1);\n else if (this.continuous()) this.currentIndex.set(this.itemsGroupLength() - 1);\n this.slideChanged.emit({\n index: this.currentIndex(),\n currentItems: this.itemsGroup()[this.currentIndex()]?.group,\n });\n }\n\n /**Set the current index directly */\n setCurrentIndex(index: number) {\n if (this.itemsGroup()?.length > index) this.currentIndex.set(index);\n }\n}\n\n/**\n * Carousel Item config\n */\nexport interface ICarouselItem<TData = any> {\n /**\n * Path to slide content\n */\n src?: string;\n /**\n * Item label\n */\n label?: string;\n /**\n * Item sub label\n */\n subLabel?: string;\n /**\n * Content type.\n *\n * Choose template to use custom html content in the slides.\n * @default \"image\"\n */\n type?: 'image' | 'video' | 'template';\n /**The contextual data to pass with the slide when using a custom slide template */\n data?: TData;\n}\n","@if (hasItemsGroup()) {\n <div class=\"ng-carousel\" (mouseover)=\"handleMouseOver()\" (mouseout)=\"handleMouseOut()\" #cont>\n @for (group of itemsGroup(); track group; let index = $index) {\n <div class=\"ng-carousel-item-group\" [hidden]=\"currentIndex() != index\">\n @for (item of group.group; track item) {\n <div class=\"ng-carousel-item\" [style.width.px]=\"cont.offsetWidth / numberPerView()\">\n @switch (item.type) {\n @case ('template') {\n <ng-container\n *ngTemplateOutlet=\"customItemTemplate()!; context: { $implicit: item }\"\n />\n }\n @case ('video') {\n <video\n src=\"{{ item.src }}\"\n [autoplay]=\"autoplayVideo()\"\n [controls]=\"false\"\n attr.aria-label=\"{{ item.label || 'slide ' }}\"\n class=\"{{ contentFit() }}\"\n ></video>\n }\n @default {\n <img\n src=\"{{ item.src }}\"\n attr.aria-label=\"{{ item.label || 'slide ' }}\"\n class=\"{{ contentFit() }}\"\n />\n }\n }\n @if (item.label) {\n <div class=\"ng-carousel-label-cont {{ labelClass() }}\">\n <div>\n <div class=\"ng-carousel-label\">{{ item.label }}</div>\n @if (item.subLabel) {\n <div class=\"ng-carousel-sub-label {{ subLabelClass() }} \">\n {{ item.subLabel }}\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n @if (useIndicators()) {\n <div class=\"indicators\">\n @for (item of itemsGroup(); track item; let index = $index) {\n <div\n (click)=\"setCurrentIndex(index)\"\n class=\"indicator-item\"\n [ngClass]=\"{ active: currentIndex() == index }\"\n ></div>\n }\n </div>\n }\n @if (useArrowButtons()) {\n <div class=\"nav-btn-cont left\">\n <button\n (click)=\"previous();resetInterval()\"\n #btnLeft\n [disabled]=\"currentIndex() == 0\"\n class=\"nav-btn left {{ navBtnClass() }}\"\n >\n @if (customArrowContentTemplate()) {\n <ng-container\n *ngTemplateOutlet=\"\n customArrowContentTemplate();\n context: { $implicit: { isBack: true, isForward: false } }\n \"\n />\n } @else {\n <\n }\n </button>\n </div>\n <div class=\"nav-btn-cont right\">\n <button\n (click)=\"next();resetInterval()\"\n #btnRight\n [disabled]=\"disableNext()\"\n class=\"nav-btn {{ navBtnClass() }}\"\n >\n @if (customArrowContentTemplate()) {\n <ng-container\n *ngTemplateOutlet=\"\n customArrowContentTemplate();\n context: { $implicit: { isBack: false, isForward: true } }\n \"\n />\n } @else {\n >\n }\n </button>\n </div>\n }\n </div>\n} @else {\n <ng-template [ngTemplateOutlet]=\"noItemsTemplate() || _noItemsTemplate\"></ng-template>\n}\n\n<ng-template #_noItemsTemplate> There are no items to show </ng-template>\n<!-- <div>{{ currentIndex }}</div> -->\n","/*\n * Public API Surface of ng-carousel\n */\n \nexport * from './lib/ng-carousel.component'; \n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}