# 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 (
)
}
```
#### 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 (
)
}
```
#### Vue
```vue
```
#### Svelte
```svelte
```
### 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.isAllSelected() ? 'Deselect All' : 'Select All'}
{selection.selectedValues.length} of {collection.items.length} selected
{collection.items.map((item) => (
selection.select(item)} />
{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 (
)
}
```
#### Vue
```vue
```
#### Svelte
```svelte
{selection.isAllSelected() ? 'Deselect All' : 'Select All'}
{selection.selectedValues().length} of {collection.items.length} selected
{#each collection.items as item (item)}
selection.select(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:
Click to select single item
Ctrl/Cmd + Click to toggle individual items
Shift + Click to select range from first selected item
{collection.items.map((item) => (
handleItemClick(item.value, e)}
/>
{item.label}
))}
)
}
```
#### 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 (
)
}
```
#### Vue
```vue
Instructions:
Click to select single item
Ctrl/Cmd + Click to toggle individual items
Shift + Click to select range from first selected item
handleItemClick(item.value, e)"
:style="{
backgroundColor: selection.isSelected(item.value) ? '#e2e8f0' : 'transparent',
padding: '8px 12px',
cursor: 'pointer',
userSelect: 'none',
border: '1px solid #e2e8f0',
marginBottom: '2px',
}"
>
{{ item.label }}
```
#### Svelte
```svelte
Instructions:
Click to select single item
Ctrl/Cmd + Click to toggle individual items
Shift + Click to select range from first selected item
{#each collection.items as item (item.value)}
handleItemClick(item.value, e)}
/>
{item.label}
{/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