Transfer
Transfer moves records between available and selected lists.
@duskmoon-dev/components/transfer 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.
Transfer is most often configured through `dataSource`, `targetKeys`, `defaultTargetKeys`, `selectedKeys`.
Renders source and target lists with titles
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 Transfer from its package subpath, then render it with the core props.
import "@duskmoon-dev/components/styles.css";
import { Transfer } from "@duskmoon-dev/components/transfer";
export function Example() {
return (<Transfer
dataSource={[
{ key: "tokens", title: "Design tokens", description: "Theme primitives" },
{ key: "docs", title: "Docs site", description: "Examples and API pages" },
{ key: "qa", title: "Visual QA", description: "Review queue" },
{ key: "release", title: "Release notes", description: "Publish checklist" }
]}
defaultTargetKeys={["release"]}
defaultSelectedKeys={["tokens"]}
titles={["Available", "Selected"]}
showSearch
/>);
} Renders source and target lists with titles
test-backedTransfer scenario from the component test coverage: renders source and target lists with titles.
import "@duskmoon-dev/components/styles.css";
import { Transfer } from "@duskmoon-dev/components/transfer";
export function TransferRendersSourceAndTargetDemo() {
return (<Transfer
dataSource={[
{ key: "tokens", title: "Design tokens", description: "Theme primitives" },
{ key: "docs", title: "Docs site", description: "Examples and API pages" },
{ key: "qa", title: "Visual QA", description: "Review queue" },
{ key: "release", title: "Release notes", description: "Publish checklist" }
]}
defaultTargetKeys={["release"]}
defaultSelectedKeys={["tokens"]}
titles={["Available", "Selected"]}
showSearch
/>);
} Moves selected source items to target
test-backedTransfer scenario from the component test coverage: moves selected source items to target.
import "@duskmoon-dev/components/styles.css";
import { Transfer } from "@duskmoon-dev/components/transfer";
export function TransferMovesSelectedSourceItemsDemo() {
return (<Transfer
dataSource={[
{ key: "tokens", title: "Design tokens", description: "Theme primitives" },
{ key: "docs", title: "Docs site", description: "Examples and API pages" },
{ key: "qa", title: "Visual QA", description: "Review queue" },
{ key: "release", title: "Release notes", description: "Publish checklist" }
]}
defaultTargetKeys={["release"]}
defaultSelectedKeys={["tokens"]}
titles={["Available", "Selected"]}
showSearch
/>);
} Supports selectedKeys and select change callbacks
test-backedTransfer scenario from the component test coverage: supports selectedkeys and select change callbacks.
import "@duskmoon-dev/components/styles.css";
import { Transfer } from "@duskmoon-dev/components/transfer";
export function TransferSupportsSelectedKeysAndSelectDemo() {
return (<Transfer
dataSource={[
{ key: "tokens", title: "Design tokens", description: "Theme primitives" },
{ key: "docs", title: "Docs site", description: "Examples and API pages" },
{ key: "qa", title: "Visual QA", description: "Review queue" },
{ key: "release", title: "Release notes", description: "Publish checklist" }
]}
defaultTargetKeys={["release"]}
defaultSelectedKeys={["tokens"]}
titles={["Available", "Selected"]}
showSearch
/>);
} Supports search, render object, filter, and pagination
test-backedTransfer scenario from the component test coverage: supports search, render object, filter, and pagination.
import "@duskmoon-dev/components/styles.css";
import { Transfer } from "@duskmoon-dev/components/transfer";
export function TransferSupportsSearchRenderObjectDemo() {
return (<Transfer
dataSource={[
{ key: "tokens", title: "Design tokens", description: "Theme primitives" },
{ key: "docs", title: "Docs site", description: "Examples and API pages" },
{ key: "qa", title: "Visual QA", description: "Review queue" },
{ key: "release", title: "Release notes", description: "Publish checklist" }
]}
defaultTargetKeys={["release"]}
defaultSelectedKeys={["tokens"]}
titles={["Available", "Selected"]}
showSearch
/>);
} Supports oneWay, disabled state, rowKey, and subcomponents
test-backedTransfer scenario from the component test coverage: supports oneway, disabled state, rowkey, and subcomponents.
import "@duskmoon-dev/components/styles.css";
import { Transfer } from "@duskmoon-dev/components/transfer";
export function TransferSupportsOneWayDisabledStateDemo() {
return (<Transfer
dataSource={[
{ key: "tokens", title: "Design tokens", description: "Theme primitives" },
{ key: "docs", title: "Docs site", description: "Examples and API pages" },
{ key: "qa", title: "Visual QA", description: "Review queue" },
{ key: "release", title: "Release notes", description: "Publish checklist" }
]}
defaultTargetKeys={["release"]}
defaultSelectedKeys={["tokens"]}
titles={["Available", "Selected"]}
showSearch
/>);
} Theme aware
Docs previews inherit the DuskMoon data-theme value. Use the header switch to compare light and dark rendering.
<div data-theme="sunshine">
<Transfer
dataSource={[
{ key: "tokens", title: "Design tokens", description: "Theme primitives" },
{ key: "docs", title: "Docs site", description: "Examples and API pages" },
{ key: "qa", title: "Visual QA", description: "Review queue" },
{ key: "release", title: "Release notes", description: "Publish checklist" }
]}
defaultTargetKeys={["release"]}
defaultSelectedKeys={["tokens"]}
titles={["Available", "Selected"]}
showSearch
/>
</div>
<div data-theme="moonlight">
<Transfer
dataSource={[
{ key: "tokens", title: "Design tokens", description: "Theme primitives" },
{ key: "docs", title: "Docs site", description: "Examples and API pages" },
{ key: "qa", title: "Visual QA", description: "Review queue" },
{ key: "release", title: "Release notes", description: "Publish checklist" }
]}
defaultTargetKeys={["release"]}
defaultSelectedKeys={["tokens"]}
titles={["Available", "Selected"]}
showSearch
/>
</div> API
The API reference below lists every parsed exported type or interface for Transfer. Start with `dataSource`, `targetKeys`, `defaultTargetKeys`, `selectedKeys` for common usage.
packages/components/src/components/transfer/Transfer.types.ts
Scenarios: packages/components/src/components/transfer/Transfer.test.tsx | Prop | Type | Required | Description |
|---|---|---|---|
dataSource | T[] | No | dataSource configures Transfer. |
targetKeys | TransferKey[] | No | targetKeys configures Transfer. |
defaultTargetKeys | TransferKey[] | No | defaultTargetKeys configures Transfer. |
selectedKeys | TransferKey[] | No | selectedKeys configures Transfer. |
defaultSelectedKeys | TransferKey[] | No | defaultSelectedKeys configures Transfer. |
render | TransferRender<T> | No | render configures Transfer. |
showSearch | boolean | No | showSearch configures Transfer. |
filterOption | TransferFilterOption<T> | No | filterOption configures Transfer. |
pagination | boolean | TransferPaginationConfig | No | pagination configures Transfer. |
oneWay | boolean | No | oneWay configures Transfer. |
operations | ReactNode[] | No | operations configures Transfer. |
titles | ReactNode[] | No | titles configures Transfer. |
disabled | boolean | No | disabled configures Transfer. |
rowKey | (item: T) => TransferKey | No | rowKey configures Transfer. |
locale | TransferLocale | No | locale configures Transfer. |
onChange | ( | No | onChange configures Transfer. |
targetKeys | TransferKey[], | Yes | targetKeys configures Transfer. |
direction | TransferDirection, | Yes | direction configures Transfer. |
moveKeys | TransferKey[], | Yes | moveKeys configures Transfer. |
onSelectChange | ( | No | onSelectChange configures Transfer. |
sourceSelectedKeys | TransferKey[], | Yes | sourceSelectedKeys configures Transfer. |
targetSelectedKeys | TransferKey[], | Yes | targetSelectedKeys configures Transfer. |
onSearch | (direction: TransferDirection, value: string) => void | No | onSearch configures Transfer. |
| Prop | Type | Required | Description |
|---|---|---|---|
key | TransferKey | Yes | key configures Transfer. |
title | ReactNode | No | title configures Transfer. |
description | ReactNode | No | description configures Transfer. |
disabled | boolean | No | disabled configures Transfer. |
| Prop | Type | Required | Description |
|---|---|---|---|
pageSize | number | No | pageSize configures Transfer. |
| Prop | Type | Required | Description |
|---|---|---|---|
itemUnit | string | No | itemUnit configures Transfer. |
itemsUnit | string | No | itemsUnit configures Transfer. |
notFoundContent | ReactNode | No | notFoundContent configures Transfer. |
searchPlaceholder | string | No | searchPlaceholder configures Transfer. |
| Prop | Type | Required | Description |
|---|---|---|---|
direction | TransferDirection | Yes | direction configures Transfer. |
title | ReactNode | No | title configures Transfer. |
items | T[] | Yes | items configures Transfer. |
selectedKeys | TransferKey[] | No | selectedKeys configures Transfer. |
disabled | boolean | No | disabled configures Transfer. |
showSearch | boolean | No | showSearch configures Transfer. |
searchValue | string | No | searchValue configures Transfer. |
searchPlaceholder | string | No | searchPlaceholder configures Transfer. |
notFoundContent | ReactNode | No | notFoundContent configures Transfer. |
render | TransferRender<T> | No | render configures Transfer. |
filterOption | TransferFilterOption<T> | No | filterOption configures Transfer. |
pagination | boolean | TransferPaginationConfig | No | pagination configures Transfer. |
onSearch | (direction: TransferDirection, value: string) => void | No | onSearch configures Transfer. |
onItemSelect | (key: TransferKey, selected: boolean) => void | No | onItemSelect configures Transfer. |
| Prop | Type | Required | Description |
|---|---|---|---|
onChange | (value: string) => void | No | onChange configures Transfer. |
| Prop | Type | Required | Description |
|---|---|---|---|
disabled | boolean | No | disabled configures Transfer. |
oneWay | boolean | No | oneWay configures Transfer. |
operations | ReactNode[] | No | operations configures Transfer. |
moveToRightDisabled | boolean | No | moveToRightDisabled configures Transfer. |
moveToLeftDisabled | boolean | No | moveToLeftDisabled configures Transfer. |
onMoveToRight | () => void | No | onMoveToRight configures Transfer. |
onMoveToLeft | () => void | No | onMoveToLeft configures Transfer. |
"left" | "right" string | ReactNode | { label: ReactNode ForwardRefExoticComponent< TransferSearchProps & RefAttributes<HTMLInputElement> > ForwardRefExoticComponent< TransferOperationProps & RefAttributes<HTMLDivElement> > <T extends TransferItem = TransferItem>( props: TransferListProps<T> & RefAttributes<HTMLDivElement>, ) => ReactElement | null (<T extends TransferItem = TransferItem>( props: TransferProps<T> & RefAttributes<HTMLDivElement>, ) => ReactElement | null) & { Search: TransferSearchComponent