registry:ui · Data Display
list — the prose list, the list itself
A native <ol|ul> by the ordered prop — the separator's dual-root cast, with start and reversed passed explicitly on the ol branch only. What it owns is the reading channel set: the marker (a 7-word frozen vocabulary — disc | circle | square | decimal | alpha | roman | none, element-agnostic, lowercase only; omitted keeps the per-element platform default byte-parity, explicit overrides), padding-inline-start 1.5rem (none keeps it: the indent is structural), muted marker ink. And nav mode: a nav prop (the aria-label) wraps the list in a landmark <nav data-jx-list-nav> defaulting marker none + ps-0 — a default that paints standalone; inside a jx-pure scope the face's B8 restore out-cascades it (no-jx-pure is the escape). class/rest stay on the LIST element, the wrapper carries only the semantics. What it refuses: block margins (the rhythm and flush laws own spacing, as with heading) and any opinion about the rows — children stay native <li> elements, so the element-based rhythm selectors, the flush law and the container-inner sibling stack keep matching the native roots (the markdown map composes exactly this way; list_item stays bare). Not to be confused with list-item: that item is the antd/F7 settings-row system — ItemGroup frames, media/end lanes, ItemField + seven control adapters (Toggle / Checkbox / Radio / Select / Input / Segmented / Stepper — the list-item 1st review ruling) — a different taxonomy entirely.
$npx jixoai-ui add list
https://ui.jixoai.com/r/list.json
usage
Usage
One boolean flips the root; write your rows as plain li elements — or component trees that render them. The component owns marker shape, marker ink and the inline pad; everything else is the container's rhythm.
<script lang="ts">
import { List } from '@ui/list';
</script>
<div class={cx(rt.liGrid)}>
<List>
<li>prefix keys freeze while the tail grows</li>
<li>the tail mutates in place on its <code class={cx(rt.fontMono, rt.liCode85)}>:tail</code> key</li>
<li>
nesting composes:
<List>
<li>the inner list rides the same channels</li>
<li>one level deeper, zero extra classes</li>
</List>
</li>
</List>
<List ordered start={4}>
<li>the fourth finding — start shifts the first marker</li>
<li>the fifth, continuing the decimal run</li>
<li>marker ink is muted; body ink is not</li>
</List>
</div>list
The unordered default with muted markers, an ordered list continuing from start=4, and a nested composition — an inner list rides the same channels at one level deeper, no extra classes.
- prefix keys freeze while the tail grows
- the tail mutates in place on its
:tailkey - nesting composes:
- the inner list rides the same channels
- one level deeper, zero extra classes
- the fourth finding — start shifts the first marker
- the fifth, continuing the decimal run
- marker ink is muted; body ink is not
<script lang="ts">
import { List } from '@ui/list';
</script>
<div class={cx(rt.liGrid)}>
<List>
<li>prefix keys freeze while the tail grows</li>
<li>the tail mutates in place on its <code class={cx(rt.fontMono, rt.liCode85)}>:tail</code> key</li>
<li>
nesting composes:
<List>
<li>the inner list rides the same channels</li>
<li>one level deeper, zero extra classes</li>
</List>
</li>
</List>
<List ordered start={4}>
<li>the fourth finding — start shifts the first marker</li>
<li>the fifth, continuing the decimal run</li>
<li>marker ink is muted; body ink is not</li>
</List>
</div>list
The marker matrix — the 7-word frozen vocabulary, element-agnostic: the unordered shapes (disc, circle, square), the ordered counters (decimal, alpha, roman — lowercase only, upper is the escape hatch), and none (which KEEPS the structural ps-6: the indent belongs to document flow). Marker ink stays the muted law in every word; marker size and spacing are deliberately absent — the ambient scale and the no-margins law own them.
- disc — the ul platform default
- a core utility; the byte-parity stamp
- circle — hollow, the nested-list word
- no core utility exists: the arbitrary [list-style:] form
- square — the compact marker
- same arbitrary form, probed against TW 4.2.1
- none — markers gone, ps-6 stays
- the indent is structural, not decorative
- decimal — the ol platform default
- continues from start when set
- alpha — lower-alpha counters
- appendix-grade enumeration
- roman — lower-roman counters
- preface-grade enumeration
- start shifts the first counter
- iv, v — the native ol accounting
<script lang="ts">
import { List } from '@ui/list';
</script>
<div class={cx(rt.liGridXY)}>
<div class={cx(rt.flex, rt.col, rt.gap16)}>
<List marker="disc">
<li>disc — the ul platform default</li>
<li>a core utility; the byte-parity stamp</li>
</List>
<List marker="circle">
<li>circle — hollow, the nested-list word</li>
<li>no core utility exists: the arbitrary [list-style:] form</li>
</List>
<List marker="square">
<li>square — the compact marker</li>
<li>same arbitrary form, probed against TW 4.2.1</li>
</List>
<List marker="none">
<li>none — markers gone, ps-6 stays</li>
<li>the indent is structural, not decorative</li>
</List>
</div>
<div class={cx(rt.flex, rt.col, rt.gap16)}>
<List ordered marker="decimal">
<li>decimal — the ol platform default</li>
<li>continues from start when set</li>
</List>
<List ordered marker="alpha">
<li>alpha — lower-alpha counters</li>
<li>appendix-grade enumeration</li>
</List>
<List ordered marker="roman">
<li>roman — lower-roman counters</li>
<li>preface-grade enumeration</li>
</List>
<List ordered marker="roman" start={4}>
<li>start shifts the first counter</li>
<li>iv, v — the native ol accounting</li>
</List>
</div>
</div>law
Task lists live in the markdown face
The GFM task-item rules — marker suppression on li:has(> input), checkbox middle-alignment — are container-level DOM-shape laws, not list paint, and they stay in the markdown sheet where the li shape is known. This component takes no checkbox wiring: render task lists through the markdown component and the jx-pure bare-checkbox face paints the markers.
A task item is a container judgment: the sheet sees the raw li:has(> input) shape and suppresses the marker. A standalone list component that rendered checkboxes
would have to re-own those rules — the double-marker bug would return. The markdown
map keeps task checkboxes as native disabled inputs for exactly this reason.
See the markdown page for the task-list face — and the list-item page for the settings-row system this component deliberately is not.
a11y
Accessibility
Native list semantics — the platform announces items-in-group counts for free.
Keyboard
| Key | Action |
|---|---|
| — | Not focusable — document structure, not a control |
ARIA
| Attribute | Value | Description |
|---|---|---|
| ul / ol | native elements | Item-group semantics from the platform; ordered lists announce their length. |
| li | consumer-owned | The rows are yours — native li children (or component trees rendering them); this component styles the list, never the item. |
| data-jx-list | 'ol' | 'ul' | Hook attribute naming which native root rendered — the separator's data-orientation form. |
| nav wrapper | nav[aria-label] | Nav mode renders a real landmark — the platform announces the region by its aria-label; navigation semantics never ride styling. |
| data-jx-list-nav | presence | Hook on the wrapper when nav mode is active — only the landmark attributes ride it, never classes. |
axes
Universal props
The eight-axis surface (explicit-props): size · shape · radius · density · color · theme · elevation · motion — each axis takes named steps, auto (inherit the ambient context; stamps nothing), an exact number (px · coefficient · dp · hue per axis), or query() for responsive/container-conditional values. FIRST-TIME contract, all no-own: the B8 marker channels and the no-margins rhythm law own the paint — the axes ride the LIST element (the nav wrapper is a landmark shell).
List · universal props
The prose list forwards the axes; marker/indent laws unchanged.
<List size="medium">…</List>api
API
Five props and a verbatim spread; one boolean flips the root, one word moves the marker, one string switches the landmark.
Properties
| Property | Type | Default | Description |
|---|---|---|---|
| ordered | boolean | false | false → <ul> (disc markers); true → <ol> (decimal markers). The Props shape is typed on the ul form; the ol branch spreads the same rest through the ol element type. |
| marker | 'disc' | 'circle' | 'square' | 'decimal' | 'alpha' | 'roman' | 'none' | per-element platform default | The 7-word frozen vocabulary, element-agnostic and lowercase only (upper is the escape hatch). Omitted keeps today's per-element restoration byte-parity (decimal on ol, disc on ul; none in nav mode); an explicit marker overrides — the list-style default only, never the structural pad. circle/square ride the arbitrary [list-style:] form (no core utility under TW 4.2.1). |
| nav | string | — | The aria-label; PRESENCE switches the container: a <nav aria-label data-jx-list-nav> wrapper around the list, defaulting marker none + ps-0 (an explicit marker overrides the list-style default only — ps-0 stays: a nav list is chrome). The default paints standalone; inside a jx-pure face scope the B8 restore law out-cascades it — class no-jx-pure is the escape (the markdown map's own stamp). class/rest stay on the LIST element; the wrapper carries only the landmark semantics. |
| start | number | — | The first marker value of an ordered list (ol-only passthrough — the native ul element carries no such attribute, so it is ignored there). |
| reversed | boolean | — | Descending marker order — the ol-only native pair with start (ignored on ul). |
| children | Snippet | — | The list items — native <li> children or component trees that render them. |
| class | string | '' | Forwarded to the rendered list root; consumer classes land last. |
| ...rest | HTMLAttributes<HTMLUListElement> | spread | Every other attribute passes through to the native list element untouched — except the eight universal axes, which the component intercepts, resolves through ListDefaults, and stamps as carriers + data-density on the list root (see Universal props). |
Universal props
| Property | Type | Default | Description |
|---|---|---|---|
| size | 'small' | 'medium' | 'large' | 'auto' | number | 'auto' · ambient scope | the base scale — root font-size; parts size in em |
| shape | 'round' | 'scoop' | 'bevel' | 'notch' | 'square' | 'squircle' | 'auto' | 'auto' · ambient scope | corner geometry (CSS corner-shape; §14 degrade table) |
| radius | 'small' | 'medium' | 'large' | 'auto' | number | 'auto' · ambient scope | corner size; auto = the concentric broadcast (§3) |
| density | 'small' | 'medium' | 'large' | 'auto' | number | 'auto' · ambient scope | spacing/leading scale over the kernel channels (§4) |
| color | 'primary' | 'secondary' | 'error' | 'warn' | 'success' | 'info' | 'auto' | number | string | 'auto' · ambient scope | the hue axis of the fixed oklch primary system (§5) |
| theme | 'light' | 'dark' | 'system' | 'auto' | 'auto' · ambient scope | light/dark profile; system = the JS-mutable global (§6) |
| elevation | 'level-1' | 'level0' | 'level1' | 'level2' | 'level3' | 'level4' | 'level5' | 'auto' | number | 'auto' · ambient scope | official M3 levels over the surface ladder (§7) |
| motion | 'reduced' | 'subtle' | 'normal' | 'expressive' | 'auto' | number | 'auto' · ambient scope | intensity across the motion kernels (§8) |