jixoai-ui
the terminal design language
loading the style sheet…
Skip to content
docs · print medium: screen

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.

install — list

$npx jixoai-ui add list

https://ui.jixoai.com/r/list.json

native <ul> | <ol> ordered · start · reversed marker — 7-word frozen set nav mode · landmark wrapper styles the list, never the row

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.

List usage
<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 :tail key
  • nesting composes:
    • the inner list rides the same channels
    • one level deeper, zero extra classes
  1. the fourth finding — start shifts the first marker
  2. the fifth, continuing the decimal run
  3. marker ink is muted; body ink is not
list-usage.svelte svelte
<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
  1. decimal — the ol platform default
  2. continues from start when set
  1. alpha — lower-alpha counters
  2. appendix-grade enumeration
  1. roman — lower-roman counters
  2. preface-grade enumeration
  1. start shifts the first counter
  2. iv, v — the native ol accounting
list-markers-usage.svelte svelte
<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

KeyAction
—Not focusable — document structure, not a control

ARIA

AttributeValueDescription
ul / olnative elementsItem-group semantics from the platform; ordered lists announce their length.
liconsumer-ownedThe 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 wrappernav[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-navpresenceHook 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-universal.svelte svelte
<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

PropertyTypeDefaultDescription
ordered booleanfalsefalse → <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 defaultThe 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>spreadEvery 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

PropertyTypeDefaultDescription
size'small' | 'medium' | 'large' | 'auto' | number'auto' · ambient scopethe base scale — root font-size; parts size in em
shape'round' | 'scoop' | 'bevel' | 'notch' | 'square' | 'squircle' | 'auto''auto' · ambient scopecorner geometry (CSS corner-shape; §14 degrade table)
radius'small' | 'medium' | 'large' | 'auto' | number'auto' · ambient scopecorner size; auto = the concentric broadcast (§3)
density'small' | 'medium' | 'large' | 'auto' | number'auto' · ambient scopespacing/leading scale over the kernel channels (§4)
color'primary' | 'secondary' | 'error' | 'warn' | 'success' | 'info' | 'auto' | number | string'auto' · ambient scopethe hue axis of the fixed oklch primary system (§5)
theme'light' | 'dark' | 'system' | 'auto''auto' · ambient scopelight/dark profile; system = the JS-mutable global (§6)
elevation'level-1' | 'level0' | 'level1' | 'level2' | 'level3' | 'level4' | 'level5' | 'auto' | number'auto' · ambient scopeofficial M3 levels over the surface ladder (§7)
motion'reduced' | 'subtle' | 'normal' | 'expressive' | 'auto' | number'auto' · ambient scopeintensity across the motion kernels (§8)
jixoai-ui ui.jixoai.com the jixoai design language

Theme

Brand hue

0°

Auto cycle · 24h