UNPKG

ng-content-carousel

Version:

A responsive, customizable and accessible Angular content carousel.

1 lines 27.5 kB
{"version":3,"file":"ng-content-carousel.mjs","sources":["../../../projects/ng-content-carousel/src/lib/accessibility/content-carousel.lang.ts","../../../projects/ng-content-carousel/src/lib/ng-content-carousel.ts","../../../projects/ng-content-carousel/src/lib/ng-content-carousel.html","../../../projects/ng-content-carousel/src/lib/directives/carousel-item-directive.ts","../../../projects/ng-content-carousel/src/lib/ng-content-carousel.types.ts","../../../projects/ng-content-carousel/src/public-api.ts","../../../projects/ng-content-carousel/src/ng-content-carousel.ts"],"sourcesContent":["import { AccessibilityOptions } from \"../ng-content-carousel.types\";\n\nexport const CONTENT_CAROUSEL_LANG: Record<string, AccessibilityOptions> = {\n en: {\n globalAriaLabel: 'Content carousel',\n globalRoleDescription: 'Carousel of content',\n prevBtnAriaLabel: 'Go to previous item',\n nextBtnAriaLabel: 'Go to next item',\n trackRoleDescription: 'Carousel track',\n trackAriaLabel: 'Carousel items',\n rangeMessage: (first, last, total) => `Showing items ${first} to ${last} of ${total}`,\n },\n es: {\n globalAriaLabel: 'Carrusel de contenido',\n globalRoleDescription: 'Carrusel de contenido',\n prevBtnAriaLabel: 'Ir al elemento anterior',\n nextBtnAriaLabel: 'Ir al siguiente elemento',\n trackRoleDescription: 'Pista del carrusel',\n trackAriaLabel: 'Elementos del carrusel',\n rangeMessage: (first, last, total) => `Mostrando elementos ${first} a ${last} de ${total}`,\n },\n fr: {\n globalAriaLabel: 'Carrousel de contenu',\n globalRoleDescription: 'Carrousel de contenu',\n prevBtnAriaLabel: 'Aller à l’élément précédent',\n nextBtnAriaLabel: 'Aller à l’élément suivant',\n trackRoleDescription: 'Piste du carrousel',\n trackAriaLabel: 'Éléments du carrousel',\n rangeMessage: (first, last, total) => `Affichage des éléments ${first} à ${last} sur ${total}`,\n },\n de: {\n globalAriaLabel: 'Inhaltskarussell',\n globalRoleDescription: 'Karussell mit Inhalten',\n prevBtnAriaLabel: 'Zum vorherigen Element gehen',\n nextBtnAriaLabel: 'Zum nächsten Element gehen',\n trackRoleDescription: 'Karussellspur',\n trackAriaLabel: 'Karussellelemente',\n rangeMessage: (first, last, total) => `Elemente ${first} bis ${last} von ${total} werden angezeigt`,\n },\n it: {\n globalAriaLabel: 'Carosello di contenuti',\n globalRoleDescription: 'Carosello di contenuti',\n prevBtnAriaLabel: 'Vai all’elemento precedente',\n nextBtnAriaLabel: 'Vai all’elemento successivo',\n trackRoleDescription: 'Traccia del carosello',\n trackAriaLabel: 'Elementi del carosello',\n rangeMessage: (first, last, total) => `Visualizzazione elementi da ${first} a ${last} di ${total}`,\n }\n};\n","import { AfterViewInit, ChangeDetectionStrategy, Component, ContentChildren, effect, ElementRef, HostListener, inject, input, OnInit, QueryList, signal, ViewChild } from '@angular/core';\nimport { CarouselItemDirective } from '../public-api';\nimport { CONTENT_CAROUSEL_LANG } from './accessibility/content-carousel.lang';\nimport { AccessibilityOptions, ContentCarouselLangs } from './ng-content-carousel.types';\n\n@Component({\n standalone: true,\n selector: 'ng-content-carousel',\n imports: [],\n templateUrl: './ng-content-carousel.html',\n styleUrl: './ng-content-carousel.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class NgContentCarousel implements AfterViewInit, OnInit {\n\n transition = input<boolean>(true);\n arrowStyle = input<'minimal' |'solid'>('minimal');\n hideArrowsOnEdges = input<boolean>(true);\n advanceMode= input<'single' |'page'>('page');\n\n lang = input<ContentCarouselLangs>('en');\n accessibilityOptions = input<AccessibilityOptions | null>(null);\n\n @ContentChildren(CarouselItemDirective) items!: QueryList<CarouselItemDirective>;\n @ViewChild('carouselContainer') carouselContainer!: ElementRef<HTMLDivElement>;\n @ViewChild('track') track!: ElementRef;\n @ViewChild('trackContainer') trackContainer!: ElementRef<HTMLDivElement>;\n @ViewChild('arrowButtonPrev') arrowButtonPrev!: ElementRef<HTMLDivElement>;\n @ViewChild('arrowButtonNext') arrowButtonNext!: ElementRef<HTMLDivElement>;\n\n host = inject(ElementRef<HTMLElement>);\n\n acc = signal<AccessibilityOptions>(CONTENT_CAROUSEL_LANG['en']);\n\n currentIndex = signal<number>(0);\n itemWidth = signal<number | null>(null);\n transform = signal<string>('');\n totalItems = signal<number>(3);\n maxWidth = signal<number | null>(null);\n minWidth = signal<number | null>(null);\n\n onStart = signal<boolean>(true);\n onEnd = signal<boolean>(false);\n\n trackContainerWidth = signal<number | null>(null);\n arrowButtonsWidth = signal<number | null>(null);\n hostWidth = signal<number | null>(null);\n itemsViewed = signal<number | null>(null);\n\n @HostListener('window:resize', ['$event'])\n onResize(_event: UIEvent) {\n this.calculateHostWidth();\n this.calculateitemWidth();\n this.calculateArrowsWidth();\n\n this.calculateTrackContainerWidth();\n }\n\n onKeyDown(event: KeyboardEvent) {\n const active = document.activeElement;\n const container = this.carouselContainer.nativeElement;\n\n if (active !== container) return; // ignore if focus is on a son parent\n\n if (event.key === 'ArrowRight') {\n this.next();\n event.preventDefault();\n }\n if (event.key === 'ArrowLeft') {\n this.prev();\n event.preventDefault();\n }\n }\n\n ngOnInit(): void {\n this.setAccOptions();\n };\n\n ngAfterViewInit() {\n this.calculateHostWidth();\n this.calculateitemWidth();\n this.calculatetotalItems();\n this.calculateArrowsWidth();\n\n const initialWidth = this.trackContainer.nativeElement.offsetWidth;\n this.calculateTrackContainerWidth(initialWidth);\n\n this.updateVisibleItems();\n };\n\n constructor() {\n effect(() => {\n this.setAccOptions();\n });\n // **IMPORTANT** For angular 18 add \", { allowSignalWrites: true }\" to each effect\n };\n\n calculateHostWidth(){\n this.hostWidth.set(this.host.nativeElement.offsetWidth);\n }\n\n calculateArrowsWidth(){\n setTimeout(() => {\n const arrowPrevWidth = this.arrowButtonPrev.nativeElement.offsetWidth;\n const arrowNextWidth = this.arrowButtonNext.nativeElement.offsetWidth;\n this.arrowButtonsWidth.set(arrowPrevWidth + arrowNextWidth);\n });\n };\n\n calculateitemWidth(){\n const firstItem = this.items.first?.el.nativeElement;\n if (firstItem) {\n this.itemWidth.set(firstItem.offsetWidth);\n }\n };\n\n calculateTrackContainerWidth(width: number = 0){\n\n let initialWidth = width;\n if(this.hostWidth() && this.arrowButtonsWidth()){\n const widthFromHost = this.hostWidth()! - this.arrowButtonsWidth()!;\n initialWidth = widthFromHost > this.maxWidth()! ? this.maxWidth()! : widthFromHost;\n }\n const itemsViewed = Math.floor(initialWidth / this.itemWidth()!);\n itemsViewed === 0\n ? this.itemsViewed.set(1)\n : this.itemsViewed.set(itemsViewed);\n\n const calculatedWidth = (itemsViewed * this.itemWidth()!);\n const finalWidth = calculatedWidth < this.itemWidth()! ? this.minWidth() : calculatedWidth;\n this.trackContainerWidth.set(finalWidth);\n };\n\n calculatetotalItems(){\n this.totalItems.set(this.items.length);\n this.maxWidth.set(this.items.length * this.itemWidth()!);\n this.minWidth.set(this.itemWidth()!);\n }\n\n next() {\n if(this.currentIndex() <= this.totalItems() - this.itemsViewed()! - 1){\n\n if(this.advanceMode() === 'page'){\n const itemsToAdvance = this.currentIndex() + (this.itemsViewed()! * 2) > this.totalItems()\n ? this.totalItems() - this.itemsViewed()!\n : this.currentIndex() + this.itemsViewed()!\n this.currentIndex.set(itemsToAdvance);\n }else{\n this.currentIndex.set(this.currentIndex() + 1);\n }\n this.updateTransform();\n }\n\n if(this.currentIndex() === this.totalItems() - this.itemsViewed()!){\n this.onEnd.set(true);\n }\n\n if(this.currentIndex() > 0){\n this.onStart.set(false);\n }\n\n this.updateVisibleItems();\n\n }\n\n prev() {\n if (this.currentIndex() > 0) {\n if(this.advanceMode() === 'page'){\n const itemsToAdvance = this.currentIndex() - (this.itemsViewed()!) < 0\n ? 0\n : this.currentIndex() - this.itemsViewed()!\n this.currentIndex.set(itemsToAdvance);\n }else{\n this.currentIndex.set(this.currentIndex() - 1);\n }\n this.updateTransform();\n }\n\n if(this.currentIndex() === 0){\n this.onStart.set(true);\n }\n\n if(this.currentIndex() !== this.totalItems() - this.itemsViewed()! ){\n this.onEnd.set(false);\n }\n\n this.updateVisibleItems();\n };\n\n startX = 0;\n endX = 0;\n startY = 0;\n endY = 0;\n\n onTouchStart(e: TouchEvent) {\n this.startX = e.touches[0].clientX;\n this.startY = e.touches[0].clientY;\n }\n\n onTouchEnd(e: TouchEvent) {\n this.endX = e.changedTouches[0].clientX;\n this.endY = e.changedTouches[0].clientY;\n\n const diffX = this.startX - this.endX;\n const diffY = this.startY - this.endY;\n\n if (Math.abs(diffY) > Math.abs(diffX)) return;\n\n if (Math.abs(diffX) > 10) {\n diffX > 0 ? this.next() : this.prev();\n }\n }\n\n\n updateTransform() {\n let translatePoint = this.currentIndex() * (this.itemWidth()!);\n if(this.currentIndex() === 0){\n translatePoint = 0;\n }\n this.transform.set(`translateX(-${translatePoint}px)`);\n };\n\n firstVisibleIndex = signal<number>(0);\n lastVisibleIndex = signal<number>(0);\n\n updateVisibleItems() {\n\n if (!this.itemsViewed() || this.items.length === 0) {\n this.firstVisibleIndex.set(0);\n this.lastVisibleIndex.set(0);\n\n // Set timeout for avoiding false positive on ssr\n setTimeout(() => {\n if (this.items.length === 0) {\n console.warn('NgContentCarousel: no projected children detected.');\n }\n });\n\n return;\n }\n\n const visibleItemsArr : number[] = [];\n for (let i = this.currentIndex(); i <= (this.currentIndex() + this.itemsViewed()! - 1); i++) {\n visibleItemsArr.push(i);\n }\n\n this.firstVisibleIndex.set(visibleItemsArr[0]);\n this.lastVisibleIndex.set(visibleItemsArr[visibleItemsArr.length - 1]);\n\n this.items.forEach(({ el }, i) => {\n if(!visibleItemsArr.includes(i)){\n el.nativeElement.toggleAttribute('inert', true);\n }else{\n el.nativeElement.toggleAttribute('inert', false);\n }\n });\n };\n\n setAccOptions() {\n const currentLang = this.lang() ?? 'en';\n const langDefaults = CONTENT_CAROUSEL_LANG[currentLang];\n const userOptions = this.accessibilityOptions() ?? {};\n\n this.acc.set({\n ...langDefaults,\n ...userOptions,\n });\n };\n\n visibleRangeMessage() {\n const first = this.firstVisibleIndex();\n const last = this.lastVisibleIndex();\n const total = this.items.length;\n\n const acc = this.acc(); // current accessibility options\n return acc.rangeMessage!(first + 1, last + 1, total);\n\n };\n}\n","<div #carouselContainer\n class=\"contentCarousel__container\"\n role=\"region\"\n [attr.aria-roledescription]=\"acc().globalRoleDescription\"\n [attr.aria-label]=\"acc().globalAriaLabel\"\n tabindex=\"0\"\n (keydown)=\"onKeyDown($event)\"\n>\n\n <div class=\"sr-only\" aria-live=\"polite\">\n {{visibleRangeMessage()}}\n </div>\n\n <div #arrowButtonPrev\n class=\"contentCarousel__prevContainer\"\n [class.onStart]=\"onStart() && hideArrowsOnEdges()\"\n >\n <button\n class=\"contentCarousel__prevButton\"\n (click)=\"prev()\"\n [class.minimal]=\"arrowStyle() === 'minimal'\"\n [class.solid]=\"arrowStyle() === 'solid'\"\n [attr.inert]=\"onStart() && hideArrowsOnEdges() ? '' : null\"\n [attr.aria-disabled]=\"onStart() && hideArrowsOnEdges() ? 'true' : 'false'\"\n [attr.aria-label]=\"acc().prevBtnAriaLabel\"\n tabindex=\"-1\"\n >\n <div class=\"contentCarousel__prevIcon\">\n <svg xmlns=\"http://www.w3.org/2000/svg\"s\n aria-hidden=\"true\" focusable=\"false\"\n width=\"1.5rem\" height=\"1.5rem\"\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 </div>\n </button>\n </div>\n\n <div #trackContainer\n class=\"contentCarousel__trackContainer\"\n [style.width]=\"trackContainerWidth() + 'px'\"\n (touchend)=\"onTouchEnd($event)\"\n (touchstart)=\"onTouchStart($event)\"\n >\n <div #track\n class=\"contentCarousel__track\"\n [style.transform]=\"transform()\"\n [class.transition]=\"transition()\"\n role=\"group\"\n [attr.aria-roledescription]=\"acc().trackRoleDescription\"\n [attr.aria-label]=\"acc().trackAriaLabel\"\n >\n <ng-content></ng-content>\n </div>\n </div>\n\n <div #arrowButtonNext\n class=\"contentCarousel__nextContainer\"\n [class.onEnd]=\"onEnd() && hideArrowsOnEdges()\"\n >\n <button\n class=\"contentCarousel__nextButton\"\n (click)=\"next()\"\n\n [class.minimal]=\"arrowStyle() === 'minimal'\"\n [class.solid]=\"arrowStyle() === 'solid'\"\n [attr.inert]=\"onEnd() && hideArrowsOnEdges() ? '' : null\"\n [attr.aria-disabled]=\"onEnd() && hideArrowsOnEdges() ? 'true' : 'false'\"\n [attr.aria-label]=\"acc().nextBtnAriaLabel\"\n tabindex=\"-1\"\n >\n <div class=\"contentCarousel__nextIcon\" >\n <svg aria-hidden=\"true\" focusable=\"false\" xmlns=\"http://www.w3.org/2000/svg\"\n width=\"1.5rem\" height=\"1.5rem\"\n viewBox=\"320 -720 296 480\"\n >\n <path d=\"M504-480 320-664l56-56 240 240-240 240-56-56 184-184Z\"/>\n </svg>\n </div>\n\n </button>\n </div>\n</div>\n","import { Directive, ElementRef, Renderer2 } from '@angular/core';\n\n@Directive({\n selector: '[carouselItem]',\n standalone: true\n})\nexport class CarouselItemDirective {\n constructor(public el: ElementRef, private renderer: Renderer2) {\n this.renderer.addClass(this.el.nativeElement, 'carousel-item');\n }\n}\n","import { CONTENT_CAROUSEL_LANG } from \"./accessibility/content-carousel.lang\";\n\nexport type ContentCarouselLangs = keyof typeof CONTENT_CAROUSEL_LANG;\n// \"en\" | \"es\" | \"fr\" | \"it\" | \"de\"\n\nexport interface AccessibilityOptions {\n globalAriaLabel?: string;\n globalRoleDescription?: string;\n prevBtnAriaLabel?: string;\n nextBtnAriaLabel?: string;\n trackRoleDescription?: string;\n trackAriaLabel?: string;\n rangeMessage?: (first: number, last: number, total: number) => string;\n};\n","/*\n * Public API Surface of ng-content-carousel\n */\n\nexport * from './lib/ng-content-carousel';\nexport * from './lib/directives/carousel-item-directive';\nexport * from './lib/ng-content-carousel.types';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}