List
List renders repeated records with item metadata and secondary actions.
@duskmoon-dev/components/list Usage
When to use
- Use it when users need to scan structured content and act on individual records.
- Prefer it over ad hoc markup when the content has repeatable fields, hierarchy, or navigation state.
Implementation notes
Features
Designed for repeated or hierarchical content where users scan, compare, and inspect details.
Documents the props that control sorting, selection, expansion, pagination, or value changes where available.
List is most often configured through `dataSource`, `renderItem`, `bordered`, `size`.
Renders dataSource with renderItem
Feature Demos
Feature demos are authored for the component page, then supplemented with behavior scenarios from the component test coverage.
Basic usage
Import the component stylesheet and List from its package subpath, then render it with the core props.
import "@duskmoon-dev/components/styles.css";
import { List } from "@duskmoon-dev/components/list";
export function Example() {
return (<List bordered>
{[
{ title: "Design tokens", description: "Updated color and spacing scale" },
{ title: "Components", description: "Reviewed visual states" },
{ title: "Release", description: "Ready for package validation" }
].map((item) => (
<List.Item key={item.title} extra="Open">
<List.Item.Meta
title={item.title}
description={item.description}
/>
</List.Item>
))}
</List>);
} Renders dataSource with renderItem
test-backedList scenario from the component test coverage: renders datasource with renderitem.
import "@duskmoon-dev/components/styles.css";
import { List } from "@duskmoon-dev/components/list";
export function ListRendersDataSourceWithRenderItemDemo() {
return (<List bordered>
{[
{ title: "Design tokens", description: "Updated color and spacing scale" },
{ title: "Components", description: "Reviewed visual states" },
{ title: "Release", description: "Ready for package validation" }
].map((item) => (
<List.Item key={item.title} extra="Open">
<List.Item.Meta
title={item.title}
description={item.description}
/>
</List.Item>
))}
</List>);
} Supports className and children
test-backedList scenario from the component test coverage: supports classname and children.
import "@duskmoon-dev/components/styles.css";
import { List } from "@duskmoon-dev/components/list";
export function ListSupportsClassNameAndChildrenDemo() {
return (<List bordered>
{[
{ title: "Design tokens", description: "Updated color and spacing scale" },
{ title: "Components", description: "Reviewed visual states" },
{ title: "Release", description: "Ready for package validation" }
].map((item) => (
<List.Item key={item.title} extra="Open">
<List.Item.Meta
title={item.title}
description={item.description}
/>
</List.Item>
))}
</List>);
} Renders List.Item
test-backedList scenario from the component test coverage: renders list.item.
import "@duskmoon-dev/components/styles.css";
import { List } from "@duskmoon-dev/components/list";
export function ListRendersListItemDemo() {
return (<List bordered>
{[
{ title: "Design tokens", description: "Updated color and spacing scale" },
{ title: "Components", description: "Reviewed visual states" },
{ title: "Release", description: "Ready for package validation" }
].map((item) => (
<List.Item key={item.title} extra="Open">
<List.Item.Meta
title={item.title}
description={item.description}
/>
</List.Item>
))}
</List>);
} Renders List.Item.Meta title and description
test-backedList scenario from the component test coverage: renders list.item.meta title and description.
import "@duskmoon-dev/components/styles.css";
import { List } from "@duskmoon-dev/components/list";
export function ListRendersListItemMetaDemo() {
return (<List bordered>
{[
{ title: "Design tokens", description: "Updated color and spacing scale" },
{ title: "Components", description: "Reviewed visual states" },
{ title: "Release", description: "Ready for package validation" }
].map((item) => (
<List.Item key={item.title} extra="Open">
<List.Item.Meta
title={item.title}
description={item.description}
/>
</List.Item>
))}
</List>);
} Renders actions, extra, and meta avatar
test-backedList scenario from the component test coverage: renders actions, extra, and meta avatar.
import "@duskmoon-dev/components/styles.css";
import { List } from "@duskmoon-dev/components/list";
export function ListRendersActionsExtraAndDemo() {
return (<List bordered>
{[
{ title: "Design tokens", description: "Updated color and spacing scale" },
{ title: "Components", description: "Reviewed visual states" },
{ title: "Release", description: "Ready for package validation" }
].map((item) => (
<List.Item key={item.title} extra="Open">
<List.Item.Meta
title={item.title}
description={item.description}
/>
</List.Item>
))}
</List>);
} Applies bordered and size classes
test-backedList scenario from the component test coverage: applies bordered and size classes.
import "@duskmoon-dev/components/styles.css";
import { List } from "@duskmoon-dev/components/list";
export function ListAppliesBorderedAndSizeDemo() {
return (<List bordered>
{[
{ title: "Design tokens", description: "Updated color and spacing scale" },
{ title: "Components", description: "Reviewed visual states" },
{ title: "Release", description: "Ready for package validation" }
].map((item) => (
<List.Item key={item.title} extra="Open">
<List.Item.Meta
title={item.title}
description={item.description}
/>
</List.Item>
))}
</List>);
} Forwards root ref
test-backedList scenario from the component test coverage: forwards root ref.
import "@duskmoon-dev/components/styles.css";
import { List } from "@duskmoon-dev/components/list";
export function ListForwardsRootRefDemo() {
return (<List bordered>
{[
{ title: "Design tokens", description: "Updated color and spacing scale" },
{ title: "Components", description: "Reviewed visual states" },
{ title: "Release", description: "Ready for package validation" }
].map((item) => (
<List.Item key={item.title} extra="Open">
<List.Item.Meta
title={item.title}
description={item.description}
/>
</List.Item>
))}
</List>);
} Theme aware
Docs previews inherit the DuskMoon data-theme value. Use the header switch to compare light and dark rendering.
<div data-theme="sunshine">
<List bordered>
{[
{ title: "Design tokens", description: "Updated color and spacing scale" },
{ title: "Components", description: "Reviewed visual states" },
{ title: "Release", description: "Ready for package validation" }
].map((item) => (
<List.Item key={item.title} extra="Open">
<List.Item.Meta
title={item.title}
description={item.description}
/>
</List.Item>
))}
</List>
</div>
<div data-theme="moonlight">
<List bordered>
{[
{ title: "Design tokens", description: "Updated color and spacing scale" },
{ title: "Components", description: "Reviewed visual states" },
{ title: "Release", description: "Ready for package validation" }
].map((item) => (
<List.Item key={item.title} extra="Open">
<List.Item.Meta
title={item.title}
description={item.description}
/>
</List.Item>
))}
</List>
</div> API
The API reference below lists every parsed exported type or interface for List. Start with `dataSource`, `renderItem`, `bordered`, `size` for common usage.
packages/components/src/components/list/List.types.ts
Scenarios: packages/components/src/components/list/List.test.tsx | Prop | Type | Required | Description |
|---|---|---|---|
dataSource | T[] | No | dataSource configures List. |
renderItem | (item: T, index: number) => ReactNode | No | renderItem configures List. |
children | ReactNode | No | children configures List. |
bordered | boolean | No | bordered configures List. |
size | ListSize | No | size configures List. |
| Prop | Type | Required | Description |
|---|---|---|---|
actions | ReactNode[] | ReactNode | No | actions configures List. |
extra | ReactNode | No | extra configures List. |
disabled | boolean | No | disabled configures List. |
| Prop | Type | Required | Description |
|---|---|---|---|
avatar | ReactNode | No | avatar configures List. |
title | ReactNode | No | title configures List. |
description | ReactNode | No | description configures List. |
"sm" | "md" | "lg" ForwardRefExoticComponent< ListItemMetaProps & RefAttributes<HTMLDivElement> > ForwardRefExoticComponent< ListItemProps & RefAttributes<HTMLDivElement> > & { Meta: ListItemMetaComponent (<T = unknown>( props: ListProps<T> & RefAttributes<HTMLDivElement>, ) => ReactElement | null) & { Item: ListItemComponent