{"version":3,"file":"ngx-carousel-ease.mjs","sources":["../../../projects/carousel/src/lib/carousel.ts","../../../projects/carousel/src/lib/validation.ts","../../../projects/carousel/src/lib/communSlider.ts","../../../projects/carousel/src/lib/infiniteSlider.ts","../../../projects/carousel/src/lib/finiteSlider.ts","../../../projects/carousel/src/lib/carousel.service.ts","../../../projects/carousel/src/lib/carousel.component.ts","../../../projects/carousel/src/lib/carousel.component.html","../../../projects/carousel/src/public-api.ts","../../../projects/carousel/src/ngx-carousel-ease.ts"],"sourcesContent":["import { signal } from '@angular/core';\r\n\r\nexport class Carousel {\r\n  slides!: NodeListOf<HTMLDivElement>;\r\n  originalSlideWidth!: number;\r\n  slideWidthWithGap!: number;\r\n\r\n  numberDots = signal(0);\r\n  maxScrollableContent = signal(0);\r\n  arrayNumberDots = signal<number[]>([]);\r\n\r\n  slidesContainer!: HTMLDivElement;\r\n  totalSlides = 0;\r\n  initialSlideToShow = 1;\r\n  paddingCarousel = 0;\r\n  carouselWidth!: number;\r\n  widthSlideContainer!: number;\r\n  arrayOfSlides: HTMLDivElement[] = [];\r\n\r\n  constructor(\r\n    private readonly carousel: HTMLDivElement,\r\n    private readonly maxWidthCarousel: number | undefined,\r\n    public slideToShow: number,\r\n    public slideWidth: number,\r\n    public readonly slideMaxWidth: number,\r\n    public readonly gap: number,\r\n    private readonly responsive: boolean,\r\n    private readonly loop: boolean\r\n  ) {\r\n    this.init();\r\n  }\r\n\r\n  get carouselElement() {\r\n    return this.carousel;\r\n  }\r\n\r\n  init() {\r\n    this.paddingCarousel = this.getPaddingCarousel();\r\n    this.initialSlideToShow = this.slideToShow;\r\n    this.slidesContainer = this.selectSlidesContainer();\r\n    this.slides = this.selectSlides();\r\n    this.arrayOfSlides = this.slidesToArray();\r\n    this.totalSlides = this.slides.length;\r\n    this.originalSlideWidth = this.slideWidth;\r\n    this.setWidthSlides();\r\n    this.setMaxWidthCarousel();\r\n    this.updateProperties();\r\n    this.slidesContainer.style.gap = `${this.gap}px`;\r\n    this.setDraggableImgToFalse();\r\n  }\r\n\r\n  /**\r\n   * Set the slide width and max width\r\n   * NB: In responsive mode, width is automatically adapted through the setAutoColumnSlideContainer() method.\r\n   *\r\n   */\r\n  setWidthSlides() {\r\n    for (const slide of this.slides) {\r\n      slide.style.maxWidth = `${this.slideMaxWidth}px`;\r\n      slide.style.width = '100%';\r\n      slide.style.userSelect = 'none';\r\n\r\n      if (!this.responsive) {\r\n        slide.style.width = `${this.slideWidth}px`;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Update carousel properties\r\n   * Occurs at start and at resizing.\r\n   */\r\n  updateProperties() {\r\n    this.carouselWidth = this.carousel.clientWidth;\r\n    if (this.responsive) {\r\n      this.updateSlideToShowResponsive();\r\n      this.setAutoColumnSlideContainer();\r\n    } else {\r\n      this.updateSlideToShowNotResponsive();\r\n    }\r\n\r\n    this.numberDots.set(this.setNumberDots());\r\n    this.arrayNumberDots.set([...Array(this.numberDots()).keys()]);\r\n\r\n    this.slideWidthWithGap = this.slideWidth + this.gap;\r\n    this.setWidthSlideContainer();\r\n    this.maxScrollableContent.set(this.getMaxScroll());\r\n  }\r\n\r\n  /**\r\n   * Update slide to show (responsive mode)\r\n   * Computes the number of slide fitting\r\n   */\r\n  updateSlideToShowResponsive() {\r\n    const slideWidthPlusGap = this.originalSlideWidth + this.gap;\r\n\r\n    const referenceWidth = Math.min(\r\n      this.carouselWidth,\r\n      this.maxWidthCarousel || Infinity,\r\n      window.innerWidth\r\n    );\r\n\r\n    const slideFitting = Math.floor(referenceWidth / slideWidthPlusGap) || 1;\r\n\r\n    this.determineSlideToShow(slideFitting);\r\n  }\r\n\r\n  /**\r\n   * Determine slide to show\r\n   * Useful to compute the slide displayed on screen and for the slider class.\r\n   * In not responsive mode, the maximum slides to show is determined by the maximum available space and the width of the slide set by the user.\r\n   */\r\n  determineSlideToShow(slideFitting: number) {\r\n    const maxSlidesToShow = this.responsive\r\n      ? this.initialSlideToShow\r\n      : this.totalSlides;\r\n\r\n    this.slideToShow = Math.min(slideFitting, maxSlidesToShow);\r\n  }\r\n\r\n  /**\r\n   * Update slide to show (not responsive mode)\r\n   * Computes the number of slide fitting. The number of slides to be shown are determined by the number of slides fitting within its container.\r\n   */\r\n  updateSlideToShowNotResponsive() {\r\n    const slideWidthPlusGap = this.slideWidth + this.gap;\r\n\r\n    const referenceWidth = Math.min(\r\n      this.carouselWidth,\r\n      this.maxWidthCarousel || Infinity,\r\n      window.innerWidth\r\n    );\r\n\r\n    const numberOfSlidesComputed =\r\n      Math.floor(referenceWidth / slideWidthPlusGap) || 1;\r\n    const slideFitting = Math.min(numberOfSlidesComputed, this.totalSlides);\r\n\r\n    this.determineSlideToShow(slideFitting);\r\n  }\r\n\r\n  getPaddingCarousel() {\r\n    const computedStyle = window.getComputedStyle(this.carousel);\r\n    const paddingLeft = computedStyle.getPropertyValue('padding-left');\r\n    const paddingRight = computedStyle.getPropertyValue('padding-right');\r\n\r\n    return parseFloat(paddingLeft) + parseFloat(paddingRight);\r\n  }\r\n\r\n  setMaxWidthCarousel() {\r\n    this.carousel.style.maxWidth = `${this.maxWidthCarousel}px`;\r\n  }\r\n\r\n  /**\r\n   * Set the with of a slide, responsive mode\r\n   * There are [n cards - 1] gaps (3 cards, 2 gaps)\r\n   */\r\n  setAutoColumnSlideContainer() {\r\n    const windowWidth =\r\n      this.carouselWidth -\r\n      this.paddingCarousel -\r\n      (this.slideToShow - 1) * this.gap;\r\n\r\n    const widthPerSlide = windowWidth / this.slideToShow;\r\n    this.slidesContainer.style.gridAutoColumns = `${widthPerSlide}px`;\r\n\r\n    this.slideWidth = widthPerSlide;\r\n  }\r\n\r\n  /**\r\n   * Define the slide container width\r\n   * Make non visible gaps of non visible cards scrollable and is used to compute the maxScrollableContent (strechingEffect)\r\n   */\r\n  setWidthSlideContainer() {\r\n    this.widthSlideContainer =\r\n      this.selectSlides().length * this.slideWidthWithGap - this.gap;\r\n    this.slidesContainer.style.width = `${this.widthSlideContainer}px`;\r\n  }\r\n\r\n  selectSlides(): NodeListOf<HTMLDivElement> {\r\n    return this.carousel.querySelectorAll('.carousel-slide');\r\n  }\r\n\r\n  slidesToArray() {\r\n    return Array.from(this.slides);\r\n  }\r\n\r\n  selectSlidesContainer() {\r\n    return this.carousel.querySelector('.slides-container') as HTMLDivElement;\r\n  }\r\n\r\n  /**\r\n   * Set number of dots\r\n   * If infinite mode, one more window than normal mode.\r\n   */\r\n  setNumberDots() {\r\n    if (this.loop) return this.totalSlides;\r\n\r\n    return this.slideToShow > 1\r\n      ? this.totalSlides - this.slideToShow + 1\r\n      : this.totalSlides;\r\n  }\r\n\r\n  /**\r\n   * Get the max scrollable content\r\n   * Useful for the streching effect (not infinite mode), end of the slides\r\n   */\r\n  getMaxScroll() {\r\n    return (this.numberDots() - 1) * this.slideWidthWithGap;\r\n  }\r\n\r\n  setDraggableImgToFalse() {\r\n    const images = this.slidesContainer.querySelectorAll('img');\r\n    images?.forEach((image) => {\r\n      image.setAttribute('draggable', 'false');\r\n    });\r\n  }\r\n}\r\n","export class Validation {\r\n  carouselSlides!: NodeListOf<HTMLDivElement> | undefined;\r\n\r\n  constructor(\r\n    private readonly carousel: HTMLDivElement,\r\n    private readonly slideWidth: number,\r\n    private readonly slideMaxWidth: number,\r\n    private readonly gap: number,\r\n    private readonly slideToScroll: number\r\n  ) {\r\n    this.carouselSlides = this.carousel.querySelectorAll('.carousel-slide');\r\n    this.slideMaxWidthShouldBeGreaterThanSlideWidth();\r\n    this.slideWidthAndGapShouldBeGreaterThanZero();\r\n    this.requiredClassShouldBeAdded();\r\n    this.slideToScrollNotGreaterThanTotalSlides();\r\n  }\r\n\r\n  slideMaxWidthShouldBeGreaterThanSlideWidth() {\r\n    if (this.slideMaxWidth < this.slideWidth) {\r\n      throw new Error(\r\n        `slideMaxWidth (value: ${this.slideMaxWidth}) is lower than slideWidth (value: ${this.slideWidth}). Please increase the max width or decrease the slide width.`\r\n      );\r\n    }\r\n  }\r\n\r\n  slideWidthAndGapShouldBeGreaterThanZero() {\r\n    const slideWidthPlusGap = this.slideWidth + this.gap;\r\n\r\n    if (slideWidthPlusGap <= 0) {\r\n      throw new Error(\r\n        'Unable to construct Carousel. SlideWidth and gap lower or equal than zero. Please add a positive value for the slideWidth and gap.'\r\n      );\r\n    }\r\n  }\r\n\r\n  requiredClassShouldBeAdded() {\r\n    if (this.carouselSlides === undefined || this.carouselSlides.length === 0) {\r\n      throw new Error(\r\n        'No elements with \"carousel-slide\" as class have been found. Please add this class to each of your slides.'\r\n      );\r\n    }\r\n  }\r\n\r\n  slideToScrollNotGreaterThanTotalSlides() {\r\n    if (\r\n      this.carouselSlides &&\r\n      this.slideToScroll > this.carouselSlides.length\r\n    ) {\r\n      throw new Error(\r\n        `slideToScroll value (${this.slideToScroll}) is greater than the total amount of slide (${this.carouselSlides.length}). This can cause invisible cards in infinite mode. Please lower the slideToScroll value.`\r\n      );\r\n    }\r\n  }\r\n}\r\n","import { ChangeDetectorRef, signal } from '@angular/core';\r\nimport { Carousel } from './carousel';\r\nimport { CarouselService } from './carousel.service';\r\n\r\nexport class CommunSlider {\r\n  dragging = signal(false);\r\n  currentSlide = signal(0);\r\n  lastWindow = 0;\r\n  currentTranslation = signal(0);\r\n  previousTranslation = 0;\r\n  direction: 'right' | 'left' = 'right';\r\n  startX = 0;\r\n  previousX = 0;\r\n  currentX = 0;\r\n  positionChange = 0;\r\n  prevLimit = 0;\r\n  nextLimit = 0;\r\n  slidesContainer!: HTMLDivElement;\r\n  arrayOfSlides!: HTMLDivElement[];\r\n  totalAmountOfSlides!: number;\r\n  fullWidthInf = 0;\r\n  lastWindowTranslation = 0;\r\n  totalSlides = 0;\r\n  DOMLimitReached = false;\r\n  visibleOffsetCardNotResponsive = 0;\r\n  invisibleOffsetCardNotResponsive = 0;\r\n  accumulatedSlide = 0;\r\n  currentCarouselID = 0;\r\n  autoInterval!: number;\r\n  playActive = signal(false);\r\n  playButtonDisabled = signal(false);\r\n  directionAutoPlay = (slides: number) => {};\r\n\r\n  constructor(\r\n    readonly carousel: Carousel,\r\n    readonly responsive: boolean,\r\n    readonly slideToScroll: number,\r\n    readonly LIMIT_AUTO_SLIDE: number,\r\n    readonly strechingLimit: number,\r\n    readonly autoSlide: boolean,\r\n    readonly animationTimingFn: string,\r\n    readonly animationTimingMs: number,\r\n    readonly enableMouseDrag: boolean,\r\n    readonly enableTouch: boolean,\r\n    readonly autoPlay: boolean,\r\n    readonly autoPlayInterval: number,\r\n    readonly autoPlayAtStart: boolean,\r\n    readonly playDirection: string,\r\n    readonly autoplaySlideToScroll: number,\r\n    public carouselService: CarouselService,\r\n    public cd: ChangeDetectorRef\r\n  ) {\r\n    this.initProperties();\r\n    this.updateProperties();\r\n  }\r\n\r\n  initProperties() {\r\n    this.slidesContainer = this.carousel.slidesContainer;\r\n    this.arrayOfSlides = this.carousel.arrayOfSlides;\r\n\r\n    this.totalSlides = this.carousel.totalSlides;\r\n    this.totalAmountOfSlides = this.totalSlides;\r\n\r\n    this.nextLimit = Math.floor(this.carousel.slideWidthWithGap);\r\n    this.prevLimit = -this.carousel.slideWidthWithGap;\r\n\r\n    if (this.autoPlayAtStart) this.launchAutoPlay();\r\n  }\r\n\r\n  launchAutoPlay() {\r\n    if (!this.autoPlay) return;\r\n\r\n    this.playActive.set(true);\r\n\r\n    this.autoInterval = window.setInterval(() => {\r\n      this.directionAutoPlay(this.autoplaySlideToScroll);\r\n      this.cd.markForCheck();\r\n    }, this.autoPlayInterval);\r\n  }\r\n\r\n  stopAutoPlay() {\r\n    if (!this.autoPlay) return;\r\n\r\n    this.playActive.set(false);\r\n    clearInterval(this.autoInterval);\r\n  }\r\n\r\n  /**\r\n   * Update properties of the slider\r\n   * Fired at start and at resizing.\r\n   */\r\n  updateProperties() {\r\n    this.updateNotResponsive();\r\n\r\n    this.lastWindow = this.carousel.numberDots() - 1;\r\n    this.fullWidthInf = this.totalSlides * this.carousel.slideWidthWithGap;\r\n\r\n    this.lastWindowTranslation =\r\n      this.slidesContainer.clientWidth -\r\n      this.carousel.slideToShow * this.carousel.slideWidthWithGap +\r\n      this.carousel.gap;\r\n\r\n    this.lastWindowTranslation += this.responsive\r\n      ? 0\r\n      : -this.visibleOffsetCardNotResponsive - this.carousel.gap;\r\n\r\n    const maxScrollable =\r\n      this.carousel.widthSlideContainer -\r\n      this.carousel.carouselWidth +\r\n      this.carousel.paddingCarousel;\r\n    this.carousel.maxScrollableContent.set(maxScrollable);\r\n\r\n    if (this.carousel.numberDots() === 1) {\r\n      // if all slides visible in one window, max scrollable content equals 0\r\n      this.carousel.maxScrollableContent.set(0);\r\n    }\r\n  }\r\n\r\n  updateNotResponsive() {\r\n    if (this.responsive) return;\r\n\r\n    // visible part of the offset of the card in px\r\n    this.visibleOffsetCardNotResponsive =\r\n      this.carousel.carouselWidth -\r\n      this.carousel.slideToShow * this.carousel.slideWidthWithGap -\r\n      this.carousel.paddingCarousel;\r\n\r\n    this.invisibleOffsetCardNotResponsive =\r\n      this.carousel.slideWidth - this.visibleOffsetCardNotResponsive;\r\n  }\r\n\r\n  /**\r\n   * Fired at drag start\r\n   * Instantiate property of the starting drag point on the X axis. Used to compute the translation.\r\n   * Disabling the transition while applying the transformation because of the attached animation.\r\n   */\r\n  dragStart(event: MouseEvent | TouchEvent) {\r\n    if (this.currentEventIsDisabled(event)) return;\r\n    clearInterval(this.autoInterval);\r\n\r\n    this.dragging.set(true);\r\n    this.startX =\r\n      event instanceof MouseEvent ? event.pageX : event.touches[0].pageX;\r\n\r\n    // Useful for direction detection\r\n    this.previousX = this.startX;\r\n    this.slidesContainer.style.transition = 'none';\r\n  }\r\n\r\n  /**\r\n   * Checks if current event is allowed by user.\r\n   * TouchEvent partially supported on Firefox (and working on Safari despite the MDN docs).\r\n   */\r\n  currentEventIsDisabled(event: MouseEvent | TouchEvent) {\r\n    const isMouseEvent = event instanceof MouseEvent;\r\n\r\n    return (\r\n      (isMouseEvent && !this.enableMouseDrag) ||\r\n      (!isMouseEvent && !this.enableTouch)\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Update the direction\r\n   * Do not update the direction in case of the same previous position.\r\n   */\r\n  setDirection() {\r\n    if (this.previousX > this.currentX) {\r\n      this.direction = 'right';\r\n    } else if (this.previousX < this.currentX) {\r\n      this.direction = 'left';\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Update the last window translation\r\n   * Useful to get the max translation at the end of the slides.\r\n   * In not responsive mode, there is possibly a not fully displayed card (card offset).\r\n   */\r\n  updateLastWindowTranslation() {\r\n    const total = this.totalAmountOfSlides * this.carousel.slideWidthWithGap;\r\n\r\n    this.lastWindowTranslation =\r\n      total - this.carousel.slideToShow * this.carousel.slideWidthWithGap;\r\n\r\n    this.lastWindowTranslation += this.responsive\r\n      ? 0\r\n      : -this.visibleOffsetCardNotResponsive - this.carousel.gap;\r\n  }\r\n\r\n  /**\r\n   * Decrease limit (movement to the left)\r\n   * In infinite mode, take full width of a set if on the first slide as new slides are created to the left (a whole set offset).\r\n   * Exception: if not responsive (card offset) and finite carousel, the next limit is at the maximum (the end of the carousel)\r\n   */\r\n  decreaseLimits(slidesCreatedOnTheLeft = false) {\r\n    let translationCorrectionAfterClone = this.prevLimit;\r\n\r\n    if (slidesCreatedOnTheLeft) {\r\n      translationCorrectionAfterClone = this.fullWidthInf;\r\n    }\r\n\r\n    this.prevLimit =\r\n      translationCorrectionAfterClone - this.carousel.slideWidthWithGap;\r\n\r\n    this.nextLimit = this.prevLimit + 2 * this.carousel.slideWidthWithGap;\r\n\r\n    this.prevLimit = Math.floor(this.prevLimit);\r\n    this.nextLimit = Math.floor(this.nextLimit);\r\n  }\r\n\r\n  /**\r\n   * Increase limit on basis of previous computed limits (movement to the right)\r\n   * Schema: || previous | current || next\r\n   * Exception: if not responsive (card offset) and finite carousel, the next limit is at the maximum (the end of the carousel)\r\n   */\r\n  increaseLimits() {\r\n    this.nextLimit += Math.floor(this.carousel.slideWidthWithGap);\r\n    this.prevLimit = Math.floor(\r\n      this.nextLimit - this.carousel.slideWidthWithGap * 2\r\n    );\r\n\r\n    // console.log(this.prevLimit, this.nextLimit);\r\n  }\r\n\r\n  /**\r\n   * Change prev and next limit on basis of the provided slide number\r\n   * Prev and next limit are always calculated as the following:\r\n   * || <= prev | current || <= next\r\n   */\r\n  changePrevAndNextLimits(slideNumber: number) {\r\n    const limitInPX = slideNumber * this.carousel.slideWidthWithGap;\r\n    this.nextLimit = Math.floor(limitInPX + this.carousel.slideWidthWithGap);\r\n\r\n    this.prevLimit = Math.floor(\r\n      this.nextLimit - this.carousel.slideWidthWithGap * 2\r\n    );\r\n\r\n    // console.log(this.prevLimit, this.nextLimit);\r\n  }\r\n\r\n  fireSlideChangeEvent(slideHasChanged: boolean, slide: number) {\r\n    if (!slideHasChanged) return;\r\n\r\n    this.carouselService.emit(slide, this.carousel.carouselElement);\r\n  }\r\n\r\n  applyTransformation(transformation: number) {\r\n    this.slidesContainer.style.transition = `transform ${this.animationTimingMs}ms ${this.animationTimingFn}`;\r\n\r\n    this.applyTranslation(-transformation);\r\n\r\n    this.dragging.set(false);\r\n    this.previousTranslation = -transformation;\r\n    this.currentTranslation.set(-transformation);\r\n  }\r\n\r\n  applyTranslation(transformation: number) {\r\n    this.slidesContainer.style.transform = `translate3d(${transformation}px, 0, 0)`;\r\n  }\r\n}\r\n","import { ChangeDetectorRef } from '@angular/core';\r\nimport { Carousel } from './carousel';\r\nimport { CarouselService } from './carousel.service';\r\nimport { CommunSlider } from './communSlider';\r\n\r\nexport class InfiniteSlider extends CommunSlider {\r\n  readonly MAX_DOM_SIZE: number;\r\n\r\n  constructor(\r\n    carousel: Carousel,\r\n    responsive: boolean,\r\n    slideToScroll: number,\r\n    LIMIT_AUTO_SLIDE: number,\r\n    strechingLimit: number,\r\n    autoSlide: boolean,\r\n    animationTimingFn: string,\r\n    animationTimingMs: number,\r\n    MAX_DOM_SIZE: number,\r\n    enableMouseDrag: boolean,\r\n    enableTouch: boolean,\r\n    autoPlay: boolean,\r\n    autoPlayInterval: number,\r\n    autoPlayAtStart: boolean,\r\n    playDirection: string,\r\n    autoplaySlideToScroll: number,\r\n    carouselService: CarouselService,\r\n    cd: ChangeDetectorRef\r\n  ) {\r\n    super(\r\n      carousel,\r\n      responsive,\r\n      slideToScroll,\r\n      LIMIT_AUTO_SLIDE,\r\n      strechingLimit,\r\n      autoSlide,\r\n      animationTimingFn,\r\n      animationTimingMs,\r\n      enableMouseDrag,\r\n      enableTouch,\r\n      autoPlay,\r\n      autoPlayInterval,\r\n      autoPlayAtStart,\r\n      playDirection,\r\n      autoplaySlideToScroll,\r\n      carouselService,\r\n      cd\r\n    );\r\n    this.MAX_DOM_SIZE = MAX_DOM_SIZE;\r\n    this.initProperties();\r\n    this.updateProperties();\r\n    this.addSlidesToRightAtStart();\r\n  }\r\n\r\n  override initProperties() {\r\n    this.defineAutoPlayDirection();\r\n    super.initProperties();\r\n  }\r\n\r\n  /**\r\n   * next and prev are defined separatively\r\n   */\r\n  defineAutoPlayDirection() {\r\n    if (this.playDirection === 'ltr') {\r\n      this.directionAutoPlay = this.next.bind(this);\r\n    } else {\r\n      this.directionAutoPlay = this.prev.bind(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Add slides to the right at start\r\n   * If only one window (number of dots === 1) and not responsive mode, there is possibly space at start for slides to the right (even though this configuration does not make a lot of sense)\r\n   * TODO: ajouter des slides si slidesToShow > total slides\r\n   */\r\n  addSlidesToRightAtStart() {\r\n    if (this.carousel.numberDots() > 1 || this.responsive) {\r\n      return;\r\n    }\r\n\r\n    this.addSlidesToTheRight();\r\n  }\r\n\r\n  /**\r\n   * Fired at drag start\r\n   * Instantiate property of the starting drag point on the X axis. Used to compute the translation.\r\n   * Disabling the transition while applying the transformation because of the attached animation.\r\n   */\r\n  override dragStart(event: MouseEvent | TouchEvent) {\r\n    if (super.currentEventIsDisabled(event)) return;\r\n\r\n    super.dragStart(event);\r\n  }\r\n\r\n  /**\r\n   * Relaunch autoPlay if not disabled or infinite mode (never disabled by limits)\r\n   * Restart only if started (playActive).\r\n   */\r\n  relaunchAutoPlay() {\r\n    if (this.playActive()) {\r\n      clearInterval(this.autoInterval);\r\n      this.launchAutoPlay();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Fired at drag end\r\n   */\r\n  dragStop(event: MouseEvent | TouchEvent) {\r\n    if (this.currentEventIsDisabled(event)) return;\r\n    this.dragging.set(false);\r\n    this.previousTranslation = this.currentTranslation();\r\n\r\n    this.autoSlider();\r\n  }\r\n\r\n  autoSlider() {\r\n    if (!this.autoSlide) return;\r\n\r\n    const referenceWidth = Math.min(\r\n      this.carousel.slideWidth,\r\n      this.carousel.slideMaxWidth || Infinity\r\n    );\r\n    const currentLimit = this.prevLimit + this.carousel.slideWidthWithGap;\r\n\r\n    // previousTranslation always a negative number, currentLimit always positive\r\n    const currentPositionChange = this.previousTranslation + currentLimit;\r\n    const moveComparedToSlide = (currentPositionChange / referenceWidth) * 100;\r\n\r\n    if (\r\n      moveComparedToSlide < -this.LIMIT_AUTO_SLIDE ||\r\n      moveComparedToSlide > this.LIMIT_AUTO_SLIDE\r\n    ) {\r\n      if (moveComparedToSlide > this.LIMIT_AUTO_SLIDE) {\r\n        this.changeSlideNumber(-1);\r\n        this.decreaseLimits();\r\n      } else {\r\n        this.changeSlideNumber(1);\r\n        this.increaseLimits();\r\n      }\r\n    }\r\n\r\n    if (-this.currentTranslation() > this.lastWindowTranslation) {\r\n      this.addSlidesToTheRight();\r\n    }\r\n\r\n    this.computeTransformation(this.accumulatedSlide);\r\n  }\r\n\r\n  /**\r\n   * Fired at dragging\r\n   * Compute the translation, change the slide number, update the direction.\r\n   */\r\n  dragMove(event: MouseEvent | TouchEvent) {\r\n    if (this.currentEventIsDisabled(event)) return;\r\n    if (!this.dragging()) return;\r\n\r\n    this.currentX =\r\n      event instanceof MouseEvent ? event.pageX : event.changedTouches[0].pageX;\r\n\r\n    this.setDirection();\r\n    this.previousX = this.currentX;\r\n\r\n    this.positionChange = this.currentX - this.startX;\r\n    this.currentTranslation.set(this.positionChange + this.previousTranslation);\r\n\r\n    this.applyTranslation(this.currentTranslation());\r\n    this.modifyCurrentSlide();\r\n  }\r\n\r\n  /**\r\n   * Responsible for changing slide number and updating the limits.\r\n   * If createSlidesInfiniteModeIfLimitsReached() doesn't take action, slide change according to previous computed limits.\r\n   */\r\n  modifyCurrentSlide() {\r\n    if (this.createSlidesInfiniteModeIfLimits()) return;\r\n\r\n    if (-this.currentTranslation() < this.prevLimit) {\r\n      this.changeSlideNumber(-1);\r\n      this.decreaseLimits();\r\n    } else if (-this.currentTranslation() >= this.nextLimit) {\r\n      this.changeSlideNumber(1);\r\n      this.increaseLimits();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Handle slide creation in infinite mode if limits reached\r\n   * Mouse or touch drag.\r\n   */\r\n  createSlidesInfiniteModeIfLimits() {\r\n    if (this.currentTranslation() > 0) {\r\n      this.addSlidesToTheLeft();\r\n      this.decreaseLimits(true);\r\n\r\n      // not enabled at start\r\n      if (this.currentSlide() > 0) {\r\n        this.changeSlideNumber(-1);\r\n      }\r\n      return true;\r\n    } else if (-this.currentTranslation() > this.lastWindowTranslation) {\r\n      this.addSlidesToTheRight();\r\n\r\n      if (this.DOMLimitReached) {\r\n        this.changePrevAndNextLimits(this.accumulatedSlide);\r\n        return true;\r\n      }\r\n    }\r\n\r\n    return false;\r\n  }\r\n\r\n  /**\r\n   * Append or prepend new slides according to the direction\r\n   * If new slides prepended, update the translation to the correct place (appending new slides do not change the translation).\r\n   * Limit DOM growth or update last window translation if applicable.\r\n   */\r\n  appendOrPrependNElements() {\r\n    if (this.direction === 'left') {\r\n      for (let i = this.arrayOfSlides.length - 1; i >= 0; i--) {\r\n        const clonedElement = this.arrayOfSlides[i].cloneNode(true);\r\n        this.slidesContainer.prepend(clonedElement);\r\n      }\r\n\r\n      this.accumulatedSlide += this.totalSlides;\r\n      this.resetViewLeftDirection();\r\n    } else {\r\n      for (let i = 0; i < this.arrayOfSlides.length; i++) {\r\n        const clonedElement = this.arrayOfSlides[i].cloneNode(true);\r\n        this.slidesContainer.append(clonedElement);\r\n      }\r\n    }\r\n\r\n    if (this.totalAmountOfSlides >= this.MAX_DOM_SIZE * this.totalSlides) {\r\n      // Limit DOM growth, max X times original DOM\r\n      // console.log('dom limit reached');\r\n      this.limitDOMGrowth();\r\n      this.DOMLimitReached = true;\r\n    } else {\r\n      this.totalAmountOfSlides += this.totalSlides;\r\n      this.DOMLimitReached = false;\r\n      this.updateLastWindowTranslation();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Limit DOM growth\r\n   * Reset the view accordingly.\r\n   */\r\n  limitDOMGrowth() {\r\n    const slides = this.carousel.selectSlides();\r\n\r\n    if (this.direction === 'right') {\r\n      for (let i = 0; i < this.totalSlides; i++) {\r\n        slides[i].remove();\r\n      }\r\n\r\n      this.resetViewRightDirection();\r\n      this.accumulatedSlide -= this.totalSlides;\r\n    } else {\r\n      for (\r\n        let i = slides.length - 1;\r\n        i > slides.length - this.totalSlides - 1;\r\n        i--\r\n      ) {\r\n        slides[i].remove();\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Reset the view in a movement to the left\r\n   * New slides added to the left, so the view has to be updated accordingly.\r\n   * If the carousel is moved with the mouse | touch event (dragging is true), the offset should be equal to a full carousel width. Otherwise (with the buttons), the computed translation should be taken into account.\r\n   * Side comment: the view does not have to be updated for slides added to the right, since relative order does not change.\r\n   * getBoundingClientRect triggers reflow of the element.\r\n   */\r\n  resetViewLeftDirection() {\r\n    const translation = Math.abs(this.previousTranslation) + this.fullWidthInf;\r\n    this.previousTranslation = -translation;\r\n\r\n    this.slidesContainer.style.transition = 'none';\r\n    const transformation = this.dragging() ? -this.fullWidthInf : -translation;\r\n    this.applyTranslation(transformation);\r\n\r\n    this.slidesContainer.getBoundingClientRect();\r\n  }\r\n\r\n  /**\r\n   * Reset the view in a movement to the right\r\n   * First set of slides have been deleted, so the translation has to be updated accordingly.\r\n   * currentTranslation is a negative number so it will be decreased by a set of slides.\r\n   * getBoundingClientRect triggers reflow of the element.\r\n   */\r\n  resetViewRightDirection() {\r\n    const translation = this.currentTranslation() + this.fullWidthInf;\r\n\r\n    this.slidesContainer.style.transition = 'none';\r\n    this.applyTranslation(translation);\r\n    this.previousTranslation = translation - this.positionChange;\r\n\r\n    this.slidesContainer.getBoundingClientRect();\r\n  }\r\n\r\n  addSlidesToTheLeft() {\r\n    this.appendOrPrependNElements();\r\n  }\r\n\r\n  addSlidesToTheRight() {\r\n    this.appendOrPrependNElements();\r\n  }\r\n\r\n  /**\r\n   * Increase limit on basis of previous computed limits (movement to the right)\r\n   * Schema: || previous | current || next\r\n   */\r\n  override increaseLimits() {\r\n    this.nextLimit += Math.floor(this.carousel.slideWidthWithGap);\r\n    this.prevLimit = Math.floor(\r\n      this.nextLimit - this.carousel.slideWidthWithGap * 2\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Previous button navigation\r\n   */\r\n  prev(slides = this.slideToScroll) {\r\n    this.direction = 'left';\r\n\r\n    this.handleBtnInfinite(-slides);\r\n    this.changeSlideNumber(-slides);\r\n    this.changePrevAndNextLimits(this.accumulatedSlide);\r\n    this.computeTransformation(this.accumulatedSlide);\r\n    this.relaunchAutoPlay();\r\n  }\r\n\r\n  /**\r\n   * Next button navigation\r\n   */\r\n  next(slides = this.slideToScroll) {\r\n    this.direction = 'right';\r\n\r\n    this.handleBtnInfinite(slides);\r\n    this.changeSlideNumber(slides);\r\n    this.changePrevAndNextLimits(this.accumulatedSlide);\r\n    this.computeTransformation(this.accumulatedSlide);\r\n    this.relaunchAutoPlay();\r\n  }\r\n\r\n  /**\r\n   * Buttons navigation in infinite mode\r\n   * Create new slide if limits reached (start or end). Update slide, limits and apply transformation accordingly.\r\n   */\r\n  handleBtnInfinite(step: number) {\r\n    let cardOffset = 0;\r\n    const goingTo = this.accumulatedSlide + step;\r\n\r\n    // there is (possibly) a card offset if not responsive\r\n    if (!this.responsive) cardOffset = 1;\r\n\r\n    if (goingTo < 0) {\r\n      this.addSlidesToTheLeft();\r\n    } else if (\r\n      goingTo + this.carousel.slideToShow + cardOffset >\r\n      this.totalAmountOfSlides\r\n    ) {\r\n      this.addSlidesToTheRight();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Navigation with bullet points\r\n   * Update values accordingly.\r\n   */\r\n  goTo(bullet: number) {\r\n    const slideHasChanged = this.currentSlide() !== bullet;\r\n    this.direction = this.currentSlide() < bullet ? 'right' : 'left';\r\n\r\n    this.currentSlide.set(bullet);\r\n    this.fireSlideChangeEvent(slideHasChanged, this.currentSlide());\r\n\r\n    this.relaunchAutoPlay();\r\n    this.navInfiniteBullets(bullet);\r\n  }\r\n\r\n  /**\r\n   * Bullets navigation\r\n   * Create new slides if exceeding end of carousel.\r\n   */\r\n  navInfiniteBullets(bullet: number) {\r\n    let cardOffset = 0;\r\n    const positionOfCurrentSlide = this.accumulatedSlide % this.totalSlides;\r\n    const difference = bullet - positionOfCurrentSlide;\r\n    this.accumulatedSlide += difference;\r\n\r\n    // there is (possibly) a card offset if not responsive\r\n    if (!this.responsive) cardOffset = 1;\r\n\r\n    if (\r\n      this.accumulatedSlide + this.carousel.slideToShow + cardOffset >\r\n      this.totalAmountOfSlides\r\n    ) {\r\n      this.addSlidesToTheRight();\r\n    }\r\n\r\n    this.computeTransformation(this.accumulatedSlide);\r\n    this.changePrevAndNextLimits(this.accumulatedSlide);\r\n  }\r\n\r\n  /**\r\n   * Exception: if only one window (numberDots === 1), update the accumulatedSlide to let the transformation occurs, but currentSlide should stay at 0.\r\n   */\r\n  changeSlideNumber(step: number) {\r\n    const slideNumberBeforeChange: number = this.currentSlide();\r\n    this.infiniteChangeSlideNumber(step);\r\n\r\n    if (this.carousel.numberDots() === 1) {\r\n      this.currentSlide.set(0);\r\n    }\r\n\r\n    const current: number =\r\n      this.carousel.numberDots() > 1\r\n        ? this.currentSlide()\r\n        : this.accumulatedSlide;\r\n\r\n    const slideHasChanged: boolean =\r\n      slideNumberBeforeChange !== this.currentSlide();\r\n    this.fireSlideChangeEvent(slideHasChanged, current);\r\n  }\r\n\r\n  infiniteChangeSlideNumber(step: number) {\r\n    this.accumulatedSlide += step;\r\n    this.currentSlide.update((slide) => slide + step);\r\n\r\n    const lastSlide = this.totalSlides - 1;\r\n    if (this.currentSlide() > lastSlide) {\r\n      this.currentSlide.update((slide) => slide % this.totalSlides);\r\n    } else if (this.currentSlide() < 0) {\r\n      this.currentSlide.update((slide) => slide + this.totalSlides);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Compute transformation that will be applied on basis of the provided slide number\r\n   */\r\n  computeTransformation(slide: number) {\r\n    const transformation = slide * this.carousel.slideWidthWithGap;\r\n\r\n    this.applyTransformation(transformation);\r\n  }\r\n}\r\n","import { ChangeDetectorRef } from '@angular/core';\r\nimport { Carousel } from './carousel';\r\nimport { CarouselService } from './carousel.service';\r\nimport { CommunSlider } from './communSlider';\r\n\r\nexport class FiniteSlider extends CommunSlider {\r\n  constructor(\r\n    carousel: Carousel,\r\n    responsive: boolean,\r\n    slideToScroll: number,\r\n    LIMIT_AUTO_SLIDE: number,\r\n    strechingLimit: number,\r\n    autoSlide: boolean,\r\n    animationTimingFn: string,\r\n    animationTimingMs: number,\r\n    enableMouseDrag: boolean,\r\n    enableTouch: boolean,\r\n    autoPlay: boolean,\r\n    autoPlayInterval: number,\r\n    autoPlayAtStart: boolean,\r\n    playDirection: string,\r\n    autoplaySlideToScroll: number,\r\n    carouselService: CarouselService,\r\n    cd: ChangeDetectorRef\r\n  ) {\r\n    super(\r\n      carousel,\r\n      responsive,\r\n      slideToScroll,\r\n      LIMIT_AUTO_SLIDE,\r\n      strechingLimit,\r\n      autoSlide,\r\n      animationTimingFn,\r\n      animationTimingMs,\r\n      enableMouseDrag,\r\n      enableTouch,\r\n      autoPlay,\r\n      autoPlayInterval,\r\n      autoPlayAtStart,\r\n      playDirection,\r\n      autoplaySlideToScroll,\r\n      carouselService,\r\n      cd\r\n    );\r\n    this.initProperties();\r\n    this.updateProperties();\r\n  }\r\n\r\n  override initProperties() {\r\n    this.defineAutoPlayDirection();\r\n    super.initProperties();\r\n    this.disableAutoPlayBtn();\r\n  }\r\n\r\n  /**\r\n   * In finite carousel, clear autoPlay interval if limits are reached.\r\n   */\r\n  disableAutoPlayBtn() {\r\n    if (!this.autoPlay) return;\r\n    this.playButtonDisabled.set(false);\r\n\r\n    // start\r\n    if (\r\n      this.currentSlide() === 0 &&\r\n      this.playDirection === 'rtl' &&\r\n      this.currentTranslation() === 0\r\n    ) {\r\n      this.playButtonDisabled.set(true);\r\n      this.playActive.set(false);\r\n      clearInterval(this.autoInterval);\r\n    }\r\n\r\n    // end\r\n    if (\r\n      this.currentSlide() === this.lastWindow &&\r\n      this.playDirection === 'ltr' &&\r\n      this.currentTranslation() <= -this.carousel.maxScrollableContent()\r\n    ) {\r\n      this.playButtonDisabled.set(true);\r\n      this.playActive.set(false);\r\n      clearInterval(this.autoInterval);\r\n    }\r\n\r\n    if (this.carousel.numberDots() === 1) this.playButtonDisabled.set(true);\r\n  }\r\n\r\n  /**\r\n   * Fired at drag start\r\n   * Instantiate property of the starting drag point on the X axis. Used to compute the translation.\r\n   * Disabling the transition while applying the transformation because of the attached animation.\r\n   */\r\n  override dragStart(event: MouseEvent | TouchEvent) {\r\n    super.dragStart(event);\r\n    this.disableAutoPlayBtn();\r\n  }\r\n\r\n  /**\r\n   * Fired at drag end\r\n   * If limits reached (start or end), put back to the current slide. Updates previous translation.\r\n   */\r\n  dragStop(event: MouseEvent | TouchEvent) {\r\n    if (this.currentEventIsDisabled(event)) return;\r\n    this.dragging.set(false);\r\n    this.previousTranslation = this.currentTranslation();\r\n\r\n    this.autoSlider();\r\n    this.disableAutoPlayBtn();\r\n\r\n    const limit =\r\n      this.currentTranslation() > 0 ||\r\n      -this.currentTranslation() > this.lastWindowTranslation;\r\n\r\n    if (limit) {\r\n      this.computeTransformation(this.currentSlide());\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Fired at dragging\r\n   * Compute the translation, change the slide number, update the direction.\r\n   */\r\n  dragMove(event: MouseEvent | TouchEvent) {\r\n    if (this.currentEventIsDisabled(event)) return;\r\n    if (!this.dragging()) return;\r\n\r\n    this.currentX =\r\n      event instanceof MouseEvent ? event.pageX : event.changedTouches[0].pageX;\r\n\r\n    this.setDirection();\r\n    this.previousX = this.currentX;\r\n\r\n    this.positionChange = this.currentX - this.startX;\r\n    this.currentTranslation.set(this.positionChange + this.previousTranslation);\r\n\r\n    // Current translation exceeding start or end limits\r\n    if (this.strechingEffect()) return;\r\n\r\n    this.applyTranslation(this.currentTranslation());\r\n    this.modifyCurrentSlide();\r\n  }\r\n\r\n  strechingEffect() {\r\n    return (\r\n      (this.currentTranslation() > this.strechingLimit &&\r\n        this.currentSlide() === 0) ||\r\n      this.currentTranslation() <\r\n        -this.carousel.maxScrollableContent() - this.strechingLimit\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Responsible for changing slide number and updating the limits.\r\n   * In finite mode, if all slides visible on one window or end of carousel, early return to not trigger change event.\r\n   */\r\n  modifyCurrentSlide() {\r\n    if (this.endOfCarousel()) return;\r\n\r\n    if (-this.currentTranslation() < this.prevLimit) {\r\n      this.changeSlideNumber(-1);\r\n      this.decreaseLimits();\r\n    } else if (-this.currentTranslation() >= this.nextLimit) {\r\n      this.changeSlideNumber(1);\r\n      this.increaseLimits();\r\n    }\r\n  }\r\n\r\n  endOfCarousel() {\r\n    return (\r\n      this.carousel.numberDots() === 1 ||\r\n      (this.currentSlide() === this.lastWindow && this.direction === 'right')\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Auto slide card if option enabled, applied on both directions.\r\n   * Prevents auto slide on limits in finite mode (if streching < limit auto slide).\r\n   * If only one slide is displayed (slideToShow === 1), the width of the slide corresponds to the window's width (a dot). Hence, taking the min between the two.\r\n   * In non responsive and non infinite, there is possibly an offset of the current limit.\r\n   */\r\n  autoSlider() {\r\n    if (!this.autoSlide) return;\r\n    if (\r\n      this.currentTranslation() > 0 ||\r\n      -this.currentTranslation() > this.lastWindowTranslation\r\n    ) {\r\n      return;\r\n    }\r\n\r\n    const referenceWidth = Math.min(\r\n      this.carousel.slideWidth,\r\n      this.carousel.slideMaxWidth || Infinity\r\n    );\r\n    let currentLimit = this.prevLimit + this.carousel.slideWidthWithGap;\r\n\r\n    if (!this.responsive && this.currentSlide() > this.lastWindow - 1) {\r\n      currentLimit = this.lastWindowTranslation;\r\n    }\r\n\r\n    // previousTranslation always a negative number, currentLimit always positive\r\n    const currentPositionChange = this.previousTranslation + currentLimit;\r\n    const moveComparedToSlide = (currentPositionChange / referenceWidth) * 100;\r\n\r\n    if (\r\n      moveComparedToSlide < -this.LIMIT_AUTO_SLIDE ||\r\n      moveComparedToSlide > this.LIMIT_AUTO_SLIDE\r\n    ) {\r\n      if (moveComparedToSlide > this.LIMIT_AUTO_SLIDE) {\r\n        this.changeSlideNumber(-1);\r\n        this.decreaseLimits();\r\n      } else {\r\n        this.changeSlideNumber(1);\r\n        this.increaseLimits();\r\n      }\r\n    }\r\n\r\n    this.computeTransformation(this.accumulatedSlide);\r\n  }\r\n\r\n  /**\r\n   * Decrease limit (movement to the left)\r\n   * Exception: if not responsive (card offset) and finite carousel, the next limit is at the maximum (the end of the carousel)\r\n   */\r\n  override decreaseLimits() {\r\n    super.decreaseLimits();\r\n\r\n    if (!this.responsive && this.currentSlide() >= this.lastWindow - 1) {\r\n      this.nextLimit = this.lastWindowTranslation;\r\n    }\r\n\r\n    this.nextLimit = Math.floor(this.nextLimit);\r\n  }\r\n\r\n  /**\r\n   * Increase limit on basis of previous computed limits (movement to the right)\r\n   * Schema: || previous | current || next\r\n   * Exception: if not responsive (card offset) and finite carousel, the next limit is at the maximum (the end of the carousel)\r\n   */\r\n  override increaseLimits() {\r\n    super.increaseLimits();\r\n\r\n    if (!this.responsive && this.currentSlide() >= this.lastWindow - 1) {\r\n      this.nextLimit = this.lastWindowTranslation;\r\n\r\n      if (this.currentSlide() === this.lastWindow) {\r\n        // only update previous limit if last slide reached\r\n        this.prevLimit = Math.floor(\r\n          this.nextLimit - this.invisibleOffsetCardNotResponsive\r\n        );\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Previous button navigation\r\n   */\r\n  prev(slides = this.slideToScroll) {\r\n    this.direction = 'left';\r\n\r\n    this.changeSlideNumber(-slides);\r\n    this.changePrevAndNextLimits(this.accumulatedSlide);\r\n    this.computeTransformation(this.accumulatedSlide);\r\n    this.disableAutoPlayBtn();\r\n    this.relaunchAutoPlay();\r\n  }\r\n\r\n  /**\r\n   * Relaunch autoPlay if not disabled.\r\n   * Restart only if started (playActive). Play button disabled when limits reached (finite carousel).\r\n   */\r\n  relaunchAutoPlay() {\r\n    if (!this.playButtonDisabled() && this.playActive()) {\r\n      clearInterval(this.autoInterval);\r\n      this.launchAutoPlay();\r\n    }\r\n  }\r\n\r\n  defineAutoPlayDirection() {\r\n    if (this.playDirection === 'ltr') {\r\n      this.directionAutoPlay = this.next.bind(this);\r\n    } else {\r\n      this.directionAutoPlay = this.prev.bind(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Next button navigation\r\n   */\r\n  next(slides = this.slideToScroll) {\r\n    this.direction = 'right';\r\n\r\n    this.changeSlideNumber(slides);\r\n    this.changePrevAndNextLimits(this.accumulatedSlide);\r\n    this.computeTransformation(this.accumulatedSlide);\r\n    this.disableAutoPlayBtn();\r\n    this.relaunchAutoPlay();\r\n  }\r\n\r\n  /**\r\n   * Navigation with bullet points\r\n   * Update values accordingly.\r\n   */\r\n  goTo(bullet: number) {\r\n    const slideHasChanged = this.currentSlide() !== bullet;\r\n    this.direction = this.currentSlide() < bullet ? 'right' : 'left';\r\n\r\n    this.currentSlide.set(bullet);\r\n    this.fireSlideChangeEvent(slideHasChanged, this.currentSlide());\r\n\r\n    this.disableAutoPlayBtn();\r\n    this.relaunchAutoPlay();\r\n\r\n    this.accumulatedSlide = this.currentSlide();\r\n    this.changePrevAndNextLimits(bullet);\r\n    this.computeTransformation(bullet);\r\n  }\r\n\r\n  /**\r\n   * Exception: if only one window (numberDots === 1), update the accumulatedSlide to let the transformation occurs, but currentSlide should stay at 0.\r\n   */\r\n  changeSlideNumber(step: number) {\r\n    const slideNumberBeforeChange = this.currentSlide();\r\n\r\n    this.finiteChangeSlideNumber(step);\r\n\r\n    if (this.carousel.numberDots() === 1) {\r\n      this.currentSlide.set(0);\r\n    }\r\n\r\n    const current =\r\n      this.carousel.numberDots() > 1\r\n        ? this.currentSlide()\r\n        : this.accumulatedSlide;\r\n\r\n    const slideHasChanged = slideNumberBeforeChange !== this.currentSlide();\r\n\r\n    this.fireSlideChangeEvent(slideHasChanged, current);\r\n  }\r\n\r\n  finiteChangeSlideNumber(step: number) {\r\n    this.currentSlide.update((slide) => slide + step);\r\n\r\n    if (this.currentSlide() > this.lastWindow) {\r\n      this.currentSlide.set(this.lastWindow);\r\n    } else if (this.currentSlide() < 0) {\r\n      this.currentSlide.set(0);\r\n    }\r\n\r\n    this.accumulatedSlide = this.currentSlide();\r\n  }\r\n\r\n  /**\r\n   * Compute transformation that will be applied on basis of the provided slide number\r\n   * Exception: if not responsive (card offset) and finite carousel, the next limit is the end of the carousel\r\n   */\r\n  computeTransformation(slide: number) {\r\n    let transformation = slide * this.carousel.slideWidthWithGap;\r\n\r\n    if (\r\n      !this.responsive &&\r\n      slide >= this.lastWindow - 1 &&\r\n      this.carousel.numberDots() > 1\r\n    ) {\r\n      this.nextLimit = this.lastWindowTranslation;\r\n\r\n      if (slide === this.lastWindow) {\r\n        // if last window, go to maximum & update prev limit\r\n        transformation = this.lastWindowTranslation;\r\n        this.prevLimit = Math.floor(\r\n          this.nextLimit - this.invisibleOffsetCardNotResponsive\r\n        );\r\n      }\r\n    }\r\n\r\n    this.applyTransformation(transformation);\r\n  }\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport class CarouselService {\r\n  emit(slide: number, carouselElement: HTMLDivElement) {\r\n    const event = new CustomEvent('slideChange', { detail: slide });\r\n\r\n    // dispatch event on the parent\r\n    carouselElement.parentElement?.dispatchEvent(event);\r\n  }\r\n}\r\n","import {\r\n  AfterViewInit,\r\n  ChangeDetectionStrategy,\r\n  ChangeDetectorRef,\r\n  Component,\r\n  computed,\r\n  ElementRef,\r\n  Inject,\r\n  input,\r\n  PLATFORM_ID,\r\n  Signal,\r\n  signal,\r\n  ViewChild,\r\n} from '@angular/core';\r\nimport { Carousel } from './carousel';\r\nimport { CommonModule, isPlatformBrowser } from '@angular/common';\r\nimport { Validation } from './validation';\r\nimport { CarouselService } from './carousel.service';\r\nimport { AnimationsTiming } from './interfaces';\r\nimport { InfiniteSlider } from './infiniteSlider';\r\nimport { FiniteSlider } from './finiteSlider';\r\n\r\n@Component({\r\n  selector: 'carousel',\r\n  templateUrl: './carousel.component.html',\r\n  styleUrls: ['./carousel.component.css'],\r\n  imports: [CommonModule],\r\n  standalone: true,\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CarouselComponent implements AfterViewInit {\r\n  maxWidthCarousel = input<number>();\r\n  infinite = input(false);\r\n  responsive = input(true);\r\n  autoSlide = input(true);\r\n  slideToShow = input(3);\r\n  slideToScroll = input(2);\r\n  autoslideLimitPercentCard = input(30);\r\n  strechingLimit = input(60);\r\n  slideWidth = input(300);\r\n  slideMaxWidth = input(500);\r\n  dots = input(true);\r\n  arrows = input(true);\r\n  counter = input(true);\r\n  enableMouseDrag = input(true);\r\n  enableTouch = input(true);\r\n  counterSeparator = input('/');\r\n  gapBetweenSlides = input(16);\r\n  animationTimingMs = input(300);\r\n  maxDomSize = input(4);\r\n  animationTimingFn = input<AnimationsTiming>('ease-out');\r\n\r\n  autoPlay = input(false);\r\n  autoPlayInterval = input(1500);\r\n  autoPlayAtStart = input(false);\r\n  displayAutoPlayControls = input(true);\r\n  autoPlaySlideToScroll = input(1);\r\n  autoPlayDirection = input<'ltr' | 'rtl'>('ltr');\r\n\r\n  @ViewChild('carouselContainer')\r\n  private carouselContainer!: ElementRef<HTMLDivElement>;\r\n  private resizeEvent!: () => void;\r\n  private mouseUpEvent!: (event: MouseEvent | TouchEvent) => void;\r\n  private visibilityEvent!: (event: any) => void;\r\n  private previousWidth = 0;\r\n  private currentWidth = 0;\r\n  private isBrowser = true;\r\n  private carousel!: Carousel;\r\n  slider!: InfiniteSlider | FiniteSlider;\r\n\r\n  // Template variables\r\n  carouselDots: Signal<number> = signal(0);\r\n  carouselMaxScrollableContent: Signal<number> = signal(0);\r\n  carouselArrayNumberDots: Signal<number[]> = signal<number[]>([]);\r\n  sliderCurrentSlide: Signal<number> = signal(0);\r\n  sliderCurrentTranslation: Signal<number> = signal(0);\r\n  sliderPlayActive: Signal<boolean> = signal(false);\r\n  sliderPlayButtonDisabled: Signal<boolean> = signal(false);\r\n  sliderDragging: Signal<boolean> = signal(false);\r\n\r\n  constructor(\r\n    private cd: ChangeDetectorRef,\r\n    private carouselService: CarouselService,\r\n    @Inject(PLATFORM_ID) platformId: Object\r\n  ) {\r\n    this.isBrowser = isPlatformBrowser(platformId);\r\n  }\r\n\r\n  ngAfterViewInit() {\r\n    if (!this.isBrowser) return;\r\n\r\n    const carouselContainer = this.carouselContainer.nativeElement;\r\n    this.previousWidth = window.innerWidth;\r\n    this.currentWidth = window.innerWidth;\r\n\r\n    new Validation(\r\n      carouselContainer,\r\n      this.slideWidth(),\r\n      this.slideMaxWidth(),\r\n      this.gapBetweenSlides(),\r\n      this.slideToScroll()\r\n    );\r\n\r\n    this.carousel = new Carousel(\r\n      carouselContainer,\r\n      this.maxWidthCarousel(),\r\n      this.slideToShow(),\r\n      this.slideWidth(),\r\n      this.slideMaxWidth(),\r\n      this.gapBetweenSlides(),\r\n      this.responsive(),\r\n      this.infinite()\r\n    );\r\n\r\n    this.instantiateSlider();\r\n    this.listeners();\r\n    this.cd.detectChanges();\r\n  }\r\n\r\n  instantiateSlider() {\r\n    if (this.infinite()) {\r\n      this.slider = new InfiniteSlider(\r\n        this.carousel,\r\n        this.responsive(),\r\n        this.slideToScroll(),\r\n        this.autoslideLimitPercentCard(),\r\n        this.strechingLimit(),\r\n        this.autoSlide(),\r\n        this.animationTimingFn(),\r\n        this.animationTimingMs(),\r\n        this.maxDomSize(),\r\n        this.enableMouseDrag(),\r\n        this.enableTouch(),\r\n        this.autoPlay(),\r\n        this.autoPlayInterval(),\r\n        this.autoPlayAtStart(),\r\n        this.autoPlayDirection(),\r\n        this.autoPlaySlideToScroll(),\r\n        this.carouselService,\r\n        this.cd\r\n      );\r\n    } else {\r\n      this.slider = new FiniteSlider(\r\n        this.carousel,\r\n        this.responsive(),\r\n        this.slideToScroll(),\r\n        this.autoslideLimitPercentCard(),\r\n        this.strechingLimit(),\r\n        this.autoSlide(),\r\n        this.animationTimingFn(),\r\n        this.animationTimingMs(),\r\n        this.enableMouseDrag(),\r\n        this.enableTouch(),\r\n        this.autoPlay(),\r\n        this.autoPlayInterval(),\r\n        this.autoPlayAtStart(),\r\n        this.autoPlayDirection(),\r\n        this.autoPlaySlideToScroll(),\r\n        this.carouselService,\r\n        this.cd\r\n      );\r\n    }\r\n\r\n    this.carouselDots = computed(() => this.carousel.numberDots());\r\n    this.carouselMaxScrollableContent = computed(() =>\r\n      this.carousel.maxScrollableContent()\r\n    );\r\n    this.carouselArrayNumberDots = computed(() =>\r\n      this.carousel.arrayNumberDots()\r\n    );\r\n\r\n    this.sliderCurrentSlide = computed(() => this.slider.currentSlide());\r\n    this.sliderCurrentTranslation = computed(() =>\r\n      this.slider.currentTranslation()\r\n    );\r\n    this.sliderCurrentTranslation = computed(() =>\r\n      this.slider.currentTranslation()\r\n    );\r\n    this.sliderPlayActive = computed(() => this.slider.playActive());\r\n    this.sliderPlayButtonDisabled = computed(() =>\r\n      this.slider.playButtonDisabled()\r\n    );\r\n    this.sliderDragging = computed(() => this.slider.dragging());\r\n  }\r\n\r\n  listeners() {\r\n    this.mouseUpEvent = (event) => {\r\n      if (!this.sliderDragging()) return;\r\n\r\n      this.slider.dragStop(event);\r\n      this.slider.relaunchAutoPlay();\r\n      this.cd.markForCheck();\r\n    };\r\n\r\n    this.visibilityEvent = (event) => {\r\n      const visibility = event.target.visibilityState;\r\n      this.slider.dragStop(event);\r\n\r\n      if (visibility === 'hidden') {\r\n        clearInterval(this.slider.autoInterval);\r\n      }\r\n\r\n      if (visibility === 'visible') {\r\n        this.slider.relaunchAutoPlay();\r\n      }\r\n\r\n      this.cd.markForCheck();\r\n    };\r\n\r\n    this.resizeEvent = () => {\r\n      this.resize();\r\n    };\r\n\r\n    window.addEventListener('mouseup', this.mouseUpEvent);\r\n    window.addEventListener('resize', this.resizeEvent);\r\n    document.addEventListener('visibilitychange', this.visibilityEvent);\r\n  }\r\n\r\n  /**\r\n   * Reinitialise variables at resize\r\n   */\r\n  resize() {\r\n    // on smartphones a vertical scroll triggers a resize event\r\n    this.currentWidth = window.innerWidth;\r\n    if (this.currentWidth === this.previousWidth) return;\r\n\r\n    this.previousWidth = window.innerWidth;\r\n    this.carousel.updateProperties();\r\n    this.slider.updateProperties();\r\n\r\n    this.slider.stopAutoPlay();\r\n    const slideNumberBeforeChange = this.slider.currentSlide();\r\n    this.slider.currentSlide.set(0);\r\n    const slideHasChanged =\r\n      slideNumberBeforeChange !== this.slider.currentSlide();\r\n    this.slider.accumulatedSlide = 0;\r\n    this.slider.computeTransformation(0);\r\n    this.slider.changePrevAndNextLimits(0);\r\n    this.slider.fireSlideChangeEvent(slideHasChanged, 0);\r\n\r\n    this.cd.markForCheck();\r\n  }\r\n\r\n  /**\r\n   * Removes active subscriptions and clear interval autoplay.\r\n   */\r\n  ngOnDestroy() {\r\n    window.removeEventListener('resize', this.resizeEvent);\r\n    window.removeEventListener('mouseup', this.mouseUpEvent);\r\n    document.removeEventListener('visibilitychange', this.visibilityEvent);\r\n    this.slider.stopAutoPlay();\r\n  }\r\n}\r\n","<div class=\"carousel-container\" #carouselContainer>\r\n  <div class=\"banner-container\">\r\n    @if (arrows()) {\r\n    <div class=\"btn-container\">\r\n      <button\r\n        class=\"prev\"\r\n        aria-label=\"previous button navigation\"\r\n        (click)=\"slider.prev()\"\r\n        [disabled]=\"\r\n          !infinite() &&\r\n          ((this.sliderCurrentSlide() === 0 &&\r\n            this.sliderCurrentTranslation() >= 0) ||\r\n            carouselDots() === 1)\r\n        \"\r\n      >\r\n        <svg\r\n          xmlns=\"http://www.w3.org/2000/svg\"\r\n          height=\"16\"\r\n          width=\"16\"\r\n          viewBox=\"0 0 512 512\"\r\n        >\r\n          <path\r\n            d=\"M9.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l128 128c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 288 480 288c17.7 0 32-14.3 32-32s-14.3-32-32-32l-370.7 0 73.4-73.4c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-128 128z\"\r\n          />\r\n        </svg>\r\n      </button>\r\n      <button\r\n        class=\"next\"\r\n        aria-label=\"next button navigation\"\r\n        (click)=\"slider.next()\"\r\n        [disabled]=\"\r\n          !infinite() &&\r\n          ((this.sliderCurrentSlide() === carouselDots() - 1 &&\r\n            this.sliderCurrentTranslation() <=\r\n              -this.carouselMaxScrollableContent()) ||\r\n            carouselDots() === 1)\r\n        \"\r\n      >\r\n        <svg\r\n          xmlns=\"http://www.w3.org/2000/svg\"\r\n          height=\"16\"\r\n          width=\"16\"\r\n          viewBox=\"0 0 512 512\"\r\n        >\r\n          <path\r\n            d=\"M502.6 278.6c12.5-12.5 12.5-32.8 0-45.3l-128-128c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L402.7 224 32 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l370.7 0-73.4 73.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l128-128z\"\r\n          />\r\n        </svg>\r\n      </button>\r\n    </div>\r\n    } @if (autoPlay() && displayAutoPlayControls()) {\r\n    <div class=\"autoplay-container\">\r\n      <button\r\n        class=\"play\"\r\n        [disabled]=\"this.sliderPlayActive() || this.sliderPlayButtonDisabled()\"\r\n        (click)=\"slider.launchAutoPlay()\"\r\n        aria-label=\"play button navigation\"\r\n      >\r\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 384 512\">\r\n          <path\r\n            d=\"M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z\"\r\n          />\r\n        </svg>\r\n      </button>\r\n      <button\r\n        class=\"pause\"\r\n        [disabled]=\"!this.sliderPlayActive()\"\r\n        (click)=\"slider.stopAutoPlay()\"\r\n        aria-label=\"pause button navigation\"\r\n      >\r\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\r\n          <path\r\n            d=\"M48 64C21.5 64 0 85.5 0 112V400c0 26.5 21.5 48 48 48H80c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48H48zm192 0c-26.5 0-48 21.5-48 48V400c0 26.5 21.5 48 48 48h32c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48H240z\"\r\n          />\r\n        </svg>\r\n      </button>\r\n    </div>\r\n    } @if (counter()) {\r\n    <div class=\"counter\">\r\n      <p>\r\n        {{ this.sliderCurrentSlide() + 1 }} {{ counterSeparator() }}\r\n        {{ carouselDots() }}\r\n      </p>\r\n    </div>\r\n    }\r\n  </div>\r\n\r\n  <div\r\n    class=\"slides-container\"\r\n    [class.dragging]=\"this.sliderDragging()\"\r\n    (mousedown)=\"slider.dragStart($event)\"\r\n    (touchstart)=\"slider.dragStart($event)\"\r\n    (mousemove)=\"slider.dragMove($event)\"\r\n    (touchmove)=\"slider.dragMove($event)\"\r\n    (touchend)=\"slider.dragStop($event); this.slider.relaunchAutoPlay()\"\r\n  >\r\n    <ng-content></ng-content>\r\n  </div>\r\n\r\n  @if (dots()) {\r\n  <div class=\"bullets-container\">\r\n    @for (bullet of this.carouselArrayNumberDots(); track $index) {\r\n    <button\r\n      class=\"bullet\"\r\n      aria-label=\"bullet point navigation\"\r\n      [class.current]=\"bullet === slider.currentSlide()\"\r\n      (click)=\"slider.goTo(bullet)\"\r\n    ></button>\r\n    }\r\n  </div>\r\n  }\r\n</div>\r\n","/*\r\n * Public API Surface of carousel\r\n */\r\n\r\nexport * from './lib/carousel.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}