Vite plugin for SVG handling in Svelte 5 projects with dynamic color and size support.
pnpm add vite-plugin-for-svelte-svg
// vite.config.ts
import { defineConfig } from 'vite'
import { svelte } from '@sveltejs/vite-plugin-svelte'
import svelteSvg from 'vite-plugin-for-svelte-svg'
export default defineConfig({
plugins: [
svelteSvg({
dir: 'src/svg',
output: 'src/svg/index.ts'
}),
svelte()
]
})
<script lang="ts">
import { Svg } from './svg' // Auto-generated with typed name prop
</script>
<!-- Basic usage -->
<Svg name="icon" />
<!-- With size -->
<Svg name="logo" size="64px" />
<!-- With single color -->
<Svg name="arrow" color="#ff0000" />
<!-- With multiple colors (for multi-colored SVGs) -->
<Svg name="badge" color={['#fff', '#000', '#ccc']} />
<!-- With class and click handler -->
<Svg
name="button"
size="24px"
class="hover:opacity-80 cursor-pointer"
onclick={() => console.log('clicked')}
/>
| Option | Type | Default | Description |
|---|---|---|---|
dir |
string |
'src/svg' |
SVG files directory |
output |
string |
'src/svg/index.ts' |
Generated module output path |
generateTypes |
boolean |
true |
Whether to generate types |
| Prop | Type | Default | Description |
|---|---|---|---|
name |
SvgName |
required | SVG file name (without extension), auto-completed |
size |
string | number |
'40px' |
Width and height |
color |
string | string[] |
undefined |
Fill color(s) for shapes |
class |
string |
'' |
CSS classes |
...rest |
HTMLAttributes |
- | All HTML attributes and events |
The plugin generates a single index.ts file containing:
export type SvgName = 'icon1' | 'icon2' | ... // Union of all SVG names
export interface SvgProps { ... } // Typed props interface
export const Svg: Component<SvgProps> // Typed Svg component
index.ts with typed Svg componentimport.meta.glob, then parsed and modified in the browserMIT