import type { CSSProperties, ReactNode } from "react"; export type HierarchicalMenuPosition = { x: number; y: number; }; export type HierarchicalMenuItem = | { kind: "action"; label: string; onSelect: () => void; testId?: string; disabled?: boolean; onHoverChange?: (hovered: boolean) => void; } | { kind: "group"; label: string; testId?: string; children: HierarchicalMenuItem[]; } | { kind: "separator"; }; interface HierarchicalMenuProps { title: string; position: HierarchicalMenuPosition; items: HierarchicalMenuItem[]; onClose(): void; } function clampMenuPosition(position: HierarchicalMenuPosition): HierarchicalMenuPosition { const horizontalPadding = 12; const verticalPadding = 12; const estimatedMenuWidth = 300; const estimatedMenuHeight = 420; return { x: Math.max(horizontalPadding, Math.min(position.x, window.innerWidth - estimatedMenuWidth - horizontalPadding)), y: Math.max(verticalPadding, Math.min(position.y, window.innerHeight - estimatedMenuHeight - verticalPadding)) }; } function renderHierarchicalMenuItems(items: HierarchicalMenuItem[], onClose: () => void): ReactNode { return items.map((item, index) => { if (item.kind === "separator") { return
; } if (item.kind === "group") { return (