On this page
Data & status

Description released

The details of one thing as rows of a term and its value — a property and its reading, a setting and the control that changes it — on the platform's description list.

  • Import@pacit/components/description
  • Selectorsdl[pctDescriptionList], div[pctDescription]

Semantics come from the native <dl> — no role and no keyboard handling of ours

Supply
21.4 °C
Mode
Heating

description.demo.ts — the same file runs here and is highlighted under Code

Start here

Usage

One import per component, and the shortest possible use — the package itself is installed once, on the start page.

Import this component
import { PctDescriptionList, PctDescription } from '@pacit/components/description';
ExportedWhat it is
PctDescriptionListcomponentunreleaseddl[pctDescriptionList]A description list: the details of one thing as terms and their values — a property and its reading, a setting and its control.
PctDescriptioncomponentunreleaseddiv[pctDescription]One pair of the list: the term, its value, and a control that changes the value when the thing can be changed. The host is the <div> a <dl> may group a pair in; the <dt> and the <dd>s are this component's own.
<dl pctDescriptionList>
  <div pctDescription>
    <span pctDescriptionTerm>Supply temperature</span>
    21.4 °C
  </div>
</dl>
Examples

Every state, running

Each example is the component itself, not a screenshot. Open the code under any of them.

A pair with a control, the control named by its term through termId.

Supply temperature
21.4 °C
Heating
On
API

What it reads, and what it writes back

Read from the source at build time — the types, the defaults and the lines of documentation are the library's own.

unreleased marks 2 of them: on main, and not in @pacit/components@0.2.0 — the next release names the version.

A description list: the details of one thing as terms and their values — a property and its reading, a setting and its control.

Inputs

NameTypeWhat it does
No inputs — the element is configured by its content.

Outputs

None of its own. The native events — (click), (focus), the form's submit — are the platform's, and two-way models above carry the rest.

What it writes on the element

The hooks a stylesheet or a test can hold. Stable by contract — the parts inventory gate fails the build when one disappears.

AttributeBound toNote
classpct-description-list
Styling

Parts to select, tokens to override

Two ways in, both stable. No class names to depend on.

Parts

In a test, PctDescriptionListHarness, PctDescriptionHarness from @pacit/components/testing read a part by the name below and a state by its attribute — the harness gate holds the names to the package.

PartSelectorWhat it is
control[data-pct-part="control"]the <dd> of the control, empty and hidden when none
term[data-pct-part="term"]the <dt> of the pair
value[data-pct-part="value"]the <dd> of the value

Tokens

Every value the component reads, with the light and the dark default. Override a token at any scope and it cascades like any custom property.

TokenStyles
--pct-description-border{pct.border}#e2e8f0 · #334155Colour of the line between rows.
--pct-description-fg{pct.text}#0f172a · #ffffffText colour of a value.
--pct-description-gap{pct.space.5}16pxGap between the term, the value and the control of a row.
--pct-description-min-width8remThe narrowest a value stands beside its term before it wraps under it.
--pct-description-padding-y{pct.space.3}8pxBlock padding of a row.
--pct-description-term-fg{pct.text-muted}#334155 · #e2e8f0Text colour of a term.
--pct-description-term-width12remWidth of a term while the row holds it.

Theming

A brand override in a few declarations. Scope it to a theme attribute, a page or one container — the component never notices.

[data-theme='brand'] {
  --pct-description-term-fg: #115e59;
  --pct-description-term-width: 16rem;
}
Supply
21.4 °C
Mode
Heating
Accessibility

Measured, not assumed

Pattern: a native <dl> — the platform's term and definition roles, which the pair writes as <dt> and <dd> itself. Named in the class JSDoc.

Keyboard

keyeffecttest

Empty by design: the list handles no key; a control in a pair answers the keyboard on its own, as its own card says.

What is measured, and what is not yet

Every line is a test in three engines or a gate on every commit. The gaps are listed the same way, each with the requirement that will close it.

