ngx-lottie
Version:
<h1 align="center"> <img src="https://raw.githubusercontent.com/ngx-lottie/ngx-lottie/refs/heads/master/docs/assets/logo.png"> </h1>
1 lines • 31.6 kB
Source Map (JSON)
{"version":3,"file":"ngx-lottie.mjs","sources":["../../../../libs/ngx-lottie/src/lib/symbols.ts","../../../../libs/ngx-lottie/src/lib/animation-loader.ts","../../../../libs/ngx-lottie/src/lib/cacheable-animation-loader/cacheable-animation-loader.ts","../../../../libs/ngx-lottie/src/lib/providers.ts","../../../../libs/ngx-lottie/src/lib/base.directive.ts","../../../../libs/ngx-lottie/src/lib/lottie.directive.ts","../../../../libs/ngx-lottie/src/lib/lottie.component.ts","../../../../libs/ngx-lottie/src/lib/server.ts","../../../../libs/ngx-lottie/src/lib/transfer-state.ts","../../../../libs/ngx-lottie/src/ngx-lottie.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport interface BMEnterFrameEvent {\n type: 'enterFrame';\n currentTime: number;\n totalTime: number;\n duration: number;\n}\n\nexport interface BMCompleteLoopEvent {\n type: 'loopComplete';\n currentLoop: boolean | number;\n totalLoops: number;\n direction: number;\n}\n\nexport interface BMCompleteEvent {\n type: 'complete';\n direction: number;\n}\n\nexport interface BMSegmentStartEvent {\n type: 'segmentStart';\n firstFrame: number;\n totalFrames: number;\n}\n\nexport interface BMDestroyEvent {\n target: AnimationItem;\n type: 'destroy';\n}\n\nexport interface BMRenderFrameErrorEvent {\n type: 'renderFrameError';\n nativeError: Error;\n currentTime: number;\n}\n\nexport interface BMConfigErrorEvent {\n type: 'configError';\n nativeError: Error;\n}\n\nexport type LottieEvent =\n | BMEnterFrameEvent\n | BMCompleteLoopEvent\n | BMCompleteEvent\n | BMSegmentStartEvent\n | BMDestroyEvent\n | BMRenderFrameErrorEvent\n | BMConfigErrorEvent\n | void;\n\nexport type CamelizedAnimationEventName =\n | 'complete'\n | 'loopComplete'\n | 'enterFrame'\n | 'segmentStart'\n | 'configReady'\n | 'dataReady'\n | 'domLoaded'\n | 'destroy'\n | 'error';\n\nexport type EventsMap = { [key in CamelizedAnimationEventName]: AnimationEventName };\n\nexport type AnimationFilename = string;\nexport type AnimationEventName = import('lottie-web').AnimationEventName;\nexport type AnimationItem = import('lottie-web').AnimationItem;\nexport type LottiePlayer = typeof import('lottie-web').default;\n\n/**\n * @example\n * import player from 'lottie-web';\n * const factory = () => player;\n */\ntype LottiePlayerFactory = () => LottiePlayer;\n\n/**\n * @example\n * const factory = () => import('lottie-web');\n */\ntype LottieLoader = () => Promise<typeof import('lottie-web')>;\n\nexport type LottiePlayerFactoryOrLoader = LottiePlayerFactory | LottieLoader;\n\nexport interface LottieOptions {\n // Determines whether to load files on a separate worker. Note: workers cannot load\n // animations from URLs (if `options.path` is defined).\n useWebWorker?: boolean;\n player: LottiePlayerFactoryOrLoader;\n}\n\nexport type RendererType = import('lottie-web').RendererType;\n\nexport type AnimationConfigWithData<R extends RendererType = 'svg'> =\n import('lottie-web').AnimationConfigWithData<R>;\nexport type AnimationConfigWithPath<R extends RendererType = 'svg'> =\n import('lottie-web').AnimationConfigWithPath<R>;\n\nexport type AnimationOptions<R extends RendererType = 'svg'> =\n | Partial<AnimationConfigWithData<R>>\n | Partial<AnimationConfigWithPath<R>>;\n\nexport const LOTTIE_OPTIONS = new InjectionToken<LottieOptions>('LottieOptions');\n","import { Injectable, NgZone, inject, ɵisPromise } from '@angular/core';\n\nimport { Observable } from 'rxjs';\nimport { map, mergeMap, shareReplay, tap } from 'rxjs/operators';\n\nimport {\n LOTTIE_OPTIONS,\n LottiePlayer,\n AnimationItem,\n AnimationOptions,\n AnimationConfigWithData,\n AnimationConfigWithPath,\n} from './symbols';\n\nfunction convertPlayerOrLoaderToObservable(): Observable<LottiePlayer> {\n const ngZone = inject(NgZone);\n const { player, useWebWorker } = inject(LOTTIE_OPTIONS);\n\n const player$ = new Observable<LottiePlayer>(subscriber => {\n // Call the `player` function lazily — only when a subscriber\n // arrives — to avoid importing `lottie-web` on the server, as it will\n // fail with a \"document is not defined\" error.\n const playerOrLoader = ngZone.runOutsideAngular(() => player());\n\n // We need to use `isPromise` instead of checking whether\n // `result instanceof Promise`. In zone.js patched environments, `global.Promise`\n // is the `ZoneAwarePromise`. Some APIs, which are likely not patched by zone.js\n // for certain reasons, might not work with `instanceof`. For instance, the dynamic\n // import `() => import('./chunk.js')` returns a native promise (not a `ZoneAwarePromise`),\n // causing this check to be falsy.\n if (ɵisPromise(playerOrLoader)) {\n playerOrLoader\n .then(module => {\n subscriber.next(module.default || module);\n subscriber.complete();\n })\n .catch(error => subscriber.error(error));\n } else {\n subscriber.next(playerOrLoader);\n subscriber.complete();\n }\n });\n\n return player$.pipe(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n tap(player => (player as any).useWebWorker?.(useWebWorker)),\n shareReplay({ bufferSize: 1, refCount: true }),\n );\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AnimationLoader {\n protected player$ = convertPlayerOrLoaderToObservable().pipe(\n mergeMap(player => raf$(this.ngZone).pipe(map(() => player))),\n );\n\n private ngZone = inject(NgZone);\n\n loadAnimation(\n options: AnimationConfigWithData | AnimationConfigWithPath,\n ): Observable<AnimationItem> {\n return this.player$.pipe(map(player => this.createAnimationItem(player, options)));\n }\n\n resolveOptions(\n options: AnimationOptions | null,\n container: HTMLElement,\n ): AnimationConfigWithData | AnimationConfigWithPath {\n return Object.assign(\n {\n container,\n renderer: 'svg',\n loop: true,\n autoplay: true,\n },\n options,\n );\n }\n\n protected createAnimationItem(\n player: LottiePlayer,\n options: AnimationConfigWithData | AnimationConfigWithPath,\n ): AnimationItem {\n return this.ngZone.runOutsideAngular(() => player.loadAnimation(options));\n }\n}\n\nfunction raf$(ngZone: NgZone) {\n return new Observable<void>(subscriber => {\n const requestId = ngZone.runOutsideAngular(() =>\n requestAnimationFrame(() => {\n subscriber.next();\n subscriber.complete();\n }),\n );\n return () => cancelAnimationFrame(requestId);\n });\n}\n","import { DestroyRef, inject, Injectable } from '@angular/core';\nimport { map, switchMap } from 'rxjs';\n\nimport { AnimationLoader } from '../animation-loader';\nimport type { AnimationConfigWithData, AnimationConfigWithPath, AnimationItem } from '../symbols';\n\n@Injectable({ providedIn: 'root' })\nexport class CacheableAnimationLoader extends AnimationLoader {\n /** Cache storing animation data as JSON strings, keyed by file path */\n private cache = new Map<string, string>();\n\n /** Tracks in-flight HTTP requests to prevent duplicate fetches for the same animation */\n private pending = new Map<string, Promise<string>>();\n\n constructor() {\n super();\n\n inject(DestroyRef).onDestroy(() => {\n this.cache.clear();\n this.pending.clear();\n });\n }\n\n loadAnimation(options: AnimationConfigWithData | AnimationConfigWithPath) {\n return this.player$.pipe(\n map(async player => {\n // Transform options to either use cached data or wait for pending requests.\n // This prevents duplicate HTTP requests when multiple animations with the\n // same path are loaded simultaneously before the first request completes.\n const transformedOptions = await this.transformOptions(options);\n const animationItem = this.createAnimationItem(player, transformedOptions);\n\n // For path-based animations, listen for `config_ready` to cache the data.\n this.awaitConfigAndCache(options, animationItem);\n\n return animationItem;\n }),\n // Flatten Promise<AnimationItem> to AnimationItem for RxJS stream compatibility.\n switchMap(promise => promise),\n );\n }\n\n /**\n * Sets up caching for path-based animations by listening to the `config_ready` event.\n * Only the first request for a given path will register this listener - subsequent\n * requests will be handled by transformOptions.\n */\n private awaitConfigAndCache(\n options: AnimationConfigWithData | AnimationConfigWithPath,\n animationItem: AnimationItem,\n ): void {\n if (!this.isAnimationConfigWithPath(options)) {\n return;\n }\n\n const path = options.path!;\n\n // Skip if already cached or another instance is already listening.\n if (this.cache.has(path) || this.pending.has(path)) {\n return;\n }\n\n // Create a promise that resolves when lottie-web fires `config_ready`.\n const promise = new Promise<string>(resolve => {\n animationItem.addEventListener('config_ready', () => {\n // Serialize animation data to string to avoid object mutation issues.\n // lottie-web cannot re-use animationData objects between animations.\n const data = JSON.stringify(animationItem['animationData']);\n this.cache.set(path, data);\n this.pending.delete(path);\n resolve(data);\n });\n });\n\n this.pending.set(path, promise);\n }\n\n /**\n * Transforms animation options to use cached data when available or wait for\n * pending requests to complete. This prevents duplicate HTTP requests.\n *\n * Flow:\n * 1. If cached: return immediately with `animationData`\n * 2. If loading: await the pending promise, then return with `animationData`\n * 3. If first request: return original options with path (triggers HTTP fetch)\n */\n private async transformOptions(\n options: AnimationConfigWithData | AnimationConfigWithPath,\n ): Promise<AnimationConfigWithData | AnimationConfigWithPath> {\n if (!this.isAnimationConfigWithPath(options)) {\n return options;\n }\n\n const path = options.path!;\n\n // Cache hit: return parsed `animationData` immediately.\n if (this.cache.has(path)) {\n return {\n ...options,\n path: undefined,\n // Parse JSON to create a new object - lottie-web requires fresh objects.\n animationData: JSON.parse(this.cache.get(path)!),\n };\n }\n\n // Pending request: wait for the first request to complete, then use its data.\n if (this.pending.has(path)) {\n const data = await this.pending.get(path)!;\n return {\n ...options,\n path: undefined,\n animationData: JSON.parse(data),\n };\n }\n\n // First request: let lottie-web fetch the animation via the path option.\n return options;\n }\n\n private isAnimationConfigWithPath(\n options: Record<string, unknown>,\n ): options is AnimationConfigWithPath {\n return typeof options.path === 'string';\n }\n}\n","import { Provider } from '@angular/core';\n\nimport { AnimationLoader } from './animation-loader';\nimport { LottieOptions, LOTTIE_OPTIONS } from './symbols';\nimport { CacheableAnimationLoader } from './cacheable-animation-loader/cacheable-animation-loader';\n\nexport function provideCacheableAnimationLoader(): Provider[] {\n return [\n {\n provide: AnimationLoader,\n useExisting: CacheableAnimationLoader,\n },\n ];\n}\n\nexport function provideLottieOptions(options: LottieOptions): Provider[] {\n return [\n {\n provide: LOTTIE_OPTIONS,\n useValue: options,\n },\n ];\n}\n","import {\n Directive,\n Output,\n SimpleChanges,\n NgZone,\n inject,\n input,\n PLATFORM_ID,\n OnDestroy,\n} from '@angular/core';\n\nimport { Subject, BehaviorSubject, Observable, defer } from 'rxjs';\nimport { filter, switchMap } from 'rxjs/operators';\n\nimport {\n AnimationOptions,\n BMCompleteEvent,\n BMCompleteLoopEvent,\n BMEnterFrameEvent,\n BMSegmentStartEvent,\n BMDestroyEvent,\n BMRenderFrameErrorEvent,\n BMConfigErrorEvent,\n AnimationItem,\n AnimationEventName,\n} from './symbols';\nimport { AnimationLoader } from './animation-loader';\nimport { isPlatformBrowser } from '@angular/common';\n\n@Directive({ selector: '[lottie]' })\nexport class BaseDirective implements OnDestroy {\n options = input<AnimationOptions | null>(null);\n\n containerClass = input<string | null>(null);\n\n styles = input<Partial<CSSStyleDeclaration> | null>(null);\n\n /**\n * `animationCreated` is dispatched after calling `loadAnimation`.\n */\n @Output() readonly animationCreated = this.getAnimationItem();\n\n /**\n * `complete` is dispatched after completing the last frame.\n */\n @Output() readonly complete =\n this.awaitAnimationItemAndStartListening<BMCompleteEvent>('complete');\n\n /**\n * `loopComplete` is dispatched after completing the frame loop.\n */\n @Output() readonly loopComplete =\n this.awaitAnimationItemAndStartListening<BMCompleteLoopEvent>('loopComplete');\n\n /**\n * `enterFrame` is dispatched after entering the new frame.\n */\n @Output() readonly enterFrame =\n this.awaitAnimationItemAndStartListening<BMEnterFrameEvent>('enterFrame');\n\n /**\n * `segmentStart` is dispatched when the new segment is adjusted.\n */\n @Output() readonly segmentStart =\n this.awaitAnimationItemAndStartListening<BMSegmentStartEvent>('segmentStart');\n\n /**\n * Original event name is `config_ready`. `config_ready` is dispatched\n * after the needed renderer is configured.\n */\n @Output() readonly configReady = this.awaitAnimationItemAndStartListening<void>('config_ready');\n\n /**\n * Original event name is `data_ready`. `data_ready` is dispatched\n * when all parts of the animation have been loaded.\n */\n @Output() readonly dataReady = this.awaitAnimationItemAndStartListening<void>('data_ready');\n\n /**\n * Original event name is `DOMLoaded`. `DOMLoaded` is dispatched\n * when elements have been added to the DOM.\n */\n @Output() readonly domLoaded = this.awaitAnimationItemAndStartListening<void>('DOMLoaded');\n\n /**\n * `destroy` will be dispatched when the component gets destroyed,\n * it's handy for releasing resources.\n */\n @Output() readonly destroy = this.awaitAnimationItemAndStartListening<BMDestroyEvent>('destroy');\n\n /**\n * `error` will be dispatched if the Lottie player could not render\n * some frame or parse config.\n */\n @Output() readonly error = this.awaitAnimationItemAndStartListening<\n BMRenderFrameErrorEvent | BMConfigErrorEvent\n >('error');\n\n private ngZone = inject(NgZone);\n private isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n private animationLoader = inject(AnimationLoader);\n\n private loadAnimation$ = new Subject<[SimpleChanges, HTMLElement]>();\n private animationItem$ = new BehaviorSubject<AnimationItem | null>(null);\n\n constructor() {\n this.setupLoadAnimationListener();\n }\n\n ngOnDestroy(): void {\n this.destroyAnimation();\n this.loadAnimation$.complete();\n this.animationItem$.complete();\n }\n\n protected loadAnimation(changes: SimpleChanges, container: HTMLElement): void {\n this.ngZone.runOutsideAngular(() => this.loadAnimation$.next([changes, container]));\n }\n\n private getAnimationItem(): Observable<AnimationItem> {\n return defer(() => this.animationItem$).pipe(\n filter(\n (animationItem: AnimationItem | null): animationItem is AnimationItem =>\n animationItem !== null,\n ),\n );\n }\n\n private awaitAnimationItemAndStartListening<T>(name: AnimationEventName): Observable<T> {\n return this.getAnimationItem().pipe(\n switchMap(\n animationItem =>\n // `fromEvent` will try to call `removeEventListener` when `unsubscribe()` is invoked.\n // The problem is that `ngOnDestroy()` is called before Angular unsubscribes from\n // `@Output()` properties, thus `animationItem` will be `null` already, also `lottie-web`\n // removes event listeners when calling `destroy()`.\n new Observable<T>(observer => {\n this.ngZone.runOutsideAngular(() => {\n animationItem.addEventListener(name, event => {\n this.ngZone.runOutsideAngular(() => {\n observer.next(event as T);\n });\n });\n });\n }),\n ),\n );\n }\n\n private setupLoadAnimationListener(): void {\n const loadAnimation$ = this.loadAnimation$.pipe(\n filter(([changes]) => this.isBrowser && changes.options !== undefined),\n );\n\n loadAnimation$\n .pipe(\n switchMap(([changes, container]) => {\n this.destroyAnimation();\n return this.animationLoader.loadAnimation(\n this.animationLoader.resolveOptions(changes.options.currentValue, container),\n );\n }),\n )\n .subscribe(animationItem => {\n this.ngZone.run(() => this.animationItem$.next(animationItem));\n });\n }\n\n private destroyAnimation(): void {\n const animationItem = this.animationItem$.getValue();\n // The `ng-lottie` component or the `lottie` directive can be destroyed\n // before the `animationItem` is set, thus it will fail with\n // `Cannot read property 'destroy' of null`.\n // Potentially it can happen if the directive gets destroyed before change\n // detection is run.\n if (animationItem === null) {\n return;\n }\n\n // `destroy()` will remove all events listeners.\n animationItem.destroy();\n this.animationItem$.next(null);\n }\n}\n","import { Directive, ElementRef, OnChanges, SimpleChanges, inject } from '@angular/core';\n\nimport { BaseDirective } from './base.directive';\n\n@Directive({ selector: '[lottie]', standalone: true })\nexport class LottieDirective extends BaseDirective implements OnChanges {\n private host = inject(ElementRef);\n\n ngOnChanges(changes: SimpleChanges): void {\n super.loadAnimation(changes, this.host.nativeElement);\n }\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n Input,\n ElementRef,\n ViewChild,\n OnChanges,\n SimpleChanges,\n input,\n} from '@angular/core';\nimport { NgClass, NgStyle } from '@angular/common';\n\nimport { BaseDirective } from './base.directive';\n\n@Component({\n selector: 'ng-lottie',\n template: `\n <div\n #container\n [style.width]=\"width() || '100%'\"\n [style.height]=\"height() || '100%'\"\n [ngStyle]=\"styles()\"\n [ngClass]=\"containerClass()\"\n ></div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgStyle, NgClass],\n})\nexport class LottieComponent extends BaseDirective implements OnChanges {\n width = input<string | null>(null);\n height = input<string | null>(null);\n\n @ViewChild('container', { static: true }) container: ElementRef<HTMLElement> = null!;\n\n ngOnChanges(changes: SimpleChanges): void {\n super.loadAnimation(changes, this.container.nativeElement);\n }\n}\n","import { AnimationFilename } from './symbols';\n\nexport function transformAnimationFilenameToKey(animation: AnimationFilename): string {\n const [animationName] = animation.split('.json');\n return `animation-${animationName}`;\n}\n","import { inject, Injectable, makeStateKey, TransferState } from '@angular/core';\n\nimport { AnimationFilename } from './symbols';\nimport { transformAnimationFilenameToKey } from './server';\n\n@Injectable({ providedIn: 'root' })\nexport class LottieTransferState {\n private transferState = inject(TransferState);\n\n get<T>(animation: AnimationFilename): T | null {\n const animationKey = transformAnimationFilenameToKey(animation);\n const stateKey = makeStateKey<T>(animationKey);\n return this.transferState.get(stateKey, null);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["ɵisPromise","map","switchMap"],"mappings":"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"}