Description list
Description list shows label and value pairs describing a single object, such as the specifications of a product or the details of an order.
- Name
- Single lever basin mixer
- Reference
- GRO-MC-001-CHR
- Finishes
- Chrome, brushed nickel
- Supplier
- Grohe
When to use
Reach for a description list to show the properties of one object, where each value is read with its label: a product's specifications, an order's details, a profile's contact information. To compare several objects across the same properties, use a table instead.
Install & usage
Pick a framework in the toolbar above and these snippets adapt.
npm install @eunomia/elements
import "@eunomia/elements/description-list.js";
<eun-description-list>
<dl>
<dt>Name</dt>
<dd>Single lever basin mixer</dd>
<dt>Reference</dt>
<dd>GRO-MC-001-CHR</dd>
</dl>
</eun-description-list>
Importing the file registers <eun-description-list> as a custom element,
with no further setup needed. It works with any framework, or none, since
it's a standard web component.
npm install @eunomia/elements
<script type="module">
import "@eunomia/elements/description-list.js";
</script>
<eun-description-list>
<dl>
<dt>Name</dt>
<dd>Single lever basin mixer</dd>
<dt>Reference</dt>
<dd>GRO-MC-001-CHR</dd>
</dl>
</eun-description-list>
npm install @eunomia/elements
import "@eunomia/elements/description-list.js";
function ProductDetails({ product }) {
return (
<eun-description-list>
<dl>
<dt>Name</dt>
<dd>{product.name}</dd>
<dt>Reference</dt>
<dd>{product.reference}</dd>
</dl>
</eun-description-list>
);
}
npm install @eunomia/elements
"use client";
import "@eunomia/elements/description-list.js";
export function ProductDetails({ product }) {
return (
<eun-description-list>
<dl>
<dt>Name</dt>
<dd>{product.name}</dd>
<dt>Reference</dt>
<dd>{product.reference}</dd>
</dl>
</eun-description-list>
);
}
npm install @eunomia/elements
<script setup>
import "@eunomia/elements/description-list.js";
defineProps(["product"]);
</script>
<template>
<eun-description-list>
<dl>
<dt>Name</dt>
<dd>{{ product.name }}</dd>
<dt>Reference</dt>
<dd>{{ product.reference }}</dd>
</dl>
</eun-description-list>
</template>
npm install @eunomia/elements
import { CUSTOM_ELEMENTS_SCHEMA, Component, input } from "@angular/core";
import "@eunomia/elements/description-list.js";
@Component({
selector: "app-product-details",
template: `
<eun-description-list>
<dl>
<dt>Name</dt>
<dd>{{ product().name }}</dd>
<dt>Reference</dt>
<dd>{{ product().reference }}</dd>
</dl>
</eun-description-list>
`,
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class ProductDetailsComponent {
product = input.required<{ name: string; reference: string }>();
}
Server rendering
eun-description-list has no shadow root: one stylesheet holds its whole
style. Link description-list-ssr.css to have a server-rendered list look
final before the component loads.
<link
rel="stylesheet"
href="node_modules/@eunomia/elements/dist/ssr/description-list-ssr.css"
/>
import "@eunomia/elements/description-list-ssr.css";
Responsive behavior
Below 600px, the label moves above its value, since a narrow screen
leaves too little room for both on one line, and the pairs fill a single
column whatever columns is set to.
Alternatives
| You want… | Prefers |
|---|---|
| Several objects compared across the same properties | eun-table |
Guidance
- Write a short label in each
<dt>and put everything that belongs to it in the<dd>, links and tags included - Give a label with several values one
<dd>per value, rather than joining them with commas - Wrap each pair in a
<div>when you needcolumns, or a hook to style one pair - Place a heading right above the list when the page holds several
- Using a description list to compare several objects: each would repeat every label, where a table names them once in its header
- Leaving a
<dd>without its<dt>, or placing anything other than<dt>,<dd>or a wrapping<div>directly in the<dl> - Adding a
roleto the<dl>, its terms or its values: it would override the native semantics
Live testing
Properties
Description list <eun-description-list>
Attributes
| Name | Type | Default | Description |
|---|---|---|---|
| layout | EunomiaDescriptionListLayout | 'inline' | Places each label beside its value (`inline`), or above it (`stacked`) |
| align | EunomiaDescriptionListAlign | 'start' | Aligns the text of the labels and values to the start, the center, or the end ; `space-between` keeps each label at the start and pushes its value to the end, when beside it |
| columns | number | 1 | Lays the pairs out in up to 4 columns, from the `mobile` breakpoint up ; each pair must be wrapped in a `<div>` |
| divided | boolean | false | Draws a divider between two pairs, never above the first row |
Import the exact TypeScript type behind any property above, see
Slots
| Name | Description |
|---|---|
| (default) | A native `<dl>`, holding `<dt>`/`<dd>` pairs, each optionally wrapped in a `<div>` |
CSS custom properties
| Name | Description |
|---|---|
| --description-list-font-size | Sets the font size of the list |
| --description-list-label-color | Sets the color of the labels |
| --description-list-label-font-weight | Sets the font weight of the labels |
| --description-list-value-color | Sets the color of the values |
| --description-list-label-width | Sets the width of the label column when the label sits beside its value ; sized to the longest label, up to 40%, by default |
| --description-list-row-gap | Sets the space between two pairs |
| --description-list-column-gap | Sets the space between a label and the value beside it, and between two columns |
| --description-list-label-gap | Sets the space between a label and the value below it |
| --description-list-divider-color | Sets the color of the dividers drawn by `divided` |
Markup conventions
Place a native <dl> directly inside <eun-description-list>. Each pair
is a <dt> holding the label, followed by one or more <dd> holding its
values. HTML also allows wrapping each pair in a <div>, which
columns requires.
<eun-description-list>
<dl>
<dt>Label</dt>
<dd>Value</dd>
</dl>
</eun-description-list>
Layout
Inline
The default layout. Each label sits beside its value, in a column sized
to the longest label, up to 40% of the list's width.
- Name
- Single lever basin mixer
- Reference
- GRO-MC-001-CHR
- Last updated
- October 9, 2026
<eun-description-list>
<dl>
<dt>Name</dt>
<dd>Single lever basin mixer</dd>
<dt>Reference</dt>
<dd>GRO-MC-001-CHR</dd>
<dt>Last updated</dt>
<dd>October 9, 2026</dd>
</dl>
</eun-description-list>
Stacked
layout="stacked" places each label above its value, which suits long
values or a narrow container.
- Delivery address
- 12 avenue Jean Jaurès, 30100 Alès
- Instructions
- Leave the parcel at the store counter if nobody answers.
<eun-description-list layout="stacked">
<dl>
<dt>Delivery address</dt>
<dd>12 avenue Jean Jaurès, 30100 Alès</dd>
<dt>Instructions</dt>
<dd>Leave the parcel at the store counter if nobody answers.</dd>
</dl>
</eun-description-list>
Columns
columns lays the pairs out in up to 4 columns from 600px up, each pair
wrapped in a <div>. Below 600px, they fill a single column. With
divided, a line runs between two rows, never above the first one.
- Storage
- 150 m²
- Items in stock
- 3,000+
- Showroom
- Bathroom and sanitary ware
- After-sales
- Spare parts available
<eun-description-list columns="2" layout="stacked" divided>
<dl>
<div>
<dt>Storage</dt>
<dd>150 m²</dd>
</div>
<div>
<dt>Items in stock</dt>
<dd>3,000+</dd>
</div>
<div>
<dt>Showroom</dt>
<dd>Bathroom and sanitary ware</dd>
</div>
<div>
<dt>After-sales</dt>
<dd>Spare parts available</dd>
</div>
</dl>
</eun-description-list>
Alignment
align aligns the text of the labels and values: start by default,
center, or end. align="space-between" keeps each label at the start
and pushes its value to the end, when the label sits beside it.
- Subtotal
- €220.00
- Shipping
- €28.90
- Total
- €248.90
<eun-description-list align="space-between" divided>
<dl>
<dt>Subtotal</dt>
<dd>€220.00</dd>
<dt>Shipping</dt>
<dd>€28.90</dd>
<dt>Total</dt>
<dd>€248.90</dd>
</dl>
</eun-description-list>
align="center" suits key figures laid out in columns.
- Storage
- 150 m²
- Items in stock
- 3,000+
- Founded
- 1978
<eun-description-list columns="3" layout="stacked" align="center">
<dl>
<div>
<dt>Storage</dt>
<dd>150 m²</dd>
</div>
<div>
<dt>Items in stock</dt>
<dd>3,000+</dd>
</div>
<div>
<dt>Founded</dt>
<dd>1978</dd>
</div>
</dl>
</eun-description-list>
Divided
divided draws a line between two pairs.
- Order
- #20461
- Status
- Shipped
- Total
- €248.90
<eun-description-list divided>
<dl>
<dt>Order</dt>
<dd>#20461</dd>
<dt>Status</dt>
<dd>Shipped</dd>
<dt>Total</dt>
<dd>€248.90</dd>
</dl>
</eun-description-list>
Several values
A label followed by several <dd> lists each value on its own line. A
value holds any content, such as a link or a tag.
- Finishes
Chrome Brushed nickel - Data sheets
Installation guide Spare parts
<eun-description-list>
<dl>
<dt>Finishes</dt>
<dd><eun-tag size="s">Chrome</eun-tag></dd>
<dd><eun-tag size="s">Brushed nickel</eun-tag></dd>
<dt>Data sheets</dt>
<dd><eun-link href="/guide.pdf">Installation guide</eun-link></dd>
<dd><eun-link href="/parts.pdf">Spare parts</eun-link></dd>
</dl>
</eun-description-list>
Custom appearance
Every color, size, and space is a CSS custom property, listed in the API tab.
- Diameter
- 1/2"
- Flow
- 12 L/min at 3 bar
eun-description-list {
--description-list-label-width: 10rem;
--description-list-label-font-weight: 600;
--description-list-label-color: var(--eun-color-primary-500);
--description-list-row-gap: 0.5rem;
}
| Variable | Sets |
|---|---|
--description-list-label-color |
Sets the color of the labels |
--description-list-value-color |
Sets the color of the values |
--description-list-divider-color |
Sets the color of the dividers drawn by divided |
--description-list-label-font-weight |
Sets the font weight of the labels |
A class on your own <dt> or <dd> overrides the list's rules too, since
they stay at a low specificity.
Native semantics
eun-description-list has no shadow root, no item component and no ARIA
role of its own: assistive technology meets the native <dl>, its terms
and its definitions, exactly as authored. Most screen readers announce it
as a list, and read each value right after its label. A <div> wrapping
a pair adds nothing to the accessibility tree.
The layout only changes how the pairs look. The reading order stays the
order of the markup, a label always before its values, whatever layout
or columns is set.
Naming the list
A description list has no accessible name, and an aria-label on the
<dl> isn't reliably announced. When a page holds several, place a
heading right above each one, which screen reader users can also jump to:
<h2>Specifications</h2>
<eun-description-list>
<dl>
<dt>Reference</dt>
<dd>GRO-MC-001-CHR</dd>
</dl>
</eun-description-list>
Non-focusable
The list itself isn't focusable. Links and buttons placed in a value stay in the tab order, in the order of the markup.
Reference links
<dl> element