# Theme Binding
Theme binding allows you to sync your Wind configuration with Flutter's native `ThemeData` system. This ensures that standard Material widgets automatically reflect your Wind tokens, creating a cohesive visual experience across your entire application.
- [Why Bind Themes?](#why-bind-themes)
- [Reactive Binding](#reactive-binding)
- [Toggling Themes](#toggling-themes)
- [Static Binding](#static-binding)
- [Mapping Reference](#mapping-reference)
## Why Bind Themes?
By default, Wind manages its own styling tokens (colors, spacing, typography). However, Flutter's built-in widgets (like `AppBar`, `FloatingActionButton`, or `TextField`) rely on the standard `Theme.of(context)` to determine their appearance.
Binding the two systems ensures:
- **Consistency:** A button using `bg-primary-500` matches a standard `ElevatedButton`.
- **Inheritance:** Standard Flutter widgets automatically pick up your Wind font families and colors.
- **Automation:** Toggling dark mode in Wind automatically updates the `brightness` of your standard Material theme.
## Reactive Binding
To ensure your entire application rebuilds when the theme changes (e.g., switching to dark mode), use the `builder` pattern. This provides a `WindController` that dynamically generates a new `ThemeData` whenever the state updates.
```dart
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
final windTheme = WindThemeData(
colors: {
'primary': Colors.indigo,
'secondary': Colors.teal,
},
);
return WindTheme(
data: windTheme,
builder: (context, controller) {
// controller.toThemeData() produces a standard Flutter ThemeData
return MaterialApp(
theme: controller.toThemeData(),
home: const HomePage(),
);
},
);
}
}
```
## Toggling Themes
When using the reactive `builder` pattern, you can trigger a global theme update from anywhere in the widget tree. This will automatically update both Wind utilities and standard Material widgets.
```dart
// Toggle between Light and Dark mode
context.windTheme.toggleTheme();
```
## Static Binding
If you do not need dynamic theme switching at runtime, you can bind the theme once during initialization. This is useful for apps with a fixed brand identity or forced dark/light modes.
```dart
final windTheme = WindThemeData(
brightness: Brightness.dark,
colors: {'primary': Colors.purple},
);
return WindTheme(
data: windTheme,
child: MaterialApp(
theme: windTheme.toThemeData(),
home: const HomePage(),
),
);
```
## Mapping Reference
The `toThemeData()` method intelligently maps Wind tokens to their standard Flutter counterparts:
| Wind Token | Flutter Theme Property |
|:-----------|:-----------------------|
| `colors['primary']` | `colorScheme.primary` |
| `colors['secondary']` | `colorScheme.secondary` |
| `colors['error']` | `colorScheme.error` |
| `colors['background']` | `scaffoldBackgroundColor` |
| `brightness` | `brightness` |
| `fontFamilies['sans']` | `textTheme.fontFamily` |
This mapping ensures that your utility-first styles and native widgets stay perfectly in sync.