{"version":3,"file":"ifsworld-granite-components-carousel.mjs","sources":["../../../../libs/granite-components/carousel/src/lib/carousel.component.ts","../../../../libs/granite-components/carousel/src/lib/carousel.component.html","../../../../libs/granite-components/carousel/src/lib/carousel.module.ts","../../../../libs/granite-components/carousel/src/ifsworld-granite-components-carousel.ts"],"sourcesContent":["import {\n  AfterViewInit,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  ContentChild,\n  HostListener,\n  Input,\n  OnChanges,\n  OnDestroy,\n  SimpleChanges,\n  TemplateRef,\n  ViewChild,\n  inject,\n} from '@angular/core';\nimport { Carousel, CarouselResponsiveOptions } from 'primeng/carousel';\n\n@Component({\n  selector: 'granite-carousel',\n  templateUrl: './carousel.component.html',\n  styleUrl: './carousel.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  standalone: false,\n})\nexport class GraniteCarouselComponent<T>\n  implements OnChanges, AfterViewInit, OnDestroy\n{\n  @Input()\n  items: T[] = [];\n\n  @Input()\n  responsiveOptions: CarouselResponsiveOptions[] = [\n    {\n      breakpoint: '1024px',\n      numVisible: 3,\n      numScroll: 1,\n    },\n    {\n      breakpoint: '768px',\n      numVisible: 2,\n      numScroll: 1,\n    },\n    {\n      breakpoint: '560px',\n      numVisible: 1,\n      numScroll: 1,\n    },\n  ];\n\n  @Input()\n  numVisible: number = 1;\n\n  @Input()\n  numScroll: number = 1;\n\n  @Input()\n  circular: boolean = false;\n\n  @Input()\n  prevButtonAriaLabel: string = 'Previous page';\n\n  @Input()\n  nextButtonAriaLabel: string = 'Next page';\n\n  @Input()\n  shrinkToContent: boolean = false;\n\n  @ContentChild('itemTemplate', { static: false })\n  itemTemplateRef: TemplateRef<any>;\n\n  @ViewChild('carousel')\n  carousel: Carousel;\n\n  visibleItems: T[] = [];\n  isOneItemVisible: boolean = false;\n\n  private cdr = inject(ChangeDetectorRef);\n  private resizeObserver: ResizeObserver;\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['items'] && changes['items'].currentValue) {\n      this.items = changes['items'].currentValue;\n      this.triggerUpdate();\n    }\n  }\n\n  ngAfterViewInit(): void {\n    if (typeof ResizeObserver !== 'undefined') {\n      this.resizeObserver = new ResizeObserver((entries) => {\n        this.handleResize(entries);\n      });\n\n      this.resizeObserver.observe(this.carousel?.el?.nativeElement);\n    }\n  }\n\n  @HostListener('window:resize')\n  onResize(): void {\n    this.triggerUpdate();\n  }\n\n  onKeyDown(event: KeyboardEvent): void {\n    const mouseEvent = new MouseEvent('click', { cancelable: true });\n    if (event.key === 'ArrowRight') {\n      this.navForward(mouseEvent);\n    } else if (event.key === 'ArrowLeft') {\n      this.navBackward(mouseEvent);\n    }\n  }\n\n  navForward(event: MouseEvent): void {\n    this.carousel?.navForward(event);\n  }\n\n  navBackward(event: MouseEvent): void {\n    this.carousel?.navBackward(event);\n  }\n\n  ngOnDestroy(): void {\n    this.resizeObserver?.disconnect();\n  }\n\n  private triggerUpdate(): void {\n    if (this.carousel?.el?.nativeElement) {\n      const containerWidth = this.carousel.el.nativeElement.offsetWidth;\n      this.updateNumVisibleBasedOnWidth(containerWidth);\n    } else {\n      this.updateVisibleItems();\n    }\n  }\n\n  private handleResize(entries: ResizeObserverEntry[]): void {\n    entries.forEach((entry) => {\n      if (entry.contentRect) {\n        const containerWidth = entry.contentRect.width;\n        this.updateNumVisibleBasedOnWidth(containerWidth);\n      }\n    });\n  }\n\n  private getDisplayItems(items: T[], numVisible: number): T[] {\n    const placeholders = Array(Math.max(0, numVisible - items.length)).fill({\n      placeholder: true,\n    });\n\n    return [...items, ...placeholders];\n  }\n\n  private updateVisibleItems(): void {\n    if (!this.items || !this.carousel) return;\n\n    const numVisible = this.carousel.numVisible || this.numVisible;\n    this.visibleItems = this.getDisplayItems(this.items, numVisible);\n    this.cdr.markForCheck();\n  }\n\n  private updateNumVisibleBasedOnWidth(containerWidth: number): void {\n    if (!this.carousel) return;\n\n    let matched: boolean = false;\n    const sortedResponsiveOptions = [...this.responsiveOptions].sort(\n      (a, b) => parseInt(a.breakpoint) - parseInt(b.breakpoint)\n    );\n\n    if (containerWidth) {\n      for (const option of sortedResponsiveOptions) {\n        const breakpoint = parseInt(option.breakpoint);\n\n        if (containerWidth <= breakpoint) {\n          this.carousel.numVisible = option.numVisible;\n          this.isOneItemVisible = option.numVisible === 1;\n          matched = true;\n          break;\n        }\n      }\n    }\n\n    if (!matched) {\n      this.carousel.numVisible = this.numVisible;\n    }\n\n    this.updateVisibleItems();\n  }\n}\n","<div class=\"carousel-wrapper\">\n  <button\n    graniteFlatButton\n    class=\"arrow-btn\"\n    [disabled]=\"carousel.isBackwardNavDisabled()\"\n    [attr.aria-label]=\"prevButtonAriaLabel\"\n    (click)=\"navBackward($event)\"\n  >\n    <granite-icon fontIcon=\"icon-caret-left\"></granite-icon>\n  </button>\n\n  <p-carousel\n    #carousel\n    [value]=\"visibleItems\"\n    [numVisible]=\"numVisible\"\n    [numScroll]=\"numScroll\"\n    [circular]=\"circular\"\n    [responsiveOptions]=\"responsiveOptions\"\n    [showNavigators]=\"false\"\n    [showIndicators]=\"false\"\n    [class.auto-width]=\"shrinkToContent\"\n    [class.is-one-item]=\"isOneItemVisible\"\n    (keydown)=\"onKeyDown($event)\"\n    tabindex=\"0\"\n  >\n    <ng-template let-item pTemplate=\"item\">\n      <div class=\"item-template-wrapper\" *ngIf=\"!item.placeholder\">\n        <ng-container\n          *ngTemplateOutlet=\"itemTemplateRef; context: { $implicit: item }\"\n        ></ng-container>\n      </div>\n    </ng-template>\n  </p-carousel>\n\n  <button\n    graniteFlatButton\n    class=\"arrow-btn\"\n    [disabled]=\"carousel.isForwardNavDisabled()\"\n    [attr.aria-label]=\"nextButtonAriaLabel\"\n    (click)=\"navForward($event)\"\n  >\n    <granite-icon fontIcon=\"icon-caret-right\"></granite-icon>\n  </button>\n</div>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { GraniteCarouselComponent } from './carousel.component';\nimport { CarouselModule } from 'primeng/carousel';\nimport {\n  GraniteIconModule,\n  GraniteButtonModule,\n} from '@ifsworld/granite-components';\n\n@NgModule({\n  declarations: [GraniteCarouselComponent],\n  exports: [GraniteCarouselComponent],\n  imports: [\n    CommonModule,\n    CarouselModule,\n    GraniteButtonModule,\n    GraniteIconModule,\n  ],\n})\nexport class GraniteCarouselModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}