Kontextmenü

Ein komponierbares, portalbasiertes Kontextmenü für die DayFlow-Oberfläche. Es unterstützt verschachtelte Untermenüs, Beschriftungen, Trennlinien und einen eingebauten Farbwähler. Es schließt sich selbstständig bei einem Klick außerhalb, beim Scrollen, beim Ändern der Fenstergröße oder mit 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

In Projekten, die bereits Tailwind CSS verwenden, importieren Sie das reine Komponenten-Bundle:

@import '@dayflow/ui-context-menu/dist/styles.components.css';
@import 'tailwindcss';

In Projekten ohne Tailwind CSS importieren Sie stattdessen das vollständige Stylesheet:

import {
  ContextMenu,
  ContextMenuItem,
  ContextMenuSeparator,
  ContextMenuLabel,
  ContextMenuSub,
  ContextMenuSubTrigger,
  ContextMenuSubContent,
  ContextMenuColorPicker,
} from '@dayflow/ui-context-menu';
import '@dayflow/ui-context-menu/dist/styles.css';

Grundlegende Verwendung

Rendern Sie ContextMenu an der Cursorposition, die Sie aus einem contextmenu-Ereignis übernehmen.

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>
  );
}

Mit Beschriftungen und Symbolen

<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>

Verschachtelte Untermenüs

Umschließen Sie Einträge mit ContextMenuSub, um Untermenüs zu erzeugen, die beim Überfahren aufklappen. Das Untermenü positioniert sich automatisch neu, damit es nicht über den sichtbaren Bereich hinausragt.

<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>

Farbwähler

ContextMenuColorPicker zeigt eine Reihe vordefinierter Farbfelder und optional eine Aktion „Eigene Farbe“.

<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>

Deaktivierte Einträge

<ContextMenuItem onClick={() => onPaste()} disabled={!hasClipboard}>
  Paste
</ContextMenuItem>

API-Referenz

ContextMenu

PropTypBeschreibung
xnumberHorizontale Position (etwa event.clientX)
ynumberVertikale Position (etwa event.clientY)
onClose() => voidWird aufgerufen, wenn sich das Menü schließen soll
childrenComponentChildrenMenüeinträge
classNamestringZusätzliche CSS-Klassen für den Menücontainer

ContextMenuItem

PropTypStandardBeschreibung
onClick() => voidKlick-Handler
childrenComponentChildrenBeschriftung des Eintrags
iconComponentChildrenSymbol links neben der Beschriftung
dangerbooleanfalseStellt den Eintrag in destruktivem Rot dar
disabledbooleanfalseMacht den Eintrag nicht anklickbar

ContextMenuColorPicker

PropTypStandardBeschreibung
selectedColorstringAktuell aktive Farbe (Hex)
onSelect(color: string) => voidWird beim Klick auf ein Farbfeld aufgerufen
onCustomColor() => voidWird beim Klick auf die Zeile für eigene Farben aufgerufen
customColorLabelstring"Custom Color"Beschriftung der Aktion für eigene Farben

Weitere Exporte

KomponenteBeschreibung
ContextMenuSeparatorWaagerechte Trennlinie
ContextMenuLabelNicht interaktive Abschnittsüberschrift
ContextMenuSubWrapper, der den Öffnungszustand eines Untermenüs verwaltet
ContextMenuSubTriggerZeile, die das Untermenü beim Überfahren einblendet
ContextMenuSubContentDas schwebende Untermenü-Panel

Auf dieser Seite