# Context Extensions - [Overview](#overview) - [Theme Extensions](#theme-extensions) - [Responsive Extensions](#responsive-extensions) - [Helper Extensions](#helper-extensions) - [API Reference](#api-reference) - [Common Patterns](#common-patterns) ## Overview Wind provides a set of ergonomic extensions on `BuildContext` to make accessing theme data, responsive breakpoints, and styling helpers as concise as possible. Instead of verbose provider lookups, you can access the entire Wind ecosystem directly from the `context`. ## Theme Extensions These extensions provide direct access to the `WindTheme` configuration and its underlying data. ### Theme Control Use `windTheme` to interact with the theme controller, typically for toggling between light and dark modes. ```dart // Toggle the current theme context.windTheme.toggleTheme(); // Set a specific brightness context.windTheme.setBrightness(Brightness.dark); ``` ### Theme Data Access the raw `WindThemeData` or specific properties like colors and brightness. ```dart // Access the full theme data object final theme = context.windThemeData; // Quick access to the colors map final primary = context.windColors['blue']; // Check current brightness state if (context.windIsDark) { // Apply dark mode logic } ``` ## Responsive Extensions Responsive extensions allow you to make layout decisions in your widget tree based on the current screen size and defined breakpoints. ### Breakpoint Shortcuts Quickly determine the current device category. These are based on your theme's `screens` configuration (defaults to Tailwind breakpoints). ```dart if (context.wIsMobile) { return MobileLayout(); // < md } if (context.wIsTablet) { return TabletLayout(); // >= md && < lg } if (context.wIsDesktop) { return DesktopLayout(); // >= lg } ``` ### Active Breakpoint You can also retrieve the exact name of the active breakpoint. ```dart WText('Current breakpoint: ${context.wActiveBreakpoint}'); ``` ## Helper Extensions These extensions are shorthand for Wind's global helper functions, allowing you to resolve specific values from the theme without passing the context manually. ### Colors and Spacing Resolve colors and spacing values based on your theme's unit scale. ```dart // Get 'red-500' from the theme final alertColor = context.wColorExt('red', shade: 500); // Get 4 units of spacing (4 * baseSpacingUnit) final padding = context.wSpacingExt(4); ``` ### Typography and Styling Directly resolve font properties or even parse full class strings into a `WindStyle` object. ```dart final weight = context.wFontWeightExt('bold'); final size = context.wFontSizeExt('lg'); // Parse a class string manually final style = context.wStyleExt('p-4 bg-blue-500 rounded-lg'); ``` ## API Reference | Property / Method | Returns | Description | |:---|:---|:---| | `windTheme` | `WindThemeController` | Access the controller for toggling or updating the theme. | | `windThemeData` | `WindThemeData` | Access the read-only theme configuration. | | `windColors` | `Map` | Returns the full color palette from the theme. | | `windScreens` | `Map` | Returns the breakpoint map (e.g., `md: 768`). | | `windBrightness` | `Brightness` | Returns the current theme brightness (`light` or `dark`). | | `windIsDark` | `bool` | Convenience getter for `brightness == Brightness.dark`. | | `wActiveBreakpoint` | `String` | Returns the name of the currently active breakpoint. | | `wIsMobile` | `bool` | Returns `true` if screen width is less than `md`. | | `wIsTablet` | `bool` | Returns `true` if screen width is between `md` and `lg`. | | `wIsDesktop` | `bool` | Returns `true` if screen width is `lg` or larger. | | `wColorExt(name, {shade})`| `Color?` | Resolves a theme color by name and optional shade. | | `wSpacingExt(multiplier)` | `double` | Returns spacing calculated by `multiplier * baseSpacingUnit`. | | `wFontSizeExt(name)` | `double?` | Returns the font size value for a key (e.g., `xl`). | | `wFontWeightExt(name)` | `FontWeight?` | Returns the font weight for a key (e.g., `bold`). | | `wScreenIsExt(name)` | `bool` | Checks if a specific breakpoint is currently active. | | `wStyleExt(className)` | `WindStyle` | Parses a utility string into a `WindStyle` object. | ## Common Patterns ### Conditional Layouts Using responsive extensions to change widget parameters. ```dart WDiv( className: 'bg-white rounded-lg', // Use extension to adjust padding dynamically in logic child: Padding( padding: EdgeInsets.all(context.wIsMobile ? 12 : 24), child: Content(), ), ) ``` ### Manual Style Resolution Sometimes you need to apply Wind styles to standard Flutter widgets that don't support `className`. ```dart final style = context.wStyleExt('text-blue-600 font-bold italic'); return Text( 'Direct Styling', style: style.textStyle, ); ``` ### Theme Toggling Implementing a theme switcher is trivial with the `windTheme` extension. ```dart IconButton( icon: Icon(context.windIsDark ? Icons.light_mode : Icons.dark_mode), onPressed: () => context.windTheme.toggleTheme(), ) ``` ## Related Documentation - [Theming Concepts](../core-concepts/theming.md) - [Responsive Design](../core-concepts/responsive-design.md) - [Color Helpers](./color-helpers.md)