ng-hero-carousel
Version:
A responsive, customizable and accessible Angular carousel.
1 lines • 40.8 kB
Source Map (JSON)
{"version":3,"file":"ng-hero-carousel.mjs","sources":["../../../projects/ng-hero-carousel/src/lib/directives/slide-for-directive.ts","../../../projects/ng-hero-carousel/src/lib/accessibility/hero-carousel.lang.ts","../../../projects/ng-hero-carousel/src/lib/directives/slide-bg-directive.ts","../../../projects/ng-hero-carousel/src/lib/ng-hero-carousel.ts","../../../projects/ng-hero-carousel/src/lib/ng-hero-carousel.html","../../../projects/ng-hero-carousel/src/lib/ng-hero-carousel.types.ts","../../../projects/ng-hero-carousel/src/public-api.ts","../../../projects/ng-hero-carousel/src/ng-hero-carousel.ts"],"sourcesContent":["import { Directive, inject, input, TemplateRef } from '@angular/core';\n\n@Directive({\n selector: 'ng-template[slideFor]'\n})\nexport class SlideForDirective {\n template = inject(TemplateRef<any>);\n slideFor = input<number>(0);\n}","import { AccessibilityOptions } from \"../ng-hero-carousel.types\";\n\nexport const HERO_CAROUSEL_LANG: Record<string, AccessibilityOptions> = {\n en: {\n autoplayPauseLabel: 'Pause carousel autoplay',\n autoplayPlayLabel: 'Resume carousel autoplay',\n hostAriaLabel: 'Main carousel',\n prevBtnAriaLabel: 'Go to previous slide',\n nextBtnAriaLabel: 'Go to next slide',\n slidesRegionAriaLabel: 'Wide carousel',\n slidesRegionRoleDescription: 'Carousel',\n slideAriaLabel: (currentSlide: number, total: number) =>\n `Slide ${currentSlide} of ${total}`,\n slideRoleDescription: 'slide',\n },\n es: {\n autoplayPauseLabel: 'Pausar la reproducción automática del carrusel',\n autoplayPlayLabel: 'Reanudar la reproducción automática del carrusel',\n hostAriaLabel: 'Carrusel principal',\n prevBtnAriaLabel: 'Ir a la diapositiva anterior',\n nextBtnAriaLabel: 'Ir a la diapositiva siguiente',\n slidesRegionAriaLabel: 'Carrusel amplio',\n slidesRegionRoleDescription: 'carrusel',\n slideAriaLabel: (currentSlide: number, total: number) =>\n `Diapositiva ${currentSlide} de ${total}`,\n slideRoleDescription: 'diapositiva',\n },\n fr: {\n autoplayPauseLabel: 'Mettre en pause la lecture automatique du carrousel',\n autoplayPlayLabel: 'Reprendre la lecture automatique du carrousel',\n hostAriaLabel: 'Carrousel principal',\n prevBtnAriaLabel: 'Aller à la diapositive précédente',\n nextBtnAriaLabel: 'Aller à la diapositive suivante',\n slidesRegionAriaLabel: 'Carrousel large',\n slidesRegionRoleDescription: 'carrousel',\n slideAriaLabel: (currentSlide: number, total: number) =>\n `Diapositive ${currentSlide} sur ${total}`,\n slideRoleDescription: 'diapositive',\n },\n de: {\n autoplayPauseLabel: 'Automatische Wiedergabe des Karussells pausieren',\n autoplayPlayLabel: 'Automatische Wiedergabe des Karussells fortsetzen',\n hostAriaLabel: 'Hauptkarussell',\n prevBtnAriaLabel: 'Zur vorherigen Folie gehen',\n nextBtnAriaLabel: 'Zur nächsten Folie gehen',\n slidesRegionAriaLabel: 'Breites Karussell',\n slidesRegionRoleDescription: 'Karussell',\n slideAriaLabel: (currentSlide: number, total: number) =>\n `Folie ${currentSlide} von ${total}`,\n slideRoleDescription: 'Folie',\n },\n it: {\n autoplayPauseLabel: 'Metti in pausa la riproduzione automatica del carosello',\n autoplayPlayLabel: 'Riprendi la riproduzione automatica del carosello',\n hostAriaLabel: 'Carosello principale',\n prevBtnAriaLabel: 'Vai alla diapositiva precedente',\n nextBtnAriaLabel: 'Vai alla diapositiva successiva',\n slidesRegionAriaLabel: 'Carosello ampio',\n slidesRegionRoleDescription: 'carosello',\n slideAriaLabel: (currentSlide: number, total: number) =>\n `Diapositiva ${currentSlide} di ${total}`,\n slideRoleDescription: 'diapositiva',\n },\n};\n","import { Directive, ElementRef, Input, Renderer2 } from '@angular/core';\n\n@Directive({\n selector: '[slide-bg]' // 👈 este será el selector que usarás en la plantilla\n})\nexport class SlideBgDirective {\n\n @Input() image?: string;\n @Input() color?: string;\n\n constructor(private el: ElementRef, private renderer: Renderer2) {}\n\n ngOnInit() {\n // Ejemplo de aplicación del fondo combinando ambos valores\n const background = this.image\n ? `url(${this.image}), ${this.color || 'transparent'}`\n : this.color || 'transparent';\n\n this.renderer.setStyle(this.el.nativeElement, 'background', background);\n this.renderer.setStyle(this.el.nativeElement, 'background-size', 'cover');\n this.renderer.setStyle(this.el.nativeElement, 'background-position', 'center');\n }\n}\n","import { AfterViewInit, ChangeDetectionStrategy, Component, ContentChild, ContentChildren, effect, ElementRef, HostBinding, HostListener, inject, input, OnInit, output, PLATFORM_ID, QueryList, Renderer2, signal, TemplateRef, ViewChild, ViewChildren } from '@angular/core';\nimport { CommonModule, isPlatformBrowser, NgTemplateOutlet } from '@angular/common';\nimport { SlideForDirective } from './directives/slide-for-directive';\nimport { HERO_CAROUSEL_LANG } from './accessibility/hero-carousel.lang';\nimport { CarouselItem, AccessibilityOptions } from './ng-hero-carousel.types';\nimport { SlideBgDirective } from \"./directives/slide-bg-directive\";\n\n@Component({\n standalone: true,\n selector: 'ng-hero-carousel',\n imports: [NgTemplateOutlet, CommonModule, SlideBgDirective],\n templateUrl: './ng-hero-carousel.html',\n styleUrl: './ng-hero-carousel.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class NgHeroCarousel implements OnInit, AfterViewInit {\n\n /** ---------- INJECTIONS ---------- */\n\n private el = inject(ElementRef);\n private renderer = inject(Renderer2);\n protected isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n /** ---------- INPUTS ---------- */\n\n slides = input<CarouselItem[]>([]);\n\n /** STYLE INPUTS */\n\n hasOverlay = input<boolean>(true);\n transitionTime = input<number>(800);\n arrowsPlacement = input<'up' | 'down' | 'auto'>('auto');\n indicators = input< 'bars' |'circles' | 'none' >('bars');\n hasCounter = input<boolean>(false);\n\n /** AUTOPLAY INPUTS */\n hasAutoplay = input<boolean>(true);\n autoplayTime = input<number>(7000);\n autoplayResumeTime = input<number>(15000);\n\n\n /** ACCESIBILITY INPUTS */\n\n lang = input<'en' | 'es' | 'fr' | 'de' | 'it'>('en');\n accessibilityOptions = input<AccessibilityOptions |null>(null);\n\n /** ---------- OUTPUTS ---------- */\n\n selected = output<number>();\n\n /** ---------- SIGNALS ---------- */\n\n protected currentSlide = signal<number>(0);\n protected carouselId = signal<string | null>(null);\n\n protected prev = signal<number>(this.slides().length - 1);\n\n private isChangingSlide = signal<boolean>(false);\n protected isPlaying = signal<boolean>(true);\n private isStopped = signal<boolean>(false);\n\n private slideWidth = signal<number>(0);\n\n private autoplayTimer = signal<number>(0);\n private resumeTimer = signal<number>(0);\n\n protected acc = signal<AccessibilityOptions>(HERO_CAROUSEL_LANG['en']);\n\n /** ---------- VIEW CHILDREN ---------- */\n\n @ViewChildren('indicatorBtn') indicatorBtn!: QueryList<ElementRef<HTMLElement>>;\n @ViewChild('indicatorsContainer') indicatorsContainer!: ElementRef<HTMLButtonElement>;\n @ViewChildren('slide') slidesElements!: QueryList<ElementRef<HTMLElement>>;\n @ViewChildren('slideCustomContent') slideCustomContent!: QueryList<ElementRef<HTMLElement>>;\n @ContentChildren(SlideForDirective) slideTemplates!: QueryList<SlideForDirective>;\n @ContentChild('outerContent') outerContent!: TemplateRef<any>;\n @ViewChild('prevBtn', { static: true }) prevBtn!: ElementRef<HTMLButtonElement>;\n @ViewChild('nextBtn', { static: true }) nextBtn!: ElementRef<HTMLButtonElement>;\n\n /** ---------- HOST BINDING / HOST LISTENERS ---------- */\n\n @HostBinding('class.user-is-tabbing') userIsTabbing = false;\n\n @HostListener('window:resize')\n onResize(){\n this.calculateSlideWidth();\n }\n\n @HostListener('keydown', ['$event'])\n handleGlobalKeydown(event: KeyboardEvent) {\n\n if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {\n event.preventDefault();\n if (event.key === 'ArrowLeft') {\n this.prevSlide();\n this.prevBtn.nativeElement.focus();\n };\n if (event.key === 'ArrowRight') {\n this.nextSlide();\n this.nextBtn.nativeElement.focus();\n };\n }\n if (event.key === 'Tab') {\n this.userIsTabbing = true;\n }\n }\n\n\n @HostListener('window:touchstart')\n onTouchStart() {\n this.userIsTabbing = false;\n }\n\n /** ---------- LIFE CYCLE---------- */\n\n constructor() {\n\n // Effects for Angular 19, 20 ( NO \", { allowSignalWrites: true }\")\n effect(() => {\n const selectedSlide = this.currentSlide();\n this.selected.emit(selectedSlide);\n });\n\n effect(() => {\n this.setAccOptions();\n this.setGlobalAriaLabel();\n });\n\n // **IMPORTANT** For angular 18 add \", { allowSignalWrites: true }\" to each effect\n };\n\n ngOnInit(): void {\n if(this.hasAutoplay()) this.autoplay();\n\n this.carouselId.set(`carousel-${Math.random().toString(36).slice(2,9)}`);\n\n this.setAccOptions();\n };\n\n ngAfterViewInit(): void {\n\n if (typeof window === 'undefined' || typeof document === 'undefined') return;\n\n this.setTransitionVariable();\n this.setGlobalAriaLabel();\n\n this.calculateSlideWidth();\n this.setSelectorInScroll();\n\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'visible') {\n this.setSelectorInScroll();\n }\n });\n };\n\n /** ---------- METHODS --------- */\n\n // Gets custom content for every slide set in ng-template\n protected getChildren(index: number) {\n return this.slideTemplates.find(t => t.slideFor() === index)?.template ?? null;\n }\n\n /** AUTOPLAY METHODS */\n\n protected toggleAutoplay(){\n if(this.isPlaying()){\n this.stopAutoplay();\n }else{\n this.isStopped.set(false);\n this.autoplay();\n }\n }\n\n private stopAutoplay (){\n clearTimeout(this.autoplayTimer());\n clearTimeout(this.resumeTimer());\n this.isPlaying.set(false);\n this.isStopped.set(true);\n }\n\n protected resetAutoplay() {\n if (this.hasAutoplay() && !this.isStopped()) {\n clearTimeout(this.autoplayTimer());\n clearTimeout(this.resumeTimer());\n this.isPlaying.set(false);\n\n this.resumeTimer.set(setTimeout(() => this.autoplay(), this.autoplayResumeTime()));\n\n }\n };\n\n private autoplay() {\n if(this.isStopped()) return;\n clearTimeout(this.autoplayTimer());\n this.autoplayTimer.set(\n setTimeout(() => {\n this.goToSlide((this.currentSlide() + 1) % this.slides().length);\n this.setSelectorInScroll();\n this.autoplay();\n }, this.autoplayTime())\n );\n this.isPlaying.set(true);\n };\n\n /** NAVIGATION METHODS */\n\n liveRegionText = signal<string>('');\n\n protected goToSlide(index: number) {\n if (this.isChangingSlide()) return;\n\n const slides = this.slides();\n if (!slides || slides.length === 0) return;\n // Limit the index to the valid range\n const clamped = Math.max(0, Math.min(index, slides.length - 1));\n // If it doesn't change, we don't do anything.\n if (clamped === this.currentSlide()) return;\n\n this.isChangingSlide.set(true);\n this.resetAutoplay();\n this.prev.set(this.currentSlide());\n\n this.currentSlide.set(clamped);\n this.setSelectorInScroll();\n\n const slideData = slides[clamped];\n const slideNumber = clamped + 1;\n const totalSlides = slides.length;\n this.liveRegionText.set(\n `Slide ${slideNumber} of ${totalSlides}. ${slideData.title || ''} ${slideData.subtitle || ''}`.trim()\n );\n\n const newSlideEl = this.slidesElements.toArray()[clamped]?.nativeElement;\n\n if (this.transitionTime() === 0) {\n // No transition → immediate unlock\n this.isChangingSlide.set(false);\n } else if (newSlideEl) {\n const onEnd = () => {\n newSlideEl.removeEventListener('transitionend', onEnd);\n this.isChangingSlide.set(false);\n };\n newSlideEl.addEventListener('transitionend', onEnd);\n } else {\n // security fallback\n setTimeout(() => this.isChangingSlide.set(false), this.transitionTime());\n }\n\n };\n\n protected nextSlide() {\n this.goToSlide((this.currentSlide() + 1) % this.slides().length);\n }\n\n protected prevSlide() {\n if(this.currentSlide() === 0){\n this.goToSlide(this.slides().length - 1);\n }else{\n this.goToSlide(this.currentSlide() - 1);\n }\n\n }\n\n private setSelectorInScroll() {\n\n if (!this.isBrowser) return;\n\n setTimeout(() => {\n const clamped = this.currentSlide();\n const activeButton = this.indicatorBtn.toArray()[clamped];\n\n if (activeButton) {\n // reference to the parent div of the buttons\n const container = this.indicatorsContainer.nativeElement;\n\n const active = activeButton.nativeElement;\n\n const offsetLeft = active.offsetLeft;\n const offsetWidth = active.offsetWidth;\n\n // We calculate position to center the button in the container\n const scrollPos = offsetLeft - (this.slideWidth() / 2) + (offsetWidth / 2);\n\n container.scrollTo({\n left: scrollPos,\n behavior: 'smooth'\n });\n }\n }, this.transitionTime());\n }\n\n private touchStartX = 0;\n private startedOnIndicators = false;\n\n protected onUserDragStart(event: TouchEvent) {\n // If we are already in transition, we ignore\n if (this.isChangingSlide()) return;\n\n // Detect if touch started on selectors\n const target = event.target as HTMLElement;\n this.startedOnIndicators = !!target.closest('.carousel__indicators');\n\n // Pause autoplay to prevent skipping while crawling\n clearTimeout(this.autoplayTimer());\n this.touchStartX = event.touches[0].clientX;\n\n // Do not propagate to avoid conflicts with other handlers\n event.stopPropagation();\n }\n\n protected onUserDragEnd(event: TouchEvent) {\n // If we were in transition, we ignore and reset flag\n if (this.isChangingSlide()) {\n this.startedOnIndicators = false;\n return;\n }\n\n // If the touch started on the selectors, we do not consider it a swipe of the carousel\n if (this.startedOnIndicators) {\n this.startedOnIndicators = false; // reset\n return;\n }\n\n const touchEndX = event.changedTouches[0].clientX;\n const deltaX = touchEndX - this.touchStartX;\n\n // small threshold to consider swipe\n const THRESHOLD = 50;\n\n event.stopPropagation();\n\n if (Math.abs(deltaX) > THRESHOLD) {\n // Prevent touch from generating a phantom click in some browsers\n event.preventDefault();\n\n if (deltaX > 0) {\n // swipe right -> previous\n this.prevSlide();\n } else {\n // swipe left -> next\n this.nextSlide();\n }\n }\n\n // resume or reschedule autoplay\n this.resetAutoplay();\n }\n\n /** ACCESSIBILITY METHODS */\n\n private setGlobalAriaLabel(): void{\n this.renderer.setAttribute(this.el.nativeElement, 'aria-label', this.acc().hostAriaLabel!);\n }\n\n private setAccOptions() {\n const currentLang = this.lang() ?? 'en';\n const langDefaults = HERO_CAROUSEL_LANG[currentLang];\n const userOptions = this.accessibilityOptions() ?? {};\n\n this.acc.set({\n ...langDefaults,\n ...userOptions,\n slideAriaLabel: userOptions.slideAriaLabel ?? langDefaults.slideAriaLabel,\n });\n }\n\n /** OTHER METHODS */\n\n private get transitionCssValue(): string {\n return `${this.transitionTime()}ms`;\n };\n\n private calculateSlideWidth() {\n const firstSlide = this.slidesElements.first;\n if (!firstSlide) return;\n const rect = firstSlide.nativeElement.getBoundingClientRect();\n const width = Number(rect.width.toFixed(2));\n this.slideWidth.set(width);\n };\n\n private setTransitionVariable(): void {\n this.el.nativeElement.style.setProperty(\n '--carousel-transition-time',\n this.transitionCssValue\n );\n }\n\n}\n","<!-- STOP AUTOPLAY -->\n<button [class]=\"!hasAutoplay() ? 'carousel__autoplayBtn--sr-only' : 'carousel__autoplayBtn'\"\n (click)=\"toggleAutoplay()\"\n [attr.aria-label]=\"hasAutoplay() ? (isPlaying() ? acc().autoplayPauseLabel : acc().autoplayPlayLabel) : null\"\n [attr.title]=\"hasAutoplay() ? (isPlaying() ? acc().autoplayPauseLabel : acc().autoplayPlayLabel) : null\"\n [attr.aria-pressed]=\"hasAutoplay() ? (isPlaying() ? 'true' : 'false') : null\"\n [attr.aria-hidden]=\"!hasAutoplay() ? 'true' : null\"\n [attr.aria-controls]=\"carouselId()\"\n>\n @if (hasAutoplay()) {\n @if(isPlaying()){\n <svg aria-hidden=\"true\" focusable=\"false\" width=\"100%\" height=\"100%\"\n viewBox=\"0 0 1920 1920\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <g stroke-width=\"0\"></g>\n <g stroke-linecap=\"round\" stroke-linejoin=\"round\"></g>\n <g>\n <path d=\"M754.571 0v1920H206V0h548.571Zm960 0v1920H1166V0h548.571Z\" fill-rule=\"evenodd\"></path>\n </g>\n </svg>\n }@else{\n <svg\n aria-hidden=\"true\" focusable=\"false\" width=\"100%\" height=\"100%\"\n viewBox=\"0 0 1920 1920\"\n xmlns=\"http://www.w3.org/2000/svg\" stroke=\"#000000\">\n <g stroke-width=\"0\"></g>\n <g stroke-linecap=\"round\" stroke-linejoin=\"round\"></g>\n <g>\n <path d=\"M175 .024V1920l1570.845-959.927z\" fill-rule=\"evenodd\"></path>\n </g>\n </svg>\n }\n }\n\n</button>\n\n<!-- OUTER CONTENT -->\n@if(outerContent){\n <div class=\"carousel__outerContent\">\n <ng-container [ngTemplateOutlet]=\"outerContent\"></ng-container>\n </div>\n}\n\n<!-- READABLE CONTENT FOR EACH SLIDE -->\n<div class=\"sr-only\" aria-live=\"polite\" aria-atomic=\"true\" role=\"status\">\n {{liveRegionText()}}\n</div>\n\n\n<!-- PREV ARROW (LEFT) -->\n<div\n class=\"carousel__prevBtnContainer\"\n [class.fiveOrLess]=\"slides().length <= 5\"\n [class.auto]=\"arrowsPlacement() === 'auto'\"\n [class.up]=\"arrowsPlacement() === 'up'\"\n>\n <button\n #prevBtn\n class=\"carousel__prevBtn\"\n (click)=\"prevSlide()\"\n [attr.aria-label]=\"acc().prevBtnAriaLabel\"\n [attr.aria-controls]=\"carouselId()\"\n type=\"button\"\n >\n <svg aria-hidden=\"true\" focusable=\"false\" xmlns=\"http://www.w3.org/2000/svg\"\n width=\"1rem\" height=\"1rem\"\n viewBox=\"320 -720 296 480\"\n >\n <path d=\"M560-240 320-480l240-240 56 56-184 184 184 184-56 56Z\"/>\n </svg>\n </button>\n</div>\n\n<!-- SLIDES CONTENT -->\n@if(slides()){\n <section\n #slidesContainer\n [id]=\"carouselId()\"\n class=\"carousel__slides\"\n (touchstart)=\"onUserDragStart($event)\"\n (touchend)=\"onUserDragEnd($event)\"\n (click)=\"resetAutoplay()\"\n\n role=\"region\"\n [attr.aria-roledescription]=\"acc().slidesRegionRoleDescription\"\n [attr.aria-label]=\"acc().slidesRegionAriaLabel\"\n >\n @for (slide of slides(); track $index) {\n\n <article\n #slide\n class=\"carousel__slide\"\n slide-bg [image]=\"slide.image_url\" [color]=\"slide.backgroundColor\"\n\n [class.fromRight]=\"$index > currentSlide()\"\n [class.fromLeft]=\"$index < currentSlide()\"\n [class.firstFromLeft]=\"$index === slides().length -1 && currentSlide() === 0\"\n\n [class.active]=\"$index === currentSlide()\"\n [class.toLeft]=\"prev() === $index && currentSlide() > prev()\"\n [class.toRight]=\"prev() === $index && currentSlide() < prev()\"\n\n [class.firstToRight]=\"$index === 0 && currentSlide() === slides().length - 1\"\n\n [class.overlay]=\"hasOverlay()\"\n\n role=\"group\"\n [attr.aria-roledescription]=\"acc().slideRoleDescription\"\n [attr.aria-label]=\"acc().slideAriaLabel?.($index + 1, slides().length) ?? null\"\n [attr.inert]=\"currentSlide() !== $index ? '' : null\"\n >\n <div\n #slidesContent class=\"carousel__slideContent\"\n [class.active]=\"currentSlide() === $index\"\n [attr.aria-live]=\"currentSlide() === $index ? 'polite' : null\"\n aria-atomic=\"true\"\n\n >\n\n @if(slide.title || slide.subtitle){\n <hgroup class=\"carousel__slideHeaders\">\n @if (slide.title) {\n <h2 class=\"carousel__slideTitle\">{{slide.title}}</h2>\n }\n\n @if (slide.subtitle) {\n <h3 class=\"carousel__slideSubtitle\">{{slide.subtitle}}</h3>\n }\n </hgroup>\n }\n\n <!-- \"isBrowser only needed in angular 18 and 19\" -->\n @if(getChildren($index)){\n <div class=\"slideCustomContent\" slideCustomContent [inert]=\"currentSlide() !== $index\">\n <ng-container [ngTemplateOutlet]=\"getChildren($index)\"></ng-container>\n </div>\n }\n\n </div>\n\n </article>\n }\n </section>\n\n}\n\n<!-- COUNTER -->\n@if (hasCounter()){\n <span class=\"carousel__counter\" aria-hidden=\"true\">\n {{(this.currentSlide() + 1) + '/' + this.slides().length}}\n </span>\n}\n\n\n<!-- NEXT ARROW (LEFT) -->\n<div\n class=\"carousel__nextBtnContainer\"\n [class.fiveOrLess]=\"slides().length <= 5\"\n [class.auto]=\"arrowsPlacement() === 'auto'\"\n [class.up]=\"arrowsPlacement() === 'up'\"\n>\n <button\n #nextBtn\n class=\"carousel__nextBtn\"\n (click)=\"nextSlide()\"\n [attr.aria-label]=\"acc().nextBtnAriaLabel\"\n [attr.aria-controls]=\"carouselId()\"\n type=\"button\"\n >\n <svg aria-hidden=\"true\" focusable=\"false\" xmlns=\"http://www.w3.org/2000/svg\"\n width=\"1rem\" height=\"1rem\"\n viewBox=\"320 -720 296 480\"\n\n >\n <path d=\"M504-480 320-664l56-56 240 240-240 240-56-56 184-184Z\"/>\n </svg>\n </button>\n</div>\n\n\n<!-- INDICATORS -->\n@if(indicators() !== 'none'){\n <section class=\"carousel__indicatorsContainer\">\n <article\n #indicatorsContainer\n class=\"carousel__indicators\"\n (touchstart)=\"onUserDragStart($event)\"\n (touchend)=\"onUserDragEnd($event)\"\n tabindex=\"-1\"\n >\n @for (indicator of slides(); track $index) {\n <button\n #indicatorBtn\n class=\"carousel__indicatorBtn\"\n [class.active]=\"currentSlide() === $index\"\n (click)=\"goToSlide($index)\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n >\n <span\n class=\"carousel__indicatorIcon\"\n [class.circles]=\"indicators() === 'circles'\"\n >\n </span>\n </button>\n }\n </article>\n </section>\n}\n","export interface CarouselItem {\n image_url?: string;\n backgroundColor?: string;\n title?: string;\n subtitle?: string;\n};\n\nexport interface AccessibilityOptions {\n hostAriaLabel?: string;\n autoplayPauseLabel?: string;\n autoplayPlayLabel?: string;\n prevBtnAriaLabel?: string;\n nextBtnAriaLabel?: string;\n slidesRegionAriaLabel?: string;\n slidesRegionRoleDescription?: string;\n slideAriaLabel?: (currentSlide: number, total: number) => string;\n slideRoleDescription?: string;\n};\n","/*\n * Public API Surface of ng-hero-carousel\n */\n\nexport * from './lib/ng-hero-carousel';\nexport * from './lib/ng-hero-carousel.types';\nexport * from './lib/directives/slide-for-directive';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}