# Product Grid A responsive product collection grid that switches from a single-column layout on small screens to a multi-column row layout on medium screens and above. - [Overview](#overview) - [Code Walkthrough](#code-walkthrough) - [Key Patterns](#key-patterns) - [Related Documentation](#related-documentation) ```dart import 'package:flutter/material.dart'; import 'package:fluttersdk_wind/fluttersdk_wind.dart'; class ProductGrid extends StatelessWidget { const ProductGrid({super.key}); @override Widget build(BuildContext context) { return Scaffold( backgroundColor: wColor('gray', shade: 200), body: WFlexContainer( className: 'flex-col md:flex-row gap-4 p-4', children: [ collectionCard( imageUrl: 'https://picsum.photos/400/300', title: 'Desk and Office', description: 'Work from home accessories', ), collectionCard( imageUrl: 'https://picsum.photos/400/300', title: 'Self-Improvement', description: 'Journals and note-taking', ), collectionCard( imageUrl: 'https://picsum.photos/400/300', title: 'Travel', description: 'Daily commute essentials', ), ], ), ); } Widget collectionCard({ required String imageUrl, required String title, required String description, }) { return WFlexContainer( className: 'flex-1 flex-col gap-2', children: [ WContainer( className: 'rounded-lg bg-white', child: Image.network(imageUrl, fit: BoxFit.cover), ), WText(title, className: 'text-base font-bold text-gray-900'), WText(description, className: 'text-sm text-gray-500'), ], ); } } ``` ## Overview This example builds a product collection grid using only Wind utility classes. The layout stacks cards vertically by default (`flex-col`) and switches to a horizontal row (`md:flex-row`) once the screen reaches the `md` breakpoint (768 px). No manual `MediaQuery` calls are needed. ## Code Walkthrough ### Outer container ```dart WFlexContainer( className: 'flex-col md:flex-row gap-4 p-4', ... ) ``` - `flex-col` — stacks children vertically on small screens. - `md:flex-row` — switches to horizontal layout at 768 px and wider. - `gap-4` — uniform spacing between the three collection cards. - `p-4` — page padding on all sides. ### Collection card ```dart WFlexContainer( className: 'flex-1 flex-col gap-2', ... ) ``` - `flex-1` — each card grows to fill an equal share of the available row space. - `flex-col` — stacks the image, title, and description vertically. - `gap-2` — tight spacing between card elements. ### Image container ```dart WContainer( className: 'rounded-lg bg-white', child: Image.network(imageUrl, fit: BoxFit.cover), ) ``` - `rounded-lg` — applies the theme's large corner radius. - `bg-white` — white background for the image card. ## Key Patterns | Pattern | Classes used | Purpose | | :--- | :--- | :--- | | Responsive direction | `flex-col md:flex-row` | Single column on mobile, side-by-side on desktop | | Equal-width columns | `flex-1` | All cards share available space equally | | Consistent spacing | `gap-4`, `gap-2` | Uniform gutters without manual `SizedBox` | | Theme color via helper | `wColor('gray', shade: 200)` | Access theme color palette in Dart code | ## Related Documentation - [Flex Direction](../flex/flex-direction.md) — `flex-col` and `flex-row` - [Flex X](../flex/flex-x.md) — `flex-1` and proportional sizing - [Gap](../flex/gap.md) — spacing between flex children - [Responsive Design](../concepts/responsive-design.md) — breakpoint prefixes like `md:` - [WFlexContainer](../widgets/wflexcontainer.md) — the flex layout widget - [WContainer](../widgets/wcontainer.md) — the container widget used for the image card