UNPKG

ngx-hm-carousel

Version:

A light carousel for Angular, support mobile touch by hammerJs with SSR

1 lines 62.5 kB
{"version":3,"file":"ngx-hm-carousel.mjs","sources":["../../../../../libs/angular/ngx-hm-carousel/src/lib/ngx-hm-carousel-item.directive.ts","../../../../../libs/angular/ngx-hm-carousel/src/lib/ngx-hm-carousel-dynamic.directive.ts","../../../../../libs/angular/ngx-hm-carousel/src/lib/ngx-hm-carousel.component.ts","../../../../../libs/angular/ngx-hm-carousel/src/lib/ngx-hm-carousel.component.html","../../../../../libs/angular/ngx-hm-carousel/src/ngx-hm-carousel.ts"],"sourcesContent":["import { Directive } from '@angular/core';\n\n@Directive({\n selector: '[ngx-hm-carousel-item]',\n standalone: true,\n})\nexport class NgxHmCarouselItemDirective {}\n","import {\n Directive,\n TemplateRef,\n ViewContainerRef,\n inject,\n} from '@angular/core';\nimport { input } from '@angular/core';\n\n// TODO: ssr problem should not hide on ssr\n// TODO: show number change should recalculate is show and init show number\n@Directive({\n selector: '[ngxHmCarouselDynamic]',\n standalone: true,\n})\nexport class NgxHmCarouselDynamicDirective {\n private _view = inject(ViewContainerRef);\n private _template = inject<TemplateRef<any>>(TemplateRef<any>);\n index = input<number | undefined>(undefined, {\n alias: 'ngxHmCarouselDynamic',\n });\n length = input(0, { alias: 'ngxHmCarouselDynamicLength' });\n show = input(1, { alias: 'ngxHmCarouselDynamicShow' });\n\n currentI = input(0, {\n alias: 'ngxHmCarouselDynamicIndex',\n transform: (value: number) => {\n if (!this.completed) {\n const nextI = value + this.show();\n const prevI = value - this.show();\n if (\n this.index() === 0 ||\n this.index() === this.length() - 1 ||\n this.index() === nextI ||\n this.index() === prevI ||\n this.index() === value\n ) {\n this._view.createEmbeddedView(this._template);\n this.completed = true;\n }\n }\n\n return value;\n },\n });\n\n private completed = false;\n\n constructor() {\n this._view.clear();\n }\n}\n","import {\n AsyncPipe,\n DOCUMENT,\n isPlatformBrowser,\n NgTemplateOutlet,\n} from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n computed,\n contentChild,\n contentChildren,\n DestroyRef,\n effect,\n ElementRef,\n EmbeddedViewRef,\n forwardRef,\n inject,\n input,\n NgZone,\n OnDestroy,\n PLATFORM_ID,\n Renderer2,\n signal,\n TemplateRef,\n viewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nimport {\n BehaviorSubject,\n bufferCount,\n filter,\n forkJoin,\n fromEvent,\n interval,\n merge,\n Observable,\n of,\n Subject,\n Subscription,\n switchMap,\n takeUntil,\n tap,\n timer,\n} from 'rxjs';\n\nimport { resizeObservable } from '@nghedgehog/core';\n\nimport { NgxHmCarouselItemDirective } from './ngx-hm-carousel-item.directive';\nimport { NgxHmCarouselBreakPointUp } from './ngx-hm-carousel.model';\n\n@Component({\n selector: 'ngx-hm-carousel',\n templateUrl: './ngx-hm-carousel.component.html',\n styleUrls: ['./ngx-hm-carousel.component.scss'],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NgxHmCarouselComponent),\n multi: true,\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [NgTemplateOutlet, AsyncPipe],\n})\nexport class NgxHmCarouselComponent implements ControlValueAccessor, OnDestroy {\n private platformId = inject<any>(PLATFORM_ID);\n private _document = inject<any>(DOCUMENT);\n private _destroyRef = inject<any>(DestroyRef);\n private _renderer = inject(Renderer2);\n private _zone = inject(NgZone);\n private _cd = inject(ChangeDetectorRef);\n container = viewChild.required('containerElm', { read: ElementRef });\n btnPrev = viewChild<ElementRef>('prev');\n btnNext = viewChild<ElementRef>('next');\n progressContainerElm = viewChild('progress', { read: ElementRef });\n\n // get all item elms\n itemElms = contentChildren(NgxHmCarouselItemDirective, {\n read: ElementRef,\n descendants: true,\n });\n\n contentPrev = contentChild('carouselPrev', { read: TemplateRef });\n contentNext = contentChild('carouselNext', { read: TemplateRef });\n dotElm = contentChild<TemplateRef<any>>('carouselDot');\n progressElm = contentChild<TemplateRef<any>>('carouselProgress');\n\n infiniteContainer = contentChild('infiniteContainer', {\n read: ViewContainerRef,\n });\n\n contentContent = contentChild.required('carouselContent', {\n read: TemplateRef,\n });\n\n /** the data you using with *ngFor, it need when infinite mode or autoplay mode */\n data = input<any[]>([]);\n\n /** when infinite is true, the animation time with item, default is 400. */\n aniTime = input(400);\n\n /** this class will add in #containerElm when model change */\n aniClass = input('transition');\n\n /**\n * this class will add when carousel auto play,\n * this default autoplay animation is same as aniClass\n */\n aniClassAuto = input(this.aniClass());\n\n /**\n * user move picture with the container width rate,\n * when more than that rate, it will go to next or prev,\n * set false will never move with distance rate,\n * default is `0.15`\n */\n panBoundary = input<number | false>(0.15, { alias: 'pan-boundary' });\n\n /** when `show-num` is bigger than 1, the first item align, default is `center` */\n align = input<'left' | 'center' | 'right'>('center');\n\n /**\n * disable when drag occur the child element will follow touch point.\n * default is `false`\n */\n notDrag = input(false, { alias: 'not-follow-pan' });\n\n /**\n * the event binding state for stop auto play when mouse move over\n */\n mouseEnable = input(false, { alias: 'mouse-enable' });\n\n /** each auto play between time */\n delay = input(8000, { alias: 'between-delay' });\n\n /** auto play direction, default is `right`. */\n direction = input<'left' | 'right'>('right', { alias: 'autoplay-direction' });\n\n /** how many number with each scroll, default is `1`. */\n scrollNum = input(1, { alias: 'scroll-num' });\n\n /** Could user scroll many item once, simulate with scrollbar, default is `false` */\n isDragMany = input(false, { alias: 'drag-many' });\n\n /** Minimal velocity required before recognizing, unit is in px per ms, default `0.3` */\n swipeVelocity = input(0.3, { alias: 'swipe-velocity' });\n\n /**\n * switch show number with custom logic like css\n * @media (min-width: `number`px)\n */\n breakpoint = input<NgxHmCarouselBreakPointUp[]>([]);\n\n /** disable drag event with touch and mouse pan moving, default is `false` */\n disableDrag = input(undefined, {\n alias: 'disable-drag',\n transform: (value: boolean) => {\n if (this.rootElm) {\n if (value) {\n this.destroyHammer();\n } else {\n this.hammer = this.bindHammer();\n }\n }\n return value;\n },\n });\n\n /** is the carousel can move infinite */\n infinite = input(false, {\n alias: 'infinite',\n });\n\n /** auto play speed */\n speed = input(undefined, {\n alias: 'autoplay-speed',\n transform: (value: number) => {\n this.speedChange.next(value);\n return value;\n },\n });\n\n /** PinchRecognizer that you want to add to hammer event */\n recognizers = input<Recognizer[]>([]);\n\n /** PinchRecognizer that you want to add to hammer event */\n stopPanListener = input(false);\n private _showNum = 1;\n /**\n * how many number items to show once, default is `1`\n * set `auto` to using `[breakpoint]` set value.\n */\n showNum = input(this._showNum, {\n alias: 'show-num',\n transform: (value: number | 'auto') => {\n if (value === 'auto') {\n this.isAutoNum = true;\n } else {\n this._showNum = +value;\n if (this.rootElm) {\n this.setViewWidth();\n this.reSetAlignDistance();\n }\n }\n\n return this._showNum;\n },\n });\n\n /** is that carousel auto play */\n autoplay = input(undefined, {\n alias: 'autoplay',\n transform: (value: boolean) => {\n if (isPlatformBrowser(this.platformId)) {\n if (this.elms) {\n this.progressWidth = 0;\n if (value) {\n this.doNextSub$ = this.doNext$?.subscribe();\n } else {\n if (this.doNextSub$) {\n this.doNextSub$.unsubscribe();\n }\n }\n }\n }\n return value;\n },\n });\n\n get currentIndex() {\n return this._currentIndex;\n }\n set currentIndex(value) {\n // if now index is not equal to save index, do something\n if (this.currentIndex !== value) {\n // if the value is not contain with the boundary not handler\n if (\n !this.runLoop() &&\n !(0 <= value && value <= this.itemElms().length - 1)\n ) {\n return;\n }\n this._currentIndex = value;\n if (this.elms) {\n if (this.autoplay() && !this.isFromAuto) {\n this._zone.runOutsideAngular(() => {\n this.stopEvent.next(undefined);\n this.callRestart();\n });\n }\n this.drawView(this.currentIndex, this.hasInitWriteValue);\n if (this.isDragMany()) {\n this.hasInitWriteValue = true;\n }\n }\n if (\n 0 <= this.currentIndex &&\n this.currentIndex <= this.itemElms().length - 1\n ) {\n this._zone.run(() => {\n this.onChange(this.currentIndex);\n this._cd.detectChanges();\n });\n }\n }\n this.isFromAuto = false;\n }\n\n get progressWidth() {\n return this._progressWidth;\n }\n set progressWidth(value) {\n const containerElm = this.progressContainerElm();\n if (this.progressElm() && containerElm && this.autoplay()) {\n this._progressWidth = value;\n this._renderer.setStyle(\n (containerElm.nativeElement as HTMLElement).children[0],\n 'width',\n `${this.progressWidth}%`,\n );\n }\n }\n\n get grabbing() {\n return this._grabbing;\n }\n set grabbing(value: boolean) {\n if (this._grabbing !== value) {\n // console.log(value);\n this._zone.run(() => {\n this._grabbing = value;\n if (value) {\n this._renderer.addClass(this.containerElm, 'grabbing');\n } else {\n this.panCount = 0;\n this.callRestart();\n this._renderer.removeClass(this.containerElm, 'grabbing');\n }\n this._cd.detectChanges();\n });\n }\n }\n\n // using for check mouse or touchend\n leaveObs$ = merge(\n fromEvent<MouseEvent>(this._document, 'mouseup'),\n fromEvent<TouchEvent>(this._document, 'touchend'),\n ).pipe(\n tap((e: Event) => {\n this.grabbing = false;\n e.stopPropagation();\n e.preventDefault();\n }),\n );\n\n hammer!: HammerManager | null;\n\n private set left(value: number) {\n if (isPlatformBrowser(this.platformId)) {\n this._renderer.setStyle(\n this.containerElm,\n 'transform',\n `translateX(${value}px)`,\n );\n } else {\n this._renderer.setStyle(\n this.containerElm,\n 'transform',\n `translateX(${value}%)`,\n );\n }\n }\n\n private get maxRightIndex() {\n let addIndex = 0;\n switch (this.align()) {\n case 'left':\n addIndex = 0;\n break;\n case 'center':\n addIndex = (this.showNum() as number) - 1;\n break;\n case 'right':\n addIndex = (this.showNum() as number) - 1;\n break;\n }\n return this.itemElms().length - 1 - this._showNum + 1 + addIndex;\n }\n\n runLoop = computed(() => this.autoplay() || this.infinite());\n\n private get lengthOne() {\n return this.itemElms().length === 1;\n }\n\n private get rootElmWidth() {\n return isPlatformBrowser(this.platformId)\n ? this.rootElm.getBoundingClientRect().width\n : 100;\n }\n\n private set containerElmWidth(value: number) {\n this.setStyle(this.containerElm, 'width', value);\n }\n\n private isFromAuto = true;\n private isAutoNum = false;\n private mouseOnContainer = false;\n private alignDistance = 0;\n private elmWidth = 0;\n\n private rootElm!: HTMLElement;\n private containerElm!: HTMLElement;\n\n private elms!: Array<HTMLElement>;\n private infiniteElmRefs = signal<Array<EmbeddedViewRef<any>>>([]);\n\n private saveTimeOut$?: Subscription;\n private doNextSub$?: Subscription;\n private doNext$?: Observable<any>;\n\n private restart = new BehaviorSubject<any>(null);\n private speedChange = new BehaviorSubject(5000);\n private stopEvent = new Subject<any>();\n\n private _progressWidth = 0;\n private _currentIndex = 0;\n private _grabbing = false;\n\n private panCount = 0;\n\n // this variable use for check the init value is write with ngModel,\n // when init first, not set with animation\n private hasInitWriteValue = false;\n\n protected readonly itemElmsChanges = toObservable(this.itemElms);\n\n constructor() {\n effect(() => {\n this.infiniteElmRefs().forEach((ref) => {\n this.addStyle(ref.rootNodes[0], {\n visibility: this.runLoop() ? 'visible' : 'hidden',\n });\n });\n });\n\n const effectRef = effect(\n () => {\n this.rootElm = this.container().nativeElement;\n this.containerElm = this.rootElm.children[0] as HTMLElement;\n\n this.init();\n\n forkJoin([\n this.bindClick(),\n // when item changed, remove old hammer binding, and reset width\n this.itemElmsChanges.pipe(\n // detectChanges to change view dots\n tap(() => {\n if (this.currentIndex > this.itemElms().length - 1) {\n // pass the change detection check,\n requestAnimationFrame(() => {\n this.currentIndex = this.itemElms().length - 1;\n });\n }\n this.destroy();\n this.removeInfiniteElm();\n this.init();\n this.progressWidth = 0;\n }),\n tap(() => this._cd.detectChanges()),\n ),\n resizeObservable(this.rootElm, () => this.containerResize()),\n ])\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe();\n\n // only exec once\n effectRef.destroy();\n },\n {\n allowSignalWrites: true,\n },\n );\n }\n\n ngOnDestroy() {\n this.destroy();\n }\n\n writeValue(value: any) {\n if (value || value === 0) {\n this.currentIndex = value;\n this.hasInitWriteValue = true;\n }\n }\n\n registerOnChange(fn: (value: any) => any) {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => any) {\n this.onTouched = fn;\n }\n\n private onChange = (_: any) => {\n //\n };\n private onTouched = () => {\n //\n };\n\n private init() {\n this.initVariable();\n this.setViewWidth(true);\n this.reSetAlignDistance();\n if (!this.disableDrag()) {\n this.hammer = this.bindHammer();\n }\n this.drawView(this.currentIndex, false);\n if (isPlatformBrowser(this.platformId) && this.runLoop()) {\n this.addInfiniteElm();\n }\n }\n\n private destroy() {\n this.destroyHammer();\n\n if (this.autoplay()) {\n this.doNextSub$?.unsubscribe();\n }\n }\n\n private destroyHammer() {\n if (this.hammer) {\n this.hammer.destroy();\n }\n }\n\n private addInfiniteElm() {\n const infiniteContainer = this.infiniteContainer();\n const showNum = this.showNum();\n\n if (!infiniteContainer || typeof showNum !== 'number') return;\n for (let i = 1; i <= showNum; i++) {\n const elm = infiniteContainer.createEmbeddedView(this.contentContent(), {\n $implicit: this.data()[this.itemElms().length - i],\n index: this.itemElms().length - i,\n });\n this.addStyle(elm.rootNodes[0], {\n position: 'absolute',\n // boxShadow: `0 0 0 5000px rgba(200, 75, 75, 0.5) inset`,\n transform: `translateX(-${100 * i}%)`,\n visibility: this.runLoop() ? 'visible' : 'hidden',\n });\n this.setStyle(elm.rootNodes[0], 'width', this.elmWidth);\n\n const elm2 = infiniteContainer.createEmbeddedView(this.contentContent(), {\n $implicit: this.data()[i - 1],\n index: i - 1,\n });\n this.addStyle(elm2.rootNodes[0], {\n // boxShadow: `0 0 0 5000px rgba(200, 75, 75, 0.5) inset`,\n position: 'absolute',\n right: 0,\n top: 0,\n transform: `translateX(${100 * i}%)`,\n visibility: this.runLoop() ? 'visible' : 'hidden',\n });\n this.setStyle(elm2.rootNodes[0], 'width', this.elmWidth);\n\n elm.detectChanges();\n elm2.detectChanges();\n\n this.infiniteElmRefs.set([...this.infiniteElmRefs(), elm, elm2]);\n }\n }\n\n private removeInfiniteElm() {\n this.infiniteElmRefs().forEach((a) => {\n a.detach();\n a.destroy();\n });\n if (this.infiniteContainer()) {\n this.infiniteContainer()!.clear();\n }\n this.infiniteElmRefs.set([]);\n }\n\n private containerResize() {\n this.setViewWidth();\n this.reSetAlignDistance();\n\n const showNum = this.showNum();\n const touchEnd = typeof showNum === 'number' && showNum >= this.elms.length;\n\n if (this.align() !== 'center' && touchEnd) {\n this.currentIndex = 0;\n }\n\n this.drawView(this.currentIndex, false);\n }\n\n private initVariable() {\n this._zone.runOutsideAngular(() => {\n this.elms = this.itemElms().map((x) => x.nativeElement);\n\n let startEvent = this.restart.asObservable();\n let stopEvent = this.stopEvent.asObservable();\n if (this.mouseEnable()) {\n startEvent = merge(\n startEvent,\n fromEvent(this.containerElm, 'mouseleave').pipe(\n // when leave, we should reverse grabbing state to set the mouseOn state,\n // because when the grabbing, the mask will on, and it will occur leave again\n filter(() => !this.grabbing),\n tap(() => (this.mouseOnContainer = false)),\n ),\n );\n stopEvent = merge(\n stopEvent,\n fromEvent(this.containerElm, 'mouseover').pipe(\n tap(() => (this.mouseOnContainer = true)),\n ),\n );\n }\n\n this.doNext$ = startEvent.pipe(\n // not using debounceTime, it will stop mouseover event detect, will cause mouse-enable error\n // debounceTime(this.delay),\n switchMap(() => this.speedChange),\n switchMap(() =>\n timer(this.delay()).pipe(\n switchMap(() => this.runProgress(20)),\n tap(() => {\n this.isFromAuto = true;\n // console.log('next');\n if (this.direction() === 'left') {\n this.currentIndex -= this.scrollNum();\n } else {\n this.currentIndex += this.scrollNum();\n }\n }),\n takeUntil(stopEvent.pipe(tap(() => (this.progressWidth = 0)))),\n ),\n ),\n );\n\n if (this.autoplay()) {\n this.doNextSub$ = this.doNext$.subscribe();\n }\n });\n }\n\n private reSetAlignDistance() {\n switch (this.align()) {\n case 'center':\n this.alignDistance = (this.rootElmWidth - this.elmWidth) / 2;\n break;\n case 'left':\n this.alignDistance = 0;\n break;\n case 'right':\n this.alignDistance = this.rootElmWidth - this.elmWidth;\n break;\n }\n }\n\n private setViewWidth(isInit?: boolean) {\n if (this.isAutoNum) {\n this._showNum = this.getAutoNum();\n }\n this._renderer.addClass(this.containerElm, 'grab');\n if (isInit) {\n // remain one elm height\n this._renderer.addClass(\n this.containerElm,\n 'ngx-hm-carousel-display-nowrap',\n );\n }\n this.elmWidth = this.rootElmWidth / this._showNum;\n\n this._renderer.removeClass(\n this.containerElm,\n 'ngx-hm-carousel-display-nowrap',\n );\n\n this.containerElmWidth = this.elmWidth * this.elms.length;\n\n this._renderer.setStyle(this.containerElm, 'position', 'relative');\n\n this.infiniteElmRefs().forEach((ref) => {\n this.setStyle(ref.rootNodes[0], 'width', this.elmWidth);\n });\n this.elms.forEach((elm: HTMLElement) => {\n this.setStyle(elm, 'width', this.elmWidth);\n });\n }\n\n private bindHammer() {\n if (!isPlatformBrowser(this.platformId)) {\n return null;\n }\n return this._zone.runOutsideAngular(() => {\n const hm = new Hammer.Manager(this.containerElm);\n\n const pan = new Hammer.Pan({\n direction: Hammer.DIRECTION_HORIZONTAL,\n threshold: 0,\n });\n\n hm.add(pan);\n\n hm.on('panleft panright panend pancancel', (e: HammerInput) => {\n // console.log(e.type);\n\n if (this.stopPanListener()) {\n return;\n }\n\n if (this.lengthOne) {\n return;\n }\n\n this.removeContainerTransition();\n\n if (this.autoplay()) {\n this._zone.runOutsideAngular(() => {\n this.stopEvent.next(undefined);\n });\n }\n\n switch (e.type) {\n case 'panleft':\n case 'panright':\n {\n this.panCount++;\n // only when panmove more than two times, set move\n if (this.panCount < 2) {\n return;\n }\n\n this.grabbing = true;\n const showNum = this.showNum();\n // When show-num is bigger than length, stop hammer\n if (\n this.align() !== 'center' &&\n typeof showNum === 'number' &&\n showNum >= this.elms.length\n ) {\n this.hammer?.stop(true);\n return;\n }\n // Slow down at the first and last pane.\n if (!this.runLoop() && this.outOfBound(e.type)) {\n e.deltaX *= 0.2;\n }\n\n if (!this.notDrag()) {\n this.left =\n -this.currentIndex * this.elmWidth +\n this.alignDistance +\n e.deltaX;\n }\n\n // if not drag many, when bigger than half\n if (!this.isDragMany()!) {\n if (Math.abs(e.deltaX) > this.elmWidth * 0.5) {\n if (e.deltaX > 0) {\n this.currentIndex -= this.scrollNum();\n } else {\n this.currentIndex += this.scrollNum();\n }\n this.hammer?.stop(true);\n return;\n }\n }\n }\n break;\n case 'pancancel':\n this.drawView(this.currentIndex);\n break;\n\n case 'panend':\n {\n const panBoundary = this.panBoundary();\n // if boundary more than rate\n if (\n panBoundary !== false &&\n Math.abs(e.deltaX) > this.elmWidth * panBoundary\n ) {\n const moveNum = this.isDragMany()\n ? Math.ceil(Math.abs(e.deltaX) / this.elmWidth)\n : this.scrollNum();\n\n const prevIndex = this.currentIndex - moveNum;\n const nextIndex = this.currentIndex + moveNum;\n\n // if right\n if (e.deltaX > 0) {\n this.goPrev(prevIndex);\n // left\n } else {\n this.goNext(nextIndex);\n }\n break;\n } else if (\n e.velocityX < -this.swipeVelocity() &&\n e.distance > 10\n ) {\n this.goNext(this.currentIndex + this.scrollNum());\n } else if (\n e.velocityX > this.swipeVelocity() &&\n e.distance > 10\n ) {\n this.goPrev(this.currentIndex - this.scrollNum());\n } else {\n this.drawView(this.currentIndex);\n }\n }\n break;\n }\n });\n\n this.recognizers().forEach((recognizer) => {\n hm.add(recognizer);\n });\n\n return hm;\n });\n }\n\n private goPrev(prevIndex: number) {\n if (!this.runLoop() && prevIndex < 0) {\n prevIndex = 0;\n this.drawView(0);\n }\n this.currentIndex = prevIndex;\n }\n\n private goNext(nextIndex: number) {\n if (!this.runLoop() && nextIndex > this.maxRightIndex) {\n nextIndex = this.maxRightIndex;\n this.drawView(nextIndex);\n }\n this.currentIndex = nextIndex;\n }\n\n private bindClick() {\n const nextBtn = this.btnNext();\n const prevBtn = this.btnPrev();\n if (nextBtn && prevBtn) {\n return forkJoin([\n fromEvent(nextBtn.nativeElement, 'click').pipe(\n tap(() => this.currentIndex++),\n ),\n fromEvent(prevBtn.nativeElement, 'click').pipe(\n tap(() => this.currentIndex--),\n ),\n ]);\n }\n return of(null);\n }\n\n private callRestart() {\n // if that is autoplay\n // if that mouse is not on container( only mouse-enable is true, the state maybe true)\n // if now is grabbing, skip this restart, using grabbing change restart\n if (this.autoplay()! && !this.mouseOnContainer && !this.grabbing) {\n this._zone.runOutsideAngular(() => {\n this.restart.next(null);\n });\n }\n }\n\n private drawView(\n index: number,\n isAnimation = true,\n isFromAuto = this.isFromAuto,\n ) {\n // move element only on length is more than 1\n if (this.elms.length > 1) {\n this.removeContainerTransition();\n this.left = -(index * this.elmWidth - this.alignDistance);\n\n if (isAnimation) {\n if (isFromAuto) {\n this._renderer.addClass(this.containerElm, this.aniClassAuto());\n } else {\n this._renderer.addClass(this.containerElm, this.aniClass());\n }\n // if infinite move to next index with timeout\n this.infiniteHandler(index);\n }\n } else {\n this.left = this.alignDistance;\n }\n }\n\n private removeContainerTransition() {\n this._renderer.removeClass(this.containerElm, this.aniClass());\n this._renderer.removeClass(this.containerElm, this.aniClassAuto());\n }\n\n private infiniteHandler(index: number) {\n if (this.runLoop()) {\n let state = 0;\n state = index < 0 ? -1 : state;\n state = index > this.itemElms().length - 1 ? 1 : state;\n\n // index = index % this._showNum;\n if (state !== 0) {\n switch (state) {\n case -1:\n this._currentIndex =\n (this.itemElms().length + index) % this.itemElms().length;\n break;\n case 1:\n this._currentIndex = index % this.itemElms().length;\n break;\n }\n\n const isFromAuto = this.isFromAuto;\n if (this.saveTimeOut$) {\n this.saveTimeOut$.unsubscribe();\n }\n\n this.saveTimeOut$ = timer(this.aniTime())\n .pipe(\n switchMap(() => {\n // if it is any loop carousel, the next event need wait the timeout complete\n if (this.aniTime() === this.speed()) {\n this.removeContainerTransition();\n this.left =\n -((this._currentIndex - state) * this.elmWidth) +\n this.alignDistance;\n return timer(50).pipe(\n tap(() => {\n this.drawView(\n this.currentIndex,\n this.hasInitWriteValue,\n isFromAuto,\n );\n }),\n );\n } else {\n this.drawView(this.currentIndex, false);\n }\n return of(null);\n }),\n takeUntil(this.stopEvent),\n )\n .subscribe();\n }\n }\n }\n\n private outOfBound(type: 'panleft' | 'panright') {\n switch (type) {\n case 'panleft':\n return this.currentIndex >= this.maxRightIndex;\n case 'panright':\n return this.currentIndex <= 0;\n }\n }\n\n private runProgress(betweenTime: number): Observable<any> {\n return this._zone.runOutsideAngular(() => {\n const speed = this.speed()!;\n const howTimes = speed / betweenTime;\n const everyIncrease = (100 / speed) * betweenTime;\n return interval(betweenTime).pipe(\n tap((t) => {\n this.progressWidth = (t % howTimes) * everyIncrease;\n }),\n bufferCount(howTimes),\n );\n });\n }\n\n private getAutoNum() {\n const currWidth = this.rootElmWidth;\n // check user has had set breakpoint\n if (this.breakpoint().length > 0) {\n // get the last biggest point\n const now = this.breakpoint().find((b) => {\n return b.width >= currWidth;\n });\n // if find value, it is current width\n if (now) {\n return now.number;\n }\n return this.breakpoint()[this.breakpoint().length - 1].number;\n }\n\n // system init show number\n const initNum = 3;\n // 610\n if (currWidth > 300) {\n return Math.floor(initNum + currWidth / 200);\n }\n return initNum;\n }\n\n private addStyle(\n elm: HTMLElement,\n style: { [key: string]: string | number },\n ) {\n if (style) {\n Object.keys(style).forEach((key) => {\n const value = style[key];\n this._renderer.setStyle(elm, key, value);\n });\n }\n }\n\n private setStyle(elm: HTMLElement, style: string, value: number) {\n if (isPlatformBrowser(this.platformId)) {\n this._renderer.setStyle(elm, style, `${value}px`);\n } else {\n this._renderer.setStyle(elm, style, `${value}%`);\n }\n }\n}\n","<div #containerElm class=\"carousel\">\n <!-- main content -->\n <ng-content select=\"[ngx-hm-carousel-container]\" />\n <!-- left -->\n @if (contentPrev(); as prevVar) {\n <div #prev class=\"direction left\">\n <ng-container *ngTemplateOutlet=\"prevVar\" />\n </div>\n }\n <!-- right -->\n @if (contentNext(); as nextVar) {\n <div #next class=\"direction right\">\n <ng-container *ngTemplateOutlet=\"nextVar\" />\n </div>\n }\n <!-- indicators -->\n @if (dotElm(); as dotVar) {\n <ul class=\"indicators\">\n @for (dot of itemElms(); track dot; let i = $index) {\n <li (click)=\"currentIndex = i\">\n <ng-container\n *ngTemplateOutlet=\"\n dotVar;\n context: {\n $implicit: {\n index: i,\n currentIndex: currentIndex\n }\n }\n \"\n />\n </li>\n }\n </ul>\n }\n <!-- progress -->\n @if (autoplay() && progressElm(); as progressVar) {\n <div #progress>\n <ng-container *ngTemplateOutlet=\"progressVar\" />\n </div>\n }\n\n @if (grabbing) {\n <div class=\"mask\">\n @if (leaveObs$ | async) {}\n </div>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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