Vue SVG Icons

By the Axialis Engineering team ·

Vue SVG Icons

Importing raw SVG files into a Vue app leaves you wiring up vite-svg-loader, build config, and ARIA by hand for every icon. Export each icon from IconVectors as a typed Vue 3 single-file component instead, and you get a <script setup lang="ts"> SFC with a size prop, attribute fallthrough, accessible labels, and currentColor theming — ready to import and ship.

When to choose a Vue SFC over an SVG file

Draw, Import or Trace your icon

The IconVectors editor drawing a heart icon on a 24x24 grid, with the Source Code panel open showing SVG, Minified SVG, XAML, SVG Symbol, VueTS and ReactTS export tabs.

Export a Vue SFC from IconVectors

  1. Design on a consistent grid (e.g. 24x24). Keep strokes aligned to whole pixels so the icon stays crisp at 1x.
  2. Set your theming strategy: for single-color icons, set currentColor on fill or stroke so CSS controls the color; leave fixed accent colors hard-coded.
  3. Open the Source Code panel (F3) and select the VueTS tab.
  4. Copy the generated component and save it to your project, e.g. icons/HeartIcon.vue.

Component template (typed + attribute fallthrough)

<template>
  <svg
    :width="size"
    :height="size"
    viewBox="0 0 24 24"
    v-bind="aria"
    v-bind="$attrs">
    <path
      fill="none"
      stroke="currentColor"
      stroke-width="1"
      stroke-linecap="round"
      stroke-linejoin="round"
      d="M2.5 9C2.5 2.5 10 3 12 7.5C14 3 21.5 2.5 21.5 9C21.5 15.4 12 21.5 12 21.5C12 21.5 2.5 15.6 2.5 9z"/>
  </svg>
</template>

<script lang="ts" setup>
import { computed } from 'vue';

interface IconProps {
  /** Optional accessible label; if omitted, icon is decorative */
  title?: string;
  /** Optional size in px (applies to width/height) */
  size?: number | string;
}

defineOptions({ inheritAttrs: false });
const props = defineProps<IconProps>();

const aria = computed(() =>
  props.title
    ? { role: 'img', 'aria-label': props.title }
    : { 'aria-hidden': 'true' }
);
const size = computed(() => props.size ?? 24);
</script>

Usage examples

<script setup lang="ts">
import HeartIcon from '@/icons/HeartIcon.vue';
</script>

<!-- 1) Decorative icon (screen readers ignore) -->
<HeartIcon class="h-5 w-5 text-rose-600" aria-hidden="true" />

<!-- 2) Informative icon with label -->
<HeartIcon class="h-5 w-5" title="Favorite" />

<!-- 3) Set size via prop or CSS -->
<HeartIcon :size="20" style="color:#16a34a" />

Using an SVG sprite in Vue (alternative)

If you maintain a global sprite, reference symbols with <use href="…"/>:

<!-- In index.html or App.vue once -->
<svg style="display:none">
  <symbol id="icon-heart-24" viewBox="0 0 24 24">
    <path fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"
          d="M2.5 9C2.5 2.5 10 3 12 7.5C14 3 21.5 2.5 21.5 9C21.5 15.4 12 21.5 12 21.5C12 21.5 2.5 15.6 2.5 9z"/>
  </symbol>
</svg>

<!-- Anywhere in your app -->
<svg width="24" height="24" aria-hidden="true" class="text-rose-600">
  <use href="#icon-heart-24" fill="currentColor" />
</svg>

Accessibility checklist

Theming with currentColor

Set the main shape's fill or stroke to currentColor so the icon inherits text color from CSS — utility classes, variables, or a parent's color. For fixed accents, keep hard-coded colors on the secondary paths.

.btn-icon { color: #2563eb; }
[data-theme="dark"] .btn-icon { color: #93c5fd; }
<button class="btn-icon inline-flex items-center gap-2">
  <HeartIcon :size="20" aria-hidden="true" /> Save
</button>

Performance and packaging tips

Related guides

Start Making SVG Icons Today with IconVectors

Download the fully-functional 30‑Day Free Trial and unlock your icon design workflow.

Version 1.70 for Windows and macOS