Popover
Un panneau flottant ancré à un déclencheur, qui se redimensionne en douceur avec son contenu et suit la direction du déclencheur.
pnpm dlx shadcn@latest add https://hextaui.com/r/popover.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 cnCopiez et collez le code suivant dans votre projet.
components/ui/popover.tsx Mettez à jour les chemins d’import selon la configuration de votre projet.
Contenu qui change de taille
Quand le contenu grandit ou rétrécit, la popup anime sa hauteur au lieu de sauter. Les changements continus, comme la saisie, suivent directement le contenu pour que rien ne traîne.
Contrôlé
Passez open et onOpenChange pour le piloter depuis votre propre état. Le second argument indique pourquoi il a changé, par exemple trigger-press, outside-press ou escape-key.
Placement
side et align définissent la position préférée. Faute de place, la popup passe de l'autre côté et se décale pour rester à l'écran, en gardant 8px des bords.
Ouverture au survol
Définissez openOnHover sur le déclencheur pour des cartes d'aperçu. delay et closeDelay évitent le scintillement quand le pointeur passe dessus.
Déclencheurs détachés
Créez un handle avec createPopoverHandle pour partager un même popover entre plusieurs déclencheurs situés n'importe où dans l'arbre. Chaque déclencheur passe un payload, et la popup l'affiche via une fonction enfant.
Avec un calendrier
Utilisez className="w-auto p-0" pour ajuster un contenu qui apporte son propre padding. La popup suit le calendrier quand il change de mois.
Imbriqué
Un popover dans un autre popover ou dans une sheet se superpose à son parent. Les clics dans l'enfant gardent le parent ouvert, et Escape ne ferme que la couche la plus haute.
Contenu long
Le texte sans espace passe à la ligne dans la popup. Quand le contenu dépasse l'espace disponible, la popup défile en interne au lieu de sortir de l'écran.
Modal
Avec modal, le défilement de la page est verrouillé et les clics extérieurs ne font que fermer le popover. Rendez un <PopoverClose /> à l'intérieur pour que le focus puisse être piégé et que les lecteurs d'écran tactiles aient une issue.
Désactivé
Un déclencheur disabled n'ouvre jamais son popover.
De droite à gauche
La popup reprend la direction du déclencheur qui l'a ouverte, même si elle est rendue dans un portail. Les côtés logiques comme inline-end s'inversent avec elle.
| Touche | Action |
|---|---|
| EnterSpace | Sur le déclencheur, ouvre ou ferme le popover. Le focus passe dans la popup. |
| Tab | Parcourt le contenu de la popup. Sortir par Tab d'un popover non modal le ferme. |
| Esc | Ferme le popover et rend le focus au déclencheur. |
<PopoverTitle />et<PopoverDescription />nomment et décrivent la popup pour les lecteurs d'écran. Incluez un titre dès que la popup contient plus d'une phrase.- Le focus passe au premier élément focalisable à l'ouverture et revient au déclencheur à la fermeture. Modifiez cela avec
initialFocusetfinalFocus. - Avec la réduction des animations, la popup apparaît en fondu sans changement d'échelle.
Construit sur le popover de Base UI. Chaque partie accepte les props de la primitive qu'elle enveloppe.
| Prop | Type | Par défaut |
|---|---|---|
defaultOpen | boolean | false |
open | boolean | – |
onOpenChangedetails.reason indique la cause du changement. | (open: boolean, details) => void | – |
onOpenChangeCompleteAppelé à la fin de l’animation d’ouverture ou de fermeture. | (open: boolean) => void | – |
modaltrue verrouille le défilement de la page et l'interaction extérieure. trap-focus ne piège que le focus. | boolean | "trap-focus" | false |
handleRelie des déclencheurs détachés. | PopoverHandle<Payload> | – |
children | ReactNode | ({ payload }) => ReactNode | – |
| Prop | Type | Par défaut |
|---|---|---|
openOnHover | boolean | false |
delayMillisecondes avant l'ouverture au survol. | number | 300 |
closeDelayMillisecondes avant la fermeture à la fin du survol. | number | 0 |
handle | PopoverHandle<Payload> | – |
payloadTransmis à la popup quand ce déclencheur l'ouvre. | Payload | – |
disabled | boolean | false |
render | ReactElement | (props, state) => ReactElement | <button> |
| Attribut | Description |
|---|---|
data-slot="popover-trigger" | Ciblez le déclencheur en CSS. |
data-popup-open | Présent tant que son popover est ouvert. |
data-pressed | Présent tant que le déclencheur est enfoncé. |
data-disabled | Présent lorsque le déclencheur est désactivé. |
Rend le portail, le positionneur et la popup en une seule partie.
| Prop | Type | Par défaut |
|---|---|---|
side | "top" | "right" | "bottom" | "left" | "inline-start" | "inline-end" | "bottom" |
align | "start" | "center" | "end" | "center" |
sideOffsetEspace entre le déclencheur et la popup. | number | (data) => number | 6 |
alignOffset | number | (data) => number | 0 |
collisionPaddingEspace conservé par rapport aux bords du viewport. | number | Rect | 8 |
collisionAvoidanceFaut-il inverser, décaler ou ne rien faire quand la place manque. | CollisionAvoidance | – |
collisionBoundary | Boundary | – |
anchorSe positionne par rapport à autre chose que le déclencheur. | Element | RefObject | VirtualElement | () => Element | – |
sticky | boolean | false |
positionMethod | "absolute" | "fixed" | "absolute" |
initialFocusOù va le focus quand le popover s'ouvre. | boolean | RefObject | (type) => HTMLElement | boolean | – |
finalFocusOù va le focus quand le popover se ferme. | boolean | RefObject | (type) => HTMLElement | boolean | – |
portalPropsProps du portail, comme container. | PortalProps | – |
classNameLa popup fait w-72 par défaut. | string | (state) => string | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Description |
|---|---|
data-slot="popover-content" | Le popup. |
data-slot="popover-positioner" | L'élément qui positionne la popup. |
data-open | Présent tant que le popover est ouvert. |
data-starting-style | Présent pendant l'animation d'entrée de la popup. |
data-ending-style | Présent pendant l'animation de sortie de la popup. |
data-side | Le côté sur lequel la popup s'est placée. |
data-align | L'alignement finalement retenu par la popup. |
data-instant | Présent quand le changement ne doit pas être animé. |
--transform-origin | Le point à partir duquel la popup change d'échelle, au niveau du déclencheur. |
--available-width | Espace entre le déclencheur et le bord du viewport. |
--available-height | Espace entre le déclencheur et le bord du viewport. La hauteur maximale de la popup. |
--anchor-width | La largeur du déclencheur. |
--anchor-height | La hauteur du déclencheur. |
Un simple <div> qui empile le titre et la description.
| Attribut | Description |
|---|---|
data-slot="popover-header" | Ciblez l’en-tête en CSS. |
| Prop | Type | Par défaut |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <h2> |
| Attribut | Description |
|---|---|
data-slot="popover-title" | Nomme la popup. |
| Prop | Type | Par défaut |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <p> |
| Attribut | Description |
|---|---|
data-slot="popover-description" | Décrit la popup. |
| Prop | Type | Par défaut |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <button> |
| Attribut | Description |
|---|---|
data-slot="popover-close" | Ferme le popover quand on appuie dessus. |
createPopoverHandle<Payload>() renvoie un handle qui relie un <Popover /> à des déclencheurs rendus ailleurs. Créez-le une seule fois, en dehors de votre composant.
- 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.
- CommandUne liste d’actions recherchable, intégrée ou en palette ⌘K, avec pages, raccourcis et correspondances surlignées.
- 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.
- DialogUne fenêtre au-dessus de la page pour les formulaires et les tâches ciblées, avec en-tête et pied de page épinglés, imbrication, et une bottom sheet balayable sur mobile.
- DrawerUn panneau qui glisse depuis n’importe quel bord et suit votre doigt, avec des points d’accroche, une poignée fonctionnelle et des drawers imbriqués qui s’empilent.
- Dropdown menuUn menu d’actions et d’options derrière un bouton, avec groupes, sous-menus, éléments case à cocher et radio, et raccourcis.
Utilisé dans les blocks
Des blocks qui s’appuient sur Popover.
- Prompt InputUn champ de discussion qui démarre sur une seule ligne sobre, grandit en carte à mesure que vous écrivez et descend une fois la conversation lancée. Entrée envoie, sans risque avec la saisie japonaise et chinoise. Collez, déposez ou choisissez des fichiers avec aperçus, progression et nouvel essai. @ ajoute des fichiers et / lance des commandes depuis un menu au niveau du curseur. Un sélecteur de modèle avec touches numériques, un curseur d’effort qui s’anime à Max, un anneau de contexte, la dictée avec forme d’onde en direct, des chips d’outils, une file pour les messages saisis pendant qu’une réponse arrive en streaming, et des brouillons qui survivent à un rechargement.
- Agent TodosAffichez le plan d’un agent pendant son travail. Chaque étape passe de backlog à à faire, en cours puis terminé, avec des durées en direct, les échecs et les appels d’outils qui les sous-tendent. Une pastille de statut à placer au-dessus du champ de saisie, des changements de plan visibles et une étape de relecture pour modifier le plan avant son exécution.
- Diff ReviewRelisez les modifications d’un agent dans plusieurs fichiers avant qu’elles ne soient appliquées. Une arborescence de fichiers avec compteurs, acceptation ou rejet de chaque changement, de chaque fichier ou de tout, des commentaires sur n’importe quelle ligne ou plage renvoyés à l’agent, des vues unifiée et côte à côte, des surlignages au niveau du mot, l’annulation, des modifications en streaming et un résumé « 4 fichiers modifiés » pour le chat.
- Voice ModeParlez à votre assistant. Huit styles réactifs à l’audio, d’un ciel nuageux et d’une goutte de ferrofluide à des pixels tramés, de l’ASCII, une planète CRT, des points de demi-teinte, un anneau unique et une aura douce, plus quatre points réactifs. Une session plein écran avec coupure du micro, interruption et sous-titres, une pastille vocale dans le chat, un sélecteur de voix, et un moteur de navigateur qui écoute, attend que vous ayez fini et répond.