# Responsive Design Adapt layouts across screen sizes with breakpoint prefixes. Inspired by TailwindCSS, Wind lets you write responsive styles such as `sm:w-full` or `lg:w-100` directly in a `className`, applied the moment the screen width crosses the matching breakpoint. - [Basic Usage](#basic-usage) - [Default Breakpoints](#default-breakpoints) - [How It Works](#how-it-works) - [Managing Breakpoints](#managing-breakpoints) - [Best Practices](#best-practices) - [Related Documentation](#related-documentation) ```dart import 'package:flutter/material.dart'; import 'package:fluttersdk_wind/fluttersdk_wind.dart'; class ResponsiveDesign extends StatelessWidget { const ResponsiveDesign({super.key}); @override Widget build(BuildContext context) { return WFlexContainer( className: 'w-full h-full justify-center items-center flex-col bg-gray-200', children: [ WCard( className: 'sm:w-full lg:w-100 p-4 bg-white rounded-lg items-center justify-center', child: WText('Full width on small screens, fixed on large.', className: 'text-black'), ), WCard( className: 'lg:w-full p-4 bg-white rounded-lg items-center justify-center', child: WText('Full width on large screens.', className: 'text-black'), ), ], ); } } ``` ## Basic Usage Prefix any utility with a breakpoint name to apply it from that width upward: ```dart WCard( className: 'sm:w-full md:w-1/2 lg:w-100 p-4 bg-white rounded-lg', child: WText('Resizes as the viewport grows.', className: 'text-black'), ); ``` Breakpoints are min-width based: `lg:w-100` takes effect once the available width is at least the `lg` breakpoint and stays in effect at wider sizes. ## Default Breakpoints Wind ships with five breakpoints out of the box. The width is the minimum screen width, in logical pixels, at which the prefix activates: | Prefix | Min width (px) | |:--|:--| | `sm` | 640 | | `md` | 768 | | `lg` | 1024 | | `xl` | 1280 | | `2xl` | 1536 | Retrieve the full map programmatically: ```dart final screens = WindTheme.getScreens(); ``` ## How It Works Wind reads each space-separated token in a `className`. When a token carries a known breakpoint prefix, the screens parser checks the current `MediaQuery` width against `WindTheme.getScreenValue(prefix)`. If the width meets or exceeds that value, the prefix is stripped and the underlying utility is applied; otherwise the token is skipped. Because the check is min-width based, listing several breakpoints lets the larger one win at wider sizes: ```dart // w-full below lg, then a fixed 100-unit width from lg upward. WContainer(className: 'sm:w-full lg:w-100'); ``` The same prefix machinery also resolves `dark:`/`light:` and operating-system prefixes (`ios:`, `android:`, `web:`, ...), so a single token can target a breakpoint and a mode together. ## Managing Breakpoints Add, update, or remove custom breakpoints through `WindTheme`. Do this once during setup, before the widgets that depend on them build: ```dart // Add a custom breakpoint. WindTheme.addScreen('watch', 300); // Update an existing breakpoint. WindTheme.updateScreen('watch', 400); // Remove a custom breakpoint. WindTheme.removeScreen('watch'); ``` Once registered, a custom prefix behaves exactly like the built-in ones: `watch:w-full` applies from its width upward. ## Best Practices - Order tokens from smallest to largest breakpoint so the intent reads top-down (`sm:... md:... lg:...`). - Remember breakpoints are min-width based: a value with no prefix is the base, and each prefix overrides it from its width upward. - Register custom breakpoints during app setup, not inside `build`, so the map is stable across rebuilds. - Combine breakpoint and mode prefixes when needed (`lg:dark:bg-gray-800`) rather than duplicating widgets. ## Related Documentation - [Dark Mode](dark-mode.md) — the `dark:` prefix that shares this resolution model. - [State-Based Styling](state-based-styling.md) — applying styles for widget states. - [Width](../sizing/width.md) — the `w-*` utilities most often made responsive. - [Display](../layout/display.md) — `hide`/`show` utilities with breakpoint prefixes.