# Binding the Flutter Theme

Bind the Wind theme to your `MaterialApp` so your app's Material defaults and Wind's utility-first styles stay consistent.

- [Dynamic Binding](#dynamic-binding)
- [Static Binding](#static-binding)
- [Customization Parameters](#customization-parameters)
- [Related Documentation](#related-documentation)

```dart
MaterialApp(
  theme: WindTheme.toThemeData(
    primarySwatch: Colors.blue,
    bodyFontString: 'Roboto',
    displayFontString: 'Lobster',
  ),
)
```

Wind exposes two ways to produce a `ThemeData`:

1. **Dynamic Mode** with `WindTheme.toThemeCallback`, which adapts to runtime changes such as light/dark mode transitions automatically.
2. **Static Mode** with `WindTheme.toThemeData`, which is simpler to set up but requires manual updates when the brightness changes at runtime.

`WindTheme` is a static class, so you call these methods directly on the type. There is no theme-data object or builder to instantiate.

## Dynamic Binding

`WindTheme.toThemeCallback` updates the theme in response to runtime changes like light or dark mode toggling. It reads the brightness from the current `BuildContext` (or from the `brightness` you pass) and keeps the app in sync without manual intervention.

```dart
class MyApp extends StatelessWidget {
  final Widget Function(BuildContext) appCallback;

  const MyApp({super.key, required this.appCallback});

  @override
  Widget build(BuildContext context) {
    return appCallback(context);
  }
}

void main() {
  runApp(MyApp(
    appCallback: (context) {
      return MaterialApp(
        theme: WindTheme.toThemeCallback(
          context,
          primarySwatch: Colors.blue,
          bodyFontString: 'Roboto',
          displayFontString: 'Lobster',
        ),
      );
    },
  ));
}
```

`toThemeCallback` resolves the brightness from the context (via `setTypeFromContext`) unless you pass an explicit `brightness`, then delegates to `toThemeData`. This makes it the right choice for dynamic theme transitions.

## Static Binding

If you do not need runtime adaptability, `WindTheme.toThemeData` is the simpler option. It applies the theme statically. When the brightness changes during runtime, update the theme manually by calling `WindTheme.setType`.

```dart
void main() {
  runApp(MaterialApp(
    theme: WindTheme.toThemeData(
      primarySwatch: Colors.green,
      bodyFontString: 'Open Sans',
      displayFontString: 'Pacifico',
      backgroundColor: Colors.grey.shade200,
      brightness: Brightness.light,
    ),
  ));
}
```

To switch to dark mode at runtime:

```dart
WindTheme.setType(Brightness.dark);
```

Calling `setType` regenerates Wind's darkened color set so the theme reflects the new brightness state.

## Customization Parameters

Both `toThemeData` and `toThemeCallback` accept the same named parameters to customize the Material theme:

| Parameter | Description | Default Value |
|:---|:---|:---|
| `textTheme` | Custom `TextTheme` for the app's typography. | `Typography.material2021().englishLike` |
| `bodyFontString` | Font family for body text. | `WindTheme.getBodyFontString()` |
| `displayFontString` | Font family for display text (e.g. headings). | `WindTheme.getDisplayFontString()` |
| `primarySwatch` | Primary color swatch for the app. | `WindTheme.getMaterialColor('primary')` |
| `accentColor` | Secondary accent color. | `WindTheme.getColor('secondary')` |
| `cardColor` | Background color for cards. | `WindTheme.getColor('white')` |
| `backgroundColor` | Default background color for the app. | `WindTheme.getColor('gray', shade: 50)` |
| `errorColor` | Color used for error states. | `WindTheme.getColor('red')` |
| `brightness` | Overall brightness (light or dark mode). | Current `WindTheme` type |

The defaults above are the ones `toThemeData` applies. `toThemeCallback` differs on two: it defaults `textTheme` to `Theme.of(context).textTheme` and resolves `brightness` from the current `BuildContext` (unless you pass an explicit value), which is what makes it adapt to runtime light/dark changes.

Choose the method that best fits your application's needs.

## Related Documentation

- [Get Started with Wind](https://anilcancakir.com/wind_kit/docs/v0.0/getting-started/installation.md) — install Wind and style your first widget.
- [Dark Mode](https://anilcancakir.com/wind_kit/docs/v0.0/concepts/dark-mode.md) — how Wind handles brightness and color inversion.
- [Colors](https://anilcancakir.com/wind_kit/docs/v0.0/customization/colors.md) — customize the palette `toThemeData` reads from.
- [Font Family](https://anilcancakir.com/wind_kit/docs/v0.0/customization/font-family.md) — set the body and display fonts.
