# WDiv
The fundamental building block of Wind. `WDiv` acts as a multi-purpose container that replaces standard Flutter widgets like `Container`, `Row`, `Column`, `Flex`, `Grid`, `Wrap`, and `SingleChildScrollView`.
It embodies the "Intelligent Composition" philosophy, dynamically constructing the most efficient widget tree based on the provided utility classes. Instead of blindly wrapping content, `WDiv` inspects the `className` and selectively applies specialized widgets like `Padding`, `Align`, `Row`, or `GridView` only when necessary.
- [Basic Usage](#basic-usage)
- [Constructor](#constructor)
- [Props](#props)
- [Runtime-Dynamic Colors](#runtime-dynamic-colors)
- [Layout Modes](#layout-modes)
- [Event Handling](#event-handling)
- [State Variants](#state-variants)
- [Styling Examples](#styling-examples)
- [All Supported Classes](#all-supported-classes)
- [Customizing Theme](#customizing-theme)
- [Related Documentation](#related-documentation)
```dart
WDiv(
className: 'flex flex-col gap-4 p-6 bg-white rounded-xl shadow-lg',
children: [
WText('Hello Wind', className: 'text-2xl font-bold'),
WText('This is a styled container.', className: 'text-gray-600'),
],
)
```
## Basic Usage
Use `WDiv` with a single `child` for simple wrapping or with `children` when using layout modes like `flex` or `grid`.
```dart
// Simple container
WDiv(
className: 'p-4 bg-blue-500 rounded',
child: WText('Single Child', className: 'text-white'),
)
// Flex row
WDiv(
className: 'flex flex-row gap-2',
children: [
WDiv(className: 'w-10 h-10 bg-red-500'),
WDiv(className: 'w-10 h-10 bg-green-500'),
],
)
```
## Constructor
```dart
const WDiv({
Key? key,
String? className,
Widget? child,
List? children,
WindStyle? style,
Set? states,
bool scrollPrimary = false,
Color? backgroundColor,
})
```
## Props
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `className` | `String?` | `null` | Utility class string defining layout and styles. |
| `child` | `Widget?` | `null` | Single child widget. Mutually exclusive with `children`. |
| `children` | `List?` | `null` | List of children widgets. Mutually exclusive with `child`. |
| `style` | `WindStyle?` | `null` | Explicit style object that serves as a base for `className`. |
| `states` | `Set?` | `null` | Custom states to activate prefix classes (e.g., `loading:bg-blue-500`). |
| `scrollPrimary` | `bool` | `false` | Whether this is the primary scroll view for iOS tap-to-top and desktop scrollbar integration. |
| `backgroundColor` | `Color?` | `null` | Inline background color for runtime-dynamic values. Overrides any `bg-*` / `dark:bg-*` from `className`. See [Runtime-Dynamic Colors](#runtime-dynamic-colors). |
## Runtime-Dynamic Colors
Utility classes are for **design tokens** (`bg-primary-500`, `bg-red-500`). When the color is a **runtime value**, a hex from a color picker or a brand color loaded per tenant, use the `backgroundColor` prop instead of interpolating into `bg-[#$hex]`.
```dart
// Good: runtime-dynamic color via inline prop
WDiv(
backgroundColor: userBrandColor, // Color from a picker or API
className: 'w-16 h-16 rounded-xl',
)
// Avoid: string interpolation bloats the parser cache, one entry per unique hex
WDiv(className: 'w-16 h-16 rounded-xl bg-[#${userBrandColor.hex}]')
```
Precedence: inline `backgroundColor` wins over any `bg-*` / `dark:bg-*` resolved from `className`. When `backgroundColor` is `null`, className behavior, including the `dark:` fallback, is unchanged. The inline color does not participate in the parser cache key.
## Layout Modes
`WDiv` dynamically switches its internal structure based on the `display` utility classes provided in `className`.
- **Block (Default)**: Standard vertical stack or single child wrapper. If `children` is used without `flex` or `grid`, it defaults to a `Column`.
- **Flex**: Enabled via `flex`. Supports `flex-row`, `flex-col`, `gap-*`, `items-*`, `justify-*`. It mimics CSS Flexbox behavior, including automatic `Flexible` wrapping for children in rows.
- **Grid**: Enabled via `grid`. Uses a combination of `Wrap` and `LayoutBuilder` to achieve Tailwind-like grid behavior (`grid-cols-*`) with intrinsic item heights.
- **Wrap**: Enabled via `wrap`. Elements wrap to the next line when space is insufficient, similar to `flex-wrap` in CSS.
- **Hidden**: Enabled via `hidden`. The widget short-circuits to `SizedBox.shrink()` to save resources.
## Event Handling
`WDiv` automatically becomes interactive when state-based prefixes like `hover:`, `focus:`, or `active:` are used in the `className`. Under the hood, it wraps the content in a `WAnchor` to detect gestures and focus.
For direct gesture support (taps, long presses) or to create semantic buttons, use [WAnchor](/docs/widgets/w-anchor) or [WButton](/docs/widgets/w-button).
## State Variants
`WDiv` supports all Wind state prefixes, allowing you to change styles based on interaction or environment.
```dart
WDiv(
className: 'bg-blue-500 hover:bg-blue-600 active:scale-95 duration-200',
child: WText('Interactive', className: 'text-white'),
)
```
Common prefixes:
- `hover:` - Applies when the mouse pointer is over the element.
- `focus:` - Applies when the element has keyboard focus.
- `disabled:` - Applies when the element or parent is disabled.
- `dark:` - Applies when the application is in dark mode.
- `active:` - Applies while the element is being pressed.
## Styling Examples
### Backgrounds & Borders
Combine background colors, gradients, and border properties.
```dart
WDiv(className: 'bg-red-500 border-2 border-red-700 rounded-lg')
```
### Shadows & Rings
Apply depth with shadows or focus indicators with rings.
```dart
WDiv(className: 'shadow-xl ring-2 ring-blue-500 ring-offset-2')
```
### Responsive Design
`WDiv` uses mobile-first breakpoints to adapt layouts to different screen sizes.
```dart
// Stacked on mobile, side-by-side on tablet/desktop
WDiv(className: 'flex flex-col md:flex-row gap-4')
// Variable widths
WDiv(className: 'w-full md:w-1/2 lg:w-1/3')
```
## All Supported Classes
| Category | Classes |
|:---------|:--------|
| **Display** | `block`, `flex`, `grid`, `wrap`, `hidden` |
| **Flexbox** | `flex-row`, `flex-col`, `justify-*`, `items-*`, `gap-*`, `flex-1`, `flex-2`, etc. |
| **Grid** | `grid-cols-*`, `gap-x-*`, `gap-y-*` |
| **Sizing** | `w-*`, `h-*`, `min-w-*`, `max-w-*`, `aspect-*` |
| **Spacing** | `p-*`, `px-*`, `py-*`, `m-*`, `mx-*`, `my-*`, `space-x-*`, `space-y-*` |
| **Background** | `bg-*`, `bg-gradient-*`, `bg-opacity-*` |
| **Borders** | `border-*`, `rounded-*`, `border-opacity-*` |
| **Effects** | `shadow-*`, `opacity-*`, `ring-*`, `ring-offset-*` |
| **Overflow** | `overflow-hidden`, `overflow-scroll`, `overflow-auto`, `overflow-x-*`, `overflow-y-*` |
| **Animation** | `animate-spin`, `animate-pulse`, `animate-bounce`, `animate-ping` |
| **Transitions** | `transition-*`, `duration-*`, `ease-*` |
## Customizing Theme
`WDiv` respects the configuration defined in `WindThemeData`.
```dart
WindTheme(
data: WindThemeData(
baseSpacingUnit: 4.0, // Multiplier for p-1, m-4, etc.
colors: { ... }, // Custom color palette for bg-*, border-*
breakpoints: { ... }, // Custom screen sizes for md:, lg:, etc.
),
child: ...,
)
```
## Related Documentation
- [Flexbox](../layout/flexbox.md) & [Grid](../layout/grid.md)
- [Sizing Utilities](../layout/sizing.md)
- [Spacing & Margins](../layout/spacing.md)
- [Interaction State Prefixes](../core-concepts/state-management.md)
- [WAnchor Widget](./w-anchor.md)
- [WSpacer Widget](./w-spacer.md)