Label/value pairs for record details and summaries — a native <dl>. Horizontal, vertical or grid layouts that follow the container width, locale formatting for numbers and dates, copy buttons and click-to-edit values.
Northwind renewal
Deal details
- Owner
- Ayşe Kaya
- Company
- Northwind Traders
- Deal value
- $48,500.00
- Probability
- 65%
- Expected close
- Dec 15, 2026Moved from Nov 30 by Ayşe
- Lead source
- Not set
Installation
The whole kit as one package — get updates by bumping the version. Add the styles to globals.css: @import "@vamos-ui/react/styles.css";
Usage
import { DescriptionList } from "@vamos-ui/react";
<DescriptionList items={[
{ key: "owner", label: "Owner", value: "Ayşe Kaya" },
{ key: "value", label: "Deal value", value: "48500.00", format: "currency" },
{ key: "iban", label: "IBAN", value: "TR33 0006 1005 1978 6457 8413 26", copyable: true },
]} />Examples
Grid with spans (HR)
layout="grid" with columns; span: 2 or "full" for long values. Columns drop on narrow containers.
Ece Demir
Employee · Studio team
- Job title
- Senior product designer
- Manager
- Meltem Aydın
- Start date
- Mar 6, 2023
- Location
- Istanbul · hybrid
- Contract
- Full-time, permanent
- Leave balance
- 11 days
- Notes
- In the office Tuesdays and Thursdays. Mentoring two junior designers since September.
Copyable values
copyable copies the text value, or the string you pass (IBAN without spaces). Confirmed visually and announced.
Payment details
Share these with the client for a bank transfer.
- Account holder
- Vamos Dijital Ltd.
- IBAN
- TR33 0006 1005 1978 6457 8413 26
- SWIFT
- TGBATRIS
- Reference
- INV-2041Ask the client to include it in the transfer note.
Inline edit
editable rows + onEdit. The value is a button ("Edit Phone"); Enter saves, Escape cancels; a rejected promise shows the error.
Burak Şen
Click a value to edit · Enter saves · Escape cancels
- Company
- Kadıköy Bistro
- Phone
- Website
Sections (CMS)
DescriptionGroup titles a section and names it as a region.
Post
- Status
- Scheduled
- Publish on
- Nov 11, 2026, 6:00 AM
- Author
- Meltem Aydın
SEO
How the post appears in search results.
- Slug
- google-business-profile-guide
- Meta title
- How to stand out on Google Business Profile
- Word count
- 1,840
- Canonical URL
- Not set
Loading, vertical, empty values
loading renders label + value skeletons; empty values show — (or emptyValue) and read "Not set".
Order #10482
Loading
Order #10482
Vertical layout, custom empty value
- Customer
- İlker Şahin
- Total
- $1,249.90
- Coupon
- Not provided
API
DescriptionList
| Prop | Type | Default |
|---|---|---|
itemsRows as data — or compose DescriptionItem children. | DescriptionEntry[] | — |
layoutHorizontal stacks under ~28rem of container width. | "horizontal" | "vertical" | "grid" | "horizontal" |
columnsGrid columns (container queries). | 1 | 2 | 3 | 2 |
labelWidthLabel column width (horizontal). | string | "11rem" |
dividedHairlines between rows. | boolean | true (horizontal) |
sizeText size and row spacing. | "sm" | "md" | "md" |
emptyValueShown for empty values. | ReactNode | "—" |
onEditSaves editable rows; reject to show the error. | (key: string, value: string) => void | Promise<void> | — |
loadingSkeleton rows (default 4). | boolean | number | — |
labelscopy, copied, edit, save, cancel, saving, error, empty. | Partial<DescriptionListLabels> | — |
DescriptionEntry
| Prop | Type | Default |
|---|---|---|
keyStable key, passed to onEdit. | string | — |
label / valueThe pair. | ReactNode | — |
format"number" | "currency" | "compact" | "percent" | "date" | "datetime" | "relative" | … | ValueFormat | — |
hintHelp text under the value. | ReactNode | — |
copyableCopy button. | boolean | string | — |
spanGrid span. | 1 | 2 | "full" | — |
editable / editValue / inputTypeInline edit. | boolean / string / input type | — |
DescriptionItem
| Prop | Type | Default |
|---|---|---|
labelThe dt. | ReactNode | — |
childrenThe value. | ReactNode | — |
copyableCopy button. | boolean | string | — |
editInline edit slot (e.g. DescriptionEditable). | ReactNode | — |
actionTrailing slot (link, badge). | ReactNode | — |
hint / span / emptyValueAs in DescriptionEntry. | … | — |
DescriptionEditable
| Prop | Type | Default |
|---|---|---|
valueCurrent value. | string | — |
onSaveSave handler. | (value: string) => void | Promise<void> | — |
labelField name for accessible names. | string | — |
displayFormatted read view. | ReactNode | — |
inputTypeInput type. | "text" | "email" | "tel" | "url" | "number" | "text" |
DescriptionGroup
| Prop | Type | Default |
|---|---|---|
titleSection heading (names the region). | ReactNode | — |
descriptionSecondary line. | ReactNode | — |
titleAsHeading level. | "h2" | "h3" | "h4" | "h5" | "h4" |
actionSlot at the end of the heading row. | ReactNode | — |