Menu contextuel
Un menu contextuel composable, basé sur des portails, pour l'interface DayFlow. Il gÚre les sous-menus imbriqués, les libellés, les séparateurs et un sélecteur de couleur intégré. Il se ferme automatiquement au clic extérieur, au défilement, au redimensionnement ou avec Escape.
Installation
Pour les projets qui utilisent déjà Tailwind CSS, importez le bundle « composants uniquement » :
@import '@dayflow/ui-context-menu/dist/styles.components.css';
@import 'tailwindcss';Pour les projets sans Tailwind CSS, importez plutĂŽt la feuille de style complĂšte :
import {
ContextMenu,
ContextMenuItem,
ContextMenuSeparator,
ContextMenuLabel,
ContextMenuSub,
ContextMenuSubTrigger,
ContextMenuSubContent,
ContextMenuColorPicker,
} from '@dayflow/ui-context-menu';
import '@dayflow/ui-context-menu/dist/styles.css';Utilisation de base
Affichez ContextMenu à la position du curseur capturée depuis un événement contextmenu.
import { useState } from 'react';
import {
ContextMenu,
ContextMenuItem,
ContextMenuSeparator,
} from '@dayflow/ui-context-menu';
function MyComponent() {
const [menu, setMenu] = useState<{ x: number; y: number } | null>(null);
const handleContextMenu = (e: React.MouseEvent) => {
e.preventDefault();
setMenu({ x: e.clientX, y: e.clientY });
};
return (
<div onContextMenu={handleContextMenu}>
Right-click here
{menu && (
<ContextMenu x={menu.x} y={menu.y} onClose={() => setMenu(null)}>
<ContextMenuItem onClick={() => console.log('Edit')}>
Edit
</ContextMenuItem>
<ContextMenuItem onClick={() => console.log('Copy')}>
Copy
</ContextMenuItem>
<ContextMenuSeparator />
<ContextMenuItem onClick={() => console.log('Delete')} danger>
Delete
</ContextMenuItem>
</ContextMenu>
)}
</div>
);
}Avec libellés et icÎnes
<ContextMenu x={x} y={y} onClose={onClose}>
<ContextMenuLabel>Actions</ContextMenuLabel>
<ContextMenuItem icon={<PencilIcon />} onClick={() => onEdit()}>
Edit Event
</ContextMenuItem>
<ContextMenuItem icon={<CopyIcon />} onClick={() => onDuplicate()}>
Duplicate
</ContextMenuItem>
<ContextMenuSeparator />
<ContextMenuItem icon={<TrashIcon />} onClick={() => onDelete()} danger>
Delete
</ContextMenuItem>
</ContextMenu>Sous-menus imbriqués
Enveloppez les Ă©lĂ©ments dans ContextMenuSub pour crĂ©er des sous-menus dĂ©clenchĂ©s au survol. Le sous-menu se repositionne automatiquement pour ne pas dĂ©border de la fenĂȘtre.
<ContextMenu x={x} y={y} onClose={onClose}>
<ContextMenuItem onClick={() => onEdit()}>Edit</ContextMenuItem>
<ContextMenuSub>
<ContextMenuSubTrigger>Move to</ContextMenuSubTrigger>
<ContextMenuSubContent>
<ContextMenuItem onClick={() => onMove('work')}>Work</ContextMenuItem>
<ContextMenuItem onClick={() => onMove('personal')}>
Personal
</ContextMenuItem>
</ContextMenuSubContent>
</ContextMenuSub>
<ContextMenuSeparator />
<ContextMenuItem danger onClick={() => onDelete()}>
Delete
</ContextMenuItem>
</ContextMenu>Sélecteur de couleur
ContextMenuColorPicker affiche une rangée de pastilles prédéfinies et, en option, une action « Couleur personnalisée ».
<ContextMenu x={x} y={y} onClose={onClose}>
<ContextMenuLabel>Calendar Color</ContextMenuLabel>
<ContextMenuColorPicker
selectedColor={currentColor}
onSelect={color => {
updateCalendarColor(color);
onClose();
}}
onCustomColor={() => openColorDialog()}
customColorLabel='Custom color...'
/>
</ContextMenu>ĂlĂ©ments dĂ©sactivĂ©s
<ContextMenuItem onClick={() => onPaste()} disabled={!hasClipboard}>
Paste
</ContextMenuItem>Référence de l'API
ContextMenu
| Prop | Type | Description |
|---|---|---|
x | number | Position horizontale (par exemple event.clientX) |
y | number | Position verticale (par exemple event.clientY) |
onClose | () => void | Appelé lorsque le menu doit se fermer |
children | ComponentChildren | ĂlĂ©ments du menu |
className | string | Classes CSS supplémentaires pour le conteneur du menu |
ContextMenuItem
| Prop | Type | Par défaut | Description |
|---|---|---|---|
onClick | () => void | â | Gestionnaire de clic |
children | ComponentChildren | â | LibellĂ© de l'Ă©lĂ©ment |
icon | ComponentChildren | â | IcĂŽne affichĂ©e Ă gauche du libellĂ© |
danger | boolean | false | Affiche l'élément en rouge, comme action destructive |
disabled | boolean | false | Rend l'élément non interactif |
ContextMenuColorPicker
| Prop | Type | Par défaut | Description |
|---|---|---|---|
selectedColor | string | â | Couleur active (hex) |
onSelect | (color: string) => void | â | AppelĂ© au clic sur une pastille |
onCustomColor | () => void | â | AppelĂ© au clic sur la ligne de couleur personnalisĂ©e |
customColorLabel | string | "Custom Color" | Libellé de l'action de couleur personnalisée |
Autres exports
| Composant | Description |
|---|---|
ContextMenuSeparator | Ligne de séparation horizontale |
ContextMenuLabel | Titre de section, non interactif |
ContextMenuSub | Conteneur qui gÚre l'état d'ouverture d'un sous-menu |
ContextMenuSubTrigger | Ligne qui révÚle le sous-menu au survol |
ContextMenuSubContent | Le panneau flottant du sous-menu |