{"version":3,"sources":["../src/components/DDMenu.tsx","../src/components/DDSearchable.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","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"],"mappings":"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","file":"index.mjs","sourcesContent":["import React, { useState, useRef, useEffect, useCallback } from \"react\";\nimport type { MenuItem } from \"../types/menu.types\";\nimport \"../styles/dd-menu.css\";\n\nexport type DDMenuVariant = \"default\" | \"minimal\" | \"navbar\" | \"sidebar\";\nexport type DDMenuSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\";\n\ninterface DDMenuProps {\n  items: MenuItem[];\n  theme?: \"light\" | \"dark\" | \"auto\";\n  variant?: DDMenuVariant;\n  size?: DDMenuSize;\n  className?: string;\n  style?: React.CSSProperties;\n  trigger?: React.ReactNode;\n  placement?:\n    | \"bottom\"\n    | \"bottom-start\"\n    | \"bottom-end\"\n    | \"top\"\n    | \"top-start\"\n    | \"top-end\"\n    | \"right\"\n    | \"left\";\n  onItemClick?: (item: MenuItem) => void;\n  closeOnClick?: boolean;\n  disabled?: boolean;\n  hoverDelay?: number; // New prop for hover delay\n  onHoverChange?: (isHovering: boolean) => void; // Event handler for hover state changes\n  onFontSizeChange?: (fontSize: DDMenuSize) => void; // Event handler for font size changes\n}\n\nconst DDMenu = ({\n  items,\n  theme = \"auto\",\n  variant = \"default\",\n  size = \"md\",\n  className = \"\",\n  style = {},\n  trigger,\n  placement = \"bottom-start\",\n  onItemClick,\n  closeOnClick = true,\n  disabled = false,\n  hoverDelay = 150, // Default 150ms delay\n  onHoverChange,\n  onFontSizeChange,\n}: DDMenuProps) => {\n  const [isOpen, setIsOpen] = useState(false);\n  const [openSubmenus, setOpenSubmenus] = useState<Set<string>>(new Set());\n  const [hoveringItem, setHoveringItem] = useState<string | null>(null);\n  const menuRef = useRef<HTMLDivElement>(null);\n  const buttonTriggerRef = useRef<HTMLButtonElement>(null);\n  const customTriggerRef = useRef<HTMLDivElement>(null);\n  const hoverTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n  const submenuTimeoutRef = useRef<Map<string, ReturnType<typeof setTimeout>>>(new Map());\n  const [isHovering] = useState(false);\n  const [fontSize] = useState(size);\n\n\n  // Call onHoverChange when isHovering state changes\n  useEffect(() => {\n    if (onHoverChange) {\n      onHoverChange(isHovering);\n    }\n  }, [isHovering, onHoverChange]);\n\n  // Call onFontSizeChange when fontSize state changes\n  useEffect(() => {\n    if (onFontSizeChange) {\n      onFontSizeChange(fontSize);\n    }\n  }, [fontSize, onFontSizeChange]);\n\n  // Close menu when clicking outside\n  useEffect(() => {\n    const handleClickOutside = (event: MouseEvent) => {\n      // Prevent immediate closure by checking if the click target is part of the menu system\n      const currentTrigger = buttonTriggerRef.current || customTriggerRef.current;\n      const isClickInsideTrigger = currentTrigger && currentTrigger.contains(event.target as Node);\n      const isClickInsideMenu = menuRef.current && menuRef.current.contains(event.target as Node);\n      \n      // Only close if click is outside both trigger and menu\n      if (!isClickInsideTrigger && !isClickInsideMenu) {\n        setIsOpen(false);\n        setOpenSubmenus(new Set());\n        setHoveringItem(null);\n        clearAllTimeouts();\n      }\n    };\n\n    if (isOpen) {\n      // Use mousedown for better responsiveness, but add a small delay to prevent immediate closure\n      setTimeout(() => {\n        document.addEventListener(\"mousedown\", handleClickOutside);\n      }, 50);\n      \n      return () => {\n        document.removeEventListener(\"mousedown\", handleClickOutside);\n        clearAllTimeouts();\n      };\n    }\n    \n    // Return empty cleanup function for when isOpen is false\n    return () => {};\n  }, [isOpen]);\n\n  // Clear all timeouts\n  const clearAllTimeouts = useCallback(() => {\n    if (hoverTimeoutRef.current) {\n      clearTimeout(hoverTimeoutRef.current);\n      hoverTimeoutRef.current = null;\n    }\n    submenuTimeoutRef.current.forEach((timeout) => clearTimeout(timeout));\n    submenuTimeoutRef.current.clear();\n  }, []);\n\n  // Handle submenu toggle with improved logic\n  const toggleSubmenu = useCallback((id: string) => {\n    setOpenSubmenus((prev) => {\n      const newSet = new Set(prev);\n      if (newSet.has(id)) {\n        newSet.delete(id);\n      } else {\n        newSet.add(id);\n      }\n      return newSet;\n    });\n    \n    // Ensure the item is being hovered\n    setHoveringItem(id);\n  }, []);\n\n  // Improved submenu opening with delay\n  const openSubmenuWithDelay = useCallback((id: string) => {\n    // Clear any existing timeout for this submenu\n    const existingTimeout = submenuTimeoutRef.current.get(id);\n    if (existingTimeout) {\n      clearTimeout(existingTimeout);\n      submenuTimeoutRef.current.delete(id);\n    }\n\n    // For sidebar variant, open immediately\n    if (variant === \"sidebar\") {\n      setOpenSubmenus((prev) => {\n        const newSet = new Set(prev);\n        newSet.add(id);\n        return newSet;\n      });\n      return;\n    }\n\n    // Open immediately for better UX\n    setOpenSubmenus((prev) => {\n      const newSet = new Set(prev);\n      newSet.add(id);\n      return newSet;\n    });\n  }, [variant]);\n\n  // Improved submenu closing with delay\n  const closeSubmenuWithDelay = useCallback((id: string) => {\n    // Clear any opening timeout for this submenu\n    const existingTimeout = submenuTimeoutRef.current.get(id);\n    if (existingTimeout) {\n      clearTimeout(existingTimeout);\n      submenuTimeoutRef.current.delete(id);\n    }\n\n    // For sidebar variant, close immediately\n    if (variant === \"sidebar\") {\n      setOpenSubmenus((prev) => {\n        const newSet = new Set(prev);\n        newSet.delete(id);\n        return newSet;\n      });\n      return;\n    }\n\n    // For other variants, use hover delay\n    const timeout = setTimeout(() => {\n      setOpenSubmenus((prev) => {\n        const newSet = new Set(prev);\n        newSet.delete(id);\n        return newSet;\n      });\n      submenuTimeoutRef.current.delete(id);\n    }, hoverDelay);\n\n    submenuTimeoutRef.current.set(id, timeout);\n  }, [variant, hoverDelay]);\n\n  // Handle item click\n  const handleItemClick = useCallback((item: MenuItem, event: React.MouseEvent) => {\n    if (item.disabled) {\n      event.preventDefault();\n      return;\n    }\n\n    if (item.children?.length) {\n      event.preventDefault();\n      toggleSubmenu(item.id);\n      return;\n    }\n\n    // Execute item onClick\n    if (item.onClick) {\n      item.onClick();\n    }\n\n    // Execute parent onItemClick\n    if (onItemClick) {\n      onItemClick(item);\n    }\n\n    // Close menu if specified\n    if (closeOnClick) {\n      setIsOpen(false);\n      setOpenSubmenus(new Set());\n      setHoveringItem(null);\n      clearAllTimeouts();\n    }\n  }, [onItemClick, closeOnClick, toggleSubmenu, clearAllTimeouts]);\n\n  // Handle mouse enter for items\n  const handleItemMouseEnter = useCallback((item: MenuItem) => {\n    setHoveringItem(item.id);\n    \n    if (item.children?.length && variant !== \"sidebar\") {\n      // Immediately open submenu on hover\n      openSubmenuWithDelay(item.id);\n    }\n  }, [variant, openSubmenuWithDelay]);\n\n  // Handle mouse leave for items\n  const handleItemMouseLeave = useCallback((item: MenuItem) => {\n    if (hoveringItem === item.id) {\n      setHoveringItem(null);\n    }\n\n    if (item.children?.length && variant !== \"sidebar\") {\n      closeSubmenuWithDelay(item.id);\n    }\n  }, [hoveringItem, variant, closeSubmenuWithDelay]);\n\n  // Render menu items recursively\n  const renderMenuItems = useCallback((\n    menuItems: MenuItem[],\n    level = 0\n  ): React.ReactNode => {\n    return menuItems.map((item) => {\n      const hasChildren = item.children && item.children.length > 0;\n      const isSubmenuOpen = openSubmenus.has(item.id);\n\n      return (\n        <li\n          key={item.id}\n          className=\"dd-menu__item-wrapper\"\n          onMouseEnter={() => handleItemMouseEnter(item)}\n          onMouseLeave={() => handleItemMouseLeave(item)}\n        >\n          <div\n            className={`\n              dd-menu__item\n              ${item.disabled ? \"dd-menu__item--disabled\" : \"\"}\n              ${item.active ? \"dd-menu__item--active\" : \"\"}\n              ${hasChildren ? \"dd-menu__item--has-children\" : \"\"}\n              ${level > 0 ? \"dd-menu__item--nested\" : \"\"}\n              ${hoveringItem === item.id ? \"dd-menu__item--hovering\" : \"\"}\n            `.trim()}\n            onClick={(e) => handleItemClick(item, e)}\n            role=\"menuitem\"\n            tabIndex={item.disabled ? -1 : 0}\n            aria-disabled={item.disabled}\n            aria-expanded={hasChildren ? isSubmenuOpen : undefined}\n            aria-haspopup={hasChildren ? \"menu\" : undefined}\n          >\n            {item.icon && (\n              <span className=\"dd-menu__item-icon\">\n                {typeof item.icon === \"string\" ? (\n                  <span>{item.icon}</span>\n                ) : (\n                  item.icon\n                )}\n              </span>\n            )}\n\n            <span className=\"dd-menu__item-label\">\n              {item.link && !hasChildren ? (\n                <a\n                  href={item.link}\n                  className=\"dd-menu__item-link\"\n                  onClick={(e) => e.stopPropagation()}\n                >\n                  {item.label}\n                </a>\n              ) : (\n                item.label\n              )}\n            </span>\n\n            {hasChildren && (\n              <span className=\"dd-menu__item-arrow\">\n                <svg\n                  width=\"16\"\n                  height=\"16\"\n                  viewBox=\"0 0 16 16\"\n                  fill=\"currentColor\"\n                  style={{\n                    transform: variant === \"sidebar\" && isSubmenuOpen ? \"rotate(90deg)\" : undefined,\n                    transition: \"transform 0.2s ease\"\n                  }}\n                >\n                  <path\n                    d=\"M6 4l4 4-4 4\"\n                    stroke=\"currentColor\"\n                    strokeWidth=\"1.5\"\n                    fill=\"none\"\n                    strokeLinecap=\"round\"\n                    strokeLinejoin=\"round\"\n                  />\n                </svg>\n              </span>\n            )}\n          </div>\n\n          {hasChildren && (\n            <ul\n              className={`\n                dd-menu__submenu\n                dd-menu__submenu--level-${level + 1}\n                ${isSubmenuOpen ? \"dd-menu__submenu--open\" : \"\"}\n              `.trim()}\n              role=\"menu\"\n            >\n              {renderMenuItems(item.children!, level + 1)}\n            </ul>\n          )}\n        </li>\n      );\n    });\n  }, [\n    openSubmenus,\n    hoveringItem,\n    handleItemClick,\n    handleItemMouseEnter,\n    handleItemMouseLeave,\n    variant\n  ]);\n\n  // Default trigger if none provided\n  const defaultTrigger = (\n    <button\n      ref={buttonTriggerRef}\n      className=\"dd-menu__trigger\"\n      onClick={(e) => {\n        e.preventDefault(); // Prevent default browser behavior\n        e.stopPropagation(); // Stop event propagation\n        if (!disabled) {\n          setIsOpen(!isOpen);\n        }\n      }}\n      disabled={disabled}\n      aria-expanded={isOpen}\n      aria-haspopup=\"menu\"\n    >\n      <span>Menu</span>\n      <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n        <path\n          d=\"M4 6l4 4 4-4\"\n          stroke=\"currentColor\"\n          strokeWidth=\"1.5\"\n          fill=\"none\"\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n        />\n      </svg>\n    </button>\n  );\n\n  return (\n    <div\n      className={`\n        dd-menu \n        dd-menu--${variant} \n        dd-menu--${size} \n        dd-menu--${theme} \n        ${isOpen ? \"dd-menu--open\" : \"\"}\n        ${disabled ? \"dd-menu--disabled\" : \"\"}\n        ${className}\n      `.trim()}\n      style={style}\n    >\n      {trigger ? (\n        <div\n          ref={customTriggerRef}\n          onClick={(e) => {\n            e.preventDefault(); // Prevent default browser behavior\n            e.stopPropagation(); // Stop propagation to parent elements\n            if (!disabled) {\n              setIsOpen(!isOpen);\n            }\n          }}\n          className=\"dd-menu__custom-trigger\"\n        >\n          {trigger}\n        </div>\n      ) : (\n        defaultTrigger\n      )}\n\n      {isOpen && (\n        <div\n          ref={menuRef}\n          className={`dd-menu__content dd-menu__content--${placement}`}\n          role=\"menu\"\n          aria-orientation=\"vertical\"\n          onClick={(e) => e.stopPropagation()} /* Prevent clicks inside menu from bubbling up */\n        >\n          <ul className=\"dd-menu__list\" role=\"none\">\n            {renderMenuItems(items)}\n          </ul>\n        </div>\n      )}\n    </div>\n  );\n};\n\nexport { DDMenu };\nexport default DDMenu;\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"]}