Command
Une liste d’actions recherchable, intégrée ou en palette ⌘K, avec pages, raccourcis et correspondances surlignées.
pnpm dlx shadcn@latest add https://hextaui.com/r/command.jsonAjoute le composant, les tokens de thème HextaUI et les composants HextaUI dont il dépend.
Ajoutez les tokens de thème à votre CSS global, si ce n’est pas déjà fait.
Installez les dépendances.
pnpm add @base-ui/react @tabler/icons-react class-variance-authority cmdk cnCopiez et collez le code suivant dans votre projet.
components/ui/command.tsx components/ui/button.tsx lib/motion.ts Mettez à jour les chemins d’import selon la configuration de votre projet.
Les raccourcis utilisent mod pour ⌘ sur les appareils Apple et Ctrl partout ailleurs. Les libellés sont formatés pour chaque plateforme.
Basique
La saisie filtre et classe les éléments au fur et à mesure. Les groupes sans correspondance disparaissent, et la hauteur de la liste s’anime pour s’adapter à ce qui reste.
Dialog
Placez un <Command /> dans <CommandDialog /> et basculez-le avec useCommandHotkey. Appuyez sur ⌘K ou Ctrl K. Les raccourcis d’éléments s’exécutent pendant l’ouverture, les correspondances sont mises en évidence, et preserveSearch conserve la requête et la sélection pour la prochaine ouverture.
Pages
Un élément avec page ouvre le <CommandPage /> correspondant. Le titre de la page apparaît comme une chip dans le champ, la liste glisse depuis le côté, et Backspace dans une recherche vide ou Escape revient en arrière.
Défilant
Les longues listes défilent dans une hauteur plafonnée. L’élément sélectionné reste toujours visible pendant la navigation au clavier.
Résultats asynchrones
Définissez shouldFilter={false} et rendez les résultats que vous récupérez. <CommandLoading /> attend 150 ms avant d’apparaître puis reste au moins 300 ms : les réponses rapides n’affichent donc jamais un spinner furtif. Essayez les deux latences.
Contenu long
Les titres passent à la ligne, les noms longs sont tronqués ou passent à la ligne selon votre choix, et les raccourcis ne sont jamais repoussés.
De droite à gauche
Les icônes, les raccourcis, la chip de page et le glissement des pages suivent tous le sens de lecture.
| Touche | Action |
|---|---|
| ↓ | Sélectionne l’élément suivant. |
| ↑ | Sélectionne l’élément précédent. |
| Alt↓ | Saute au premier élément du groupe suivant. |
| Alt↑ | Saute au premier élément du groupe précédent. |
| Home | Sélectionne le premier élément. |
| End | Sélectionne le dernier élément. |
| CtrlN | Sélectionne l’élément suivant. Ctrl J fonctionne aussi. Désactivez avec vimBindings. |
| CtrlP | Sélectionne l’élément précédent. Ctrl K fonctionne aussi. Désactivez avec vimBindings. |
| Enter | Exécute l’élément sélectionné. Sur un élément de type lien, ⌘ Enter ou Ctrl Enter l’ouvre dans un nouvel onglet. |
| Esc | Efface d’abord la recherche, puis revient d’une page en arrière, puis ferme la boîte de dialogue. |
| Backspace | Revient d’une page en arrière lorsque la recherche est vide. |
| ⌘P | Tout raccourci d’élément exécute son élément tant que le focus est dans le menu de commandes. |
- Le champ est un combobox qui pointe vers l’élément sélectionné : les lecteurs d’écran annoncent donc chaque élément au fil du déplacement.
- Une région live polie annonce le nombre de résultats peu après l’arrêt de la saisie, et annonce le titre de la page à l’ouverture ou à la sortie d’une page. Modifiez la formulation avec
formatResultsetrootTitle. <CommandDialog />a un titre et une description masqués, piège le focus pendant l’ouverture et le rend au déclencheur à la fermeture.- Les raccourcis d’éléments sont exposés avec
aria-keyshortcuts. - Avec la réduction des animations, les éléments s’exécutent sans clignotement de confirmation et les pages se fondent au lieu de glisser.
Construit sur cmdk, avec <CommandDialog /> sur la boîte de dialogue de Base UI. Les parties acceptent les props de la partie cmdk qu’elles enveloppent.
| Prop | Type | Par défaut |
|---|---|---|
labelNom accessible du menu. | string | "Command menu" |
highlightMet en évidence les lettres correspondantes dans chaque élément et atténue le reste. | boolean | false |
shouldFilterDéfinissez à false pour filtrer et trier les éléments vous-même, par exemple lorsque les résultats viennent d’un serveur. | boolean | true |
filterRetourne un score de 0 (masqué) à 1 (meilleure correspondance). | (value: string, search: string, keywords?: string[]) => number | – |
valueLa valeur de l’élément sélectionné. | string | – |
defaultValue | string | – |
onValueChange | (value: string) => void | – |
loopReboucle aux extrémités de la liste. | boolean | false |
vimBindingsNavigation avec Ctrl N, J, P et K. | boolean | true |
disablePointerSelection | boolean | false |
formatResultsTexte annoncé aux lecteurs d’écran après la saisie. | (count: number) => string | "3 results" |
rootTitleAnnoncé lorsque vous quittez la dernière page et revenez à la racine. | string | "All commands" |
| Attribut | Description |
|---|---|
data-slot="command" | Ciblez la racine en CSS. |
data-highlighting | Présent lorsque highlight est activé et que la recherche n’est pas vide. |
--command-radius | Rayon extérieur. Les éléments en déduisent un rayon concentrique. |
--command-inset | Remplissage entre le bord de la liste et ses éléments. |
| Prop | Type | Par défaut |
|---|---|---|
open | boolean | – |
defaultOpen | boolean | false |
onOpenChange | (open: boolean, details) => void | – |
preserveSearchGarde la boîte de dialogue montée pour que la requête, la page et la sélection survivent à la fermeture. La requête est sélectionnée à la réouverture. | boolean | false |
titleTitre de la boîte de dialogue masqué visuellement. | string | "Command menu" |
descriptionDescription de la boîte de dialogue masquée visuellement. | string | "Search for a command to run." |
showCloseButton | boolean | false |
classNameAppliqué à la popup de la boîte de dialogue. | string | – |
| Attribut | Description |
|---|---|
data-slot="command-dialog" | La popup de la boîte de dialogue. |
data-slot="command-dialog-overlay" | L’arrière-plan. |
data-open | Présent sur la popup tant qu’elle est ouverte. |
| Prop | Type | Par défaut |
|---|---|---|
valueTexte de recherche contrôlé. | string | – |
onValueChange | (search: string) => void | – |
placeholder | string | – |
clearLabelNom accessible du bouton d’effacement. | string | "Clear search" |
backLabelNom accessible de la chip de page. | (title: string) => string | (title) => `Back from ${title}` |
| Attribut | Description |
|---|---|
data-slot="command-input" | Le champ. |
data-slot="command-input-wrapper" | La ligne qui contient l’icône, le champ et le bouton d’effacement. |
data-slot="command-clear" | Le bouton d’effacement, affiché dès que vous saisissez. |
data-slot="command-page-chip" | La chip de retour affichée sur une page. |
| Prop | Type | Par défaut |
|---|---|---|
labelNom accessible de la liste. | string | – |
| Attribut | Description |
|---|---|
data-slot="command-list" | La liste. |
data-settled | Présent une fois que la liste s’est mesurée. La transition de hauteur ne s’exécute que lorsqu’il est défini. |
--cmdk-list-height | Hauteur des éléments visibles, utilisée pour animer la liste. |
| Prop | Type | Par défaut |
|---|---|---|
childrenUtilisez la forme fonction pour répéter la requête. | ReactNode | (search: string) => ReactNode | – |
| Attribut | Description |
|---|---|
data-slot="command-empty" | Masqué tant qu’un CommandLoading est dans la liste. |
| Prop | Type | Par défaut |
|---|---|---|
loading | boolean | true |
delayMillisecondes d’attente avant l’affichage du spinner. | number | 150 |
minDurationNombre minimal de millisecondes pendant lesquelles le spinner reste une fois affiché. | number | 300 |
labelLibellé accessible. Par défaut, les enfants de type chaîne. | string | – |
progress | number | – |
| Attribut | Description |
|---|---|
data-slot="command-loading" | La ligne de chargement. |
data-pending | Présent pendant le délai, lorsque la ligne est annoncée mais pas encore visible. |
| Prop | Type | Par défaut |
|---|---|---|
heading | ReactNode | – |
valueRequis lorsqu’il n’y a pas de titre. | string | – |
forceMountGarde le groupe visible pendant le filtrage. | boolean | false |
| Attribut | Description |
|---|---|
data-slot="command-group" | Le groupe. |
[cmdk-group-heading] | L’élément de titre. |
| Prop | Type | Par défaut |
|---|---|---|
onSelectS’exécute au clic, sur Enter ou avec le raccourci de l’élément, après le clignotement de confirmation. | (value: string) => void | – |
valueUtilisé pour le filtrage. Par défaut, le texte de l’élément, sans le raccourci. | string | – |
keywordsMots supplémentaires qui correspondent à cet élément. | string[] | – |
disabled | boolean | false |
shortcutUn raccourci comme "mod+shift+c". Affiché sur l’élément et l’exécute lorsque le focus est dans le menu. | string | – |
pageOuvre le CommandPage avec cet id au lieu de s’exécuter. | string | – |
pageTitleTitre affiché dans la chip de page. Par défaut, la valeur. | string | – |
hrefRend l’élément comme un lien. Enter le suit, ⌘ ou Ctrl Enter l’ouvre dans un nouvel onglet. | string | – |
renderUn élément de lien à rendre à la place, comme <Link /> de Next.js. | ReactElement | – |
confirmFait clignoter brièvement l’élément avant de l’exécuter, pour que le choix soit perceptible. | boolean | true |
forceMountGarde l’élément visible pendant le filtrage. | boolean | false |
| Attribut | Description |
|---|---|
data-slot="command-item" | L’élément. |
data-selected="true" | Présent sur l’élément sélectionné. |
data-disabled="true" | Présent sur les éléments désactivés. |
data-value | La valeur utilisée pour le filtrage. |
data-confirming | Présent pendant le clignotement de confirmation. |
data-page | Présent sur les éléments qui ouvrent une page. |
| Prop | Type | Par défaut |
|---|---|---|
idCorrespond à la prop page de l’élément qui l’ouvre. Ses groupes et ses éléments ne sont rendus que lorsqu’elle est la page courante. | string | – |
| Prop | Type | Par défaut |
|---|---|---|
hotkeyFormate un raccourci comme "mod+k" pour la plateforme actuelle. Les enfants le remplacent. | string | – |
| Attribut | Description |
|---|---|
data-slot="command-shortcut" | Le libellé du raccourci. |
| Prop | Type | Par défaut |
|---|---|---|
alwaysRenderLe garde visible pendant la recherche. | boolean | false |
| Attribut | Description |
|---|---|
data-slot="command-separator" | Le séparateur. |
| Prop | Type | Par défaut |
|---|---|---|
childrenPar défaut, des indications de touches qui se mettent à jour selon la page. Masqué sur écran tactile. | ReactNode | – |
| Attribut | Description |
|---|---|
data-slot="command-footer" | Le pied de page. |
| Prop | Type | Par défaut |
|---|---|---|
hotkeyÉcouté sur tout le document. Les raccourcis sans modificateur sont ignorés pendant la saisie dans un champ. | string | – |
callback | (event: KeyboardEvent) => void | – |
options.enabled | boolean | true |
Indique si un indicateur de chargement doit être visible, avec les mêmes délai et durée minimale que <CommandLoading />. Utilisez-le pour masquer les résultats périmés pendant qu’une requête est en cours.
| Prop | Type | Par défaut |
|---|---|---|
loading | boolean | – |
options.delay | number | 150 |
options.minDuration | number | 300 |
useCommandPages()retourne{ pages, page, push, pop, reset }pour piloter les pages depuis votre propre code.useCommandState(selector)lit l’état de cmdk, comme la recherche ou le nombre d’éléments filtrés.useHotkeyLabel(hotkey)formate un raccourci pour la plateforme actuelle, comme ⌘K ou Ctrl+K.
- ButtonDes boutons dans toutes les variantes et tailles, avec un flux de chargement, de succès et d’erreur intégré qui évite le spinner pour les requêtes rapides.
- HotkeyAnalysez, libellez, annoncez et faites correspondre des raccourcis clavier, avec ⌘ sur les plateformes Apple et Ctrl partout ailleurs.
- MotionLes courbes d’easing, les durées et la vérification de réduction des animations utilisées par chaque composant, ainsi que des hooks pour les morphs de taille et les surlignages glissants.
- SpinnerUn indicateur de chargement avec des graduations façon Apple ou un anneau qui respire, pouvant attendre avant de s’afficher et rester assez longtemps pour ne pas clignoter.
- Alert dialogUne boîte de dialogue de confirmation pour les actions destructrices ou importantes, qui attend le travail asynchrone et devient une bottom sheet sur mobile.
- Context menuUn menu d’actions au clic droit ou à l’appui long, avec sous-menus, éléments case à cocher et radio, et retour visuel de maintien au toucher.
Utilisé dans les blocks
Des blocks qui s’appuient sur Command.