diff --git a/frontend/app/element/dropdown.less b/frontend/app/element/dropdown.less index 5d67ce8b..1cdc91a9 100644 --- a/frontend/app/element/dropdown.less +++ b/frontend/app/element/dropdown.less @@ -27,7 +27,8 @@ letter-spacing: -0.12px; width: 100%; - &:hover { + &:hover, + &.active { background-color: var(--accent-color); } diff --git a/frontend/app/element/dropdown.tsx b/frontend/app/element/dropdown.tsx index 545a1323..a1ef9576 100644 --- a/frontend/app/element/dropdown.tsx +++ b/frontend/app/element/dropdown.tsx @@ -11,6 +11,7 @@ const SubMenu = memo( parentKey, subMenuPosition, visibleSubMenus, + hoveredItems, handleMouseEnterItem, subMenuRefs, }: { @@ -18,9 +19,11 @@ const SubMenu = memo( parentKey: string; subMenuPosition: any; visibleSubMenus: any; + hoveredItems: string[]; handleMouseEnterItem: any; subMenuRefs: any; }) => { + // Ensure a ref exists for each submenu subItems.forEach((_, idx) => { const newKey = `${parentKey}-${idx}`; if (!subMenuRefs.current[newKey]) { @@ -41,11 +44,13 @@ const SubMenu = memo( }} > {subItems.map((item, idx) => { - const newKey = `${parentKey}-${idx}`; + const newKey = `${parentKey}-${idx}`; // Full hierarchical key + const isActive = hoveredItems.includes(newKey); // Check if this item is hovered or in the hierarchy + return (
handleMouseEnterItem(event, parentKey, idx, item)} > {item.label} @@ -56,6 +61,7 @@ const SubMenu = memo( parentKey={newKey} subMenuPosition={subMenuPosition} visibleSubMenus={visibleSubMenus} + hoveredItems={hoveredItems} // Pass hoveredItems to submenus handleMouseEnterItem={handleMouseEnterItem} subMenuRefs={subMenuRefs} /> @@ -88,6 +94,7 @@ const Dropdown = memo( className?: string; }) => { const [visibleSubMenus, setVisibleSubMenus] = useState<{ [key: string]: any }>({}); + const [hoveredItems, setHoveredItems] = useState([]); // Track hovered items and ancestors const [subMenuPosition, setSubMenuPosition] = useState<{ [key: string]: { top: number; left: number; label: string }; }>({}); @@ -107,6 +114,8 @@ const Dropdown = memo( } }); + console.log("hoveredItems", hoveredItems); + useLayoutEffect(() => { if (anchorRef.current && dropdownRef.current) { const anchorRect = anchorRef.current.getBoundingClientRect(); @@ -215,6 +224,14 @@ const Dropdown = memo( return updatedState; }); + // Update the hovered items state (including ancestors) + const newHoveredItems = key.split("-").reduce((acc, part, idx) => { + if (idx === 0) return [part]; + return [...acc, `${acc[idx - 1]}-${part}`]; + }, [] as string[]); + + setHoveredItems(newHoveredItems); + const itemRect = event.currentTarget.getBoundingClientRect(); handleSubMenuPosition(key, itemRect, dropdownRef, item.label); }; @@ -227,10 +244,12 @@ const Dropdown = memo( > {items.map((item, index) => { const key = `${index}`; + const isActive = hoveredItems.includes(key); // Check if the current item is hovered or in the hierarchy + return (
handleMouseEnterItem(event, null, index, item)} > {item.label} @@ -241,6 +260,7 @@ const Dropdown = memo( parentKey={key} subMenuPosition={subMenuPosition} visibleSubMenus={visibleSubMenus} + hoveredItems={hoveredItems} // Pass hoveredItems to submenus handleMouseEnterItem={handleMouseEnterItem} subMenuRefs={subMenuRefs} />