MeasuredARIA pattern named in the class JSDoclibs/components/description/src/description.ts
n/aKeyboard map tested key by keynot applicable — no handler; the control in a pair is the consumer's
Measuredaxe audit on the component's own sandbox viewapps/sandbox-e2e/src/a11y.spec.ts — /frame in SBX_ROUTES
MeasuredVisual screenshotapps/sandbox-e2e/src/visual.spec.ts — frame-app and frame-app-rtl
Measuredforced-colors: active — no state carried by colour alonelibs/components/description/src/description.scss — the line between rows CanvasText; the list has no state. The reading: apps/sandbox-e2e/src/forced-colors.spec.ts
n/aprefers-reduced-motion — duration from a tokennot applicable — the list moves nothing
n/aTouch target ≥ 24×24 px outrightnot applicable — the list's targets are the consumer's controls
MeasuredSize axis aligned to --pct-control-height-*deliberately not: a row is text, sized by its content and the spacing scale
MeasuredDensity axislibs/tokens/src/component.description.json — the padding and the gap stand on space.3 and space.5, which the compact scope re-points
MeasuredRTL — no physical properties + a dir="rtl" screenshotlogical properties only, held by check-styles; the screenshot frame-app-rtl, where the term stands at the right
MeasuredSSR + hydration with no NG05xxapps/sandbox-e2e/src/hydration.spec.ts — /frame in SBX_ROUTES
n/aFormsnot applicable — the list holds no value; a control in it carries its own form contract
MeasuredParts registered in the inventorylibs/components/parts.snapshot.md — the three parts above
MeasuredTokens registered + an entry in contrast.policy.jsonlibs/tokens/src/contrast.policy.json — the value and the term (AA error), the line between rows (UI warn); libs/tokens/tokens.snapshot.md
n/aStrings through PCT_TEXTSnot applicable — the component writes no word of its own
MeasuredEntrypoint size budgetlibs/components/size.snapshot.md — the ./description row
MeasuredScreen-reader logRead 2026-11-02 from docs/acr/at/ — three readers, whole sandbox. The list and the control named by its term: Orca, tabbing from the navigation to the switch, leaving list. · leaving navigation. · Description list with 3 terms · Heating · switch pressed. — the count of terms, and the term as the switch's name. NVDA said list alone on the same switch, neither its name nor its role, which is for the next walk to measure against a switch outside a <dl>. VoiceOver lost the page before the list
MeasuredA docs page with live examplesapps/sandbox/src/app/views/frame/ (the sandbox view). The published site: /components/description, its demos' source in the code tab
MeasuredUnit + mutationlibs/components/description/src/description.spec.ts; libs/components/mutation.snapshot.md — description.ts, measured by a narrow run
Evidence

What the repository holds for this component

Read at build time from the tracked snapshots, not typed here.

91.67%mutation score11 of 12 mutants killed
—e2e casescovered by the shared suites only
3colour pairs measuredlight and dark, at every token build
0visual baselinesChromium, the sandbox's own pictures
11elements in the preview0 listeners · 1 render to settle · 2347 µs in jsdom, held exactly but for the clock

Known limitations

  • One value per term. HTML allows several <dd> for one <dt>; the pair writes one value and one control. Two values are one value of the consumer's two lines.
  • The terms line up by a width, not a column. --pct-description-term-width is the term's basis: a term longer than it wraps inside its own width rather than widening every row.
  • The control's name is the consumer's binding. termId has to be passed to the control's ariaLabelledby; a control without a name is a control the axe audit finds, not this list.
  • NVDA said list alone on the switch in a pair. In the walk of 2026-11-02 NVDA with Firefox read the control named by termId as the list it stands in, with no name and no role, where Orca reads Heating · switch pressed.. The axe audit and the e2e both find the switch named Heating.
  • A pair outside a <dl> warns in dev mode, and draws a <dt> the platform reads as no term at all.