{"version":3,"sources":["../src/components/DDMenu.tsx","../src/components/DDSearchable.tsx","../src/components/DDMenuWrapper.tsx"],"names":["DDMenu","items","theme","variant","size","className","style","trigger","placement","onItemClick","closeOnClick","disabled","hoverDelay","onHoverChange","onFontSizeChange","isOpen","setIsOpen","useState","openSubmenus","setOpenSubmenus","hoveringItem","setHoveringItem","menuRef","useRef","buttonTriggerRef","customTriggerRef","hoverTimeoutRef","submenuTimeoutRef","isHovering","fontSize","useEffect","handleClickOutside","event","currentTrigger","isClickInsideTrigger","isClickInsideMenu","clearAllTimeouts","useCallback","timeout","toggleSubmenu","id","prev","newSet","openSubmenuWithDelay","existingTimeout","closeSubmenuWithDelay","handleItemClick","item","handleItemMouseEnter","handleItemMouseLeave","handleSubmenuMouseEnter","itemId","handleSubmenuMouseLeave","renderMenuItems","menuItems","level","hasChildren","isSubmenuOpen","jsxs","e","jsx","defaultTrigger","DDMenu_default","DDSearchable","placeholder","onItemSelect","onSearchChange","clearable","maxHeight","noResultsText","searchKeys","caseSensitive","minSearchLength","debounceMs","selectedItem","allowCustomValue","onCustomValue","searchTerm","setSearchTerm","highlightedIndex","setHighlightedIndex","debouncedSearchTerm","setDebouncedSearchTerm","containerRef","inputRef","listRef","timer","filteredItems","useMemo","searchValue","filterRecursive","itemList","acc","key","value","filteredChildren","flattenedItems","flatten","depth","handleInputChange","handleKeyDown","handleClear","highlightedElement","renderItem","index","isHighlighted","itemClasses","containerClasses","DDSearchable_default","DDMenuWrapper","children","DDMenuWrapper_default"],"mappings":"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","file":"index.mjs","sourcesContent":["import React, { useState, useRef, useEffect, useCallback } from \"react\";\r\nimport type { MenuItem } from \"../types/menu.types\";\r\nimport \"../styles/dd-menu.css\";\r\n\r\nexport type DDMenuVariant = \"default\" | \"minimal\" | \"navbar\" | \"sidebar\";\r\nexport type DDMenuSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\";\r\n\r\ninterface DDMenuProps {\r\n  items: MenuItem[];\r\n  theme?: \"light\" | \"dark\" | \"auto\";\r\n  variant?: DDMenuVariant;\r\n  size?: DDMenuSize;\r\n  className?: string;\r\n  style?: React.CSSProperties;\r\n  trigger?: React.ReactNode;\r\n  placement?:\r\n    | \"bottom\"\r\n    | \"bottom-start\"\r\n    | \"bottom-end\"\r\n    | \"top\"\r\n    | \"top-start\"\r\n    | \"top-end\"\r\n    | \"right\"\r\n    | \"left\";\r\n  onItemClick?: (item: MenuItem) => void;\r\n  closeOnClick?: boolean;\r\n  disabled?: boolean;\r\n  hoverDelay?: number; // New prop for hover delay\r\n  onHoverChange?: (isHovering: boolean) => void; // Event handler for hover state changes\r\n  onFontSizeChange?: (fontSize: DDMenuSize) => void; // Event handler for font size changes\r\n}\r\n\r\nconst DDMenu = ({\r\n  items,\r\n  theme = \"auto\",\r\n  variant = \"default\",\r\n  size = \"md\",\r\n  className = \"\",\r\n  style = {},\r\n  trigger,\r\n  placement = \"bottom-start\",\r\n  onItemClick,\r\n  closeOnClick = true,\r\n  disabled = false,\r\n  hoverDelay = 150, // Default 150ms delay\r\n  onHoverChange,\r\n  onFontSizeChange,\r\n}: DDMenuProps) => {\r\n  const [isOpen, setIsOpen] = useState(false);\r\n  const [openSubmenus, setOpenSubmenus] = useState<Set<string>>(new Set());\r\n  const [hoveringItem, setHoveringItem] = useState<string | null>(null);\r\n  const menuRef = useRef<HTMLDivElement>(null);\r\n  const buttonTriggerRef = useRef<HTMLButtonElement>(null);\r\n  const customTriggerRef = useRef<HTMLDivElement>(null);\r\n  const hoverTimeoutRef = useRef<NodeJS.Timeout | null>(null);\r\n  const submenuTimeoutRef = useRef<Map<string, NodeJS.Timeout>>(new Map());\r\n  const [isHovering] = useState(false);\r\n  const [fontSize] = useState(size);\r\n\r\n\r\n  // Call onHoverChange when isHovering state changes\r\n  useEffect(() => {\r\n    if (onHoverChange) {\r\n      onHoverChange(isHovering);\r\n    }\r\n  }, [isHovering, onHoverChange]);\r\n\r\n  // Call onFontSizeChange when fontSize state changes\r\n  useEffect(() => {\r\n    if (onFontSizeChange) {\r\n      onFontSizeChange(fontSize);\r\n    }\r\n  }, [fontSize, onFontSizeChange]);\r\n\r\n  // Close menu when clicking outside\r\n  useEffect(() => {\r\n    const handleClickOutside = (event: MouseEvent) => {\r\n      // Prevent immediate closure by checking if the click target is part of the menu system\r\n      const currentTrigger = buttonTriggerRef.current || customTriggerRef.current;\r\n      const isClickInsideTrigger = currentTrigger && currentTrigger.contains(event.target as Node);\r\n      const isClickInsideMenu = menuRef.current && menuRef.current.contains(event.target as Node);\r\n      \r\n      // Only close if click is outside both trigger and menu\r\n      if (!isClickInsideTrigger && !isClickInsideMenu) {\r\n        setIsOpen(false);\r\n        setOpenSubmenus(new Set());\r\n        setHoveringItem(null);\r\n        clearAllTimeouts();\r\n      }\r\n    };\r\n\r\n    if (isOpen) {\r\n      // Use mousedown for better responsiveness, but add a small delay to prevent immediate closure\r\n      setTimeout(() => {\r\n        document.addEventListener(\"mousedown\", handleClickOutside);\r\n      }, 50);\r\n      \r\n      return () => {\r\n        document.removeEventListener(\"mousedown\", handleClickOutside);\r\n        clearAllTimeouts();\r\n      };\r\n    }\r\n    \r\n    // Return empty cleanup function for when isOpen is false\r\n    return () => {};\r\n  }, [isOpen]);\r\n\r\n  // Clear all timeouts\r\n  const clearAllTimeouts = useCallback(() => {\r\n    if (hoverTimeoutRef.current) {\r\n      clearTimeout(hoverTimeoutRef.current);\r\n      hoverTimeoutRef.current = null;\r\n    }\r\n    submenuTimeoutRef.current.forEach((timeout) => clearTimeout(timeout));\r\n    submenuTimeoutRef.current.clear();\r\n  }, []);\r\n\r\n  // Handle submenu toggle with improved logic\r\n  const toggleSubmenu = useCallback((id: string) => {\r\n    setOpenSubmenus((prev) => {\r\n      const newSet = new Set(prev);\r\n      if (newSet.has(id)) {\r\n        newSet.delete(id);\r\n      } else {\r\n        newSet.add(id);\r\n      }\r\n      return newSet;\r\n    });\r\n    \r\n    // Ensure the item is being hovered\r\n    setHoveringItem(id);\r\n  }, []);\r\n\r\n  // Improved submenu opening with delay\r\n  const openSubmenuWithDelay = useCallback((id: string) => {\r\n    // Clear any existing timeout for this submenu\r\n    const existingTimeout = submenuTimeoutRef.current.get(id);\r\n    if (existingTimeout) {\r\n      clearTimeout(existingTimeout);\r\n      submenuTimeoutRef.current.delete(id);\r\n    }\r\n\r\n    // For sidebar variant, open immediately\r\n    if (variant === \"sidebar\") {\r\n      setOpenSubmenus((prev) => {\r\n        const newSet = new Set(prev);\r\n        newSet.add(id);\r\n        return newSet;\r\n      });\r\n      return;\r\n    }\r\n\r\n    // Open immediately for better UX\r\n    setOpenSubmenus((prev) => {\r\n      const newSet = new Set(prev);\r\n      newSet.add(id);\r\n      return newSet;\r\n    });\r\n  }, [variant]);\r\n\r\n  // Improved submenu closing with delay\r\n  const closeSubmenuWithDelay = useCallback((id: string) => {\r\n    // Clear any opening timeout for this submenu\r\n    const existingTimeout = submenuTimeoutRef.current.get(id);\r\n    if (existingTimeout) {\r\n      clearTimeout(existingTimeout);\r\n      submenuTimeoutRef.current.delete(id);\r\n    }\r\n\r\n    // For sidebar variant, close immediately\r\n    if (variant === \"sidebar\") {\r\n      setOpenSubmenus((prev) => {\r\n        const newSet = new Set(prev);\r\n        newSet.delete(id);\r\n        return newSet;\r\n      });\r\n      return;\r\n    }\r\n\r\n    // For other variants, use hover delay\r\n    const timeout = setTimeout(() => {\r\n      setOpenSubmenus((prev) => {\r\n        const newSet = new Set(prev);\r\n        newSet.delete(id);\r\n        return newSet;\r\n      });\r\n      submenuTimeoutRef.current.delete(id);\r\n    }, hoverDelay);\r\n\r\n    submenuTimeoutRef.current.set(id, timeout);\r\n  }, [variant, hoverDelay]);\r\n\r\n  // Handle item click\r\n  const handleItemClick = useCallback((item: MenuItem, event: React.MouseEvent) => {\r\n    if (item.disabled) {\r\n      event.preventDefault();\r\n      return;\r\n    }\r\n\r\n    if (item.children?.length) {\r\n      event.preventDefault();\r\n      toggleSubmenu(item.id);\r\n      return;\r\n    }\r\n\r\n    // Execute item onClick\r\n    if (item.onClick) {\r\n      item.onClick();\r\n    }\r\n\r\n    // Execute parent onItemClick\r\n    if (onItemClick) {\r\n      onItemClick(item);\r\n    }\r\n\r\n    // Close menu if specified\r\n    if (closeOnClick) {\r\n      setIsOpen(false);\r\n      setOpenSubmenus(new Set());\r\n      setHoveringItem(null);\r\n      clearAllTimeouts();\r\n    }\r\n  }, [onItemClick, closeOnClick, toggleSubmenu, clearAllTimeouts]);\r\n\r\n  // Handle mouse enter for items\r\n  const handleItemMouseEnter = useCallback((item: MenuItem) => {\r\n    setHoveringItem(item.id);\r\n    \r\n    if (item.children?.length && variant !== \"sidebar\") {\r\n      // Immediately open submenu on hover\r\n      openSubmenuWithDelay(item.id);\r\n    }\r\n  }, [variant, openSubmenuWithDelay]);\r\n\r\n  // Handle mouse leave for items\r\n  const handleItemMouseLeave = useCallback((item: MenuItem) => {\r\n    if (hoveringItem === item.id) {\r\n      setHoveringItem(null);\r\n    }\r\n\r\n    if (item.children?.length && variant !== \"sidebar\") {\r\n      closeSubmenuWithDelay(item.id);\r\n    }\r\n  }, [hoveringItem, variant, closeSubmenuWithDelay]);\r\n\r\n  // Handle submenu mouse enter (prevents closing)\r\n  const handleSubmenuMouseEnter = useCallback((itemId: string) => {\r\n    // Clear any pending close timeout\r\n    const existingTimeout = submenuTimeoutRef.current.get(itemId);\r\n    if (existingTimeout) {\r\n      clearTimeout(existingTimeout);\r\n      submenuTimeoutRef.current.delete(itemId);\r\n    }\r\n    \r\n    // Ensure the submenu stays open\r\n    setOpenSubmenus((prev) => {\r\n      const newSet = new Set(prev);\r\n      newSet.add(itemId);\r\n      return newSet;\r\n    });\r\n    \r\n    // Keep track of hovering item\r\n    setHoveringItem(itemId);\r\n  }, []);\r\n\r\n  // Handle submenu mouse leave\r\n  const handleSubmenuMouseLeave = useCallback((itemId: string) => {\r\n    if (variant !== \"sidebar\") {\r\n      closeSubmenuWithDelay(itemId);\r\n    }\r\n  }, [variant, closeSubmenuWithDelay]);\r\n\r\n  // Render menu items recursively\r\n  const renderMenuItems = useCallback((\r\n    menuItems: MenuItem[],\r\n    level = 0\r\n  ): React.ReactNode => {\r\n    return menuItems.map((item) => {\r\n      const hasChildren = item.children && item.children.length > 0;\r\n      const isSubmenuOpen = openSubmenus.has(item.id);\r\n\r\n      return (\r\n        <li key={item.id} className=\"dd-menu__item-wrapper\">\r\n          <div\r\n            className={`\r\n              dd-menu__item\r\n              ${item.disabled ? \"dd-menu__item--disabled\" : \"\"}\r\n              ${item.active ? \"dd-menu__item--active\" : \"\"}\r\n              ${hasChildren ? \"dd-menu__item--has-children\" : \"\"}\r\n              ${level > 0 ? \"dd-menu__item--nested\" : \"\"}\r\n              ${hoveringItem === item.id ? \"dd-menu__item--hovering\" : \"\"}\r\n            `.trim()}\r\n            onClick={(e) => handleItemClick(item, e)}\r\n            onMouseEnter={() => handleItemMouseEnter(item)}\r\n            onMouseLeave={() => handleItemMouseLeave(item)}\r\n            role=\"menuitem\"\r\n            tabIndex={item.disabled ? -1 : 0}\r\n            aria-disabled={item.disabled}\r\n            aria-expanded={hasChildren ? isSubmenuOpen : undefined}\r\n            aria-haspopup={hasChildren ? \"menu\" : undefined}\r\n          >\r\n            {item.icon && (\r\n              <span className=\"dd-menu__item-icon\">\r\n                {typeof item.icon === \"string\" ? (\r\n                  <span>{item.icon}</span>\r\n                ) : (\r\n                  item.icon\r\n                )}\r\n              </span>\r\n            )}\r\n\r\n            <span className=\"dd-menu__item-label\">\r\n              {item.link && !hasChildren ? (\r\n                <a\r\n                  href={item.link}\r\n                  className=\"dd-menu__item-link\"\r\n                  onClick={(e) => e.stopPropagation()}\r\n                >\r\n                  {item.label}\r\n                </a>\r\n              ) : (\r\n                item.label\r\n              )}\r\n            </span>\r\n\r\n            {hasChildren && (\r\n              <span className=\"dd-menu__item-arrow\">\r\n                <svg\r\n                  width=\"16\"\r\n                  height=\"16\"\r\n                  viewBox=\"0 0 16 16\"\r\n                  fill=\"currentColor\"\r\n                  style={{\r\n                    transform: variant === \"sidebar\" && isSubmenuOpen ? \"rotate(90deg)\" : undefined,\r\n                    transition: \"transform 0.2s ease\"\r\n                  }}\r\n                >\r\n                  <path\r\n                    d=\"M6 4l4 4-4 4\"\r\n                    stroke=\"currentColor\"\r\n                    strokeWidth=\"1.5\"\r\n                    fill=\"none\"\r\n                    strokeLinecap=\"round\"\r\n                    strokeLinejoin=\"round\"\r\n                  />\r\n                </svg>\r\n              </span>\r\n            )}\r\n          </div>\r\n\r\n          {hasChildren && (\r\n            <ul\r\n              className={`\r\n                dd-menu__submenu\r\n                dd-menu__submenu--level-${level + 1}\r\n                ${isSubmenuOpen ? \"dd-menu__submenu--open\" : \"\"}\r\n              `.trim()}\r\n              role=\"menu\"\r\n              onMouseEnter={() => handleSubmenuMouseEnter(item.id)}\r\n              onMouseLeave={() => handleSubmenuMouseLeave(item.id)}\r\n            >\r\n              {renderMenuItems(item.children!, level + 1)}\r\n            </ul>\r\n          )}\r\n        </li>\r\n      );\r\n    });\r\n  }, [\r\n    openSubmenus,\r\n    hoveringItem,\r\n    handleItemClick,\r\n    handleItemMouseEnter,\r\n    handleItemMouseLeave,\r\n    handleSubmenuMouseEnter,\r\n    handleSubmenuMouseLeave,\r\n    variant\r\n  ]);\r\n\r\n  // Default trigger if none provided\r\n  const defaultTrigger = (\r\n    <button\r\n      ref={buttonTriggerRef}\r\n      className=\"dd-menu__trigger\"\r\n      onClick={(e) => {\r\n        e.preventDefault(); // Prevent default browser behavior\r\n        e.stopPropagation(); // Stop event propagation\r\n        if (!disabled) {\r\n          setIsOpen(!isOpen);\r\n        }\r\n      }}\r\n      disabled={disabled}\r\n      aria-expanded={isOpen}\r\n      aria-haspopup=\"menu\"\r\n    >\r\n      <span>Menu</span>\r\n      <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n        <path\r\n          d=\"M4 6l4 4 4-4\"\r\n          stroke=\"currentColor\"\r\n          strokeWidth=\"1.5\"\r\n          fill=\"none\"\r\n          strokeLinecap=\"round\"\r\n          strokeLinejoin=\"round\"\r\n        />\r\n      </svg>\r\n    </button>\r\n  );\r\n\r\n  return (\r\n    <div\r\n      className={`\r\n        dd-menu \r\n        dd-menu--${variant} \r\n        dd-menu--${size} \r\n        dd-menu--${theme} \r\n        ${isOpen ? \"dd-menu--open\" : \"\"}\r\n        ${disabled ? \"dd-menu--disabled\" : \"\"}\r\n        ${className}\r\n      `.trim()}\r\n      style={style}\r\n    >\r\n      {trigger ? (\r\n        <div\r\n          ref={customTriggerRef}\r\n          onClick={(e) => {\r\n            e.preventDefault(); // Prevent default browser behavior\r\n            e.stopPropagation(); // Stop propagation to parent elements\r\n            if (!disabled) {\r\n              setIsOpen(!isOpen);\r\n            }\r\n          }}\r\n          className=\"dd-menu__custom-trigger\"\r\n        >\r\n          {trigger}\r\n        </div>\r\n      ) : (\r\n        defaultTrigger\r\n      )}\r\n\r\n      {isOpen && (\r\n        <div\r\n          ref={menuRef}\r\n          className={`dd-menu__content dd-menu__content--${placement}`}\r\n          role=\"menu\"\r\n          aria-orientation=\"vertical\"\r\n          onClick={(e) => e.stopPropagation()} /* Prevent clicks inside menu from bubbling up */\r\n        >\r\n          <ul className=\"dd-menu__list\" role=\"none\">\r\n            {renderMenuItems(items)}\r\n          </ul>\r\n        </div>\r\n      )}\r\n    </div>\r\n  );\r\n};\r\n\r\nexport { DDMenu };\r\nexport default DDMenu;\r\n","import React, { useState, useRef, useEffect, useCallback, useMemo } from \"react\";\nimport type { MenuItem } from \"../types/menu.types\";\nimport \"../styles/dd-menu.css\";\n\nexport type DDSearchableVariant = \"default\" | \"minimal\" | \"outlined\" | \"filled\";\nexport type DDSearchableSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\";\n\ninterface DDSearchableProps {\n  items: MenuItem[];\n  theme?: \"light\" | \"dark\" | \"auto\";\n  variant?: DDSearchableVariant;\n  size?: DDSearchableSize;\n  className?: string;\n  style?: React.CSSProperties;\n  placeholder?: string;\n  onItemSelect?: (item: MenuItem) => void;\n  onSearchChange?: (searchTerm: string) => void;\n  disabled?: boolean;\n  clearable?: boolean;\n  maxHeight?: number;\n  noResultsText?: string;\n  searchKeys?: (keyof MenuItem)[];\n  caseSensitive?: boolean;\n  minSearchLength?: number;\n  debounceMs?: number;\n  selectedItem?: MenuItem | null;\n  allowCustomValue?: boolean;\n  onCustomValue?: (value: string) => void;\n}\n\nconst DDSearchable = ({\n  items,\n  theme = \"auto\",\n  variant = \"default\",\n  size = \"md\",\n  className = \"\",\n  style = {},\n  placeholder = \"Search...\",\n  onItemSelect,\n  onSearchChange,\n  disabled = false,\n  clearable = true,\n  maxHeight = 300,\n  noResultsText = \"No results found\",\n  searchKeys = [\"label\", \"id\"],\n  caseSensitive = false,\n  minSearchLength = 0,\n  debounceMs = 300,\n  selectedItem = null,\n  allowCustomValue = false,\n  onCustomValue,\n}: DDSearchableProps) => {\n  const [isOpen, setIsOpen] = useState(false);\n  const [searchTerm, setSearchTerm] = useState(\"\");\n  const [highlightedIndex, setHighlightedIndex] = useState(-1);\n  const [debouncedSearchTerm, setDebouncedSearchTerm] = useState(\"\");\n  \n  const containerRef = useRef<HTMLDivElement>(null);\n  const inputRef = useRef<HTMLInputElement>(null);\n  const listRef = useRef<HTMLUListElement>(null);\n\n  // Debounce search term\n  useEffect(() => {\n    const timer = setTimeout(() => {\n      setDebouncedSearchTerm(searchTerm);\n      onSearchChange?.(searchTerm);\n    }, debounceMs);\n\n    return () => clearTimeout(timer);\n  }, [searchTerm, debounceMs, onSearchChange]);\n\n  // Filter items based on search term\n  const filteredItems = useMemo(() => {\n    if (debouncedSearchTerm.length < minSearchLength) {\n      return items;\n    }\n\n    const searchValue = caseSensitive ? debouncedSearchTerm : debouncedSearchTerm.toLowerCase();\n    \n    const filterRecursive = (itemList: MenuItem[]): MenuItem[] => {\n      return itemList.reduce((acc: MenuItem[], item) => {\n        const matchesSearch = searchKeys.some(key => {\n          const value = item[key];\n          if (typeof value === 'string') {\n            const searchIn = caseSensitive ? value : value.toLowerCase();\n            return searchIn.includes(searchValue);\n          }\n          return false;\n        });\n\n        if (matchesSearch) {\n          acc.push(item);\n        } else if (item.children) {\n          const filteredChildren = filterRecursive(item.children);\n          if (filteredChildren.length > 0) {\n            acc.push({ ...item, children: filteredChildren });\n          }\n        }\n\n        return acc;\n      }, []);\n    };\n\n    return filterRecursive(items);\n  }, [items, debouncedSearchTerm, searchKeys, caseSensitive, minSearchLength]);\n\n  // Flatten items for keyboard navigation\n  const flattenedItems = useMemo(() => {\n    const flatten = (itemList: MenuItem[], depth = 0): Array<MenuItem & { depth: number }> => {\n      return itemList.reduce((acc, item) => {\n        if (!item.disabled) {\n          acc.push({ ...item, depth });\n        }\n        if (item.children) {\n          acc.push(...flatten(item.children, depth + 1));\n        }\n        return acc;\n      }, [] as Array<MenuItem & { depth: number }>);\n    };\n    return flatten(filteredItems);\n  }, [filteredItems]);\n\n  const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n    const value = e.target.value;\n    setSearchTerm(value);\n    setHighlightedIndex(-1);\n    if (!isOpen && value) {\n      setIsOpen(true);\n    }\n  };\n\n  const handleItemClick = (item: MenuItem) => {\n    if (item.disabled) return;\n    \n    setSearchTerm(item.label);\n    setIsOpen(false);\n    setHighlightedIndex(-1);\n    onItemSelect?.(item);\n    item.onClick?.();\n  };\n\n  const handleKeyDown = (e: React.KeyboardEvent) => {\n    switch (e.key) {\n      case \"ArrowDown\":\n        e.preventDefault();\n        if (!isOpen) {\n          setIsOpen(true);\n        } else {\n          setHighlightedIndex(prev => \n            prev < flattenedItems.length - 1 ? prev + 1 : 0\n          );\n        }\n        break;\n      case \"ArrowUp\":\n        e.preventDefault();\n        if (isOpen) {\n          setHighlightedIndex(prev => \n            prev > 0 ? prev - 1 : flattenedItems.length - 1\n          );\n        }\n        break;\n      case \"Enter\":\n        e.preventDefault();\n        if (isOpen && highlightedIndex >= 0 && flattenedItems[highlightedIndex]) {\n          handleItemClick(flattenedItems[highlightedIndex]);\n        } else if (allowCustomValue && searchTerm && onCustomValue) {\n          onCustomValue(searchTerm);\n          setIsOpen(false);\n        }\n        break;\n      case \"Escape\":\n        setIsOpen(false);\n        setHighlightedIndex(-1);\n        inputRef.current?.blur();\n        break;\n      case \"Tab\":\n        setIsOpen(false);\n        setHighlightedIndex(-1);\n        break;\n    }\n  };\n\n  const handleClear = () => {\n    setSearchTerm(\"\");\n    setIsOpen(false);\n    setHighlightedIndex(-1);\n    inputRef.current?.focus();\n    onItemSelect?.(null as any);\n  };\n\n  const handleClickOutside = useCallback((event: MouseEvent) => {\n    if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n      setIsOpen(false);\n      setHighlightedIndex(-1);\n    }\n  }, []);\n\n  useEffect(() => {\n    document.addEventListener(\"mousedown\", handleClickOutside);\n    return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n  }, [handleClickOutside]);\n\n  // Update search term when selectedItem changes\n  useEffect(() => {\n    if (selectedItem) {\n      setSearchTerm(selectedItem.label);\n    } else if (selectedItem === null) {\n      setSearchTerm(\"\");\n    }\n  }, [selectedItem]);\n\n  // Scroll highlighted item into view\n  useEffect(() => {\n    if (highlightedIndex >= 0 && listRef.current) {\n      const highlightedElement = listRef.current.children[highlightedIndex] as HTMLElement;\n      if (highlightedElement) {\n        highlightedElement.scrollIntoView({\n          block: \"nearest\",\n          behavior: \"smooth\"\n        });\n      }\n    }\n  }, [highlightedIndex]);\n\n  const renderItem = (item: MenuItem & { depth: number }, index: number) => {\n    const isHighlighted = index === highlightedIndex;\n    const itemClasses = [\n      \"dd-menu-item\",\n      item.disabled && \"dd-menu-item--disabled\",\n      item.active && \"dd-menu-item--active\",\n      isHighlighted && \"dd-menu-item--highlighted\",\n      item.className,\n    ]\n      .filter(Boolean)\n      .join(\" \");\n\n    return (\n      <li\n        key={`${item.id}-${item.depth}`}\n        className={itemClasses}\n        style={{\n          paddingLeft: `${0.5 + item.depth * 1.5}rem`,\n          ...item.style,\n        }}\n        onClick={() => handleItemClick(item)}\n        onMouseEnter={() => setHighlightedIndex(index)}\n      >\n        {item.icon && (\n          <span className=\"dd-menu-item__icon\">\n            {typeof item.icon === \"string\" ? item.icon : item.icon}\n          </span>\n        )}\n        <span className=\"dd-menu-item__label\">{item.label}</span>\n      </li>\n    );\n  };\n\n  const containerClasses = [\n    \"dd-searchable\",\n    `dd-searchable--${variant}`,\n    `dd-searchable--${size}`,\n    `dd-searchable--${theme}`,\n    disabled && \"dd-searchable--disabled\",\n    isOpen && \"dd-searchable--open\",\n    className,\n  ]\n    .filter(Boolean)\n    .join(\" \");\n\n  return (\n    <div\n      ref={containerRef}\n      className={containerClasses}\n      style={style}\n    >\n      <div className=\"dd-searchable__input-wrapper\">\n        <input\n          ref={inputRef}\n          type=\"text\"\n          className=\"dd-searchable__input\"\n          placeholder={placeholder}\n          value={searchTerm}\n          onChange={handleInputChange}\n          onKeyDown={handleKeyDown}\n          onFocus={() => setIsOpen(true)}\n          disabled={disabled}\n          autoComplete=\"off\"\n        />\n        {clearable && searchTerm && (\n          <button\n            type=\"button\"\n            className=\"dd-searchable__clear\"\n            onClick={handleClear}\n            tabIndex={-1}\n          >\n            ✕\n          </button>\n        )}\n        <div className=\"dd-searchable__arrow\">\n          <svg\n            width=\"12\"\n            height=\"12\"\n            viewBox=\"0 0 12 12\"\n            fill=\"none\"\n            xmlns=\"http://www.w3.org/2000/svg\"\n          >\n            <path\n              d=\"M3 4.5L6 7.5L9 4.5\"\n              stroke=\"currentColor\"\n              strokeWidth=\"1.5\"\n              strokeLinecap=\"round\"\n              strokeLinejoin=\"round\"\n            />\n          </svg>\n        </div>\n      </div>\n\n      {isOpen && (\n        <div className=\"dd-searchable__dropdown\" style={{ maxHeight }}>\n          {filteredItems.length > 0 ? (\n            <ul ref={listRef} className=\"dd-searchable__list\">\n              {flattenedItems.map((item, index) => renderItem(item, index))}\n            </ul>\n          ) : (\n            <div className=\"dd-searchable__no-results\">\n              {noResultsText}\n              {allowCustomValue && searchTerm && (\n                <button\n                  className=\"dd-searchable__custom-option\"\n                  onClick={() => {\n                    onCustomValue?.(searchTerm);\n                    setIsOpen(false);\n                  }}\n                >\n                  Add \"{searchTerm}\"\n                </button>\n              )}\n            </div>\n          )}\n        </div>\n      )}\n    </div>\n  );\n};\n\nexport { DDSearchable };\nexport default DDSearchable;\n","import React, { ReactNode } from 'react';\nimport '../styles/dd-menu-wrapper.css';\n\ninterface DDMenuWrapperProps {\n  children: ReactNode;\n  className?: string;\n  style?: React.CSSProperties;\n}\n\n/**\n * DDMenuWrapper - A component that creates an isolated styling context for DDMenu components\n * \n * This wrapper creates a boundary that prevents external styles from affecting the DDMenu\n * component's appearance and positioning. Use this wrapper when integrating DDMenu in\n * environments with conflicting styles (like complex navbars).\n * \n * @example\n * ```tsx\n * <DDMenuWrapper>\n *   <DDMenu items={items} />\n * </DDMenuWrapper>\n * ```\n */\nconst DDMenuWrapper: React.FC<DDMenuWrapperProps> = ({ \n  children, \n  className = '',\n  style = {}\n}) => {\n  return (\n    <div \n      className={`dd-menu-wrapper ${className}`} \n      style={style}\n    >\n      {children}\n    </div>\n  );\n};\n\nexport default DDMenuWrapper;\n"]}