# WSvg
The utility-first SVG component. `WSvg` brings HTML SVG semantics to Flutter with Tailwind-like utility classes for styling, supporting both asset paths and raw SVG strings.
- [Basic Usage](#basic-usage)
- [Constructor](#constructor)
- [Props](#props)
- [Layout Modes](#layout-modes)
- [Event Handling](#event-handling)
- [State Variants](#state-variants)
- [Styling Examples](#styling-examples)
- [Preserving Original Colors](#preserving-original-colors)
- [All Supported Classes](#all-supported-classes)
- [Customizing Theme](#customizing-theme)
- [Related Documentation](#related-documentation)
```dart
WSvg(
src: 'assets/icons/star.svg',
className: 'fill-yellow-500 w-6 h-6 hover:scale-110 transition-transform',
)
```
## Basic Usage
The `WSvg` widget allows you to render SVG graphics and style them using utility classes. It inherits colors and sizes from parent styles if not explicitly defined.
### From Asset
Use the default constructor for files located in your assets folder.
```dart
WSvg(
src: 'assets/logo.svg',
className: 'w-12 h-12 fill-blue-600',
)
```
### From String
Use the `WSvg.string` constructor to render raw SVG content.
```dart
WSvg.string(
'',
className: 'stroke-red-500 stroke-2 w-8 h-8',
)
```
## Constructor
```dart
WSvg({
Key? key,
required String? src,
String? className,
Set? states,
String? semanticsLabel,
})
WSvg.string(
String svg, {
Key? key,
String? className,
Set? states,
String? semanticsLabel,
})
```
## Props
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `className` | `String?` | `null` | Wind utility classes for sizing, coloring, and effects. |
| `src` | `String?` | `null` | The asset path to the SVG file. |
| `svgString` | `String?` | `null` | Raw SVG string content (used in `WSvg.string`). |
| `states` | `Set?` | `null` | Custom states for dynamic styling prefixes. |
| `semanticsLabel` | `String?` | `null` | Semantic label for accessibility. |
## Layout Modes
`WSvg` behaves as a fixed-size or flexible graphic depending on the classes provided.
### Sizing Priority
The widget determines its size based on the following priority:
1. `w-{n}` or `h-{n}` classes.
2. `text-{size}` classes (font size).
3. Inherited font size from the parent `DefaultTextStyle`.
```dart
WSvg(
src: 'assets/icon.svg',
className: 'w-10 h-10', // Explicit size
)
```
## Event Handling
`WSvg` does not handle events directly. To add interactivity, wrap it in a `WAnchor` or `WButton`.
```dart
WAnchor(
onTap: () => print('SVG clicked'),
child: WSvg(
src: 'assets/icon.svg',
className: 'hover:fill-blue-500 transition-colors',
),
)
```
## State Variants
Use state prefixes to change SVG styles based on interactions or environment:
```dart
WSvg(
src: 'assets/icon.svg',
className: 'fill-gray-400 hover:fill-blue-500 dark:fill-white',
)
```
## Styling Examples
### Color Priority
The widget applies a color filter using the following priority:
1. `stroke-{color}` (ideal for outlined icons)
2. `fill-{color}`
3. `text-{color}` (fallback)
4. Inherited color from parent
```dart
// Applying a stroke color to an outlined SVG
WSvg(
src: 'assets/outline-star.svg',
className: 'stroke-amber-500',
)
```
> [!NOTE]
> Adding the `preserve-colors` class bypasses the entire color priority chain. No `ColorFilter` is applied, and the SVG renders with its original embedded colors.
### Opacity and Transitions
You can apply opacity and animate it using transition classes.
```dart
WSvg(
src: 'assets/logo.svg',
className: 'opacity-50 hover:opacity-100 duration-300',
)
```
### Preserving Original Colors
By default, `WSvg` applies a `ColorFilter` based on the color priority chain above. For SVGs that contain multiple colors you want to keep intact—like QR codes, branded logos, or multi-color illustrations—use the `preserve-colors` utility class.
```dart
// Multi-color logo — keep original colors
WSvg(
src: 'assets/logo-colored.svg',
className: 'w-32 h-32 preserve-colors',
)
// QR code — must not be tinted
WSvg(
src: 'assets/qr-code.svg',
className: 'w-48 h-48 preserve-colors',
)
```
## All Supported Classes
| Category | Classes |
|:---------|:--------|
| Sizing | `w-{size}`, `h-{size}`, `text-{size}` |
| Coloring | `fill-{color}`, `stroke-{color}`, `text-{color}` |
| Preserve | `preserve-colors` |
| Opacity | `opacity-{n}` |
| Transitions| `duration-{ms}`, `ease-{curve}` |
| Animations | `animate-spin`, `animate-pulse`, `animate-bounce` |
## Customizing Theme
You can define custom colors in your `WindThemeData` that will be available to `WSvg`.
```dart
WindThemeData(
colors: {
'brand': Colors.blue,
},
)
```
Then use it as: `className: 'fill-brand-500'`.
## Related Documentation
- [WIcon](./w-icon.md)
- [WImage](./w-image.md)
- [SVG Parser](../parsers/svg_parser.md)