# Command
A searchable, ranked list of actions run from the keyboard: inline, in a popover, or as a command palette.
```ehtml Example
import {
Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem, CommandSeparator,
CommandShortcut, CommandDialog,
} from "@elements/ui/command";
import { Icon } from "@elements/ui/icon";
No results found.
go("/calendar")}> Calendar
Search Emoji
Profile ⌘P
...same parts...
```
## Parts
| Part | What it is |
|---|---|
| `Command` | The root: filters, ranks and highlights its items, and owns the keyboard. |
| `CommandInput` | The search input (role=combobox). Focus stays here; arrows move the highlight. |
| `CommandList` | The listbox. It scrolls past a height and exposes --command-list-height for a height transition. |
| `CommandEmpty` | Shown only when no item matches. |
| `CommandLoading` | A progress row for async items. |
| `CommandGroup` | A titled group. Hidden when none of its items match; ranked by its best match. |
| `CommandItem` | An action. value (or its text) and keywords are what the search matches; onSelect runs on click or Enter. |
| `CommandSeparator` | A line between groups; hidden while searching unless alwaysRender. |
| `CommandShortcut` | A key hint at the end of an item. |
| `CommandDialog` | Command in a modal Dialog, with an optional Cmd/Ctrl shortcut that toggles it. |
## Attributes
### Command
| Attribute | Type | Default | Description |
|---|---|---|---|
| `value` | `string` (two-way) | `""` | The highlighted item's value. Bind it to read or move the highlight. |
| `search` | `string` (two-way) | `""` | The search text. Bind it to read or set the query. |
| `label` | `string` | `"Command menu"` | Accessible name for the menu. |
| `filter` | `((value: string, search: string, keywords: string[]) => number) \| null` | `commandScore` | Ranks an item from 0 (hidden) to 1. null turns filtering and ranking off: render the results yourself, as for async or virtual lists. |
| `loop` | `boolean` | `false` | Arrow keys wrap from the last item to the first. |
| `vimBindings` | `boolean` | `true` | Ctrl+N and Ctrl+J move down, Ctrl+P and Ctrl+K move up. |
| `disablePointerSelection` | `boolean` | `false` | The mouse does not move the highlight. |
| `bordered` | `boolean` | `false` | Draw the overlay border and shadow, for a Command placed in the page. |
| `class` | `string` | `""` | Extra classes on the root; on CommandDialog, on the dialog content. |
| `onValueChange` | `(value: string) => void` | `() => {}` | The highlight moved. |
| `onSearchChange` | `(search: string) => void` | `() => {}` | The user typed. |
| `onKeyDown` | `(e: KeyboardEvent) => void` | `() => {}` | Every key on the root before Command handles it. e.preventDefault() takes the key (nested pages). |
### CommandInput
| Attribute | Type | Default | Description |
|---|---|---|---|
| `placeholder` | `string` | `"Type a command or search..."` | Input placeholder. |
| `disabled` | `boolean` | `false` | Disables the input. |
| `attrs` | `Record` | `{}` | Spread onto the input. |
### CommandList
| Attribute | Type | Default | Description |
|---|---|---|---|
| `label` | `string` | `"Suggestions"` | The listbox's accessible name. |
### CommandLoading
| Attribute | Type | Default | Description |
|---|---|---|---|
| `progress` | `number` | `-1` | 0 to 100 for determinate progress; -1 for none. |
| `label` | `string` | `"Loading..."` | Text and accessible name. |
### CommandGroup
| Attribute | Type | Default | Description |
|---|---|---|---|
| `heading` | `string` | `""` | The group's title, which names the group. |
| `value` | `string` | `its heading` | The group's data-value; give one when there is no heading. |
### CommandGroup, CommandItem
| Attribute | Type | Default | Description |
|---|---|---|---|
| `forceMount` | `boolean` | `false` | Show it whatever the search. |
### CommandItem
| Attribute | Type | Default | Description |
|---|---|---|---|
| `value` | `string` | `its text` | What the search matches and what onSelect and the root's value get. |
| `keywords` | `string[]` | `[]` | Aliases the search also matches. |
| `disabled` | `boolean` | `false` | Shown, skipped, does not run. |
| `onSelect` | `(value: string) => void` | `() => {}` | Runs on click or Enter. |
### CommandSeparator
| Attribute | Type | Default | Description |
|---|---|---|---|
| `alwaysRender` | `boolean` | `false` | Keep it while searching. |
### CommandDialog
| Attribute | Type | Default | Description |
|---|---|---|---|
| `open` | `boolean` (two-way) | `false` | Whether the palette is open. |
| `title, description` | `string` | `"Command Palette", "Search for a command to run..."` | The dialog's accessible name and description (visually hidden). |
| `showCloseButton` | `boolean` | `true` | Show the dialog's close button, at the end of the search row. |
| `shortcut` | `string` | `""` | A key that, with Cmd or Ctrl, toggles the palette from anywhere ("k"). |
| `value, search, label, filter, loop, vimBindings, disablePointerSelection, onValueChange, onSearchChange, onKeyDown` | `as on Command` | `as on Command` | Passed to the Command inside. |
| `onOpenChange` | `(open: boolean) => void` | `() => {}` | The palette opened or closed itself. |
## Slots
| Slot | Part | Content |
|---|---|---|
| `default` | | CommandInput and CommandList. |
| `default` | `CommandList` | Items, groups, separators, CommandEmpty and CommandLoading. |
| `default` | `CommandItem` | Icon, label, CommandShortcut. |
| `trigger` | `CommandDialog` | An element that opens the palette. |
## Keyboard
| Keys | Action |
|---|---|
| `Typing` | Filters and ranks; the best match is highlighted. |
| `ArrowDown / ArrowUp` | Next or previous item; wraps with loop. |
| `Ctrl + N / J, Ctrl + P / K` | Next and previous (vimBindings). |
| `Alt + ArrowDown / ArrowUp` | First item of the next or previous group; with no group that way, the next or previous item. |
| `Meta + ArrowDown / ArrowUp` | Last or first item. |
| `Home / End` | First or last item, also from the input. |
| `Enter` | Runs the highlighted item. |
| `Cmd / Ctrl + shortcut` | CommandDialog: toggles the palette. |
| `Escape` | Inline: clears a typed search. CommandDialog: closes and returns focus. |
| `Escape / Backspace on an empty search` | Pages demo: back a page, through onKeyDown. |
## Data attributes
| Attribute | Values | On | Description |
|---|---|---|---|
| `data-highlighted` | present | .command-item | The keyboard or mouse highlight. |
| `data-selected` | present | .command-item | Another name for the same highlight, set with data-highlighted, so styles written for either name apply. |
| `data-disabled` | present | .command-item | |
| `data-value` | string | .command-item, .command-group | The item's value (given, or its text, trimmed); the group's value or heading. |
| `hidden` | present | .command-item, .command-group, .command-separator, .command-empty | Filtered out. |
| `data-empty` | present | .command | Nothing matches. |
| `--command-list-height` | px | .command-list | Height of the list's content, for height: var(--command-list-height) with a transition. |
| `--command-max-height` | length | .command-list | Set it to change where the list starts scrolling. |
## Accessibility
- The input is a combobox named by label (aria-labelledby), with aria-autocomplete=list, aria-expanded=true) controlling the listbox; aria-activedescendant names the highlighted item.
- Items are options; the highlighted one has aria-selected=true. Disabled items have aria-disabled.
- While ranked, aria-posinset and aria-setsize give each item its place in the order shown.
- Groups are role=group named by their heading.
- CommandDialog is a modal Dialog named by its title and described by its description, both visually hidden.
- Focus stays in the input while the mouse presses items.
## See also
- [Icon](icon): An inline stroke icon from the set the templates draw their own controls with, sized in pixels and colored by the text around it.
- [Select](select): Pick one value, or several, from a styled listbox that lines the selected option up over the trigger.
- [Combobox](combobox): A text input that filters a list of options as you type, for one value or several shown as chips, with async results.