a11y/use-list · Bullet text should be a list
A bullet character typed into plain text should be a real list element instead.
Severity: info · Category: a11y
What it checks
Flags text that opens with a bullet character (•, ・, ·, -, or *) followed by whitespace, when there are at least two such items under one parent, as sibling text nodes (- one<br>- two) or as the opening text of sibling elements (<p>• one</p><p>• two</p>). A lone bullet line is a dash, not a list; WCAG technique H48 is about sequences of items, and one item is not a sequence.
Not flagged:
- The bullet character elsewhere in the text, e.g.
a - bor-webkit-.... Only the start of the trimmed text counts. - A bullet character with no following whitespace, e.g. a signed number like
-1. - Text already inside an
<li>. - Text that follows an
{expression}among its siblings.<p>{count} - results found</p>trims to- results found, which is a sentence tail, not a bullet. - Text inside
<pre>,<code>,<kbd>,<samp>or<textarea>, where a leading dash is content.
This is a heuristic, not a structural check. It can’t tell a genuine bullet from an author’s stylistic dash, so it’s scored as info rather than warning.
<div>
<p>• Ships within one business day</p>
<p>• Backed by a two-year warranty</p>
</div>
Why it matters
A real <ul>/<ol> gives assistive technology list semantics: item count, position within the list, and where the list starts and ends. A bullet character typed into plain text looks the same visually but carries none of that structure, so a screen reader announces it as ordinary prose.
How to fix
Use a list element instead:
<ul>
<li>Ships within one business day</li>
<li>Backed by a two-year warranty</li>
</ul>
Mode differences
None. This rule reads source, the same .svelte and .ts files, everywhere it runs. The CLI, the Vite plugin’s build pass, and the live dashboard’s static baseline all report it identically, and the rendered-HTML pass never re-evaluates it. Scoping a run with --route skips it: component-scoped rules have no route to attribute a finding to.
Disabling
If the bullet character is intentional prose, not a stand-in for a list, silence a single occurrence with <!-- svelte-vitals-disable-next-line a11y/use-list -->, or turn the rule off:
export default {
rules: {
'a11y/use-list': 'off'
}
};