UNPKG

laif-ds

Version:

Design System di Laif con componenti React basati su principi di Atomic Design

148 lines (118 loc) 4.54 kB
# Card ## Overview Composable container with header, content, footer, and optional action area. Supports size variants that control internal padding and spacing. --- ## Props ### Card (Root) | Prop | Type | Default | Description | | ----------- | ----------------------------- | ----------- | -------------------------------------------- | | `size` | `"default" | "sm" | "lg" | "none"` | `"default"` | Controls internal padding and spacing. | | `className` | `string` | `""` | Additional classes for layout and width. | | `children` | `React.ReactNode` | **required**| Compose with subcomponents below. | ### Subcomponents - `CardHeader`: Top section, usually with `CardTitle`, `CardDescription`, and optional `CardAction`. - `CardTitle`: Title text area. - `CardDescription`: Secondary text under the title. - `CardAction`: Right-aligned area inside the header for buttons/menus. - `CardContent`: Main content area. - `CardFooter`: Bottom area for actions or summaries. --- ## Behavior - **Size variants**: `sm`, `default`, `lg`, `none` change vertical padding and gaps. - **Header/Footer borders**: Apply border utilities on header/footer to create separators. - **Layout**: Use `className` for width and responsive behavior. --- ## Examples ### Basic ```tsx import { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from "laif-ds"; import { Button } from "laif-ds"; export function BasicCard() { return ( <Card className="w-[350px]"> <CardHeader> <CardTitle>Card Title</CardTitle> <CardDescription>Card description goes here</CardDescription> </CardHeader> <CardContent> <p>This is the main content of the card. You can put any content here.</p> </CardContent> <CardFooter> <Button>Action</Button> </CardFooter> </Card> ); } ``` ### With Action ```tsx import { Card, CardHeader, CardTitle, CardDescription, CardAction, CardContent } from "laif-ds"; import { Button } from "laif-ds"; export function CardWithAction() { return ( <Card className="w-[350px]"> <CardHeader> <CardTitle>Card with Action</CardTitle> <CardDescription>Card with an action button in the header</CardDescription> <CardAction> <Button variant="ghost" size="icon"></Button> </CardAction> </CardHeader> <CardContent> <p>This card has an action button in the top right corner.</p> </CardContent> </Card> ); } ``` ### Size Variants ```tsx import { Card, CardHeader, CardTitle, CardDescription, CardContent } from "laif-ds"; export function SizeVariants() { return ( <div className="flex flex-col gap-8"> <Card size="sm" className="w-[350px]"> <CardHeader> <CardTitle>Size: Small</CardTitle> <CardDescription>Reduced padding (sm)</CardDescription> </CardHeader> <CardContent> <p>This card uses size="sm".</p> </CardContent> </Card> <Card size="default" className="w-[350px]"> <CardHeader> <CardTitle>Size: Default</CardTitle> <CardDescription>Standard padding (default)</CardDescription> </CardHeader> <CardContent> <p>This card uses size="default".</p> </CardContent> </Card> <Card size="lg" className="w-[350px]"> <CardHeader> <CardTitle>Size: Large</CardTitle> <CardDescription>Spacious padding (lg)</CardDescription> </CardHeader> <CardContent> <p>This card uses size="lg".</p> </CardContent> </Card> <Card size="none" className="w-[350px]"> <CardHeader className="border-d-border border-b p-4"> <CardTitle>Size: None</CardTitle> <CardDescription>No default padding (none)</CardDescription> </CardHeader> <CardContent className="p-4"> <p>This card uses size="none" with custom padding.</p> </CardContent> </Card> </div> ); } ``` --- ## Notes - **Composability**: Use only the subcomponents you need. - **Borders**: Add `border-b`/`border-t` to header/footer for separation. - **Action area**: `CardAction` aligns content to the top-right in the header.