{"version":3,"file":"ngx-fast-svg.mjs","sources":["../../../../packages/ngx-fast-lib/src/lib/token/svg-options.token.ts","../../../../packages/ngx-fast-lib/src/lib/token/svg-load.strategy.model.ts","../../../../packages/ngx-fast-lib/src/lib/internal/get-zone-unpatched-api.ts","../../../../packages/ngx-fast-lib/src/lib/token/svg-load.strategy.ts","../../../../packages/ngx-fast-lib/src/lib/token/default-token-values.ts","../../../../packages/ngx-fast-lib/src/lib/svg-registry.service.ts","../../../../packages/ngx-fast-lib/src/lib/fast-svg.component.ts","../../../../packages/ngx-fast-lib/src/lib/fast-svg.provider.ts","../../../../packages/ngx-fast-lib/src/lib/fast-svg.module.ts","../../../../packages/ngx-fast-lib/src/index.ts","../../../../packages/ngx-fast-lib/src/ngx-fast-svg.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { SvgOptions } from './svg-options.model';\n\nexport const SvgOptionsToken = new InjectionToken<SvgOptions>(\n  '__SvgOptionsToken__',\n  {\n    providedIn: 'root',\n    factory: () => ({\n      url: () => '',\n      defaultSize: undefined,\n      suspenseSvgString: undefined,\n    }),\n  }\n);\n","import { Observable } from 'rxjs';\nimport { Injectable } from '@angular/core';\n\n@Injectable()\nexport abstract class SvgLoadStrategy {\n  abstract config(url: string): Observable<string>;\n  abstract load(url: Observable<string>): Observable<string>;\n}\n","// eslint-disable-next-line @typescript-eslint/ban-types\nexport function getZoneUnPatchedApi<T = Function>(\n  name: string,\n  elem: HTMLElement\n): T {\n  return (elem as any)['__zone_symbol__' + name] !== undefined\n    ? (elem as any)['__zone_symbol__' + name]\n    : (elem as any)[name];\n}\n","import { from, Observable, of, switchMap } from 'rxjs';\nimport { getZoneUnPatchedApi } from '../internal/get-zone-unpatched-api';\nimport { SvgLoadStrategy } from './svg-load.strategy.model';\nimport { Injectable } from '@angular/core';\n\n@Injectable()\nexport class SvgLoadStrategyImpl implements SvgLoadStrategy {\n  fetch = getZoneUnPatchedApi('fetch', window as any);\n\n  load(url$: Observable<string>): Observable<string> {\n    return url$.pipe(switchMap((url) => {\n      return from(fetch(url).then((res) => (!res.ok ? '' : res.text())));\n    }));\n  }\n\n  config(url: string) {\n    return of(url);\n  }\n}\n","export const suspenseSvg = `<svg\n      viewBox=\"0 0 24 24\"\n      fill=\"currentColor\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n      <circle cx=\"15.5\" cy=\"9.5\" r=\"1.5\" />\n      <circle cx=\"8.5\" cy=\"9.5\" r=\"1.5\" />\n      <path\n        d=\"M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm0-6c-2.33 0-4.32 1.45-5.12 3.5h1.67c.69-1.19 1.97-2 3.45-2s2.75.81 3.45 2h1.67c-.8-2.05-2.79-3.5-5.12-3.5z\"\n      />\n    </svg>`;\n","import { DOCUMENT } from '@angular/common';\nimport { inject, Injectable } from '@angular/core';\nimport { BehaviorSubject, map, Observable } from 'rxjs';\nimport { SvgOptionsToken } from './token/svg-options.token';\nimport { suspenseSvg } from './token/default-token-values';\nimport { SvgLoadStrategy } from './token/svg-load.strategy.model';\nimport { SvgLoadStrategyImpl } from './token/svg-load.strategy';\n\n// @TODO compose svg in 1 sprite and fetch by id as before\n\ninterface SvgCache {\n  name: string;\n  viewBox: string;\n}\n\nfunction createDomParser(document: Document): (s: string) => HTMLElement {\n  const e = document.createElement('DIV');\n  return (s: string) => {\n    e && (e.innerHTML = s);\n    return e.firstChild as HTMLElement;\n  };\n}\n\nfunction styleDomCacheForPerformance(el: HTMLElement): HTMLElement {\n  /**\n   * reduce paint area with width/height 0 and overflow hidden\n   * fixed position of -2000px to always have it offscreen and outside any native trigger (viewport observer in content visibilities)\n   * contain:content to leverage css perf features for older browsers not supporting content-visibility   * : auto to exclude it completely from styles recalculation\n   */\n  el.setAttribute(\n    'style',\n    `\n      overflow: hidden;\n      width: 0px;\n      height: 0px;\n      position: fixed;\n      bottom: -2000px;\n      contain: content;\n      content-visibility: auto;\n    `\n  );\n  return el;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class SvgRegistry {\n  private document = inject(DOCUMENT);\n  private svgOptions = inject(SvgOptionsToken);\n\n  private svgLoadStrategy =\n    inject(SvgLoadStrategy, { optional: true }) // custom strategy if provided\n    || new SvgLoadStrategyImpl(); // default strategy\n\n  private readonly domParser = createDomParser(this.document);\n\n  private readonly svgDomCache: HTMLElement = (() => {\n    // The DOM cache could be already created on SSR or due to multiple instances of the registry\n    const domCache =\n      this.document.getElementById('svg-cache') ||\n      this.domParser('<div id=\"svg-cache\"></div>');\n    styleDomCacheForPerformance(domCache);\n    this.document.body.appendChild(domCache);\n    return domCache;\n  })();\n\n  private readonly _svgHrefCache = new Map<string, BehaviorSubject<SvgCache>>();\n  private readonly _cachedSvgs = new Set();\n\n  public defaultSize = this.svgOptions?.defaultSize || '24';\n  private _defaultViewBox = `0 0 ${this.defaultSize} ${this.defaultSize}`;\n\n  public url = (name: string) => this.svgLoadStrategy.config(this.svgOptions.url(name));\n\n  constructor() {\n    // configure suspense svg\n    const suspenseSvgId = this.svgId('suspense');\n    if (!this._cachedSvgs.has(suspenseSvgId)) {\n      this.cacheSvgInDOM(\n        suspenseSvgId,\n        this.svgOptions.suspenseSvgString || suspenseSvg\n      );\n    }\n\n    this.hydrateFromDom();\n  }\n\n  private hydrateFromDom(): void {\n    // hydrate DOM cache\n    Array.from(this.svgDomCache.children).forEach((i) => {\n      // add to fetchedSvgs\n      this._cachedSvgs.add(i.id);\n      // i.\n      // publish to components and render it\n      this.getSvgSubject(i.id).next({\n        name: i.id,\n        viewBox: i.getAttribute('viewBox') || this._defaultViewBox,\n      });\n    });\n  }\n\n  fetchSvg = (svgName: string): void => {\n    const svgId = this.svgId(svgName);\n    // if the svg is already fetched we return early\n    if (this._cachedSvgs.has(svgId)) {\n      return;\n    }\n    this._cachedSvgs.add(svgId);\n\n    // trigger fetch\n    this.svgLoadStrategy\n      .load(this.url(svgName))\n      .subscribe({\n        next: (body: string) => this.cacheSvgInDOM(svgId, body),\n        error: console.error\n      });\n  };\n\n  isSvgCached(name: string): boolean {\n    return this._cachedSvgs.has(this.svgId(name));\n  }\n\n  svgCache$(name: string): Observable<SvgCache> {\n    // start by displaying the suspense svg immediately\n    return this.getSvgSubject(this.svgId(name)).pipe(\n      map((svg) => ({ name: `#${svg.name}`, viewBox: svg.viewBox }))\n    );\n  }\n\n  private cacheSvgInDOM(svgId: string, svgString: string): void {\n    // create HTML\n    const svgElem = this.domParser(svgString);\n    // parse the svg string and get a viewBox\n    const viewBox = svgString.match(/viewBox=\"([^\"]*)\"/);\n\n    // the SVG element needs to be accessible over a href and end with a specific anchor to select the element by id\n    svgElem?.setAttribute && svgElem.setAttribute('id', svgId);\n    this.svgDomCache.appendChild(svgElem);\n    // notify subscribers about change\n    this.getSvgSubject(svgId).next({\n      name: svgId,\n      viewBox: viewBox?.[1] || this._defaultViewBox,\n    });\n  }\n  /*\n  private removeSvgInDOM(svgId: string): void {\n    this.svgDomCache.querySelector(`#${svgId}`)?.remove();\n  }*/\n\n  private getSvgSubject(svgId: string): BehaviorSubject<SvgCache> {\n    if (!this._svgHrefCache.has(svgId)) {\n      this._svgHrefCache.set(\n        svgId,\n        new BehaviorSubject<SvgCache>({\n          name: this.svgId('suspense'),\n          viewBox: this._defaultViewBox,\n        })\n      );\n    }\n    return this._svgHrefCache.get(svgId) as BehaviorSubject<SvgCache>;\n  }\n\n  // pattern has to be `<svgName>`\n  private svgId(name: string): string {\n    return `${name}`;\n  }\n}\n","/* eslint-disable @typescript-eslint/ban-types */\nimport { isPlatformServer } from '@angular/common';\nimport {\n  AfterViewInit,\n  ChangeDetectionStrategy,\n  Component,\n  effect,\n  ElementRef,\n  inject,\n  Injector,\n  input,\n  OnDestroy,\n  PLATFORM_ID,\n  Renderer2\n} from '@angular/core';\nimport { getZoneUnPatchedApi } from './internal/get-zone-unpatched-api';\nimport { SvgRegistry } from './svg-registry.service';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { of, switchMap } from 'rxjs';\n\n/**\n * getZoneUnPatchedApi\n *\n * @description\n *\n * This function returns the zone un-patched API for the a specific Browser API.\n * If no element is passed the window is used instead\n *\n * @param name {string} - The name of the API to check.\n * @param elem {any} - The elem to get un-patched API from.\n * @return {Function} - The zone un-patched API in question.\n *\n */\n\nconst addEventListener = (\n  elem: HTMLElement,\n  name: string,\n  listener: Function\n) => getZoneUnPatchedApi('addEventListener', elem).bind(elem)(name, listener);\n\nlet element: HTMLElement = undefined as any;\nfunction createGetImgFn(renderer: Renderer2): (src: string) => HTMLElement {\n  if (element === undefined) {\n    element = renderer.createElement('img');\n    element.setAttribute(\n      'style',\n      'display: none; contain: content; content-visibility: auto;'\n    );\n    element.setAttribute('loading', 'lazy');\n    element.setAttribute('alt', 'loading helper');\n    element.setAttribute('width', '0');\n    element.setAttribute('height', '0');\n  }\n\n  return (src: string) => {\n    const e = element.cloneNode(true) as HTMLElement;\n    e.setAttribute('src', src);\n    return e;\n  };\n}\n\n/**\n * ngx-fast-svg enables lazy loading features of the browser for SVG.\n * It also manages the caching of SVG's in the DOM for multiple usage and different stylings\n * This component also Supports lazy loading with SSR and http transfer cache\n * */\n@Component({\n  // eslint-disable-next-line @angular-eslint/component-selector\n  selector: 'fast-svg',\n  template: `\n    <!-- Svg - Displayed lazy or at bootstrap time from cache due to SSR or already loaded resources\n    We use a DOM caching mechanism to display svg over the 'use' tag and an href attribute.\n    - We display an empty SVG at the beginning. Invisible and without dimensions\n    - On View init the size is applied even if no svg is loaded to avoid flickering in dimensions\n    - A suspense svg is displayed at the same time to reduce visual flickering\n    - when the real svg is loaded it is directly cached in the DOM and displayed over a new href value\n     -->\n    <svg class=\"fast-svg\">\n      <use></use>\n    </svg>\n  `,\n  styles: [\n    `\n      :host {\n        display: contents;\n      }\n\n      .fast-svg {\n        margin: 3px;\n        /* leverage css perf features for older browsers not supporting content-visibility */\n        contain: content;\n        /* leverage contain:content improvements, exclude node completely from recalc styles if offscreen */\n        content-visibility: auto;\n      }\n    `,\n  ],\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FastSvgComponent implements AfterViewInit, OnDestroy {\n  private readonly injector = inject(Injector);\n  private readonly platform = inject(PLATFORM_ID);\n  private readonly renderer = inject(Renderer2);\n  private readonly registry = inject(SvgRegistry);\n  private readonly element = inject<ElementRef<HTMLElement>>(ElementRef);\n\n  private readonly getImg = createGetImgFn(this.renderer);\n\n  name = input<string>('');\n  size = input<string>(this.registry.defaultSize);\n  width = input<string>('');\n  height = input<string>('');\n\n  #url = toSignal(toObservable(this.name).pipe(switchMap((name) => {\n    return this.registry.url(name);\n  })))\n\n  // When the browser loaded the svg resource we trigger the caching mechanism\n  // re-fetch -> cache-hit -> get SVG -> cache in DOM\n  loadedListener = () => {\n    this.registry.fetchSvg(this.name());\n  };\n\n  ngAfterViewInit() {\n    // Setup view refs and init them\n    const elem = this.element.nativeElement;\n\n    const svg = elem.querySelector('svg') as SVGElement;\n\n    effect(\n      () => {\n        // apply size\n        if (this.size() && svg) {\n          // We apply fixed dimensions\n          // Additionally to SEO rules, to avoid any scroll flicker caused by `content-visibility:auto` defined in component styles\n          svg.setAttribute('width', this.width() || this.size());\n          svg.setAttribute(\n            'height',\n            this.height() || this.width() || this.size()\n          );\n        }\n      },\n      { injector: this.injector }\n    );\n\n    effect(\n      (onCleanup) => {\n        const name = this.name();\n\n          if (!name) {\n            throw new Error('svg component needs a name to operate');\n          }\n\n          let img: HTMLImageElement | null = null;\n\n          // if svg is not in cache we append\n          if (!this.registry.isSvgCached(name)) {\n            /**\n              CSR - Browser native lazy loading hack\n\n              We use an img element here to leverage the browsers native features:\n              - lazy loading (loading=\"lazy\") to only load the svg that are actually visible\n              - priority hints to down prioritize the fetch to avoid delaying the LCP\n\n              While the SVG is loading we display a fallback SVG.\n              After the image is loaded we remove it from the DOM. (IMG load event)\n              When the new svg arrives we append it to the template.\n\n              Note:\n              - the image is styled with display none. this prevents any loading of the resource ever.\n              on component bootstrap we decide what we want to do. when we remove display none it performs the browser native behavior\n              - the image has 0 height and with and containment as well as content-visibility to reduce any performance impact\n\n\n              Edge cases:\n              - only resources that are not loaded in the current session of the browser will get lazy loaded (same URL to trigger loading is not possible)\n              - already loaded resources will get emitted from the cache immediately, even if loading is set to lazy :o\n              - the image needs to have display other than none\n            */\n            const url = this.#url();\n            if (url) {\n              const i = this.getImg(url);\n              this.renderer.appendChild(this.element.nativeElement, i);\n\n              // get img\n              img = elem.querySelector('img') as HTMLImageElement;\n              addEventListener(img, 'load', this.loadedListener);\n            }\n          }\n\n          // Listen to svg changes\n          // This potentially could already receive the svg from the cache and drop the img from the DOM before it gets activated for lazy loading.\n          // NOTICE:\n          // If the svg is already cached the following code will execute synchronously. This gives us the chance to add\n          const sub = this.registry.svgCache$(name).subscribe((cache) => {\n            // The first child is the `use` tag. The value of href gets displayed as SVG\n            svg.children[0].setAttribute('href', cache.name);\n            svg.setAttribute('viewBox', cache.viewBox);\n\n            // early exit no image\n            if (!img) return;\n\n            // If the img is present\n            // and the name in included in the href (svg is fully loaded, not only the suspense svg)\n            // Remove the element from the DOM as it is no longer needed\n            if (cache.name.includes(name)) {\n              img.removeEventListener('load', this.loadedListener);\n              // removeEventListener.bind(img, 'load', this.loadedListener);\n              img.remove();\n            }\n          });\n\n          // SSR\n          if (isPlatformServer(this.platform)) {\n            // if SSR load svgs on server => ends up in DOM cache and ships to the client\n            this.registry.fetchSvg(name);\n          }\n          // CSR\n          else {\n            // Activate the lazy loading hack\n            // Loading is triggered in the template over loading=\"lazy\" and onload\n            // Than the same image is fetched over fromFetch and rendered as SVG. (This will result in a cache hit for this svg)\n            //\n            // If the img is present activate it\n            img && img.style.setProperty('display', 'block');\n          }\n\n          onCleanup(() => {\n            sub.unsubscribe();\n\n            if (img) {\n              img.removeEventListener('load', this.loadedListener);\n            }\n          });\n      },\n      { injector: this.injector }\n    );\n  }\n\n  ngOnDestroy() {\n    this.element.nativeElement\n      .querySelector('img')\n      ?.removeEventListener('load', this.loadedListener);\n  }\n}\n","import { Provider } from '@angular/core';\nimport { SvgLoadStrategy, SvgOptions, SvgOptionsToken } from '..';\nimport { FastSvgProviderOptions } from './provider-config.interface';\n\n/**\n * @description\n * Use this function to register the FastSvg providers in your application.\n *\n * @param options {FastSvgProviderOptions} - The options for the FastSvg providers.\n * @return { Provider[] } - The providers for the FastSvg module.\n *\n * @example\n *\n * ```ts\n * bootstrapApplication(AppComponent, {\n *  providers: [\n *   provideFastSVG({\n *     url: (name: string) => `path/to/svg-assets/${name}.svg`,\n *   })\n * ]});\n * ```\n */\nexport const provideFastSVG = (options: FastSvgProviderOptions): Provider[] => {\n  const providers: Provider[] = [\n    {\n      provide: SvgOptionsToken,\n      useValue: {\n        url: options.url,\n        suspenseSvgString: options.suspenseSvgString || undefined,\n        defaultSize: options.defaultSize || undefined,\n      } as SvgOptions,\n    },\n  ];\n\n  if (options.svgLoadStrategy) {\n    providers.push(\n      { provide: SvgLoadStrategy, useClass: options.svgLoadStrategy } as Provider\n    );\n  }\n\n  return providers;\n};\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { FastSvgComponent } from './fast-svg.component';\nimport { FastSvgProviderOptions } from './provider-config.interface';\nimport { provideFastSVG } from './fast-svg.provider';\n\n/**\n * @deprecated Use `provideFastSVG` provider function instead\n */\n@NgModule({\n  imports: [FastSvgComponent],\n  exports: [FastSvgComponent],\n})\nexport class FastSvgModule {\n  static forRoot(\n    options: FastSvgProviderOptions\n  ): ModuleWithProviders<FastSvgModule> {\n    return {\n      ngModule: FastSvgModule,\n      providers: [provideFastSVG(options)],\n    };\n  }\n\n  static forChild(): ModuleWithProviders<FastSvgModule> {\n    return {\n      ngModule: FastSvgModule,\n      providers: [],\n    };\n  }\n}\n","// tokens\nexport * from './lib/token/svg-options.model';\nexport * from './lib/token/svg-options.token';\nexport * from './lib/token/svg-load.strategy.model';\nexport { SvgLoadStrategyImpl } from './lib/token/svg-load.strategy';\n// service\nexport * from './lib/svg-registry.service';\n// component\nexport * from './lib/fast-svg.component';\n// module\nexport * from './lib/fast-svg.module';\n// provider\nexport * from './lib/fast-svg.provider';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}