UNPKG

rm-image-slider

Version:

Angular Image slider with lightbox. An Angular responsive image slider with lightbox popup. Also support youtube url, image base64 string and mp4 video urls and base64 string.

1 lines 71 kB
{"version":3,"file":"rm-image-slider.mjs","sources":["../../../projects/rm-image-slider/src/lib/rm-image-slider.service.ts","../../../projects/rm-image-slider/src/lib/slider-custom-image/slider-custom-image.component.ts","../../../projects/rm-image-slider/src/lib/slider-custom-image/slider-custom-image.component.html","../../../projects/rm-image-slider/src/lib/slider-lightbox/slider-lightbox.component.ts","../../../projects/rm-image-slider/src/lib/slider-lightbox/slider-lightbox.component.html","../../../projects/rm-image-slider/src/lib/rm-image-slider.component.ts","../../../projects/rm-image-slider/src/lib/rm-image-slider.component.html","../../../projects/rm-image-slider/src/public-api.ts","../../../projects/rm-image-slider/src/rm-image-slider.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\nconst DESC = 'DESC',\n ASC = 'ASC';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class RmImageSliderService {\n constructor() {}\n\n isBase64(str: string) {\n var base64regex =\n /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/;\n return base64regex.test(str);\n }\n\n base64FileExtension(str: string) {\n return str.substring('data:image/'.length, str.indexOf(';base64'));\n }\n\n // orderArray(arr = [], orderType = ASC) {\n // if (arr?.length && orderType) {\n // return arr.sort((ob1: any, ob2: any) => {\n // if (ob1['order'] === null || !ob1['order']) {\n // return 1;\n // } else if (ob2['order'] === null || !ob2['order']) {\n // return -1;\n // } else if (ob1['order'] > ob2['order']) {\n // if (orderType === DESC) {\n // return -1;\n // } else {\n // return 1;\n // }\n // } else if (ob1['order'] < ob2['order']) {\n // if (orderType === DESC) {\n // return 1;\n // } else {\n // return -1;\n // }\n // }\n // });\n // }\n // return arr;\n // }\n\n orderArray(arr = [], orderType = ASC) {\n if (arr?.length && orderType) {\n return arr.sort((ob1: any, ob2: any) => {\n // Handle potential undefined 'order' properties\n const order1 = ob1['order'];\n const order2 = ob2['order'];\n\n // Ensure consistent sorting for undefined/null 'order' values\n if (order1 === null || order1 === undefined) {\n return 1; // Place elements with undefined or null 'order' at the end\n } else if (order2 === null || order2 === undefined) {\n return -1; // Place elements with undefined or null 'order' at the beginning\n } else {\n // Apply ascending or descending order based on 'orderType'\n return orderType === DESC\n ? order2 - order1 // Reverse for descending order\n : order1 - order2; // Maintain for ascending order\n }\n });\n }\n\n return arr; // Return the original array if conditions are not met\n }\n}\n","import {\n Component,\n Input,\n OnChanges,\n SimpleChanges,\n Inject,\n} from '@angular/core';\nimport { CommonModule, DOCUMENT } from '@angular/common';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\nimport { RmImageSliderService } from './../rm-image-slider.service';\n\nconst youtubeRegExp =\n /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|\\&v=|\\?v=)([^#\\&\\?]*).*/,\n validFileExtensions = ['jpeg', 'jpg', 'gif', 'png'],\n validVideoExtensions = ['mp4'];\n\n@Component({\n selector: 'custom-img',\n imports: [CommonModule],\n templateUrl: './slider-custom-image.component.html',\n styleUrl: './slider-custom-image.component.css'\n})\nexport class SliderCustomImageComponent implements OnChanges {\n YOUTUBE = 'youtube';\n IMAGE = 'image';\n VIDEO = 'video';\n fileUrl: SafeResourceUrl = '';\n fileExtension = '';\n type = this.IMAGE;\n imageLoading: boolean = true;\n\n // @inputs\n @Input() showVideo: boolean = false;\n @Input() videoAutoPlay: boolean = false;\n @Input() showVideoControls: number = 1;\n @Input() currentImageIndex!: number;\n @Input() imageIndex!: number;\n @Input() speed: number = 1;\n @Input() imageUrl: any;\n @Input() isVideo = false;\n @Input() alt: String = '';\n @Input() title: String = '';\n @Input() direction: string = 'ltr';\n @Input() ratio: boolean = false;\n @Input() lazy: boolean = false;\n\n constructor(\n public imageSliderService: RmImageSliderService,\n private sanitizer: DomSanitizer,\n @Inject(DOCUMENT) document: Document\n ) {}\n\n ngOnChanges(changes: SimpleChanges) {\n if (\n this['imageUrl'] &&\n typeof this['imageUrl'] === 'string' &&\n ((changes['imageUrl'] && changes['imageUrl'].firstChange) ||\n this.videoAutoPlay)\n ) {\n this.setUrl();\n }\n }\n\n setUrl() {\n const url = this.imageUrl;\n this.imageLoading = true;\n this.fileUrl = this.sanitizer.bypassSecurityTrustResourceUrl(url);\n this.fileExtension = url.split('.').pop().split(/\\#|\\?/)[0];\n if (\n this.imageSliderService.base64FileExtension(url) &&\n (validFileExtensions.indexOf(\n this.imageSliderService.base64FileExtension(url).toLowerCase()\n ) > -1 ||\n validVideoExtensions.indexOf(\n this.imageSliderService.base64FileExtension(url).toLowerCase()\n ) > -1)\n ) {\n this.fileExtension = this.imageSliderService.base64FileExtension(url);\n }\n // verify for youtube url\n const match = url.match(youtubeRegExp);\n if (match && match[2].length === 11) {\n if (this.showVideo) {\n this.type = this.YOUTUBE;\n this.fileUrl = this.sanitizer.bypassSecurityTrustResourceUrl(\n `${'https://www.youtube.com/embed/'}${match[2]}${\n this.videoAutoPlay\n ? '?autoplay=1&enablejsapi=1'\n : '?autoplay=0&enablejsapi=1'\n }${'&controls='}${this.showVideoControls}`\n );\n } else {\n this.type = this.IMAGE;\n this.fileUrl = this.sanitizer.bypassSecurityTrustResourceUrl(\n `https://img.youtube.com/vi/${match[2]}/0.jpg`\n );\n }\n } else if (\n this.fileExtension &&\n validFileExtensions.indexOf(this.fileExtension.toLowerCase()) > -1\n ) {\n this.type = this.IMAGE;\n } else if (\n this.fileExtension &&\n validVideoExtensions.indexOf(this.fileExtension.toLowerCase()) > -1\n ) {\n this.type = this.VIDEO;\n if (\n this.videoAutoPlay &&\n document.getElementById(`video_${this.imageIndex}`)\n ) {\n const videoObj: any = document.getElementById(\n `video_${this.imageIndex}`\n );\n setTimeout(() => {\n videoObj.play();\n }, this.speed * 1000);\n }\n }\n }\n\n videoClickHandler(event: any) {\n if (event && event.srcElement && !this.showVideoControls) {\n if (event.srcElement.paused) {\n event.srcElement.play();\n } else {\n event.srcElement.pause();\n }\n }\n }\n}\n","@if (fileUrl) {\n <div class=\"custom-image-main\" [ngClass]=\"{'ng-fullimage-loading': imageLoading}\">\n @if (type === IMAGE && fileUrl) {\n <img class=\"image\" (load)=\"imageLoading = false\" [ngClass]=\"{'ratio': ratio}\"\n [src]=\"fileUrl\" [alt]=\"alt\" [title]=\"title\" [attr.loading]=\"lazy == true ? 'lazy' : null\">\n }\n @if (type === YOUTUBE && fileUrl) {\n <iframe class=\"youtube\" [src]=\"fileUrl\"\n [attr.loading]=\"lazy == true ? 'lazy' : null\" frameborder=\"0\" allow=\"autoplay\" allowfullscreen></iframe>\n }\n @if (type === VIDEO) {\n <video class=\"video\" [id]=\"'video_' + imageIndex\" [ngClass]=\"{'ratio': ratio}\" (click)=\"videoClickHandler($event)\"\n [autoplay]=\"videoAutoPlay\" type=\"video/mp4\"\n [attr.controls]=\"showVideoControls ? showVideoControls : null\" controlsList=\"nodownload\">\n <source [src]=\"fileUrl\" type=\"video/mp4\">\n Your browser does not support the video tag.\n </video>\n }\n @if (!fileUrl) {\n <div [dir]=\"direction\" class=\"invalid-msg\">Invalid file format</div>\n }\n @if (type === YOUTUBE || type === VIDEO || isVideo) {\n <span class=\"youtube-icon\"></span>\n }\n </div>\n}","import {\n ChangeDetectorRef,\n Component,\n OnInit,\n OnChanges,\n SimpleChanges,\n Inject,\n AfterViewInit,\n OnDestroy,\n Input,\n Output,\n EventEmitter,\n ViewChild,\n HostListener,\n ElementRef,\n} from '@angular/core';\nimport { CommonModule, DOCUMENT } from '@angular/common';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { SliderCustomImageComponent } from '../slider-custom-image/slider-custom-image.component';\nimport { ImageObject } from '../interface';\n\nconst LIGHTBOX_NEXT_ARROW_CLICK_MESSAGE = 'lightbox next',\n LIGHTBOX_PREV_ARROW_CLICK_MESSAGE = 'lightbox previous';\n\n@Component({\n selector: 'slider-lightbox',\n imports: [CommonModule, SliderCustomImageComponent],\n templateUrl: './slider-lightbox.component.html',\n styleUrl: './slider-lightbox.component.css'\n})\nexport class SliderLightboxComponent\n implements OnInit, AfterViewInit, OnDestroy\n{\n totalImages: number = 0;\n nextImageIndex: number = -1;\n popupWidth: number = 1200;\n marginLeft: number = 0;\n imageFullscreenView: boolean = false;\n lightboxPrevDisable: boolean = false;\n lightboxNextDisable: boolean = false;\n showLoading: boolean = true;\n effectStyle: string = 'none';\n speed: number = 1; // default speed in second\n title: string = '';\n currentImageIndex: number = 0;\n\n // for swipe event\n private swipeLightboxImgCoord?: [number, number];\n private swipeLightboxImgTime?: number;\n\n @ViewChild('lightboxDiv', { static: false }) lightboxDiv!: ElementRef;\n @ViewChild('lightboxImageDiv', { static: false })\n lightboxImageDiv!: ElementRef;\n\n // @Inputs\n @Input() images: Array<ImageObject> = [];\n @Input()\n set imageIndex(index: number) {\n if (index !== undefined && index > -1 && index < this.images.length) {\n this.currentImageIndex = index;\n }\n this.nextPrevDisable();\n }\n @Input()\n set show(visiableFlag: boolean) {\n this.imageFullscreenView = visiableFlag;\n this.elRef.nativeElement.ownerDocument.body.style.overflow = '';\n if (visiableFlag === true) {\n this.elRef.nativeElement.ownerDocument.body.style.overflow = 'hidden';\n // this.getImageData();\n this.setPopupSliderWidth();\n }\n }\n @Input() videoAutoPlay: boolean = false;\n @Input() direction: string = 'ltr';\n @Input() paginationShow: boolean = false;\n @Input()\n set animationSpeed(data: number) {\n if (data && typeof data === 'number' && data >= 0.1 && data <= 5) {\n this.speed = data;\n }\n }\n @Input() infinite: boolean = false;\n @Input() arrowKeyMove: boolean = true;\n @Input() showVideoControls: boolean = true;\n\n // @Output\n @Output() close = new EventEmitter<any>();\n @Output() prevImage = new EventEmitter<any>();\n @Output() nextImage = new EventEmitter<any>();\n\n @HostListener('window:resize', ['$event'])\n onResize(event: any) {\n this.effectStyle = 'none';\n this.setPopupSliderWidth();\n }\n @HostListener('document:keyup', ['$event'])\n handleKeyboardEvent(event: KeyboardEvent) {\n if (event && event.key && this.arrowKeyMove) {\n if (event.key.toLowerCase() === 'arrowright') {\n this.nextImageLightbox();\n }\n\n if (event.key.toLowerCase() === 'arrowleft') {\n this.prevImageLightbox();\n }\n\n if (event.key.toLowerCase() === 'escape') {\n this.closeLightbox();\n }\n }\n }\n\n constructor(\n private cdRef: ChangeDetectorRef,\n private sanitizer: DomSanitizer,\n private elRef: ElementRef,\n @Inject(DOCUMENT) private document: any\n ) {}\n\n ngOnInit() {}\n\n ngAfterViewInit() {}\n\n ngOnDestroy() {\n this.resetState();\n }\n\n setPopupSliderWidth() {\n if (window && window.innerWidth) {\n this.popupWidth = window.innerWidth;\n this.totalImages = this.images.length;\n if (\n typeof this.currentImageIndex === 'number' &&\n this.currentImageIndex !== undefined\n ) {\n this.marginLeft = -1 * this.popupWidth * this.currentImageIndex;\n this.getImageData();\n this.nextPrevDisable();\n setTimeout(() => {\n this.showLoading = false;\n }, 500);\n }\n }\n }\n\n closeLightbox() {\n this.close.emit();\n }\n\n prevImageLightbox() {\n this.effectStyle = `all ${this.speed}s ease-in-out`;\n if (this.currentImageIndex > 0 && !this.lightboxPrevDisable) {\n this.currentImageIndex--;\n this.prevImage.emit(LIGHTBOX_PREV_ARROW_CLICK_MESSAGE);\n this.marginLeft = -1 * this.popupWidth * this.currentImageIndex;\n this.getImageData();\n this.nextPrevDisable();\n }\n }\n\n nextImageLightbox() {\n this.effectStyle = `all ${this.speed}s ease-in-out`;\n if (\n this.currentImageIndex < this.images.length - 1 &&\n !this.lightboxNextDisable\n ) {\n this.currentImageIndex++;\n this.nextImage.emit(LIGHTBOX_NEXT_ARROW_CLICK_MESSAGE);\n this.marginLeft = -1 * this.popupWidth * this.currentImageIndex;\n this.getImageData();\n this.nextPrevDisable();\n }\n }\n\n nextPrevDisable() {\n this.lightboxNextDisable = true;\n this.lightboxPrevDisable = true;\n setTimeout(() => {\n this.applyButtonDisableCondition();\n }, this.speed * 1000);\n }\n\n applyButtonDisableCondition() {\n this.lightboxNextDisable = false;\n this.lightboxPrevDisable = false;\n if (!this.infinite && this.currentImageIndex >= this.images.length - 1) {\n this.lightboxNextDisable = true;\n }\n if (!this.infinite && this.currentImageIndex <= 0) {\n this.lightboxPrevDisable = true;\n }\n }\n\n getImageData() {\n if (\n this.images &&\n this.images.length &&\n typeof this.currentImageIndex === 'number' &&\n this.currentImageIndex !== undefined &&\n this.images[this.currentImageIndex] &&\n (this.images[this.currentImageIndex]['image'] ||\n this.images[this.currentImageIndex]['video'])\n ) {\n this.title = this.images[this.currentImageIndex]['title'] || '';\n this.totalImages = this.images.length;\n for (const iframeI in this.document.getElementsByTagName('iframe')) {\n if (\n this.document.getElementsByTagName('iframe')[iframeI] &&\n this.document.getElementsByTagName('iframe')[iframeI].contentWindow &&\n this.document.getElementsByTagName('iframe')[iframeI].contentWindow\n .postMessage\n ) {\n this.document\n .getElementsByTagName('iframe')\n [iframeI].contentWindow.postMessage(\n '{\"event\":\"command\",\"func\":\"pauseVideo\",\"args\":\"\"}',\n '*'\n );\n }\n }\n for (const videoI in this.document.getElementsByTagName('video')) {\n if (\n this.document.getElementsByTagName('video')[videoI] &&\n this.document.getElementsByTagName('video')[videoI].pause\n ) {\n this.document.getElementsByTagName('video')[videoI].pause();\n }\n }\n }\n }\n\n resetState() {\n this.images = [];\n }\n\n swipeLightboxImg(e: TouchEvent, when: string): void {\n const coord: [number, number] = [\n e.changedTouches[0].pageX,\n e.changedTouches[0].pageY,\n ];\n const time = new Date().getTime();\n\n if (when === 'start') {\n this.swipeLightboxImgCoord = coord;\n this.swipeLightboxImgTime = time;\n } else if (\n when === 'end' &&\n this.swipeLightboxImgCoord &&\n this.swipeLightboxImgTime\n ) {\n const direction = [\n coord[0] - this.swipeLightboxImgCoord[0],\n coord[1] - this.swipeLightboxImgCoord[1],\n ];\n const duration = time - this.swipeLightboxImgTime;\n\n if (\n duration < 1000 && //\n Math.abs(direction[0]) > 30 && // Long enough\n Math.abs(direction[0]) > Math.abs(direction[1] * 3)\n ) {\n // Horizontal enough\n if (direction[0] < 0) {\n this.nextImageLightbox();\n } else {\n this.prevImageLightbox();\n }\n }\n }\n }\n}\n","@if (imageFullscreenView) {\n <div class=\"ng-image-fullscreen-view\">\n <div class=\"lightbox-wrapper\">\n <a class=\"close\" (click)=\"closeLightbox()\"></a>\n <div class=\"lightbox-div\" #lightboxDiv>\n @if (showLoading) {\n <div class=\"pre-loader\">\n <div class=\"mnml-spinner\"></div>\n </div>\n }\n <div class=\"lightbox-image-main\"\n [ngStyle]=\"{'margin-left': marginLeft + 'px', 'grid-template-columns': 'repeat('+images.length+',1fr)', 'transition': effectStyle}\">\n @for (img of images; track img; let i = $index) {\n <div class=\"lightbox-image\" [ngStyle]=\"{'width': popupWidth + 'px'}\"\n [attr.id]=\"'ng-lightbox-image-' + i\" (touchstart)=\"swipeLightboxImg($event, 'start')\"\n (touchend)=\"swipeLightboxImg($event, 'end')\" #lightboxImageDiv>\n <div class=\"close-outside\" (click)=\"!img?.video && closeLightbox()\"></div>\n <custom-img [imageUrl]=\"img?.image || img?.video\" [isVideo]=\"!!(img?.posterImage || img?.video)\"\n [currentImageIndex]=\"currentImageIndex\" [imageIndex]=\"i\" [speed]=\"speed\"\n [videoAutoPlay]=\"videoAutoPlay && i == currentImageIndex\" [showVideoControls]=\"showVideoControls ? 1 : 0\"\n [alt]=\"img?.alt || img?.title || ''\" [title]=\"img?.title || img?.alt || ''\" [showVideo]=\"true\"\n [direction]=\"direction\">\n </custom-img>\n </div>\n }\n </div>\n <div [dir]=\"direction\" [ngClass]=\"{'show': title, 'hide': !title}\" class=\"caption\">{{ title }}</div>\n @if (images.length > 1) {\n <a [ngClass]=\"{'disable': lightboxPrevDisable}\" class=\"prev icons prev-icon\"\n (click)=\"prevImageLightbox()\">&lsaquo;</a>\n }\n @if (images.length > 1) {\n <a [ngClass]=\"{'disable': lightboxNextDisable}\" class=\"next icons next-icon\"\n (click)=\"nextImageLightbox()\">&rsaquo;</a>\n }\n </div>\n </div>\n @if (paginationShow) {\n <div class=\"popup-pagination\">{{currentImageIndex + 1}} of {{totalImages}}</div>\n }\n </div>\n}","import {\n ChangeDetectorRef,\n Component,\n OnInit,\n OnChanges,\n DoCheck,\n SimpleChanges,\n SimpleChange,\n AfterViewInit,\n OnDestroy,\n Input,\n Output,\n EventEmitter,\n ViewEncapsulation,\n ViewChild,\n HostListener,\n PLATFORM_ID,\n Inject,\n ElementRef,\n} from '@angular/core';\n\nimport { CommonModule, isPlatformBrowser, isPlatformServer } from '@angular/common';\nimport { RmImageSliderService } from './rm-image-slider.service';\nimport { SliderLightboxComponent } from './slider-lightbox/slider-lightbox.component';\nimport { SliderCustomImageComponent } from './slider-custom-image/slider-custom-image.component';\nimport { ImageObject } from './interface';\n\nconst NEXT_ARROW_CLICK_MESSAGE = 'next',\n PREV_ARROW_CLICK_MESSAGE = 'previous';\n\n@Component({\n selector: 'rm-image-slider',\n imports: [CommonModule, SliderLightboxComponent, SliderCustomImageComponent],\n templateUrl: './rm-image-slider.component.html',\n styleUrls: ['./rm-image-slider.component.scss'],\n encapsulation: ViewEncapsulation.None\n})\nexport class RmImageSliderComponent\n implements OnChanges, OnInit, DoCheck, AfterViewInit, OnDestroy\n{\n // for slider\n sliderMainDivWidth: number = 0;\n imageParentDivWidth: number = 0;\n imageObj: Array<ImageObject> = [];\n ligthboxImageObj: Array<ImageObject> = [];\n totalImages: number = 0;\n leftPos: number = 0;\n effectStyle: string = 'all 1s ease-in-out';\n speed: number = 1; // default speed in second\n sliderPrevDisable: boolean = false;\n sliderNextDisable: boolean = false;\n slideImageCount: number = 1;\n sliderImageWidth: number = 205;\n sliderImageReceivedWidth: number | string = 205;\n sliderImageHeight: number = 200;\n sliderImageReceivedHeight: number | string = 205;\n sliderImageSizeWithPadding = 211;\n autoSlideCount: number = 0;\n stopSlideOnHover: boolean = true;\n autoSlideInterval: any;\n showArrowButton: boolean = true;\n textDirection: string = 'ltr';\n imageMargin: number = 3;\n sliderOrderType: string = 'ASC';\n\n // for swipe event\n private swipeCoord?: [number, number];\n private swipeTime?: number;\n\n // for lightbox\n ligthboxShow: boolean = false;\n activeImageIndex: number = -1;\n visiableImageIndex: number = 0;\n\n @ViewChild('sliderMain', { static: false }) sliderMain: any;\n @ViewChild('imageDiv', { static: false }) imageDiv: any;\n\n // @inputs\n @Input()\n set imageSize(data: any) {\n if (data && typeof data === 'object') {\n if (\n data.hasOwnProperty('space') &&\n typeof data['space'] === 'number' &&\n data['space'] > -1\n ) {\n this.imageMargin = data['space'];\n }\n if (\n data.hasOwnProperty('width') &&\n (typeof data['width'] === 'number' || typeof data['width'] === 'string')\n ) {\n this.sliderImageReceivedWidth = data['width'];\n // this.sliderImageSizeWithPadding = data['width'] + (this.imageMargin * 2); // addeing padding with image width\n }\n if (\n data.hasOwnProperty('height') &&\n (typeof data['height'] === 'number' ||\n typeof data['height'] === 'string')\n ) {\n this.sliderImageReceivedHeight = data['height'];\n }\n }\n }\n @Input() infinite: boolean = false;\n @Input() imagePopup: boolean = true;\n @Input()\n set direction(dir: string) {\n if (dir) {\n this.textDirection = dir;\n }\n }\n @Input()\n set animationSpeed(data: number) {\n if (data && typeof data === 'number' && data >= 0.1 && data <= 5) {\n this.speed = data;\n this.effectStyle = `all ${this.speed}s ease-in-out`;\n }\n }\n @Input() images: Array<object> = [];\n @Input() set slideImage(count: any) {\n if (count && typeof count === 'number') {\n this.slideImageCount = Math.round(count);\n }\n }\n @Input() set autoSlide(count: any) {\n if (\n count &&\n (typeof count === 'number' ||\n typeof count === 'boolean' ||\n typeof count === 'object')\n ) {\n if (typeof count === 'number' && count >= 1 && count <= 5) {\n count = Math.round(count);\n } else if (typeof count === 'boolean') {\n count = 1;\n } else if (\n typeof count === 'object' &&\n count.hasOwnProperty('interval') &&\n Math.round(count['interval']) &&\n Math.round(count['interval']) >= 1 &&\n Math.round(count['interval']) <= 5\n ) {\n this.stopSlideOnHover = count.hasOwnProperty('stopOnHover')\n ? count['stopOnHover']\n : true;\n count = Math.round(count['interval']);\n }\n this.autoSlideCount = count * 1000;\n }\n }\n @Input() set showArrow(flag: any) {\n if (flag !== undefined && typeof flag === 'boolean') {\n this.showArrowButton = flag;\n }\n }\n\n @Input() set orderType(data: string) {\n if (data !== undefined && typeof data === 'string') {\n this.sliderOrderType = data.toUpperCase();\n }\n }\n @Input() videoAutoPlay: boolean = false;\n @Input() paginationShow: boolean = false;\n @Input() arrowKeyMove: boolean = true;\n @Input() manageImageRatio: boolean = false;\n @Input() showVideoControls: boolean = true;\n @Input() set defaultActiveImage(activeIndex: number) {\n if (typeof activeIndex === 'number' && activeIndex > -1) {\n this.activeImageIndex = activeIndex;\n }\n }\n @Input() lazyLoading: boolean = false;\n\n // @Outputs\n @Output() imageClick = new EventEmitter<number>();\n @Output() arrowClick = new EventEmitter<object>();\n @Output() lightboxArrowClick = new EventEmitter<object>();\n @Output() lightboxClose = new EventEmitter<object>();\n\n @HostListener('window:resize', ['$event'])\n onResize(event: any) {\n this.setSliderWidth();\n }\n @HostListener('document:keyup', ['$event'])\n handleKeyboardEvent(event: KeyboardEvent) {\n if (event && event.key) {\n if (\n event.key.toLowerCase() === 'arrowright' &&\n !this.ligthboxShow &&\n this.arrowKeyMove\n ) {\n this.next();\n }\n\n if (\n event.key.toLowerCase() === 'arrowleft' &&\n !this.ligthboxShow &&\n this.arrowKeyMove\n ) {\n this.prev();\n }\n\n if (event.key.toLowerCase() === 'escape' && this.ligthboxShow) {\n this.close();\n }\n }\n }\n\n constructor(\n private cdRef: ChangeDetectorRef,\n @Inject(PLATFORM_ID) private platformId: Object,\n public imageSliderService: RmImageSliderService,\n private elRef: ElementRef // @Inject(ElementRef) private _elementRef: ElementRef\n ) {}\n\n ngOnInit() {\n // @TODO: for future use\n // console.log(this._elementRef)\n\n // for slider\n if (this.infinite) {\n this.effectStyle = 'none';\n this.leftPos =\n -1 * this.sliderImageSizeWithPadding * this.slideImageCount;\n for (let i = 1; i <= this.slideImageCount; i++) {\n this.imageObj.unshift(this.imageObj[this.imageObj.length - i]);\n }\n }\n }\n\n // for slider\n ngAfterViewInit() {\n this.setSliderWidth();\n this.cdRef.detectChanges();\n if (isPlatformBrowser(this.platformId)) {\n this.imageAutoSlide();\n }\n }\n\n ngOnDestroy() {\n if (this.autoSlideInterval) {\n clearInterval(this.autoSlideInterval);\n }\n if (this.ligthboxShow === true) {\n this.close();\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (\n changes['images'] &&\n changes['images'].hasOwnProperty('previousValue') &&\n changes['images'].hasOwnProperty('currentValue') &&\n changes['images'].previousValue != changes['images'].currentValue\n ) {\n this.setSliderImages(changes['images'].currentValue);\n }\n if (changes && changes['imageSize']) {\n const size: SimpleChange = changes['imageSize'];\n if (\n size &&\n size.previousValue &&\n size.currentValue &&\n size.previousValue.width &&\n size.previousValue.height &&\n size.currentValue.width &&\n size.currentValue.height &&\n (size.previousValue.width !== size.currentValue.width ||\n size.previousValue.height !== size.currentValue.height)\n ) {\n this.setSliderWidth();\n }\n }\n }\n\n ngDoCheck() {\n if (\n this.images &&\n this.ligthboxImageObj &&\n this.images.length !== this.ligthboxImageObj.length\n ) {\n this.setSliderImages(this.images);\n }\n }\n\n setSliderImages(imgObj: any) {\n if (imgObj && imgObj instanceof Array && imgObj.length) {\n // const sliderOrderEnable = imgObj.find((img: any) => {\n // if (img.hasOwnProperty('order')) {\n // return true;\n // }\n // });\n const sliderOrderEnable =\n imgObj.find((img: any) => {\n return img.order !== undefined;\n }) !== undefined;\n\n if (sliderOrderEnable) {\n imgObj = this.imageSliderService.orderArray(\n imgObj as [],\n this.sliderOrderType.toUpperCase()\n );\n }\n\n this.imageObj = imgObj.map((img: any, index: any) => {\n img['index'] = index;\n return img;\n });\n this.ligthboxImageObj = [...this.imageObj];\n this.totalImages = this.imageObj.length;\n // this.imageParentDivWidth = imgObj.length * this.sliderImageSizeWithPadding;\n } else {\n this.imageObj = [];\n this.ligthboxImageObj = [];\n this.totalImages = 0;\n this.imageParentDivWidth = 0;\n this.activeImageIndex = 0;\n }\n\n this.setSliderWidth();\n }\n\n setSliderWidth() {\n if (\n this.sliderMain &&\n this.sliderMain.nativeElement &&\n this.sliderMain.nativeElement.offsetWidth\n ) {\n this.sliderMainDivWidth = this.sliderMain.nativeElement.offsetWidth;\n }\n\n if (this.sliderMainDivWidth && this.sliderImageReceivedWidth) {\n if (typeof this.sliderImageReceivedWidth === 'number') {\n this.sliderImageWidth = this.sliderImageReceivedWidth;\n } else if (typeof this.sliderImageReceivedWidth === 'string') {\n if (this.sliderImageReceivedWidth.indexOf('px') >= 0) {\n this.sliderImageWidth = parseFloat(this.sliderImageReceivedWidth);\n } else if (this.sliderImageReceivedWidth.indexOf('%') >= 0) {\n this.sliderImageWidth = +(\n (this.sliderMainDivWidth *\n parseFloat(this.sliderImageReceivedWidth)) /\n 100\n ).toFixed(2);\n } else if (parseFloat(this.sliderImageReceivedWidth)) {\n this.sliderImageWidth = parseFloat(this.sliderImageReceivedWidth);\n }\n }\n }\n if (isPlatformBrowser(this.platformId)) {\n if (window && window.innerHeight && this.sliderImageReceivedHeight) {\n if (typeof this.sliderImageReceivedHeight === 'number') {\n this.sliderImageHeight = this.sliderImageReceivedHeight;\n } else if (typeof this.sliderImageReceivedHeight === 'string') {\n if (this.sliderImageReceivedHeight.indexOf('px') >= 0) {\n this.sliderImageHeight = parseFloat(this.sliderImageReceivedHeight);\n } else if (this.sliderImageReceivedHeight.indexOf('%') >= 0) {\n this.sliderImageHeight = +(\n (window.innerHeight *\n parseFloat(this.sliderImageReceivedHeight)) /\n 100\n ).toFixed(2);\n } else if (parseFloat(this.sliderImageReceivedHeight)) {\n this.sliderImageHeight = parseFloat(this.sliderImageReceivedHeight);\n }\n }\n }\n }\n this.sliderImageSizeWithPadding =\n this.sliderImageWidth + this.imageMargin * 2;\n this.imageParentDivWidth =\n this.imageObj.length * this.sliderImageSizeWithPadding;\n if (\n this.imageDiv &&\n this.imageDiv.nativeElement &&\n this.imageDiv.nativeElement.offsetWidth\n ) {\n const staticLeftPos =\n 0 -\n (this.sliderImageSizeWithPadding * this.visiableImageIndex +\n this.imageMargin * 2);\n this.leftPos = this.infinite\n ? -1 * this.sliderImageSizeWithPadding * this.slideImageCount\n : staticLeftPos;\n }\n this.nextPrevSliderButtonDisable();\n }\n\n imageOnClick(index: number) {\n this.activeImageIndex = index;\n if (this.imagePopup) {\n this.showLightbox();\n }\n this.imageClick.emit(index);\n }\n\n imageAutoSlide() {\n if (this.infinite && this.autoSlideCount && !this.ligthboxShow) {\n this.autoSlideInterval = setInterval(() => {\n this.next();\n }, this.autoSlideCount);\n }\n }\n\n imageMouseEnterHandler() {\n if (this.infinite && this.autoSlideCount && this.autoSlideInterval) {\n clearInterval(this.autoSlideInterval);\n }\n }\n\n prev() {\n if (!this.sliderPrevDisable) {\n if (this.infinite) {\n this.infinitePrevImg();\n } else {\n this.prevImg();\n }\n\n //this.arrowClick.emit(PREV_ARROW_CLICK_MESSAGE);\n this.sliderArrowDisableTeam(PREV_ARROW_CLICK_MESSAGE);\n this.getVisiableIndex();\n }\n }\n\n next() {\n if (!this.sliderNextDisable) {\n if (this.infinite) {\n this.infiniteNextImg();\n } else {\n this.nextImg();\n }\n\n //this.arrowClick.emit(NEXT_ARROW_CLICK_MESSAGE);\n this.sliderArrowDisableTeam(NEXT_ARROW_CLICK_MESSAGE);\n this.getVisiableIndex();\n }\n }\n\n prevImg() {\n if (\n 0 >=\n this.leftPos + this.sliderImageSizeWithPadding * this.slideImageCount\n ) {\n this.leftPos += this.sliderImageSizeWithPadding * this.slideImageCount;\n } else {\n this.leftPos = 0;\n }\n }\n\n nextImg() {\n if (\n this.imageParentDivWidth + this.leftPos - this.sliderMainDivWidth >\n this.sliderImageSizeWithPadding * this.slideImageCount\n ) {\n this.leftPos -= this.sliderImageSizeWithPadding * this.slideImageCount;\n } else if (\n this.imageParentDivWidth + this.leftPos - this.sliderMainDivWidth >\n 0\n ) {\n this.leftPos -=\n this.imageParentDivWidth + this.leftPos - this.sliderMainDivWidth;\n }\n }\n\n infinitePrevImg() {\n this.effectStyle = `all ${this.speed}s ease-in-out`;\n this.leftPos = 0;\n\n setTimeout(() => {\n this.effectStyle = 'none';\n this.leftPos =\n -1 * this.sliderImageSizeWithPadding * this.slideImageCount;\n for (let i = 0; i < this.slideImageCount; i++) {\n this.imageObj.unshift(\n this.imageObj[this.imageObj.length - this.slideImageCount - 1]\n );\n this.imageObj.pop();\n }\n }, this.speed * 1000);\n }\n\n infiniteNextImg() {\n this.effectStyle = `all ${this.speed}s ease-in-out`;\n this.leftPos = -2 * this.sliderImageSizeWithPadding * this.slideImageCount;\n setTimeout(() => {\n this.effectStyle = 'none';\n for (let i = 0; i < this.slideImageCount; i++) {\n this.imageObj.push(this.imageObj[this.slideImageCount]);\n this.imageObj.shift();\n }\n this.leftPos =\n -1 * this.sliderImageSizeWithPadding * this.slideImageCount;\n }, this.speed * 1000);\n }\n\n getVisiableIndex() {\n const currentIndex = Math.round(\n (Math.abs(this.leftPos) + this.sliderImageWidth) / this.sliderImageWidth\n );\n if (\n this.imageObj &&\n this.imageObj[currentIndex - 1] &&\n this.imageObj[currentIndex - 1]['index']\n ) {\n this.visiableImageIndex = this.imageObj[currentIndex - 1]['index'] ?? 0;\n }\n }\n\n /**\n * Disable slider left/right arrow when image moving\n */\n sliderArrowDisableTeam(msg: string) {\n this.sliderNextDisable = true;\n this.sliderPrevDisable = true;\n setTimeout(() => {\n this.nextPrevSliderButtonDisable(msg);\n }, this.speed * 1000);\n }\n\n nextPrevSliderButtonDisable(msg?: string) {\n this.sliderNextDisable = false;\n this.sliderPrevDisable = false;\n const actionMsg = {} as any;\n if (!this.infinite) {\n if (this.imageParentDivWidth + this.leftPos <= this.sliderMainDivWidth) {\n this.sliderNextDisable = true;\n }\n\n if (this.leftPos >= 0) {\n this.sliderPrevDisable = true;\n }\n\n actionMsg['prevDisable'] = this.sliderPrevDisable;\n actionMsg['nextDisable'] = this.sliderNextDisable;\n }\n\n if (msg) {\n this.arrowClick.emit({\n action: msg,\n ...actionMsg,\n });\n }\n }\n\n // for lightbox\n showLightbox() {\n if (this.imageObj.length) {\n this.imageMouseEnterHandler();\n this.ligthboxShow = true;\n this.elRef.nativeElement.ownerDocument.body.style.overflow = 'hidden';\n }\n }\n\n close() {\n this.ligthboxShow = false;\n this.elRef.nativeElement.ownerDocument.body.style.overflow = '';\n this.lightboxClose.emit();\n this.imageAutoSlide();\n }\n\n lightboxArrowClickHandler(event: any) {\n this.lightboxArrowClick.emit(event);\n }\n\n swipe(e: TouchEvent, when: string): void {\n const coord: [number, number] = [\n e.changedTouches[0].pageX,\n e.changedTouches[0].pageY,\n ];\n const time = new Date().getTime();\n\n if (when === 'start') {\n this.swipeCoord = coord;\n this.swipeTime = time;\n } else if (when === 'end' && this.swipeCoord && this.swipeTime) {\n const direction = [\n coord[0] - this.swipeCoord[0],\n coord[1] - this.swipeCoord[1],\n ];\n const duration = time - this.swipeTime;\n\n if (\n duration < 1000 && //\n Math.abs(direction[0]) > 30 && // Long enough\n Math.abs(direction[0]) > Math.abs(direction[1] * 3)\n ) {\n // Horizontal enough\n if (direction[0] < 0) {\n this.next();\n } else {\n this.prev();\n }\n }\n }\n }\n}\n","<div class=\"ng-image-slider\" [ngStyle]=\"{'height':sliderImageHeight+'px'}\">\n <div class=\"ng-image-slider-container\">\n <div class=\"main\" [ngStyle]=\"{'height':sliderImageHeight+'px'}\" #sliderMain>\n @if (imageObj.length) {\n <div class=\"main-inner\" [ngClass]=\"{'with-ng-main-pagination': paginationShow}\"\n [ngStyle]=\"{'margin-left':leftPos+'px', 'width':imageParentDivWidth+'px', 'transition': effectStyle}\"\n (touchstart)=\"swipe($event, 'start')\" (touchend)=\"swipe($event, 'end')\">\n @for (img of imageObj; track img; let i = $index) {\n <div\n [ngClass]=\"{'image-popup': imagePopup, 'selected-image': activeImageIndex == i}\"\n [ngStyle]=\"{'width':sliderImageWidth+'px', 'margin-left':imageMargin+'px', 'margin-right':imageMargin+'px'}\"\n class=\"img-div\" (click)=\"imageOnClick(img.index)\" (mouseenter)=\"stopSlideOnHover && imageMouseEnterHandler()\"\n (mouseleave)=\"stopSlideOnHover && imageAutoSlide()\" #imageDiv>\n <custom-img [imageUrl]=\"img?.thumbImage || img?.posterImage || img?.video\"\n [isVideo]=\"!!(img?.posterImage || img?.video)\" [alt]=\"img?.alt || img?.title || ''\"\n [title]=\"img?.title || img?.alt || ''\" [direction]=\"textDirection\" [ratio]=\"manageImageRatio\"\n [lazy]=\"lazyLoading\">\n </custom-img>\n @if (img?.title) {\n <div [dir]=\"textDirection\" class=\"caption\">{{ img?.title }}</div>\n }\n </div>\n }\n </div>\n }\n @if (!imageObj.length) {\n <div class=\"ng-image-slider-error\">\n <span class=\"ng-image-slider-loader\"></span>\n </div>\n }\n @if (showArrowButton && imageObj.length > 1) {\n <a [ngClass]=\"{'disable': sliderPrevDisable}\"\n class=\"prev icons prev-icon\" (click)=\"prev()\" (mouseenter)=\"stopSlideOnHover && imageMouseEnterHandler()\"\n (mouseleave)=\"stopSlideOnHover && imageAutoSlide()\">&lsaquo;</a>\n }\n @if (showArrowButton && imageObj.length > 1) {\n <a [ngClass]=\"{'disable': sliderNextDisable}\"\n class=\"next icons next-icon\" (click)=\"next()\" (mouseenter)=\"imageMouseEnterHandler()\"\n (mouseleave)=\"imageAutoSlide()\">&rsaquo;</a>\n }\n </div>\n @if (imageObj.length && paginationShow) {\n <div class=\"ng-main-pagination\">{{visiableImageIndex + 1}} of\n {{totalImages}}</div>\n }\n </div>\n</div>\n@if (ligthboxShow) {\n <div>\n <slider-lightbox [paginationShow]=\"paginationShow\" [showVideoControls]=\"showVideoControls\"\n [arrowKeyMove]=\"arrowKeyMove\" [images]=\"ligthboxImageObj\" [infinite]=\"infinite\" [animationSpeed]=\"speed\"\n [imageIndex]=\"activeImageIndex\" [show]=\"ligthboxShow\" [direction]=\"textDirection\" [videoAutoPlay]=\"videoAutoPlay\"\n (prevImage)=\"lightboxArrowClickHandler($event)\" (nextImage)=\"lightboxArrowClickHandler($event)\" (close)=\"close()\">\n </slider-lightbox>\n </div>\n}","/*\n * Public API Surface of rm-image-slider\n */\n\nexport * from './lib/rm-image-slider.service';\nexport * from './lib/rm-image-slider.component';\nexport * from './lib/interface';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i3","i1.RmImageSliderService","i2"],"mappings":"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