Descriptions
Display key-value pairs in a structured, readable format.
Import
Section titled “Import”import { Descriptions } from 'asterui'Examples
Section titled “Examples”Basic Descriptions
Simple key-value display.
| Name | John Doe | john@example.com | Phone | +1 234 567 890 | |
|---|---|---|---|---|---|
| Location | San Francisco, CA | Status | Active |
import { Descriptions } from 'asterui'
function App() {
const items = [
{ key: 'name', label: 'Name', children: 'John Doe' },
{ key: 'email', label: 'Email', children: 'john@example.com' },
{ key: 'phone', label: 'Phone', children: '+1 234 567 890' },
{ key: 'location', label: 'Location', children: 'San Francisco, CA' },
{ key: 'status', label: 'Status', children: 'Active' },
]
return (
<Descriptions items={items} />
)
}
export default App Bordered
Descriptions with borders.
Order Details
| Product | AsterUI Pro | Price | $99.00 | Quantity | 2 |
|---|---|---|---|---|---|
| Total | $198.00 |
import { Descriptions } from 'asterui'
function App() {
const items = [
{ key: 'product', label: 'Product', children: 'AsterUI Pro' },
{ key: 'price', label: 'Price', children: '$99.00' },
{ key: 'quantity', label: 'Quantity', children: '2' },
{ key: 'total', label: 'Total', children: '$198.00' },
]
return (
<Descriptions items={items} bordered title="Order Details" />
)
}
export default App Sizes
Different size variants.
Small
| Name | Jane Smith | Role | Engineer | Team | Frontend |
|---|
Medium
| Name | Jane Smith | Role | Engineer | Team | Frontend |
|---|
Large
| Name | Jane Smith | Role | Engineer | Team | Frontend |
|---|
import { Descriptions, Space } from 'asterui'
function App() {
const items = [
{ key: 'name', label: 'Name', children: 'Jane Smith' },
{ key: 'role', label: 'Role', children: 'Engineer' },
{ key: 'team', label: 'Team', children: 'Frontend' },
]
return (
<Space direction="vertical" size="lg" className="w-full">
<Descriptions items={items} size="sm" bordered title="Small" />
<Descriptions items={items} size="md" bordered title="Medium" />
<Descriptions items={items} size="lg" bordered title="Large" />
</Space>
)
}
export default App Title with Extra
Title and extra content in the header.
User Profile
| Name | John Doe | john@example.com | Status | Active |
|---|
import { Descriptions, Button, Badge } from 'asterui'
function App() {
const items = [
{ key: 'name', label: 'Name', children: 'John Doe' },
{ key: 'email', label: 'Email', children: 'john@example.com' },
{ key: 'status', label: 'Status', children: <Badge color="success">Active</Badge> },
]
return (
<Descriptions
items={items}
bordered
title="User Profile"
extra={<Button size="sm">Edit</Button>}
/>
)
}
export default App Vertical Layout
Vertical label and content layout.
| Created | Updated | Author |
|---|---|---|
| 2024-01-15 10:30:00 | 2024-01-20 14:45:00 | Jane Smith |
import { Descriptions } from 'asterui'
function App() {
const items = [
{ key: 'created', label: 'Created', children: '2024-01-15 10:30:00' },
{ key: 'updated', label: 'Updated', children: '2024-01-20 14:45:00' },
{ key: 'author', label: 'Author', children: 'Jane Smith' },
]
return (
<Descriptions items={items} layout="vertical" bordered />
)
}
export default App Custom Columns
Control the number of columns.
| Name | Alice Johnson | Age | 28 |
|---|---|---|---|
| Gender | Female | Occupation | Software Engineer |
| Department | Engineering | Start Date | 2022-03-15 |
import { Descriptions } from 'asterui'
function App() {
const items = [
{ key: 'name', label: 'Name', children: 'Alice Johnson' },
{ key: 'age', label: 'Age', children: '28' },
{ key: 'gender', label: 'Gender', children: 'Female' },
{ key: 'occupation', label: 'Occupation', children: 'Software Engineer' },
{ key: 'department', label: 'Department', children: 'Engineering' },
{ key: 'start-date', label: 'Start Date', children: '2022-03-15' },
]
return (
<Descriptions items={items} column={2} bordered />
)
}
export default App Responsive Columns
Columns adjust based on viewport width.
Resize window to see columns change
| Field 1 | Value 1 | Field 2 | Value 2 | Field 3 | Value 3 |
|---|---|---|---|---|---|
| Field 4 | Value 4 | Field 5 | Value 5 | Field 6 | Value 6 |
import { Descriptions } from 'asterui'
function App() {
const items = [
{ key: 'field1', label: 'Field 1', children: 'Value 1' },
{ key: 'field2', label: 'Field 2', children: 'Value 2' },
{ key: 'field3', label: 'Field 3', children: 'Value 3' },
{ key: 'field4', label: 'Field 4', children: 'Value 4' },
{ key: 'field5', label: 'Field 5', children: 'Value 5' },
{ key: 'field6', label: 'Field 6', children: 'Value 6' },
]
return (
<Descriptions
items={items}
bordered
column={{ xs: 1, sm: 2, md: 3, lg: 4 }}
title="Resize window to see columns change"
/>
)
}
export default App With Column Span
Items spanning multiple columns.
| Name | Product X | SKU | PRD-12345 | Category | Electronics |
|---|---|---|---|---|---|
| Description | A detailed product description that spans multiple columns for better readability. | ||||
import { Descriptions } from 'asterui'
function App() {
const items = [
{ key: 'name', label: 'Name', children: 'Product X' },
{ key: 'sku', label: 'SKU', children: 'PRD-12345' },
{ key: 'category', label: 'Category', children: 'Electronics' },
{ key: 'description', label: 'Description', children: 'A detailed product description that spans multiple columns for better readability.', span: 3 },
]
return (
<Descriptions items={items} bordered />
)
}
export default App Filled Span
Items that fill the remaining row space.
| Name | John Doe | Notes | This field fills the remaining space in the row. | ||
|---|---|---|---|---|---|
| john@example.com | Phone | +1 234 567 890 | Address | 123 Main St, San Francisco, CA 94102 | |
import { Descriptions } from 'asterui'
function App() {
const items = [
{ key: 'name', label: 'Name', children: 'John Doe' },
{ key: 'notes', label: 'Notes', children: 'This field fills the remaining space in the row.', span: 'filled' as const },
{ key: 'email', label: 'Email', children: 'john@example.com' },
{ key: 'phone', label: 'Phone', children: '+1 234 567 890' },
{ key: 'address', label: 'Address', children: '123 Main St, San Francisco, CA 94102', span: 'filled' as const },
]
return (
<Descriptions items={items} bordered />
)
}
export default App No Colon
Hide the colon after labels.
| Field One | Value One | Field Two | Value Two | Field Three | Value Three |
|---|
import { Descriptions } from 'asterui'
function App() {
const items = [
{ key: 'field1', label: 'Field One', children: 'Value One' },
{ key: 'field2', label: 'Field Two', children: 'Value Two' },
{ key: 'field3', label: 'Field Three', children: 'Value Three' },
]
return (
<Descriptions items={items} colon={false} bordered />
)
}
export default App Custom Styles
Apply custom styles and classes to semantic parts.
Custom Styled
| Name | Jane Doe | Highlighted | This item has custom styles | Status | Active |
|---|
import { Descriptions } from 'asterui'
function App() {
const items = [
{ key: 'name', label: 'Name', children: 'Jane Doe' },
{ key: 'highlight', label: 'Highlighted', children: 'This item has custom styles', labelClassName: 'text-primary', contentClassName: 'text-accent font-bold' },
{ key: 'status', label: 'Status', children: 'Active' },
]
return (
<Descriptions
items={items}
bordered
styles={{
label: { backgroundColor: 'oklch(var(--b2))' },
content: { backgroundColor: 'oklch(var(--b1))' },
}}
classNames={{
title: 'text-primary',
}}
title="Custom Styled"
/>
)
}
export default App Compound Pattern
Use Descriptions.Item children instead of items prop.
Using Compound Pattern
| Name | John Doe | john@example.com | Phone | +1 234 567 890 | |
|---|---|---|---|---|---|
| Address | 123 Main Street, San Francisco, CA 94102 | ||||
import { Descriptions } from 'asterui'
function App() {
const { Item } = Descriptions
return (
<Descriptions bordered title="Using Compound Pattern">
<Item key="name" label="Name">John Doe</Item>
<Item key="email" label="Email">john@example.com</Item>
<Item key="phone" label="Phone">+1 234 567 890</Item>
<Item key="address" label="Address" span={3}>
123 Main Street, San Francisco, CA 94102
</Item>
</Descriptions>
)
}
export default App Descriptions
Section titled “Descriptions”| Property | Description | Type | Default |
|---|---|---|---|
items | Description items (alternative to children) | DescriptionsItemConfig[] | - |
title | Title of the descriptions block | React.ReactNode | - |
extra | Extra content in the top-right corner | React.ReactNode | - |
column | Number of columns (or responsive config) | number | { xs?, sm?, md?, lg?, xl?, 2xl? } | 3 |
bordered | Show borders around cells | boolean | false |
layout | Layout direction | 'horizontal' | 'vertical' | 'horizontal' |
size | Size variant | 'sm' | 'md' | 'lg' | 'md' |
colon | Show colon after labels | boolean | true |
styles | Semantic styles for component parts | Partial<Record<SemanticDOM, CSSProperties>> | - |
classNames | Semantic classNames for component parts | Partial<Record<SemanticDOM, string>> | - |
labelStyle | Default label styles (deprecated, use styles.label) | React.CSSProperties | - |
contentStyle | Default content styles (deprecated, use styles.content) | React.CSSProperties | - |
className | Additional CSS classes | string | - |
style | Inline styles for root element | React.CSSProperties | - |
data-testid | Test ID for the component | string | 'descriptions' |
DescriptionsItemConfig
Section titled “DescriptionsItemConfig”| Property | Description | Type | Default |
|---|---|---|---|
key | Unique key for the item (used for test IDs and React keys) | string | - |
label | Label for the item | React.ReactNode | - |
children | Content of the item | React.ReactNode | - |
span | Number of columns to span, or ‘filled’ to fill remaining space | number | 'filled' | 1 |
labelStyle | Custom label styles | React.CSSProperties | - |
contentStyle | Custom content styles | React.CSSProperties | - |
labelClassName | Custom label class | string | - |
contentClassName | Custom content class | string | - |
Descriptions.Item (compound)
Section titled “Descriptions.Item (compound)”| Property | Description | Type | Default |
|---|---|---|---|
key | React key, extracted by parent | string | - |
itemKey | Explicit key (alternative to React key) | string | - |
label | Label for the item | React.ReactNode | - |
children | Content of the item | React.ReactNode | - |
span | Number of columns to span, or ‘filled’ | number | 'filled' | 1 |
labelStyle | Custom label styles | React.CSSProperties | - |
contentStyle | Custom content styles | React.CSSProperties | - |
labelClassName | Custom label class | string | - |
contentClassName | Custom content class | string | - |
SemanticDOM keys
Section titled “SemanticDOM keys”| Property | Description | Type |
|---|---|---|
root | Root container element | - |
header | Header containing title and extra | - |
title | Title element | - |
extra | Extra content element | - |
table | Table element | - |
label | Label cells (th elements) | - |
content | Content cells (td elements) | - |
Accessibility
Section titled “Accessibility”- Uses semantic
<table>markup for proper structure - Header cells use
scopeattribute for screen readers - Table has
<caption>element (visually hidden) when title is provided - Content cells have
aria-labelledbylinking to their labels - Colons after labels are marked with
aria-hiddento avoid redundant announcements