{"version":3,"file":"ngx-magic-carousel.mjs","sources":["../../../projects/ngx-magic-carousel/src/lib/tokens.ts","../../../projects/ngx-magic-carousel/src/lib/carousel.component.ts","../../../projects/ngx-magic-carousel/src/lib/carousel.component.html","../../../projects/ngx-magic-carousel/src/lib/carousel.module.ts","../../../projects/ngx-magic-carousel/src/public-api.ts","../../../projects/ngx-magic-carousel/src/ngx-magic-carousel.ts"],"sourcesContent":["import {InjectionToken} from '@angular/core';\n\nexport const MAGIC_CAROUSEL_MAX_ANGLE_DEGREES = new InjectionToken<number>('carousel max tilt angle degrees to detect swipe');\n","import {\n  AfterViewInit,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  ElementRef,\n  EventEmitter,\n  HostBinding,\n  HostListener, Inject, Optional,\n  Input,\n  OnChanges,\n  Output,\n  Renderer2,\n  SimpleChanges,\n  ViewChild,\n} from '@angular/core';\nimport {fromEvent, Subject, timer} from 'rxjs';\nimport {UntilDestroy, untilDestroyed} from '@ngneat/until-destroy';\nimport {distinctUntilChanged, filter, takeUntil, tap} from 'rxjs/operators';\nimport {MAGIC_CAROUSEL_MAX_ANGLE_DEGREES} from \"./tokens\";\n\n@UntilDestroy()\n@Component({\n  selector: 'ngx-magic-carousel',\n  templateUrl: './carousel.component.html',\n  styleUrls: ['./carousel.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CarouselComponent implements OnChanges, AfterViewInit {\n  @Input() height = 0;\n  @Input() cellWidth = 0;\n  @Input() margin = 16;\n  @Input() marginFirst = 0;\n  @Input() marginLast = 0;\n  @Input() transition = 300;\n  @Input() minSwipeDistance = 10;\n  @Input() cellsToShow = 0;\n  @Input() arrows = false;\n  @Input() hideArrowsByLimit = false;\n  @Input() swipeByMouse = false;\n  @Output() private events = new EventEmitter<CarouselEvent>();\n  @ViewChild('cellsRef', {static: true}) private cellsRef!: ElementRef<HTMLElement>;\n  @HostBinding('style.height.px') private get hostHeight() {\n    return this.height;\n  }\n  @HostListener('window:resize') private onResize() {\n    if (this.elementRef.nativeElement.offsetWidth !== this.hostWidth) {\n      this.hostWidth = this.elementRef.nativeElement.offsetWidth;\n      this.contentChanged()\n    }\n  }\n\n  @HostListener('window:mousemove', ['$event']) private onMouseMove($event: MouseEvent) {\n    this.mouseHandler($event, this.pointerMove$);\n  }\n  @HostListener('mousedown', ['$event']) private onMouseDown($event: MouseEvent) {\n    this.mouseHandler($event, this.pointerDown$);\n  }\n  @HostListener('window:mouseup', ['$event']) private onMouseUp($event: MouseEvent) {\n    this.mouseHandler($event, this.pointerUp$,);\n  }\n\n  private mouseHandler($event: MouseEvent, subject: Subject<PointerPosition>) {\n    if (!this.swipeByMouse) return;\n    const { clientX, clientY, screenX, screenY } = $event;\n    subject.next({ clientX, clientY, screenX, screenY })\n  }\n\n  get movementX() {\n    return Math.round(this.touchEnd.x - this.touchStart.x);\n  }\n\n  set active(active: number) {\n    this.cd.markForCheck();\n    if (active > this.translateList.length - 1) {\n      this.activeIndex = this.translateList.length - 1;\n      console.warn('Active index greater than possible.');\n      return;\n    }\n    if (active < 0 ) {\n      this.activeIndex = 0;\n      console.warn('Active index less than possible.');\n      return;\n    }\n    this.activeIndex = active;\n  }\n  get active() {\n    return this.activeIndex;\n  }\n  private activeIndex = 0;\n\n  private eventSlideTo$ = new Subject();\n  private eventType!: CarouselEventType;\n\n  private touchStart = {\n    x: 0,\n    y: 0,\n  };\n  private touchEnd = {\n    x: 0,\n    y: 0,\n  };\n  private translateX = 0;\n  private translateStart = {\n    x: 0,\n    y: 0,\n  };\n\n  private pointerMove$ = new Subject<PointerPosition>();\n  private pointerDown$ = new Subject<PointerPosition>();\n  private pointerUp$ = new Subject<PointerPosition>();\n  private touchEvent!: TouchEvent;\n  private pointerPressed = false;\n  private hostWidth = 0;\n  private slidesInView = 1;\n  private cells: number[] = [];\n  private translateList: number[] = [];\n  private touchIdentifier = 0;\n  private timeFirstTouch = 0;\n  private maxDelayBetweenTouches = 500;\n  private maxAngleDegrees = 45;\n\n  constructor(\n    private readonly elementRef: ElementRef,\n    private readonly renderer2: Renderer2,\n    private readonly cd: ChangeDetectorRef,\n    @Optional() @Inject(MAGIC_CAROUSEL_MAX_ANGLE_DEGREES) maxAngleDegrees: number\n  ) {\n    if (maxAngleDegrees === null) return;\n    if (maxAngleDegrees < 0 || maxAngleDegrees > 90) {\n      console.warn(`The specified provider \"MAGIC_CAROUSEL_MAX_ANGLE_DEGREES\" value is incorrect. The value ${this.maxAngleDegrees} will be used.`)\n      return;\n    }\n    this.maxAngleDegrees = maxAngleDegrees;\n  }\n\n  ngOnChanges(changes: SimpleChanges) {\n    if (changes.cellsToShow?.currentValue) {\n      this.cellWidth = 0;\n      this.marginLast = 0;\n      this.marginFirst = 0;\n    }\n    this.contentChanged();\n  }\n\n  ngAfterViewInit() {\n    this.hostWidth = this.elementRef.nativeElement.offsetWidth;\n    if ('ontouchstart' in window) {\n      this.onTouchstart();\n      this.onTouchmove();\n      this.onTouchend();\n    }\n    this.subscribeToPointerDown();\n    this.subscribeToPointerMove();\n    this.subscribeToPointerUp();\n    this.contentChanged();\n    this.events.emit({name: 'ready'})\n  }\n\n  private onTouchstart() {\n    fromEvent<TouchEvent>(this.cellsRef.nativeElement, 'touchstart')\n      .pipe(untilDestroyed(this))\n      .subscribe((e: TouchEvent) => {\n        const isPinchEvent = e.touches.length > 1 && !this.eventType;\n        const alreadyMoving = this.movementX && this.pointerPressed;\n        if (isPinchEvent || alreadyMoving) return;\n        this.touchIdentifier = e.touches[0].identifier;\n        const now = Date.now();\n        if (e.touches.length === 1) {\n          this.timeFirstTouch = now;\n        }\n        if (e.touches.length > 1 && this.eventType !== 'horizontal-swipe' && now - this.timeFirstTouch <= this.maxDelayBetweenTouches) {\n          this.eventType = 'vertical-swipe'\n        }\n\n        const { clientX, clientY, screenX, screenY } = e.touches[0];\n        this.pointerDown$.next({ clientX, clientY, screenX, screenY });\n      });\n  }\n\n  private onTouchmove() {\n    fromEvent<TouchEvent>(this.cellsRef.nativeElement, 'touchmove')\n      .pipe(distinctUntilChanged(), untilDestroyed(this))\n      .subscribe((e: TouchEvent) => {\n        this.touchEvent = e;\n        const { clientX, clientY, screenX, screenY } = e.touches[0];\n        this.pointerMove$.next({ clientX, clientY, screenX, screenY });\n      });\n  }\n\n  private onTouchend() {\n    fromEvent<TouchEvent>(this.cellsRef.nativeElement, 'touchend')\n      .pipe(untilDestroyed(this))\n      .subscribe((e) => {\n        if (e.changedTouches[0].identifier !== this.touchIdentifier) return;\n        this.touchEvent = e;\n        const { clientX, clientY, screenX, screenY } = e.changedTouches[0];\n        this.pointerUp$.next({ clientX, clientY, screenX, screenY });\n      });\n  }\n\n  private subscribeToPointerDown() {\n    this.pointerDown$.pipe(untilDestroyed(this)).subscribe(position => {\n      this.pointerPressed = true;\n      this.translateStart.x = this.translateX;\n      this.touchStart.x = position.screenX;\n      this.touchStart.y = position.screenY;\n      this.touchEnd.x = position.screenX;\n      this.touchEnd.y = position.screenY;\n      this.events.emit({ name: 'touchStart' });\n    });\n  }\n\n  private subscribeToPointerMove() {\n    this.pointerMove$\n      .pipe(\n        filter(() => this.pointerPressed),\n        distinctUntilChanged(),\n        tap(position => {\n          this.cd.markForCheck()\n          this.touchEnd.x = position.screenX;\n          this.touchEnd.y = position.screenY;\n          if (this.eventType === undefined) {\n            this.eventType = this.getLinearSwipeType(position);\n          }\n          if (this.eventType === 'horizontal-swipe' && this.touchEvent) {\n            this.touchEvent.preventDefault();\n          }\n        }),\n        filter(() => this.eventType === 'horizontal-swipe'),\n        untilDestroyed(this),\n      )\n      .subscribe((e: PointerPosition) => {\n        this.cd.markForCheck();\n        if(this.greaterThanLimit(e)) return;\n        let multyply = 1;\n        this.translateX = this.translateStart.x - this.movementX * multyply\n        this.events.emit({ name: 'move' });\n        this.cd.detectChanges()\n      });\n  }\n\n  private subscribeToPointerUp() {\n    this.pointerUp$.pipe(untilDestroyed(this)).subscribe(() => {\n      this.cd.markForCheck();\n      this.pointerPressed = false;\n      if (Math.abs(this.movementX) >= this.minSwipeDistance && this.eventType === 'horizontal-swipe') {\n        this.goToNearestSlide();\n      }\n      this.touchStart = { x: 0, y: 0 };\n      this.touchEnd = { x: 0, y: 0 };\n      this.eventType = undefined;\n      this.active = this.activeIndex;\n      this.events.emit({ name: 'touchEnd' });\n    });\n  }\n\n  private getLinearSwipeType(position: PointerPosition) {\n    if (this.eventType !== 'horizontal-swipe' && this.eventType !== 'vertical-swipe') {\n      if (!this.touchEvent) return 'horizontal-swipe'\n      const movementX = Math.abs(position.screenX - this.touchStart.x);\n      const movementY = Math.abs(position.screenY - this.touchStart.y);\n      // if (Math.pow(movementX, 2) + Math.pow(movementY, 2) < 25) return this.eventType;\n      const angleRad = Math.atan( movementY / movementX);\n      const angleDegrees = angleRad * 180 / Math.PI;\n      return angleDegrees <= this.maxAngleDegrees ? 'horizontal-swipe' : 'vertical-swipe';\n    } else {\n      return this.eventType;\n    }\n  }\n\n  private greaterThanLimit(e: PointerPosition) {\n    const movement = Math.round(e.screenX - this.touchStart.x);\n    if (this.translateX < this.translateList[0]) {\n      if (this.translateX <= this.translateList[0] - this.cellWidth / 2 && movement > this.cellWidth / 2) {\n        return true;\n      }\n    }\n    else if (this.translateX > this.translateList[this.translateList.length - 1]) {\n      if (this.translateX >= this.translateList[this.translateList.length - 1] - this.cellWidth / 2 && movement < - this.cellWidth / 2) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  private goToNearestSlide() {\n    const nearestIndex = this.getNearestSlideIndex();\n    if (nearestIndex === this.active && this.translateX < this.translateList[this.translateList.length - 1]) {\n      if (this.movementX < 0) {\n        this.next();\n      } else if (this.movementX > 0) {\n        this.prev();\n      }\n      return;\n    }\n    this.active = nearestIndex;\n    this.events.emit({ name: 'goTo', data: this.active });\n    this.emitTransitionEvent();\n  }\n\n  private getNearestSlideIndex() {\n    let minimalDistance = this.translateList[this.translateList.length - 1];\n    let result = 0;\n    this.translateList.forEach((translate, i) => {\n      const distanceToCurrentSlide = Math.abs(translate - this.translateX);\n      if (distanceToCurrentSlide < minimalDistance) {\n        minimalDistance = distanceToCurrentSlide;\n        result = i;\n      }\n    });\n    return result;\n  }\n\n  contentChanged() {\n    this.setHtmlStylesToSlides();\n    this.calculateSlidesInView();\n    this.calculateTranslateList();\n    if (this.active > this.translateList.length - 1) {\n      this.active = this.translateList.length - 1;\n    }\n    this.cd.detectChanges()\n  }\n\n  private calculateSlidesInView() {\n    for (let i = this.cells.length - 1; i >= 0; i--) {\n      if (this.cellsRef.nativeElement.offsetWidth - this.cells[i] + this.marginLast >= 0) {\n        this.slidesInView = i;\n        return;\n      }\n    }\n  }\n\n  private setHtmlStylesToSlides() {\n    this.cells = [];\n    const cells = this.cellsRef.nativeElement.querySelectorAll('.carousel-cell') as unknown as HTMLElement[];\n    if (this.cellsToShow) {\n      this.calculateCellWidth();\n    }\n    cells.forEach((el, i) => {\n      this.renderer2.setStyle(el, 'width', `${this.cellWidth}px`);\n      this.setTransformStyles(cells, i);\n    });\n  }\n\n  private calculateCellWidth() {\n    const cellsTotalWidth = this.cellsRef.nativeElement.offsetWidth;\n    this.cellWidth = cellsTotalWidth / this.cellsToShow;\n    if (this.cellsToShow !== 1) {\n      const marginsAmountPerView = this.cellsToShow - 1;\n      const totalMargin = marginsAmountPerView * this.margin;\n      this.cellWidth -= totalMargin / this.cellsToShow;\n    }\n  }\n\n  private setTransformStyles(cells: HTMLElement[], i: number) {\n    const el = cells[i];\n    let translateX = 0;\n    if (i === 0) {\n      translateX += this.marginFirst;\n    } else {\n      translateX = this.cells[i - 1] + this.cellWidth;\n      translateX += this.margin;\n    }\n\n    this.cells[i] = translateX;\n    this.renderer2.setStyle(el, 'transform', `translateX(${translateX}px)`);\n  }\n\n  private calculateTranslateList() {\n    this.translateList = [this.cells[0] - this.marginFirst];\n    for (let i = 0; i < this.cells.length; i++) {\n\n      if (i + this.slidesInView >= this.cells.length - 1) {\n        let t = this.cells[this.cells.length - 1];\n        const totalWidth = this.cellsRef.nativeElement.offsetWidth;\n        t -= totalWidth - this.cellWidth - this.marginLast;\n        if (t > 0) this.translateList.push(t)\n        return;\n      }\n\n      const nextCellTranslate = this.cells[i + 1] - this.marginFirst;\n      this.translateList.push(nextCellTranslate)\n    }\n  }\n\n  getCellsContainerTransform() {\n    if (!this.movementX) {\n      this.translateX = this.translateList[this.active];\n    }\n    return `translateX(${-this.translateX}px)`;\n  }\n\n  prev() {\n    if (!this.prevAvailable()) return;\n    this.active -= 1;\n    this.events.emit({ name: 'goTo', data: this.active });\n    this.emitTransitionEvent();\n  }\n\n  next() {\n    if (!this.nextAvailable()) return;\n    this.active += 1;\n    this.events.emit({ name: 'goTo', data: this.active });\n    this.emitTransitionEvent();\n  }\n\n  private emitTransitionEvent() {\n    this.eventSlideTo$.next(undefined);\n    timer(this.transition)\n      .pipe(takeUntil(this.eventSlideTo$), untilDestroyed(this))\n      .subscribe(() => {\n        this.events.emit({ name: 'transitionEnd' });\n      });\n  }\n\n  prevAvailable() {\n    return this.active - 1 >= 0;\n  }\n\n  nextAvailable() {\n    return this.translateX < this.translateList[this.translateList.length - 1];\n  }\n\n  nextCanBeShown() {\n    if (this.hideArrowsByLimit) {\n      if (!this.nextAvailable()) return false;\n      if (this.movementX && this.active === this.translateList.length - 1) return false;\n    }\n    return true;\n  }\n}\n\ntype CarouselEventType = undefined | 'horizontal-swipe' | 'vertical-swipe';\n\ntype CarouselEventReady = {\n  name: 'ready';\n};\n\ntype CarouselEventTouchStart = {\n  name: 'touchStart';\n};\n\ntype CarouselEventMove = {\n  name: 'move';\n};\n\ntype CarouselEventTouchEnd = {\n  name: 'touchEnd';\n};\n\ntype CarouselEventGoTo = {\n  name: 'goTo';\n  data: number;\n};\n\ntype CarouselEventTransitionEnd = {\n  name: 'transitionEnd';\n};\n\nexport type CarouselEvent =\n  | CarouselEventReady\n  | CarouselEventTouchStart\n  | CarouselEventMove\n  | CarouselEventTouchEnd\n  | CarouselEventGoTo\n  | CarouselEventTransitionEnd;\n\ntype PointerPosition = {\n  clientX: number;\n  clientY: number;\n  screenX: number;\n  screenY: number;\n};\n","<div class=\"carousel-container\" [class.swipe-available]=\"swipeByMouse\">\n  <div class=\"carousel-cells\"\n       [style.transform]=\"getCellsContainerTransform()\"\n       [style.transition-duration]=\"movementX !== 0 ? '0s' : transition + 'ms'\"\n       (cdkObserveContent)=\"contentChanged()\"\n       #cellsRef\n  >\n    <ng-content></ng-content>\n  </div>\n</div>\n<div class=\"carousel-arrows\" *ngIf=\"arrows\">\n  <div class=\"carousel-arrow carousel-arrow-prev\"\n       data-cy=\"carousel-arrow-prev\"\n       *ngIf=\"!(hideArrowsByLimit && !prevAvailable())\"\n       [class.carousel-arrow-disabled]=\"!prevAvailable()\"\n       (click)=\"prev()\"\n  >\n  </div>\n  <div class=\"carousel-arrow carousel-arrow-next\"\n       data-cy=\"carousel-arrow-next\"\n       *ngIf=\"nextCanBeShown()\"\n       [class.carousel-arrow-disabled]=\"!nextAvailable()\"\n       (click)=\"next()\"\n  >\n  </div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { CarouselComponent } from './carousel.component';\nimport {CommonModule} from \"@angular/common\";\nimport {ObserversModule} from \"@angular/cdk/observers\";\n\n\n\n@NgModule({\n  declarations: [\n    CarouselComponent\n  ],\n  imports: [CommonModule,\n    ObserversModule],\n  exports: [\n    CarouselComponent\n  ],\n})\nexport class CarouselModule {}\n","/*\n * Public API Surface of ngx-magic-carousel\n */\n\nexport * from './lib/tokens';\nexport * from './lib/carousel.component';\nexport * from './lib/carousel.module';\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}