A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://github.com/shrpne/vue-inline-svg below:

GitHub - shrpne/vue-inline-svg: Dynamically loads an SVG source and inline <svg

Vue component loads an SVG source dynamically and inline <svg> so you can manipulate the style of it with CSS or JS. It looks like basic <img> so you markup will not be bloated with SVG content. Loaded SVGs are cached so it will not make network request twice.

Check old version vue-inline-svg@2

npm install vue-inline-svg
Register locally in your component
import InlineSvg from 'vue-inline-svg';

// Your component
export default {
    components: {
        InlineSvg,
    }
}
Or register globally in the Vue app
import { createApp } from 'vue'
import InlineSvg from 'vue-inline-svg';

const app = createApp({/*...*/});
app.component('inline-svg', InlineSvg);

Usually, registering components globally may be considered as bad practice, such it may pollute the main bundle, but since InlineSvg is a very small package and inlining icons may be needed throughout the whole app, registering globally may bring no to little downsides but improve DX

<script src="https://unpkg.com/vue"></script>
<!-- Include the `vue-inline-svg` script on your page after Vue script -->
<script src="https://unpkg.com/vue-inline-svg"></script>

<script>
const app = Vue.createApp({/*...*/});
app.component('inline-svg', VueInlineSvg);
</script>
<InlineSvg
    src="image.svg"
    transformSource="transformSvg"
    @loaded="svgLoaded($event)"
    @unloaded="svgUnloaded()"
    @error="svgLoadError($event)"
    width="150"
    height="150"
    fill="black"
    aria-label="My image"
/>

Example

Using relative paths or aliased paths

If you are referencing assets with relative path (not from public directory), e.g. "./assets/my.svg", "@/assets/my.svg", then @vitejs/plugin-vue or @vue/cli will not handle them automatically like they do for <img> tag, so you will need to manually import them with your bundler or configure automatic handling.

Configuring automatic handling with @vitejs/plugin-vue
// vite.config.js
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';

export default defineConfig({
    plugins: [
        vue({
            template: {
                transformAssetUrls: {
                    // default options
                    video: ['src', 'poster'],
                    source: ['src'],
                    img: ['src'],
                    image: ['xlink:href', 'href'],
                    use: ['xlink:href', 'href'],
                    // adding InlineSvg component with camel and kebab casing
                    InlineSvg: ['src'],
                    ['inline-svg']: ['src'],
                },
            },
        }),
    ],
});
<!-- So this will work-->
<InlineSvg src="@/assets/img/my.svg"/>
<!-- vite -->
<script>
    import imgUrl from '@/assets/img/my.svg';
</script>
<InlineSvg :src="imgUrl"/>

<!-- webpack -->
<InlineSvg :src="require('@/assets/img/my.svg')"/>

You might also like vite-plugin-require to enable require() in Vite.

Learn more about static assets handling:

Type: string Required

Path to SVG file

<!-- from /public folder -->
<InlineSvg src="/my.svg"/>

<!-- from relative path -->
<InlineSvg src="./assets/img/my.svg"/>

<!-- from aliased path -->
<InlineSvg src="@/assets/img/my.svg"/>
<InlineSvg src="~/assets/img/my.svg"/>

Note on relative and aliased paths

Type: string

Sets/overwrites the <title> of the SVG

<InlineSvg src="image.svg" title="My Image"/>

Type: boolean | string

Add suffix to all IDs in SVG to eliminate conflicts for multiple SVGs with the same source. If true - suffix is random string, if string - suffix is this string.

<InlineSvg src="image.svg" :uniqueIds="true"/>
<InlineSvg src="image.svg" uniqueIds="my-unique-suffix"/>

Type: string

An URL to prefix each ID in case you use the <base> tag and uniqueIds.

<InlineSvg src="image.svg" :uniqueIds="true" uniqueIdsBase="http://example.com""/>

Type: boolean; Default: true

It makes vue-inline-svg to preserve old image visible, when new image is being loaded. Pass false to disable it and show nothing during loading.

<InlineSvg src="image.svg" :keepDuringLoading="false"/>

Type: (svg: SVGElement) => SVGElement

Function to transform SVG content

This example create circle in svg:

<InlineSvg src="image.svg" :transformSource="transform"/>

<script>
const transform = (svg) => {
    let point = document.createElementNS("http://www.w3.org/2000/svg", 'circle');
        point.setAttributeNS(null, 'cx', '20');
        point.setAttributeNS(null, 'cy', '20');
        point.setAttributeNS(null, 'r', '10');
        point.setAttributeNS(null, 'fill', 'red');
        svg.appendChild(point);
    return svg;
}
// For cleaner syntax you could use https://github.com/svgdotjs/svg.js
</script>

Other SVG and HTML attributes will be passed to inlined <svg>. Except attributes with false or null value.

<!-- input -->
<InlineSvg
    fill-opacity="0.25"
    :stroke-opacity="myStrokeOpacity"
    :color="false"
/>

<!-- output -->
<svg fill-opacity="0.25" stroke-opacity="0.5"></svg>

Called when SVG image is loaded and inlined. Inlined SVG element passed as argument into the listener’s callback function.

<InlineSvg @loaded="myInlinedSvg = $event"/>

Called when src prop was changed and another SVG start loading.

<InlineSvg @unloaded="handleUnloaded()"/>

Called when SVG failed to load. Error object passed as argument into the listener’s callback function.

<InlineSvg @error="log($event)"/>
🛡️ Security Considerations

Inlining SVGs directly into the DOM provides flexibility for styling and interaction. However, it can pose risks of XSS (Cross-Site Scripting) attacks. SVGs can contain JavaScript (<script> tags), event handlers (onload, onclick, etc.), or external references (<use xlink:href="..."), which could be exploited.

To ensure security, follow these guidelines based on your SVG source:

1️⃣ SVGs from your project assets

Manually check they don't contain any harmful elements or attributes (scripts, event handlers, external references)

2️⃣ SVGs from third-party sources or user-generated content

Always sanitize before inlining. Use DOMPurify

<InlineSvg
    src="https://example.com/external.svg"
    :transformSource="sanitize"
/>

<script>
    import DOMPurify from 'dompurify';

    function sanitize(svg) {
        svg.innerHTML = DOMPurify.sanitize(svg.innerHTML, { USE_PROFILES: { svg: true } });
        return svg;
    }
</script>

CHANGELOG.md

CONTRIBUTING.md

MIT License


RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4