Feature List
A Feature List presents key product attributes or technical details as a run of scannable label / data pairs — the specification block on a product page, the service features of a plan, the rows of a comparison table.
Fuel consumption
43.4 - 45.5 (l/100 km)
Boot capacity
580 LITRES
Seats
5
Usable — may still change
The Feature List is a compact component that presents key product attributes or technical details in a structured, scannable way. It breaks complex information into digestible chunks, keeps dense product contexts readable, and lets people compare several items quickly. Reach for it on product pages, in comparison tables, summaries, and specification sections — anywhere a run of short attributes needs to be skimmed rather than read.
Anatomy
Section titled “Anatomy”-
Fuel consumption
43.4 - 45.5 (l/100 km)
-
Boot capacity
580 LITRES
- Feature list
- Item
- Label
- Data
- Info button
The Feature list is the container that sets the rhythm between rows. Each Item is one attribute, stacking a Label — the muted line that names the attribute — above the Data, the emphasised line that carries the value. An optional Info button can trail either line where the attribute needs a word of explanation; here it sits on the value.
When to use it
Section titled “When to use it”Use a Feature List when:
- You are highlighting several product features that sit at equal hierarchy.
- People benefit from quick scanning rather than deep reading.
- You are presenting technical or semi-technical attributes.
Typical use cases are product specifications (battery, size, material), service features (delivery time, warranty, coverage), and plan comparisons (pricing tiers, included features).
Avoid a Feature List when:
- The content needs long-form explanation or narrative — use body copy instead.
- The content is highly visual, where icons or images carry the meaning better.
- A single attribute stands alone, with nothing to scan against.
Properties
Section titled “Properties”Label
The muted upper line that names the attribute — “Fuel consumption”, “Boot capacity”. It is deliberately quieter than the value so the eye lands on the data first when skimming a column of rows. Keep it short enough to stay on one line.
Data
The emphasised lower line carrying the value itself. This is the line people scan for, so it takes the heavier weight and the stronger foreground colour. Include the unit here rather than in the label.
Info button
An optional icon-only affordance that trails a line where the attribute needs clarifying — a measurement standard, a caveat, a footnote. Either line can carry one, independently, and an item is perfectly complete without any. Use it sparingly: an info button on every row is noise rather than help.
Size
Two sizes are available. The larger size gives the label a bigger, more prominent setting and opens up the space between rows, suiting a standalone specification block. The smaller size tightens both, suiting a dense column or a card. It is the label and the spacing that carry the change; the value’s own typography is set per size and per brand, so check it against the brand you are designing for.
Platform considerations
Section titled “Platform considerations”Desktop
There is room for the larger size, and for two or three lists to sit side by side as columns of a comparison. Keep the labels short enough that each pair stays on two lines, so the rows align across columns.
Tablet
The same layout holds, with fewer columns side by side. Watch the longest label as the column narrows — a label that wraps to two lines breaks the alignment with a neighbouring list.
Mobile
Lists stack rather than sit side by side, and the smaller size usually reads better in the narrower measure. Let long values wrap rather than truncate — a clipped specification is worse than a taller row.
Best practices
Section titled “Best practices”A Feature List earns its place when every row is the same kind of fact, phrased the same way, so the column can be scanned rather than read.
Do
Keep every row to the same shape — one attribute, one value — and phrase the labels consistently. Put the unit with the value. Order the rows by what matters most to the reader. Keep the list to a scannable length, and let long values wrap.
Don't
Don’t mix attributes with sentences, or let one row carry a paragraph. Don’t lean on the label and data colours alone to carry the hierarchy — the wording has to work in isolation too. Don’t attach an info button to every row, and don’t truncate a value that a reader needs in full.
Content guidelines
Section titled “Content guidelines”Write labels as short noun phrases in sentence case, and keep them parallel across the list — “Boot capacity”, “Fuel consumption”, “Warranty”, not a mix of nouns and questions. Put the value and its unit together on the data line so the pair reads as one fact. Where a value needs a qualifier — a test standard, a condition — put it behind the info button rather than lengthening the line. If an attribute genuinely needs a sentence to explain it, it belongs in body copy, not in the list.
The Feature List is a <ul> carrying tng-feature-list, with one tng-feature-list-item <li> per attribute. Each item stacks two rows: tng-feature-list-label for the muted attribute name and tng-feature-list-data for the emphasised value. Both rows are laid out as flex lines, so anything you put after the text — an info button — sits inline with it.
<ul class="tng-feature-list" role="list"> <li class="tng-feature-list-item"> <p class="tng-feature-list-label">Fuel consumption</p> <p class="tng-feature-list-data">43.4 - 45.5 (l/100 km)</p> </li> <li class="tng-feature-list-item"> <p class="tng-feature-list-label">Boot capacity</p> <p class="tng-feature-list-data">580 LITRES</p> </li></ul>-
Fuel consumption
43.4 - 45.5 (l/100 km)
-
Boot capacity
580 LITRES
-
Fuel consumption
43.4 - 45.5 (l/100 km)
-
Boot capacity
580 LITRES
Both rows read their colours from the scheme, so an is-contrast container flips the label and the data together — there’s no per-element class. The rows don’t have to be <p> elements either — the classes carry the styling, so use whatever element fits the semantics you need. See the Accessibility tab for the description-list alternative.
Elements
Section titled “Elements”Info button
Section titled “Info button”Either row can trail an icon-only button for a footnote or a caveat — a measurement standard, a condition. Use tng-icon-button at is-xs with is-no-bg, and give it an accessible name; the glyph itself is decorative. The two rows are independent, so put one on the label, on the data, on both, or on neither.
<ul class="tng-feature-list" role="list"> <li class="tng-feature-list-item"> <p class="tng-feature-list-label"> Fuel consumption <button class="tng-icon-button is-xs is-no-bg" type="button" aria-label="How fuel consumption is measured" > <i class="tng-icon icon-info" aria-hidden="true"></i> </button> </p> <p class="tng-feature-list-data">43.4 - 45.5 (l/100 km)</p> </li></ul>-
Fuel consumption
43.4 - 45.5 (l/100 km)
The styleguide ships the button as a visual affordance only — it has no behaviour of its own. Wiring it to reveal the explanation is yours to do; reach for Popover rather than inventing a tooltip, and see the Accessibility tab for what that has to announce.
is-sm is the default and can be left off; is-lg scales the label typography up and opens up both the gap between rows and the gap between an item’s label and its data. Put the size class on the list — it reaches the rows from there, so you don’t repeat it per item.
<ul class="tng-feature-list is-sm" role="list"> <li class="tng-feature-list-item"> <p class="tng-feature-list-label">Fuel consumption</p> <p class="tng-feature-list-data">43.4 - 45.5 (l/100 km)</p> </li> <li class="tng-feature-list-item"> <p class="tng-feature-list-label">Boot capacity</p> <p class="tng-feature-list-data">580 LITRES</p> </li></ul><ul class="tng-feature-list is-lg" role="list"> <li class="tng-feature-list-item"> <p class="tng-feature-list-label">Fuel consumption</p> <p class="tng-feature-list-data">43.4 - 45.5 (l/100 km)</p> </li> <li class="tng-feature-list-item"> <p class="tng-feature-list-label">Boot capacity</p> <p class="tng-feature-list-data">580 LITRES</p> </li></ul>-
Fuel consumption
43.4 - 45.5 (l/100 km)
-
Boot capacity
580 LITRES
-
Fuel consumption
43.4 - 45.5 (l/100 km)
-
Boot capacity
580 LITRES
The label typography and the spacing are what scale. The data line has its own per-size tokens, which Toyota resolves to the same setting at both sizes — so don’t rely on the value being size-invariant across brands.
Because the row rhythm changes with the size, the list sets its own gaps rather than composing a stack utility — don’t wrap the items in tng-stack expecting the spacing to survive.
The Feature List is static content: the styleguide owns the layout and typography, and leaves the semantics, the accessible naming of any info button, and the behaviour behind it to you. An accessible feature list keeps the label and its value clearly related, reads top to bottom in the order it appears, survives text resizing and zoom without clipping, and never leans on colour alone to signal which line is the value. It meets WCAG 2.1 AA.
For designers
Section titled “For designers”- The label and the data must both meet minimum colour contrast in light and dark themes — the label is deliberately muted, so check it rather than assuming. Source: WCAG 1.4.3 Contrast (Minimum).
- The info icon must meet the same contrast minimum in both themes.
- Never let the label/data hierarchy ride on colour or weight alone — the wording has to make clear which is the attribute and which is the value. Source: WCAG 1.4.1 Use of Color.
- The reading order must follow the visual order, top to bottom.
- The list must tolerate text resizing without clipping, overlap, or loss of information, and stay legible and adequately spaced at supported zoom levels. Source: WCAG 1.4.4 Resize Text.
- Where an info icon is used, it needs an accessible name that says what kind of information it reveals — not a bare “info”.
- Optional rows that are hidden must be hidden properly, so they reach neither the screen reader nor the keyboard.
For developers
Section titled “For developers”The list ships as a <ul> of <li> items, each stacking a label and a data line. Because the component sets list-style: none, add role="list" on the container — Safari with VoiceOver drops the implicit list role when the markers are removed, and with it the item count and position. The rows themselves are static text and take no focus.
Keep the relationship between the two lines explicit. The markup above pairs them by containment, which is enough for a visual reader but tells assistive technology nothing about which line describes which. Where that pairing matters — a specification table people navigate rather than skim — use a description list instead: the classes are presentational, so they apply just as well to <dl> / <dt> / <dd>.
<dl class="tng-feature-list"> <div class="tng-feature-list-item"> <dt class="tng-feature-list-label">Fuel consumption</dt> <dd class="tng-feature-list-data">43.4 - 45.5 (l/100 km)</dd> </div></dl>- Fuel consumption
- 43.4 - 45.5 (l/100 km)
Avoid truncating values — a clipped specification is a loss of information, so let long values wrap instead. If you hide optional rows, remove them from the DOM or use hidden, rather than visually hiding them where they stay reachable by keyboard and screen reader.
The info button
Section titled “The info button”The styleguide ships the info button as a visual affordance with no behaviour attached, so everything that makes it accessible is yours to add. It is a real <button>, so it is focusable and keyboard-operable already, and the glyph inside is aria-hidden="true" — but an unwired button that announces itself and then does nothing is worse than no button. Either wire it up or leave it out.
When you do wire it up, give it an accessible name describing what it reveals (“How fuel consumption is measured”, not “info”), reveal the explanation with Popover rather than a bespoke tooltip, and make sure the revealed content is announced — associate it with aria-describedby, or manage focus into it — so the interaction isn’t silent for a screen reader.
Two constraints worth checking against your own layout:
- Touch target.
is-xsrenders a 22 px button, which is under the 24 × 24 px minimum. It can still pass via the spacing exception when no other target falls within a 24 px circle around it — but in a dense list, two info buttons on adjacent rows can easily breach that. Step up a size, or space the rows, where the buttons sit close together. Source: WCAG 2.5.8 Target Size (Minimum). - Focus visibility. The button keeps the standard focus ring; don’t suppress it, and check it against both the neutral and contrast surfaces. Source: WCAG 2.4.7 Focus Visible.
Keyboard interaction
Section titled “Keyboard interaction”The list itself is not interactive. Only the optional info buttons take focus.
| Key | Action |
|---|---|
| Tab / Shift + Tab | Move focus between info buttons |
| Enter / Space | Activate the focused info button |
Focus order
Section titled “Focus order”Focus moves through the info buttons in document order — down the list, and within an item from the label’s button to the data’s button. The text takes no focus, and right-to-left preserves this logical order while mirroring the layout.
-
Fuel consumption
43.4 - 45.5 (l/100 km)
-
Boot capacity
580 LITRES
- First info button
- Second info button
Labelling elements
Section titled “Labelling elements”Give every element the role, name, and state assistive technology needs.
List container
A <ul> with an explicit role="list", since the styling removes the markers. It needs no aria-label when the surrounding heading already names the block — a redundant label only adds noise. Use <dl> instead when the label/value pairing needs to be exposed rather than implied.
Label
Plain text naming the attribute. It carries no role of its own, so it must read as a self-describing attribute name — or become a <dt> when you need the pairing exposed.
Data
Plain text carrying the value and its unit together, so the fact is complete when read on its own — or a <dd> in the description-list form.
Info button
An icon-only <button> with no visible text, so give it aria-label describing what it reveals. The icon-info glyph is aria-hidden="true", so the button announces as its label alone. Only include it when it actually does something.
Source: WCAG 4.1.2 Name, Role, Value.