UNPKG

embla-carousel-angular

Version:
1 lines 10.4 kB
{"version":3,"file":"embla-carousel-angular.mjs","sources":["../../src/lib/utils.ts","../../src/lib/embla-carousel.directive.ts","../../src/public-api.ts","../../src/embla-carousel-angular.ts"],"sourcesContent":["import { InjectionToken, Provider } from '@angular/core'\nimport { EmblaOptionsType } from 'embla-carousel'\nimport { Observable, filter, map, scan } from 'rxjs'\n\nexport const EMBLA_OPTIONS_TOKEN = new InjectionToken<\nEmblaOptionsType | undefined\n>('embla global options', {\n factory: () => undefined,\n})\n\nexport function provideEmblaGlobalOptions(\n options?: EmblaOptionsType,\n): Provider[] {\n return [\n {\n provide: EMBLA_OPTIONS_TOKEN,\n useValue: options,\n },\n ]\n}\n\n// Solution from https://stackoverflow.com/a/53627167\nexport function throttleDistinct<T>(\n duration: number,\n equals: (a: T, b: T) => boolean = (a, b) => a === b,\n) {\n return (source: Observable<T>) => {\n return source\n .pipe(\n map(x => {\n return {\n value: x,\n time: Date.now(),\n keep: true,\n }\n }),\n scan((acc, curr) => {\n const diff = curr.time - acc.time\n\n const isSame = equals(curr.value, acc.value)\n return diff > duration || (diff < duration && !isSame)\n ? { ...curr, keep: true }\n : { ...acc, keep: false }\n }),\n filter(x => x.keep),\n map(x => x.value),\n )\n }\n}\n","import {\n DestroyRef,\n Directive,\n ElementRef,\n NgZone,\n afterNextRender,\n effect,\n inject,\n input,\n output,\n} from '@angular/core'\nimport EmblaCarousel, {\n EmblaCarouselType,\n EmblaEventType,\n EmblaOptionsType,\n EmblaPluginType,\n} from 'embla-carousel'\nimport {\n areOptionsEqual,\n arePluginsEqual,\n canUseDOM,\n} from 'embla-carousel-reactive-utils'\nimport { Subject } from 'rxjs'\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop'\nimport { EMBLA_OPTIONS_TOKEN, throttleDistinct } from './utils'\n\n@Directive({\n selector: '[emblaCarousel]',\n exportAs: 'emblaCarousel',\n})\nexport class EmblaCarouselDirective {\n protected _globalOptions = inject(EMBLA_OPTIONS_TOKEN)\n protected _ngZone = inject(NgZone)\n protected _elementRef = inject<ElementRef<HTMLElement>>(ElementRef)\n protected _destroyRef = inject(DestroyRef)\n\n options = input<EmblaOptionsType>({})\n plugins = input<EmblaPluginType[]>([])\n subscribeToEvents = input<EmblaEventType[]>([])\n eventsThrottleTime = input(100)\n\n readonly emblaChange = output<EmblaEventType>()\n\n protected _destroy$ = new Subject<void>()\n private storedOptions = this.options()\n private storedPlugins = this.plugins()\n emblaApi?: EmblaCarouselType\n\n constructor() {\n if (this._globalOptions) {\n EmblaCarousel.globalOptions = this._globalOptions\n }\n\n // Init Embla Carousel\n afterNextRender({\n write: () => {\n if (!canUseDOM()) return\n this._ngZone.runOutsideAngular(() => {\n this.emblaApi = EmblaCarousel(this._elementRef.nativeElement, this.storedOptions, this.storedPlugins)\n this.listenEvents()\n })\n },\n })\n\n // Watch input changes\n effect(() => {\n const plugins = this.plugins()\n const options = this.options()\n let shouldReInit = false\n\n if (options && !areOptionsEqual(this.storedOptions, options)) {\n this.storedOptions = options\n shouldReInit = true\n }\n\n if (plugins && !arePluginsEqual(this.storedPlugins, plugins)) {\n this.storedPlugins = plugins\n shouldReInit = true\n }\n\n if (shouldReInit) {\n this.reInit()\n }\n })\n\n // Cleanup Embla Carousel\n this._destroyRef.onDestroy(() => {\n this.emblaApi?.destroy()\n })\n }\n\n scrollTo(...args: Parameters<EmblaCarouselType['scrollTo']>): void {\n this._ngZone.runOutsideAngular(() => this.emblaApi?.scrollTo(...args))\n }\n\n scrollPrev(...args: Parameters<EmblaCarouselType['scrollPrev']>): void {\n this._ngZone.runOutsideAngular(() => this.emblaApi?.scrollPrev(...args))\n }\n\n scrollNext(...args: Parameters<EmblaCarouselType['scrollNext']>): void {\n this._ngZone.runOutsideAngular(() => this.emblaApi?.scrollNext(...args))\n }\n\n reInit() {\n if (!this.emblaApi) {\n return\n }\n\n this._ngZone.runOutsideAngular(() => {\n this.emblaApi?.reInit(this.storedOptions, this.storedPlugins)\n })\n }\n\n /**\n * `eventsThrottler$` Subject was made just because `scroll` event fires too often.\n */\n private listenEvents(): void {\n if (this.subscribeToEvents().length === 0) {\n return\n }\n\n const eventsThrottler$ = new Subject<EmblaEventType>()\n\n eventsThrottler$\n .pipe(\n throttleDistinct(this.eventsThrottleTime()),\n takeUntilDestroyed(this._destroyRef),\n )\n .subscribe(eventName => {\n this._ngZone.run(() => this.emblaChange.emit(eventName))\n })\n\n this._ngZone.runOutsideAngular(() => {\n this.subscribeToEvents().forEach(eventName => {\n this.emblaApi!.on(eventName, () => eventsThrottler$.next(eventName))\n })\n })\n }\n}\n","/*\n * Public API Surface of embla-carousel-angular\n */\n\nexport {\n EmblaCarouselType,\n EmblaEventType,\n EmblaOptionsType,\n EmblaPluginType,\n} from 'embla-carousel'\nexport { EmblaCarouselDirective } from './lib/embla-carousel.directive'\nexport { EMBLA_OPTIONS_TOKEN, provideEmblaGlobalOptions } from './lib/utils'\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}