{"version":3,"file":"ngxtension-svg-sprite.mjs","sources":["../../../../libs/ngxtension/svg-sprite/src/svg-sprite.ts","../../../../libs/ngxtension/svg-sprite/src/ngxtension-svg-sprite.ts"],"sourcesContent":["import { DOCUMENT } from '@angular/common';\nimport {\n\tDirective,\n\tElementRef,\n\tInjectable,\n\tInput,\n\tNgZone,\n\tbooleanAttribute,\n\tcomputed,\n\tinject,\n\tmakeEnvironmentProviders,\n\tprovideEnvironmentInitializer,\n\tsignal,\n\ttype OnInit,\n} from '@angular/core';\nimport { injectAutoEffect } from 'ngxtension/auto-effect';\nimport { derivedFrom } from 'ngxtension/derived-from';\nimport {\n\tdefer,\n\tmap,\n\tof,\n\tpipe,\n\tshareReplay,\n\tswitchMap,\n\ttype Observable,\n} from 'rxjs';\nimport { ajax } from 'rxjs/ajax';\n\n/**\n * Represents a svg sprite.\n *\n * @see {@link NgxSvgSpriteFragment.sprite}\n * @see {@link NgxSvgSprites.register}\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/SVG/Element/use `use` Element}\n */\nexport interface NgxSvgSprite {\n\t/**\n\t * A unique name identifying this sprite.\n\t */\n\tname: string;\n\n\t/**\n\t * E.g. `path/to/my/sprite.svg`\n\t */\n\tbaseUrl: string;\n\n\t/**\n\t * @param baseUrl reference to this {@link baseUrl}\n\t * @param fragment\n\t * @returns a url pointing to a specified svg in this sprite by using a `fragment` e.g `path/to/my/sprite.svg#${fragment}`\n\t *\n\t * @see {@link https://svgwg.org/svg2-draft/linking.html#URLReference}\n\t */\n\turl: (baseUrl: string, fragment: string) => string;\n\n\t/**\n\t * Whether to copy the `viewBox` attribute from the `symbol` in the svg sprite.\n\t */\n\tautoViewBox?: boolean;\n\n\t/**\n\t *\n\t * @param fragment\n\t * @returns a list of classes that are applied to the svg element.\n\t */\n\tclasses?: (fragment: string) => string[] | string;\n}\n\n/**\n * This service registers {@link NgxSvgSprite svg sprites}, which can be rendered via {@link NgxSvgSpriteFragment}.\n */\n@Injectable({ providedIn: 'root' })\nexport class NgxSvgSprites {\n\t/**\n\t * @ignore\n\t */\n\tprivate readonly ngZone = inject(NgZone);\n\n\t/**\n\t * <{@link NgxSvgSprite.name}, {@link NgxSvgSprite}>\n\t */\n\tprivate readonly sprites: Record<\n\t\tstring,\n\t\tNgxSvgSprite & { svg$: Observable<SVGGraphicsElement> }\n\t> = {};\n\n\t/**\n\t * Registers a sprite.\n\t *\n\t * @param sprite\n\t *\n\t * @see {@link NgxSvgSpriteFragment.sprite}\n\t */\n\tpublic readonly register = (sprite: NgxSvgSprite) => {\n\t\tthis.sprites[sprite.name] = {\n\t\t\t...sprite,\n\t\t\tsvg$: defer(() =>\n\t\t\t\tthis.ngZone.runOutsideAngular(() =>\n\t\t\t\t\tajax<SVGGraphicsElement>({\n\t\t\t\t\t\turl: sprite.baseUrl,\n\t\t\t\t\t\tresponseType: 'document',\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t).pipe(\n\t\t\t\tmap(({ response }) => {\n\t\t\t\t\tconst svg = response.querySelector('svg');\n\n\t\t\t\t\tif (svg == null)\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`[Svg Sprite] the url '${sprite.baseUrl}' does not seem to be a svg.`,\n\t\t\t\t\t\t);\n\n\t\t\t\t\treturn svg;\n\t\t\t\t}),\n\t\t\t\tshareReplay(1),\n\t\t\t),\n\t\t};\n\t};\n\n\t/**\n\t *\n\t * @param name\n\t * @returns a registered sprite by its name or undefined if not registered.\n\t */\n\tpublic readonly get = (name: string) => this.sprites[name];\n}\n\nexport type CreateNgxSvgSpriteOptions = Omit<NgxSvgSprite, 'url'> &\n\tPartial<Pick<NgxSvgSprite, 'url'>>;\n\n/**\n *\n * @param sprites\n * @returns an environment provider which registers svg sprites. The default `url` of a sprite will be `${baseUrl}#${fragment}`.\n */\nexport const provideSvgSprites = (...sprites: CreateNgxSvgSpriteOptions[]) =>\n\tmakeEnvironmentProviders([\n\t\tprovideEnvironmentInitializer(() => {\n\t\t\tconst initializerFn = (() => {\n\t\t\t\tconst service = inject(NgxSvgSprites);\n\t\t\t\treturn () =>\n\t\t\t\t\tsprites.forEach((sprite) =>\n\t\t\t\t\t\tservice.register(createSvgSprite(sprite)),\n\t\t\t\t\t);\n\t\t\t})();\n\t\t\treturn initializerFn();\n\t\t}),\n\t]);\n\n/**\n * Creates a {@link NgxSvgSprite} with a default `url` builder of `${baseUrl}#${fragment}`.\n *\n * @param options\n * @returns\n */\nconst createSvgSprite = (options: CreateNgxSvgSpriteOptions) => {\n\tif (options.url == null)\n\t\toptions.url = (baseUrl, fragment) => `${baseUrl}#${fragment}`;\n\n\treturn options as NgxSvgSprite;\n};\n\n/**\n * A directive for rendering _symbols_ of svg sprites. It is done with the [`use`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/use) element.\n *\n * ## Import\n *\n * ```typescript\n * import { NgxSvgSpriteFragment } from 'ngxtension/svg-sprite';\n * ```\n *\n * ## Usage\n *\n * In this example the symbol `github` of the [fontawesome](https://fontawesome.com/) svg sprite `fa-brands` is rendered. A symbol is identified by a `fragment`. Learn more about [URLs](https://svgwg.org/svg2-draft/linking.html#URLReference).\n *\n * ```html\n * <svg fragment=\"github\" sprite=\"fa-brands\"></svg>\n * ```\n *\n * Without `NgxSvgSpriteFragment`:\n *\n * ```html\n * <svg viewBox=\"0 0 496 512\">\n * \t<use href=\"assets/fontawesome/sprites/brands.svg#github\"></use>\n * </svg>\n * ```\n *\n * ### With Directive Composition Api\n *\n * In your project you can utilize the [Directive Composition Api](https://angular.dev/guide/directives/directive-composition-api) to create specific svg sprites.\n *\n * In this example a _fontawesome brands_ svg sprite is created.\n *\n * ```html\n * <svg faBrand=\"github\"></svg>\n * ```\n *\n * ```ts\n * @Directive({\n * \tselector: 'svg[faBrand]',\n *\n * \thostDirectives: [\n * \t\t{ directive: NgxSvgSpriteFragment, inputs: ['fragment:faBrand'] },\n * \t],\n * })\n * export class FaBrandSvg {\n * \tconstructor() {\n * \t\tinject(NgxSvgSpriteFragment).sprite = 'fa-brands';\n * \t}\n * }\n * ```\n *\n * ## Configuration\n *\n * In order to render a symbol, sprites have to be provided.\n *\n * ```ts\n * provideSvgSprites({\n * \tname: 'fa-brands',\n * \tbaseUrl: 'assets/fontawesome/sprites/brands.svg',\n * });\n * ```\n *\n * The `name` property can reference any arbitrary value, but should be unique, since you can register multiple different svg sprites.\n *\n * The `sprite` input of the `NgxSvgSpriteFragment` should reference the `name` property of a provided sprite.\n *\n * ### Auto View Box\n *\n * When a symbol of an svg sprite is rendered the `viewBox` attribute or `height` and `width` _should_ be set. The `svg` element does not copy/use the `viewBox` attribute of the symbol in the svg sprite, therefore the svg will have default dimensions of 300x150 px, which is probably not preferred.\n *\n * Per default when an svg sprite is registered, the svg sprite is fetched with js in addition. `NgxSvgSpriteFragment` will copy the `viewBox` attribute of the symbol to its host.\n *\n * This behavior can be disabled.\n *\n * #### Disable via DI\n *\n * Auto View Box is disabled for the svg sprite.\n *\n * ```ts\n * provideSvgSprites({\n * \tname: 'fa-brands',\n * \tbaseUrl: 'assets/fontawesome/sprites/brands.svg',\n * \tautoViewBox: false,\n * });\n * ```\n *\n * #### Disable via `autoViewBoxDisabled` Input\n *\n * Auto View Box is disabled for a `svg` element, when the `autoViewBoxDisabled` input is set to `false`.\n *\n * ```html\n * <svg fragment=\"github\" sprite=\"fa-brands\" autoViewBoxDisabled></svg>\n * ```\n *\n * #### Disable via `viewBox` Attribute\n *\n * Auto View Box is disabled for a `svg` element, when the `viewBox` attribute already is defined.\n *\n * ```html\n * <svg fragment=\"github\" sprite=\"fa-brands\" viewBox=\"0 0 32 32\"></svg>\n * ```\n *\n * ### Classes\n *\n * When the `classes` function is set, a list of classes will be added by the `NgxSvgSpriteFragment` to its host.\n *\n * ```ts\n * provideSvgSprites({\n * \tname: 'my-sprite',\n * \tbaseUrl: 'path/to/my/sprite.svg',\n * \tclasses: (fragment) => ['some-class', `some-other-class-${fragment}`],\n * });\n * ```\n *\n * ### Url\n *\n * Per default when providing a sprite, the `url` will return `'${baseUrl}#${fragment}'`. This can be overwritten:\n *\n * ```ts\n * provideSvgSprites({\n * \tname: 'my-sprite',\n * \tbaseUrl: 'path/to/my/sprite.svg',\n * \turl: (baseUrl, fragment) => `${baseUrl}#some-prefix-${fragment}`,\n * });\n * ```\n */\n@Directive({\n\tselector: 'svg[fragment]',\n})\nexport class NgxSvgSpriteFragment implements OnInit {\n\t/**\n\t * @ignore\n\t */\n\tprivate readonly element = inject(ElementRef)\n\t\t.nativeElement as SVGGraphicsElement;\n\n\t/**\n\t * @ignore\n\t */\n\tprivate readonly document = inject(DOCUMENT);\n\n\t/**\n\t * @ignore\n\t */\n\tprivate readonly autoEffect = injectAutoEffect();\n\n\t/**\n\t * @ignore\n\t */\n\tprivate readonly sprites = inject(NgxSvgSprites);\n\n\t/**\n\t * @ignore\n\t */\n\tpublic ngOnInit() {\n\t\t// Copy the 'viewBox' from the 'symbol' element in the sprite to this svg.\n\t\t// Do not launch this effect when the svg already has a 'viewBox'.\n\t\tif (!this.element.hasAttribute('viewBox'))\n\t\t\tthis.autoEffect(() => {\n\t\t\t\tconst element = this.element;\n\t\t\t\tconst autoViewBox = this.autoViewBox$();\n\t\t\t\tconst svg = this.svg$();\n\t\t\t\tconst fragment = this.fragment$();\n\n\t\t\t\tif (!autoViewBox || svg == null || fragment == null) return;\n\n\t\t\t\ttry {\n\t\t\t\t\tconst viewBox = svg\n\t\t\t\t\t\t.querySelector(`#${fragment}`)\n\t\t\t\t\t\t?.getAttribute('viewBox');\n\n\t\t\t\t\tif (viewBox == null) return;\n\n\t\t\t\t\telement.setAttribute('viewBox', viewBox);\n\t\t\t\t} catch {\n\t\t\t\t\t// the querySelector could throw due to an invalid selector\n\t\t\t\t}\n\t\t\t});\n\n\t\t// Create a 'use' element which instantiates a 'symbol' element of the sprite.\n\t\tthis.autoEffect(() => {\n\t\t\tconst fragment = this.fragment$();\n\t\t\tconst sprite = this.sprite$();\n\t\t\tconst spriteConfig = this.spriteConfig$();\n\t\t\tconst element = this.element;\n\t\t\tconst document = this.document;\n\n\t\t\tlet classes: string[] = [];\n\n\t\t\tif (fragment == null || sprite == null || spriteConfig == null) return;\n\n\t\t\tconst useElement = document.createElementNS(element.namespaceURI, 'use');\n\n\t\t\t// Add classes when provided.\n\t\t\tif (spriteConfig.classes != null) {\n\t\t\t\tconst _classes = spriteConfig.classes(fragment);\n\t\t\t\tclasses =\n\t\t\t\t\ttypeof _classes === 'string'\n\t\t\t\t\t\t? _classes.split(' ').filter(Boolean)\n\t\t\t\t\t\t: _classes;\n\t\t\t\telement.classList.add(...classes);\n\t\t\t}\n\n\t\t\tuseElement.setAttribute(\n\t\t\t\t'href',\n\t\t\t\tspriteConfig.url(spriteConfig.baseUrl, fragment),\n\t\t\t);\n\n\t\t\t// Support old browsers. Modern browser will ignore this if they support 'href'.\n\t\t\tuseElement.setAttribute(\n\t\t\t\t'xlink:href',\n\t\t\t\tspriteConfig.url(spriteConfig.baseUrl, fragment),\n\t\t\t);\n\n\t\t\telement.appendChild(useElement);\n\n\t\t\t// Cleanup: clear child nodes and remove old classes of this svg.\n\t\t\treturn () => {\n\t\t\t\twhile (element.firstChild) {\n\t\t\t\t\telement.removeChild(element.firstChild);\n\t\t\t\t}\n\t\t\t\telement.classList.remove(...classes);\n\t\t\t};\n\t\t});\n\t}\n\n\t/**\n\t * The `fragment` which identifies a `symbol` in this {@link NgxSvgSpriteFragment.sprite svg sprite}.\n\t */\n\tpublic readonly fragment$ = signal<string | undefined>(undefined);\n\n\t/**\n\t * The `name` of the {@link NgxSvgSprite svg sprite} this {@link NgxSvgSpriteFragment.fragment fragment} is a part of.\n\t *\n\t * @see {@link NgxSvgSprite.name}\n\t */\n\tpublic readonly sprite$ = signal<string | undefined>(undefined);\n\n\t/**\n\t * Whether `autoViewBox` is disabled.\n\t *\n\t * @see overrides {@link NgxSvgSprite.autoViewBox}\n\t */\n\tpublic readonly autoViewBoxDisabled$ = signal(false);\n\n\t/**\n\t * @ignore\n\t */\n\tprivate readonly spriteConfig$ = computed(() => {\n\t\tconst sprite = this.sprite$();\n\n\t\tif (sprite != null) return this.sprites.get(sprite);\n\n\t\treturn undefined;\n\t});\n\n\t/**\n\t * @ignore\n\t */\n\tprivate readonly svg$ = derivedFrom(\n\t\t{ sprite: this.spriteConfig$ },\n\t\tpipe(switchMap(({ sprite }) => sprite?.svg$ ?? of(undefined))),\n\t);\n\n\t/**\n\t * @ignore\n\t */\n\tprivate readonly autoViewBox$ = computed(\n\t\t() =>\n\t\t\t!this.autoViewBoxDisabled$() &&\n\t\t\t(this.spriteConfig$()?.autoViewBox ?? true),\n\t);\n\n\t/**\n\t * The `fragment` which identifies a `symbol` in this {@link NgxSvgSpriteFragment.sprite svg sprite}.\n\t */\n\t@Input()\n\tpublic set fragment(fragment) {\n\t\tthis.fragment$.set(fragment);\n\t}\n\n\tpublic get fragment() {\n\t\treturn this.fragment$();\n\t}\n\n\t/**\n\t * The `name` of the {@link NgxSvgSprite svg sprite} this {@link NgxSvgSpriteFragment.fragment fragment} is a part of.\n\t *\n\t * @see {@link NgxSvgSprite.name}\n\t */\n\t@Input()\n\tpublic set sprite(sprite) {\n\t\tthis.sprite$.set(sprite);\n\t}\n\n\tpublic get sprite() {\n\t\treturn this.sprite$();\n\t}\n\n\t/**\n\t * Whether `autoViewBox` is disabled.\n\t *\n\t * @see overrides {@link NgxSvgSprite.autoViewBox}\n\t */\n\t@Input({ transform: booleanAttribute })\n\tpublic set autoViewBoxDisabled(autoViewBoxDisabled) {\n\t\tthis.autoViewBoxDisabled$.set(autoViewBoxDisabled);\n\t}\n\n\tpublic get autoViewBoxDisabled() {\n\t\treturn this.autoViewBoxDisabled$();\n\t}\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}