# Dark Mode

Switch your entire app between light and dark themes with a single call. Wind automatically inverts every color in your palette, so widgets styled with `bg-gray-200` or `text-black` adapt to dark mode without rewriting their class names.

- [Basic Usage](#basic-usage)
- [How It Works](#how-it-works)
- [The `dark:` Prefix](#the-dark-prefix)
- [Keeping Colors Static](#keeping-colors-static)
- [Best Practices](#best-practices)
- [Related Documentation](#related-documentation)

```dart
import 'package:flutter/material.dart';
import 'package:fluttersdk_wind/fluttersdk_wind.dart';

class DarkMode extends StatefulWidget {
  const DarkMode({super.key});

  @override
  State<DarkMode> createState() => _DarkModeState();
}

class _DarkModeState extends State<DarkMode> {
  void enableDarkMode() {
    setState(() {
      WindTheme.setType(Brightness.dark);
    });
  }

  @override
  Widget build(BuildContext context) {
    return WCard(
      className: 'shadow-lg rounded-lg p-4 bg-white',
      child: WFlex(
        className: 'flex-col axis-min gap-2 items-start',
        children: [
          WText('12', className: 'text-4xl leading-6 font-bold text-black'),
          WText('Active users on the website', className: 'text-black leading-4'),
        ],
      ),
    );
  }
}
```

## Basic Usage

Dark mode is driven entirely by `WindTheme`. Call `WindTheme.setType(Brightness.dark)` to switch the active brightness, then rebuild the widget tree so the new colors take effect:

```dart
setState(() {
  WindTheme.setType(Brightness.dark);
});
```

To follow the platform brightness instead of toggling manually, derive it from the current `BuildContext`:

```dart
WindTheme.setTypeFromContext(context);
```

You never list a separate dark palette. The colors you already use (`bg-white`, `text-black`, `bg-gray-200`) are inverted automatically the moment the brightness changes.

## How It Works

When you call `setType`, Wind runs `WindTheme.generateDarkenColors()` under the hood. For every registered color it swaps the shade scale end-for-end, so the lightest shade becomes the darkest and vice versa:

| Light value | Inverted dark value |
|:--|:--|
| `gray-50` | `gray-900` |
| `gray-200` | `gray-700` |
| `gray-500` | `gray-400` |
| `gray-800` | `gray-100` |
| `white` | a near-black surface |
| `black` | `white` |

The result is that a card styled `bg-white` reads as a dark surface and `text-black` reads as near-white once dark mode is active, with no extra class names. Switching back to `Brightness.light` restores the original palette.

## The `dark:` Prefix

When automatic inversion is not enough and you want an explicit dark-mode-only value, prefix any utility with `dark:`. Wind applies the prefixed class only while `WindTheme.getType()` returns `Brightness.dark`:

```dart
WCard(
  className: 'p-4 rounded-lg bg-white dark:bg-gray-800',
  child: WText(
    'Adapts on its own, overridden explicitly when needed.',
    className: 'text-gray-900 dark:text-white',
  ),
);
```

The `dark:` prefix and its `light:` counterpart are resolved by the screens parser, alongside the responsive `sm:`/`md:`/`lg:` breakpoints. See [Responsive Design](https://anilcancakir.com/wind_kit/docs/v0.0/concepts/responsive-design.md) for the full prefix model.

## Keeping Colors Static

Some colors, a brand accent for example, should look identical in both modes. Register them with `WindTheme.addStaticColor` so they are excluded from the inversion pass:

```dart
WindTheme.addStaticColor('primary');
WindTheme.addStaticColor('secondary');
```

A static color keeps the same shade scale regardless of the active brightness. Call `WindTheme.removeStaticColor('primary')` to opt it back into inversion.

## Best Practices

- Toggle inside `setState` (or your state-management rebuild path) so the tree repaints with the inverted palette.
- Prefer automatic inversion first; reach for the `dark:` prefix only when a specific value should differ from the inverted default.
- Mark brand and accent colors static with `addStaticColor` so they stay recognizable across both modes.
- Use `setTypeFromContext` when you want Wind to follow the system or `MaterialApp` brightness rather than a manual toggle.

## Related Documentation
- [Responsive Design](https://anilcancakir.com/wind_kit/docs/v0.0/concepts/responsive-design.md) — the prefix model `dark:` shares with breakpoints.
- [State-Based Styling](https://anilcancakir.com/wind_kit/docs/v0.0/concepts/state-based-styling.md) — applying styles for widget states such as `hover` and `disabled`.
- [Colors](https://anilcancakir.com/wind_kit/docs/v0.0/customization/colors.md) — registering palette colors and reading them with `wColor`.
- [Background Color](https://anilcancakir.com/wind_kit/docs/v0.0/backgrounds/background-color.md) — the `bg-*` utilities that benefit from inversion.
