Description List
Semantic key value list for order details, invoices, specifications or account profiles. Default spaces rows on a gap and divided rules a line between them, and long values wrap under their term.
pnpm dlx shadcn add @01orbital/description-listimport type { ComponentProps } from "react"
import { cva, type VariantProps } from "class-variance-authority"
import { cn } from "cn"
// Label and value rows: order details, specifications, account information.
// divided rules a line between rows; default spaces them on a gap.
const descriptionListVariants = cva("group/description-list text-sm/6", {
variants: {
variant: {
default: "grid gap-3",
divided: "divide-y divide-border",
},
},
defaultVariants: { variant: "default" },
})
function DescriptionList({
className,
variant = "default",
...props
}: ComponentProps<"dl"> & VariantProps<typeof descriptionListVariants>) {
return (
<dl
data-slot="description-list"
data-variant={variant}
className={cn(descriptionListVariants({ variant }), className)}
{...props}
/>
)
}
// One term and its details on a line, on a shared baseline; a long value
// wraps under its term. In a divided list the item pads its own row.
function DescriptionListItem({ className, ...props }: ComponentProps<"div">) {
return (
<div
data-slot="description-list-item"
className={cn(
"flex flex-wrap items-baseline justify-between gap-x-4 gap-y-1 group-data-[variant=divided]/description-list:py-3 group-data-[variant=divided]/description-list:first:pt-0 group-data-[variant=divided]/description-list:last:pb-0",
className
)}
{...props}
/>
)
}
function DescriptionListTerm({ className, ...props }: ComponentProps<"dt">) {
return (
<dt
data-slot="description-list-term"
className={cn("text-muted-foreground", className)}
{...props}
/>
)
}
function DescriptionListDetails({ className, ...props }: ComponentProps<"dd">) {
return (
<dd
data-slot="description-list-details"
className={cn(
"flex min-w-0 items-center gap-2 wrap-anywhere text-foreground tabular-nums",
className
)}
{...props}
/>
)
}
export {
DescriptionList,
DescriptionListItem,
DescriptionListTerm,
DescriptionListDetails,
}
import {
DescriptionList,
DescriptionListDetails,
DescriptionListItem,
DescriptionListTerm,
} from "@/components/description-list/description-list"
const ROWS = [
{ term: "Order", value: "ORB-10482" },
{ term: "Placed", value: "November 6, 2026" },
{ term: "Ships to", value: "Megan McArthur, Pasadena" },
{ term: "Total", value: "$184.00" },
] as const
/** A divided Description List: four label and value rows. */
export default function DescriptionListDemo() {
return (
<DescriptionList variant="divided" className="w-full max-w-sm">
{ROWS.map((row) => (
<DescriptionListItem key={row.term}>
<DescriptionListTerm>{row.term}</DescriptionListTerm>
<DescriptionListDetails>{row.value}</DescriptionListDetails>
</DescriptionListItem>
))}
</DescriptionList>
)
}
Usage
import {
DescriptionList,
DescriptionListDetails,
DescriptionListItem,
DescriptionListTerm,
} from "@/components/description-list/description-list"
const ROWS = [
{ term: "Order", value: "ORB-10482" },
{ term: "Placed", value: "November 6, 2026" },
{ term: "Ships to", value: "Megan McArthur, Pasadena" },
{ term: "Total", value: "$184.00" },
] as const
/** A divided Description List: four label and value rows. */
export default function DescriptionListDemo() {
return (
<DescriptionList variant="divided" className="w-full max-w-sm">
{ROWS.map((row) => (
<DescriptionListItem key={row.term}>
<DescriptionListTerm>{row.term}</DescriptionListTerm>
<DescriptionListDetails>{row.value}</DescriptionListDetails>
</DescriptionListItem>
))}
</DescriptionList>
)
}Examples
New
description-list-clinic-appointment
New
description-list-receipt
Anatomy
Description List is built from 4 parts. In the example they nest like this:
DescriptionList
└─ DescriptionListItem
├─ DescriptionListTerm
└─ DescriptionListDetailsAPI reference
DescriptionList
Prop
Type
It also accepts the HTML attributes of the element it renders.
DescriptionListItem
It accepts the HTML attributes of the element it renders.
DescriptionListTerm
It accepts the HTML attributes of the element it renders.
DescriptionListDetails
It accepts the HTML attributes of the element it renders.
Dependencies
npm: class-variance-authority, cn. The CLI installs them for you.
No other registry pieces.