# List Selection URL: https://ark-ui.com/docs/collections/list-selection Source: https://raw.githubusercontent.com/chakra-ui/ark/refs/heads/main/website/src/content/pages/collections/list-selection.mdx Used for managing selection state in list collections. --- The `useListSelection` hook manages selection state in lists and collections. It supports single and multiple selection modes with operations like select, deselect, toggle, and clear. ```tsx import { createListCollection, useListSelection } from '@ark-ui/react/collection' const collection = createListCollection({ items: [ { label: 'Apple', value: 'apple' }, { label: 'Banana', value: 'banana' }, { label: 'Cherry', value: 'cherry' }, ], }) const selection = useListSelection({ collection, selectionMode: 'single', deselectable: true, }) console.log(selection.selectedValues) // ['apple', 'banana', 'cherry'] ``` ## Examples ### Basic By default, the hook supports single selection mode that can be deselected. > Set `deselectable` to `false` to prevent deselecting the current selection. **Example: list-selection/basic** #### React ```tsx import { createListCollection, useListSelection } from '@ark-ui/react/collection' export const Basic = () => { const collection = createListCollection({ items: ['React', 'Vue', 'Angular'], }) const selection = useListSelection({ collection, }) return (
{JSON.stringify(selection.selectedValues)}
{collection.items.map((item) => ( ))}
) } ``` #### Solid ```tsx import { createListCollection, useListSelection } from '@ark-ui/solid/collection' import { For } from 'solid-js' export const Basic = () => { const collection = createListCollection({ items: ['React', 'Vue', 'Angular'], }) const selection = useListSelection({ collection, }) return (
{JSON.stringify(selection.selectedValues())}
{(item) => ( )}
) } ``` #### Vue ```vue ``` #### Svelte ```svelte
{JSON.stringify(selection.selectedValues())}
{#each collection.items as item (item)} {/each}
``` ### Multiple Selection Set `selectionMode` to `multiple` to allow multiple items to be selected. **Example: list-selection/multiple** #### React ```tsx import { createListCollection, useListSelection } from '@ark-ui/react/collection' export const Multiple = () => { const collection = createListCollection({ items: ['React', 'Vue', 'Angular', 'Svelte', 'Solid'], }) const selection = useListSelection({ collection, selectionMode: 'multiple', }) const handleSelectAll = () => { if (selection.isAllSelected()) { selection.clear() } else { selection.setSelectedValues(collection.getValues()) } } return (
{selection.selectedValues.length} of {collection.items.length} selected
{collection.items.map((item) => ( ))}
) } ``` #### Solid ```tsx import { createListCollection, useListSelection } from '@ark-ui/solid/collection' import { For } from 'solid-js' export const Multiple = () => { const collection = createListCollection({ items: ['React', 'Vue', 'Angular', 'Svelte', 'Solid'], }) const selection = useListSelection({ collection, selectionMode: 'multiple', }) const handleSelectAll = () => { if (selection.isAllSelected()) { selection.clear() } else { selection.setSelectedValues(collection.getValues()) } } return (
{selection.selectedValues().length} of {collection.items.length} selected
{(item) => ( )}
) } ``` #### Vue ```vue ``` #### Svelte ```svelte
{selection.selectedValues().length} of {collection.items.length} selected
{#each collection.items as item (item)} {/each}
``` ### Range Selection Here's an example of how to implement range selection that extends the selection from the first selected item to the clicked item. **Example: list-selection/range** #### React ```tsx import { createListCollection, useListSelection } from '@ark-ui/react/collection' export const Range = () => { const collection = createListCollection({ items: [ { value: 'react', label: 'React' }, { value: 'vue', label: 'Vue' }, { value: 'angular', label: 'Angular' }, { value: 'svelte', label: 'Svelte' }, { value: 'solid', label: 'Solid' }, { value: 'preact', label: 'Preact' }, { value: 'qwik', label: 'Qwik' }, { value: 'lit', label: 'Lit' }, ], }) const selection = useListSelection({ collection, selectionMode: 'multiple', }) const handleItemClick = (value: string, event: React.MouseEvent) => { if (event.shiftKey && selection.firstSelectedValue) { // Extend selection from first selected to clicked item selection.extend(selection.firstSelectedValue, value) } else if (event.ctrlKey || event.metaKey) { // Toggle individual item selection.toggle(value) } else { // Replace selection with clicked item selection.replace(value) } } return (

Instructions:

{collection.items.map((item) => ( ))}
) } ``` #### Solid ```tsx import { createListCollection, useListSelection } from '@ark-ui/solid/collection' import { For } from 'solid-js' export const Range = () => { const items = [ { value: 'react', label: 'React' }, { value: 'vue', label: 'Vue' }, { value: 'angular', label: 'Angular' }, { value: 'svelte', label: 'Svelte' }, { value: 'solid', label: 'Solid' }, { value: 'preact', label: 'Preact' }, { value: 'qwik', label: 'Qwik' }, { value: 'lit', label: 'Lit' }, ] const collection = createListCollection({ items }) const selection = useListSelection({ collection, selectionMode: 'multiple', }) const handleItemClick = (value: string, event: MouseEvent) => { const firstSelectedValue = selection.firstSelectedValue() if (event.shiftKey && firstSelectedValue) { // Extend selection from first selected to clicked item selection.extend(firstSelectedValue, value) } else if (event.ctrlKey || event.metaKey) { // Toggle individual item selection.toggle(value) } else { // Replace selection with clicked item selection.replace(value) } } return (

Instructions:

{(item) => ( )}
) } ``` #### Vue ```vue ``` #### Svelte ```svelte

Instructions:

{#each collection.items as item (item.value)} {/each}
``` ## API Reference ### Props - **collection** (`ListCollection`) - The collection to manage selection for - **selectionMode** (`'single' | 'multiple' | 'none'`, default: `'single'`) - The selection mode - **deselectable** (`boolean`, default: `true`) - Whether selected items can be deselected - **initialSelectedValues** (`string[]`, default: `[]`) - Initial selected values - **resetOnCollectionChange** (`boolean`, default: `false`) - Whether to reset selection when collection changes ### Return Value The hook returns an object with the following properties and methods: #### State Properties - **selectedValues** (`string[]`) - Array of currently selected values - **isEmpty** (`boolean`) - Whether no items are selected - **firstSelectedValue** (`string | null`) - The first selected value in collection order - **lastSelectedValue** (`string | null`) - The last selected value in collection order #### Query Methods - **isSelected** (`(value: string | null) => boolean`) - Check if a value is selected - **canSelect** (`(value: string) => boolean`) - Check if a value can be selected - **isAllSelected** (`() => boolean`) - Check if all items are selected - **isSomeSelected** (`() => boolean`) - Check if some items are selected #### Selection Methods - **select** (`(value: string, forceToggle?: boolean) => void`) - Select a value - **deselect** (`(value: string) => void`) - Deselect a value - **toggle** (`(value: string) => void`) - Toggle selection of a value - **replace** (`(value: string | null) => void`) - Replace selection with a single value - **extend** (`(anchorValue: string, targetValue: string) => void`) - Extend selection from anchor to target - **setSelectedValues** (`(values: string[]) => void`) - Set the selected values - **setSelection** (`(values: string[]) => void`) - Set the selection (alias for setSelectedValues) - **clear** (`() => void`) - Clear all selections - **resetSelection** (`() => void`) - Reset selection to initial state