Vitral 0.2
Icons

799 icons, drawn for Vitral

One outline set on a 24×24 grid: round 2-unit strokes, no fill, in the current text colour. Each icon is a named export of @vitral/icons, so an application bundles only the ones it imports. Size and stroke come from the theme's icon.size and icon.strokeWidth tokens; size and stroke-width override them on one icon.

799 icons

Arrows & navigation 63

Interface & actions 93

Shapes 20

Files & folders 32

Text & formatting 37

Media 44

Communication 33

People & accounts 19

Devices & hardware 28

Development 31

Charts & data 20

Maps & location 19

Transport 21

Time & calendar 19

Weather & nature 37

Security 20

Health & medical 22

Home & buildings 26

Food & drink 30

School & education 36

E-commerce 32

Finance 32

Games 50

Sports 35

Icons from other libraries

Every icon prop, on a button or a menu item or a toast or a tree node, goes through <Icon>, which takes more than this set: another library's Vue component, SVG markup you trust, or the classes of an icon font. Whatever it is gets the vt-icon class, the theme's size and the same hidden-or-labelled accessibility.

Other libraries
<script setup lang="ts">
import { h, markRaw } from 'vue';
import { Camera } from 'lucide-vue-next';
import { Icon as Iconify } from '@iconify/vue';
import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';
import { faUser } from '@fortawesome/free-solid-svg-icons';
import { graduationCap } from '@vitral/icons';

// A component that needs its own props is wrapped in a function.
const MdiHome = () => h(Iconify, { icon: 'mdi:home' });
const FaUser = () => h(FontAwesomeIcon, { icon: faUser });

// Components kept in a model are marked raw, so Vue does not make them reactive.
const items = [
    { label: 'Photo', icon: markRaw(Camera) },
    { label: 'Home', icon: MdiHome },
    { label: 'Course', icon: graduationCap }
];
</script>

<template>
    <Button label="Shoot" :icon="Camera" />
    <Button label="Profile" :icon="FaUser" />
    <Button label="Me" icon="fa-solid fa-user" />        <!-- an icon font's classes -->
    <Button label="Logo" :icon="'<svg viewBox=…>…</svg>'" />  <!-- trusted markup -->
    <Menu :model="items" />
</template>