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

npm install @dayflow/ui-context-menu
pnpm add @dayflow/ui-context-menu
yarn add @dayflow/ui-context-menu
bun add @dayflow/ui-context-menu

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

PropTypeDescription
xnumberPosition horizontale (par exemple event.clientX)
ynumberPosition verticale (par exemple event.clientY)
onClose() => voidAppelé lorsque le menu doit se fermer
childrenComponentChildrenÉlĂ©ments du menu
classNamestringClasses CSS supplémentaires pour le conteneur du menu

ContextMenuItem

PropTypePar défautDescription
onClick() => void—Gestionnaire de clic
childrenComponentChildren—LibellĂ© de l'Ă©lĂ©ment
iconComponentChildren—IcĂŽne affichĂ©e Ă  gauche du libellĂ©
dangerbooleanfalseAffiche l'élément en rouge, comme action destructive
disabledbooleanfalseRend l'élément non interactif

ContextMenuColorPicker

PropTypePar défautDescription
selectedColorstring—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
customColorLabelstring"Custom Color"Libellé de l'action de couleur personnalisée

Autres exports

ComposantDescription
ContextMenuSeparatorLigne de séparation horizontale
ContextMenuLabelTitre de section, non interactif
ContextMenuSubConteneur qui gÚre l'état d'ouverture d'un sous-menu
ContextMenuSubTriggerLigne qui révÚle le sous-menu au survol
ContextMenuSubContentLe panneau flottant du sous-menu

Dans cette page