Tooltip
A popup that displays information related to an element on focus or hover.
Tooltip — infobulle contextuelle qui apparaît au hover ou au focus du trigger. Contenu court (nom d'un bouton icône, shortcut clavier, description brève). Pour du contenu riche préférer HoverCard.
Pattern PRISM : le trigger et le content sont frères dans un wrapper Tooltip. L'island CSS-only rend le content via opacity-0 → group-hover:opacity-100 group-focus-within:opacity-100. Zéro JS.
Installation
$ bext ui add tooltip
Copy and paste the following into src/components/ui/tooltip.tsx.
This component is interactive — make sure the shared island is loaded (see Islands). It reacts to data-ui="tooltip" hooks.
Usage
Anatomy
<Tooltip> ├── <TooltipTrigger> │ └── <Button>Hover me</Button> └── <TooltipContent>Add to library</TooltipContent>
API Reference
Tooltip
| Prop | Type | Default | Description |
|---|---|---|---|
| className | string | — | Wrapper relative inline-block (group). |
TooltipTrigger
| Prop | Type | Default | Description |
|---|---|---|---|
| children | ReactNode | — | Élément déclencheur (bouton, icône, texte). |
TooltipContent
| Prop | Type | Default | Description |
|---|---|---|---|
| className | string | — | Contenu de l'infobulle. Défaut : absolute bg-primary text-primary-foreground text-xs px-2 py-1 rounded-md, invisible → visible au hover. |
Data Attributes
Attributs qu'on peut cibler en CSS custom pour override le style par état.
| Attribute | On | Values | Description |
|---|---|---|---|
| group | Tooltip | — | Utilisé par group-hover: / group-focus-within: sur TooltipContent. |
Keyboard
| Key | Action |
|---|---|
| Tab | Focus le trigger → tooltip visible. |
Accessibility
TooltipContent devrait porter role="tooltip" pour être annoncé aux AT.
Le trigger doit rester utilisable au clavier (pas seulement au hover). Le CSS group-focus-within active le tooltip aussi au focus keyboard — vérifier.
Contenu doit rester court (≤ 60 caractères). Pour plus, utiliser HoverCard ou Popover.
Examples
Sur icône (icon button)
Edit this component live in the bext playground. The PRISM + signals version is the bext-native idiom — fine-grained reactivity, no virtual DOM.
On This Page