--- title: CommandPalette description: Add a customizable command palette to your app. links: - label: GitHub icon: i-simple-icons-github to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/navigation/CommandPalette.vue - label: 'Combobox' icon: i-simple-icons-headlessui to: 'https://headlessui.com/vue/combobox' --- ## Usage Use a `v-model` to display a searchable and selectable list of commands. ::component-example --- padding: false component: 'command-palette-example-basic' componentProps: class: 'h-[257px]' --- :: You can put a `CommandPalette` anywhere you want but it's most commonly used inside of a modal. :component-example{component="command-palette-example-modal"} You can pass multiple groups of commands to the component. Each group will be separated by a divider and will display a label. Without a `v-model`, you can also listen on `@update:model-value` to navigate to a link or do something else when a command is clicked. ::component-example --- padding: false component: 'command-palette-example-groups' componentProps: class: 'h-[274px]' --- :: ### Icon Use any icon from [Iconify](https://icones.js.org) by setting the `icon` prop by using this pattern: `i-{collection_name}-{icon_name}`. Use the `selected-icon` prop to set a different icon or change it globally in `ui.commandPalette.default.selectedIcon`. Defaults to `i-heroicons-check-20-solid`. ::component-card --- padding: false baseProps: emptyState: null props: icon: 'i-heroicons-command-line' excludedProps: - icon --- :: ### Loading Use the `loading` prop to show a loading icon. Use the `loading-icon` prop to set a different icon or change it globally in `ui.commandPalette.default.loadingIcon`. Defaults to `i-heroicons-arrow-path-20-solid`. ::component-card --- padding: false baseProps: emptyState: null props: loading: true excludedProps: - icon --- :: ### Placeholder Use the `placeholder` prop to change the input placeholder ::component-card --- padding: false baseProps: emptyState: null props: placeholder: 'Type a command...' excludedProps: - icon --- :: ### Close Use the `close-button` prop to display a close button on the right side of the input. You can pass all the props of the [Button](/elements/button) component to customize it through the `close-button` prop or globally through `ui.commandPalette.default.closeButton`. ::component-card --- padding: false baseProps: emptyState: null props: closeButton: icon: 'i-heroicons-x-mark-20-solid' color: 'gray' variant: 'link' padded: false excludedProps: - closeButton --- :: ### Empty An empty state will be displayed when there are no results. Use the `empty-state` prop to customize the `icon` and `label` or change them globally in `ui.commandPalette.default.emptyState`. You can also set it to `null` to hide the empty state. ::component-card --- padding: false baseProps: placeholder: 'Type something to see the empty label change' props: emptyState: icon: 'i-heroicons-magnifying-glass-20-solid' label: "We couldn't find any items." queryLabel: "We couldn't find any items with that term. Please try again." excludedProps: - emptyState --- :: ## Full-text search The CommandPalette component takes care of the full-text search for you with [Fuse.js](https://fusejs.io). You can pass all the options of Fuse.js through the `fuse` prop. When searching for a command, the component will look for a `label` property on the command by default. You can customize this behavior by overriding the `command-attribute` prop. This will also affect the display of the command. You can also highlight the matches in the command by setting the `fuse.fuseOptions.includeMatches` to `true`. The CommandPalette component automatically takes care of the highlighting for you. ```vue ``` ::callout{icon="i-heroicons-light-bulb"} Try it yourself in this documentation's search by pressing :kbd{value="meta"} :kbd{value="K" class="ml-1"}. :: ## Async search You can also pass an `async` function to the `search` property of a group to perform an async search. The function will receive the query as its first argument and should return an array of commands. ::component-example --- padding: false component: 'command-palette-example-async' componentProps: class: 'h-[274px]' --- :: ::callout{icon="i-heroicons-light-bulb"} The `loading` state will automatically be enabled when a `search` function is loading. You can disable this behavior by setting the `loading-icon` prop to `null` or globally in `ui.commandPalette.default.loadingIcon`. :: ## Slots ### `-icon` Use the `#-icon` slot to override the left command content which display by default the `icon`, `avatar` and `chip`. ### `-command` Use the `#-command` slot to override the command content which display by default the `prefix`, `suffix` and `label` (customizable through the `command-attribute` prop). ### `-active` Use the `#-active` slot to override the right command content (when hovered) which display by default the `active` field of the group if provided. ### `-inactive` Use the `#-inactive` slot to override the right command content (when not hovered) which display by default the `inactive` field of the group if provided or the `shortcuts` of the command. ::callout{icon="i-heroicons-light-bulb"} The 4 slots above will have access to the `group`, `command`, `active` and `selected` properties in the slot scope. :: ### `empty-state` Use the `#empty-state` slot to customize the empty state. ::component-example --- padding: false overflowClass: 'overflow-x-auto' component: 'command-palette-example-empty-slot' componentProps: class: 'flex-1' --- :: ## Props :component-props ## Preset :component-preset