# WCard Surface container with optional `header` and `footer` slots. Composes a `WDiv` (flex-col) with up to three slots: an optional header above the body, the required `child` body, and an optional footer below. All styling is className-driven; no colors or spacing are baked in. ## Table of Contents - [Basic Usage](#basic-usage) - [Props](#props) - [Constructor](#constructor) - [Styling Examples](#styling-examples) - [Related Documentation](#related-documentation) ## Basic Usage ```dart WCard( className: 'rounded-xl bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 p-5', child: WText('Body content'), ) ``` ## Props | Prop | Type | Default | Description | |:-----|:-----|:--------|:------------| | `child` | `Widget` | **Required** | The main body content of the card. | | `header` | `Widget?` | `null` | Optional widget rendered above the body. Typical use: a title row, a card image, or a section label. | | `footer` | `Widget?` | `null` | Optional widget rendered below the body. Typical use: action buttons or status/metadata rows. | | `className` | `String?` | `null` | Utility classes for the outer container. When omitted, defaults to `'w-full flex flex-col'` (no colors, no spacing). | ## Constructor ```dart WCard({ Key? key, required Widget child, Widget? header, Widget? footer, String? className, }) ``` ## Styling Examples ### Basic Card with Border and Shadow ```dart WCard( className: ''' rounded-xl bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 shadow-md p-5 ''', child: WText('Settings content here'), ) ``` ### Card with Header Slot Add a visual header section separated by a border: ```dart WCard( className: 'rounded-xl bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 overflow-hidden', header: WDiv( className: 'px-5 py-4 border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-900', child: WText('Recent Activity', className: 'text-sm font-semibold text-gray-700 dark:text-gray-300'), ), child: WDiv( className: 'px-5 py-4', child: WText('Activity list here'), ), ) ``` ### Card with Header and Footer Three-slot card with an action footer: ```dart WCard( className: 'rounded-xl bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 overflow-hidden', header: WDiv( className: 'px-5 py-4 border-b border-gray-200 dark:border-gray-700', child: WText('Team Plan', className: 'text-base font-semibold text-gray-900 dark:text-white'), ), child: WDiv( className: 'px-5 py-4 flex flex-col gap-1', children: [ WText('\$49 / month', className: 'text-2xl font-bold text-gray-900 dark:text-white'), WText('Up to 25 members, 100 GB storage.', className: 'text-sm text-gray-500 dark:text-gray-400'), ], ), footer: WDiv( className: 'px-5 py-4 border-t border-gray-200 dark:border-gray-700 flex flex-row justify-end', child: WButton( onTap: save, className: 'px-4 py-2 rounded-lg bg-blue-600 dark:bg-blue-500 hover:bg-blue-700 dark:hover:bg-blue-600', child: WText('Save', className: 'text-white text-sm font-medium'), ), ), ) ``` ### Driven by a WindSlotRecipe Use `WindSlotRecipe` to keep card tone variations in one place: ```dart final card = WindSlotRecipe( slots: {'root': 'rounded-xl border overflow-hidden', 'header': 'px-5 py-4 border-b', 'body': 'px-5 py-4'}, variants: { 'tone': { 'default': {'root': 'bg-white dark:bg-gray-800 border-gray-200 dark:border-gray-700', 'header': 'border-gray-200 dark:border-gray-700', 'body': ''}, 'highlighted': {'root': 'bg-blue-50 dark:bg-blue-950 border-blue-200 dark:border-blue-800', 'header': 'border-blue-200 dark:border-blue-800', 'body': ''}, }, }, defaultVariants: {'tone': 'default'}, ); final classes = card(variants: {'tone': 'highlighted'}); WCard( className: classes['root'], header: WDiv(className: classes['header'], child: WText('Summary')), child: WDiv(className: classes['body'], child: WText('Body')), ) ``` ## Related Documentation - [WDiv](./w-div.md): the container `WCard` delegates all rendering to. - [WindRecipe](../styling/wind-recipe.md): drive card tone from variant axes without repeating className strings. - [WButton](./w-button.md): commonly used in the `footer` slot.