asterui 0.12.74 → 0.12.76
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dropdown.js","sources":["../../src/components/Dropdown.tsx"],"sourcesContent":["import React, { createContext, useContext, useId, useRef, useState, useCallback, useEffect, forwardRef, useImperativeHandle } from 'react'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dDropdown = 'dropdown'\nconst dDropdownTop = 'dropdown-top'\nconst dDropdownBottom = 'dropdown-bottom'\nconst dDropdownLeft = 'dropdown-left'\nconst dDropdownRight = 'dropdown-right'\nconst dDropdownCenter = 'dropdown-center'\nconst dDropdownEnd = 'dropdown-end'\nconst dDropdownHover = 'dropdown-hover'\nconst dDropdownOpen = 'dropdown-open'\nconst dDropdownContent = 'dropdown-content'\nconst dMenu = 'menu'\n\n// Types for data-driven items prop\nexport type DropdownTriggerType = 'click' | 'hover' | 'contextMenu'\n\nexport interface DropdownMenuItem {\n key: string\n label: React.ReactNode\n icon?: React.ReactNode\n disabled?: boolean\n danger?: boolean\n onClick?: () => void\n children?: DropdownMenuItem[] // For submenus\n}\n\nexport interface DropdownMenuDivider {\n type: 'divider'\n key?: string\n}\n\nexport type DropdownMenuItemType = DropdownMenuItem | DropdownMenuDivider\n\ninterface DropdownContextValue {\n position?: 'top' | 'bottom' | 'left' | 'right'\n align?: 'start' | 'center' | 'end'\n menuId: string\n triggerId: string\n isOpen: boolean\n setIsOpen: (open: boolean) => void\n focusedIndex: number\n setFocusedIndex: (index: number) => void\n registerItem: (index: number, ref: HTMLElement | null, disabled: boolean) => void\n itemCount: number\n setItemCount: (count: number) => void\n disabled: boolean\n arrow: boolean\n closeDropdown: () => void\n getTestId: (suffix: string) => string | undefined\n}\n\nconst DropdownContext = createContext<DropdownContextValue | undefined>(undefined)\n\nfunction useDropdownContext() {\n const context = useContext(DropdownContext)\n if (!context) {\n throw new Error('Dropdown compound components must be used within Dropdown')\n }\n return context\n}\n\nexport interface DropdownProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n /** Trigger element and dropdown content (compound pattern) */\n children?: React.ReactNode\n /** Menu items (data-driven pattern) */\n items?: DropdownMenuItemType[]\n /** Trigger mode(s) for dropdown */\n trigger?: DropdownTriggerType[]\n position?: 'top' | 'bottom' | 'left' | 'right'\n align?: 'start' | 'center' | 'end'\n /** Controlled open state */\n open?: boolean\n /** Callback when open state changes */\n onOpenChange?: (open: boolean, info?: { source: 'trigger' | 'menu' }) => void\n /** Disable the dropdown */\n disabled?: boolean\n /** Show arrow pointing to trigger */\n arrow?: boolean | { pointAtCenter?: boolean }\n /** Delay before showing dropdown on hover (seconds) */\n mouseEnterDelay?: number\n /** Delay before hiding dropdown on mouse leave (seconds) */\n mouseLeaveDelay?: number\n /** Container for the dropdown menu */\n getPopupContainer?: (triggerNode: HTMLElement) => HTMLElement\n /** Destroy dropdown when hidden */\n destroyOnHidden?: boolean\n /** Customize popup content */\n popupRender?: (menu: React.ReactNode) => React.ReactNode\n /** Test ID prefix for child elements */\n 'data-testid'?: string\n}\n\nexport interface DropdownTriggerProps {\n children: React.ReactNode\n className?: string\n}\n\nexport interface DropdownMenuProps {\n children?: React.ReactNode\n className?: string\n}\n\nexport interface DropdownItemProps {\n children?: React.ReactNode\n /** Icon to display before label */\n icon?: React.ReactNode\n /** Item label (alternative to children) */\n label?: React.ReactNode\n onClick?: () => void\n active?: boolean\n disabled?: boolean\n danger?: boolean\n className?: string\n /** @internal */\n _index?: number\n /** @internal */\n _key?: string\n}\n\nexport interface DropdownSubMenuProps {\n children: React.ReactNode\n /** Submenu title/label */\n title: React.ReactNode\n /** Icon to display before title */\n icon?: React.ReactNode\n disabled?: boolean\n className?: string\n /** @internal */\n _key?: string\n}\n\nexport interface DropdownDividerProps {\n className?: string\n}\n\nconst DropdownRoot = forwardRef<HTMLDivElement, DropdownProps>(function DropdownRoot(\n {\n children,\n items,\n trigger = ['hover'],\n position = 'bottom',\n align = 'start',\n open: controlledOpen,\n onOpenChange,\n disabled,\n arrow = false,\n mouseEnterDelay = 0.15,\n mouseLeaveDelay = 0.1,\n getPopupContainer: _getPopupContainer,\n destroyOnHidden = false,\n popupRender,\n 'data-testid': testId,\n className = '',\n ...rest\n },\n ref\n) {\n const { componentDisabled } = useConfig()\n const effectiveDisabled = disabled ?? componentDisabled ?? false\n\n const menuId = useId()\n const triggerId = useId()\n const [internalOpen, setInternalOpen] = useState(false)\n const [focusedIndex, setFocusedIndex] = useState(-1)\n const [itemCount, setItemCount] = useState(0)\n const [shouldRender, setShouldRender] = useState(!destroyOnHidden)\n const itemRefs = useRef<Map<number, { ref: HTMLElement | null; disabled: boolean }>>(new Map())\n const dropdownRef = useRef<HTMLDivElement>(null)\n const hoverTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const triggers = trigger\n\n // Forward ref\n useImperativeHandle(ref, () => dropdownRef.current!, [])\n\n // Helper for test IDs\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n\n // Use controlled or uncontrolled open state\n const isControlled = controlledOpen !== undefined\n const isOpen = isControlled ? controlledOpen : internalOpen\n\n const setIsOpen = useCallback((open: boolean, source: 'trigger' | 'menu' = 'trigger') => {\n if (effectiveDisabled) return\n if (!isControlled) {\n setInternalOpen(open)\n }\n if (open) {\n setShouldRender(true)\n }\n onOpenChange?.(open, { source })\n }, [effectiveDisabled, isControlled, onOpenChange])\n\n const closeDropdown = useCallback(() => {\n setIsOpen(false, 'menu')\n setFocusedIndex(-1)\n document.getElementById(triggerId)?.focus()\n }, [setIsOpen, triggerId])\n\n const registerItem = useCallback((index: number, ref: HTMLElement | null, itemDisabled: boolean) => {\n if (ref) {\n itemRefs.current.set(index, { ref, disabled: itemDisabled })\n } else {\n itemRefs.current.delete(index)\n }\n }, [])\n\n // Handle destroyOnHidden\n useEffect(() => {\n if (destroyOnHidden && !isOpen) {\n const timeout = setTimeout(() => setShouldRender(false), 300)\n return () => clearTimeout(timeout)\n }\n }, [isOpen, destroyOnHidden])\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false, 'trigger')\n setFocusedIndex(-1)\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [isOpen, setIsOpen])\n\n // Hover handlers with delay\n const handleMouseEnter = useCallback(() => {\n if (!triggers.includes('hover')) return\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current)\n }\n hoverTimeoutRef.current = setTimeout(() => {\n setIsOpen(true, 'trigger')\n }, mouseEnterDelay * 1000)\n }, [triggers, mouseEnterDelay, setIsOpen])\n\n const handleMouseLeave = useCallback(() => {\n if (!triggers.includes('hover')) return\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current)\n }\n hoverTimeoutRef.current = setTimeout(() => {\n setIsOpen(false, 'trigger')\n setFocusedIndex(-1)\n }, mouseLeaveDelay * 1000)\n }, [triggers, mouseLeaveDelay, setIsOpen])\n\n // Context menu handler\n const handleContextMenu = useCallback((event: React.MouseEvent) => {\n if (!triggers.includes('contextMenu')) return\n event.preventDefault()\n setIsOpen(true, 'trigger')\n }, [triggers, setIsOpen])\n\n // Cleanup timeout on unmount\n useEffect(() => {\n return () => {\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current)\n }\n }\n }, [])\n\n const positionClasses: Record<string, string> = {\n top: dDropdownTop,\n bottom: dDropdownBottom,\n left: dDropdownLeft,\n right: dDropdownRight,\n }\n\n const alignClasses: Record<string, string> = {\n start: '',\n center: dDropdownCenter,\n end: dDropdownEnd,\n }\n\n const showArrow = typeof arrow === 'boolean' ? arrow : !!arrow\n\n // Render items from data-driven prop\n const renderItems = () => {\n if (!items) return null\n return items.map((item, index) => {\n if ('type' in item && item.type === 'divider') {\n return <DropdownDivider key={item.key || `divider-${index}`} />\n }\n const menuItem = item as DropdownMenuItem\n if (menuItem.children && menuItem.children.length > 0) {\n return (\n <DropdownSubMenu\n key={menuItem.key}\n title={menuItem.label}\n icon={menuItem.icon}\n disabled={menuItem.disabled}\n >\n {menuItem.children.map((child) => (\n <DropdownItem\n key={child.key}\n icon={child.icon}\n disabled={child.disabled}\n danger={child.danger}\n onClick={child.onClick}\n >\n {child.label}\n </DropdownItem>\n ))}\n </DropdownSubMenu>\n )\n }\n return (\n <DropdownItem\n key={menuItem.key}\n icon={menuItem.icon}\n disabled={menuItem.disabled}\n danger={menuItem.danger}\n onClick={menuItem.onClick}\n >\n {menuItem.label}\n </DropdownItem>\n )\n })\n }\n\n // Determine content - either compound children or items-generated menu\n const menuContent = items ? (\n (shouldRender || !destroyOnHidden) && (\n <DropdownMenu>{renderItems()}</DropdownMenu>\n )\n ) : null\n\n // Auto-detect trigger pattern\n const childArray = React.Children.toArray(children)\n const hasTrigger = childArray.some(\n (child) => React.isValidElement(child) && child.type === DropdownTrigger\n )\n const hasMenu = childArray.some(\n (child) => React.isValidElement(child) && child.type === DropdownMenu\n )\n\n let content: React.ReactNode\n let isAutoTrigger = false\n\n if (items) {\n // Data-driven pattern with items prop\n const triggerChild = childArray.find(\n (child) => React.isValidElement(child) && child.type === DropdownTrigger\n )\n\n // If no explicit Trigger, treat first child as trigger\n if (!triggerChild && childArray[0] && React.isValidElement(childArray[0])) {\n isAutoTrigger = true\n content = (\n <>\n <DropdownTrigger className={className}>{childArray[0]}</DropdownTrigger>\n {popupRender ? popupRender(menuContent) : menuContent}\n </>\n )\n } else {\n content = (\n <>\n {triggerChild}\n {popupRender ? popupRender(menuContent) : menuContent}\n </>\n )\n }\n } else if (!hasTrigger && !hasMenu && childArray.length >= 2) {\n // Auto-pattern: first child is trigger, second child is menu\n const [triggerChild, menuChild, ...rest] = childArray\n isAutoTrigger = true\n content = (\n <>\n {triggerChild && React.isValidElement(triggerChild) && (\n <DropdownTrigger className={className}>{triggerChild}</DropdownTrigger>\n )}\n {menuChild}\n {rest}\n </>\n )\n } else {\n // Standard compound pattern or other cases\n content = children\n }\n\n const dropdownClasses = [\n dDropdown,\n positionClasses[position],\n alignClasses[align],\n triggers.includes('hover') && dDropdownHover,\n isOpen && dDropdownOpen,\n !isAutoTrigger && className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <DropdownContext.Provider\n value={{\n position,\n align,\n menuId,\n triggerId,\n isOpen,\n setIsOpen,\n focusedIndex,\n setFocusedIndex,\n registerItem,\n itemCount,\n setItemCount,\n disabled: effectiveDisabled,\n arrow: showArrow,\n closeDropdown,\n getTestId,\n }}\n >\n <div\n ref={dropdownRef}\n className={dropdownClasses}\n data-state={isOpen ? 'open' : 'closed'}\n data-testid={testId}\n aria-disabled={effectiveDisabled || undefined}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onContextMenu={handleContextMenu}\n {...rest}\n >\n {content}\n </div>\n </DropdownContext.Provider>\n )\n})\n\nfunction DropdownTrigger({ children, className = '' }: DropdownTriggerProps) {\n const { menuId, triggerId, isOpen, setIsOpen, setFocusedIndex, itemCount, disabled } = useDropdownContext()\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n switch (event.key) {\n case 'Enter':\n case ' ':\n case 'ArrowDown':\n event.preventDefault()\n setIsOpen(true)\n setFocusedIndex(0)\n break\n case 'ArrowUp':\n event.preventDefault()\n setIsOpen(true)\n setFocusedIndex(itemCount - 1)\n break\n case 'Escape':\n event.preventDefault()\n setIsOpen(false)\n setFocusedIndex(-1)\n break\n }\n }\n\n const handleClick = () => {\n setIsOpen(!isOpen)\n if (!isOpen) {\n setFocusedIndex(0)\n }\n }\n\n // Clone the child element to add event handlers and ARIA attributes\n const child = React.Children.only(children) as React.ReactElement<\n React.HTMLAttributes<HTMLElement> & {\n onClick?: (e: React.MouseEvent) => void\n onKeyDown?: (e: React.KeyboardEvent) => void\n className?: string\n }\n >\n\n const childProps = child.props\n\n return React.cloneElement(child, {\n id: triggerId,\n tabIndex: disabled ? -1 : 0,\n 'aria-haspopup': 'menu' as const,\n 'aria-expanded': isOpen,\n 'aria-controls': menuId,\n onClick: (e: React.MouseEvent) => {\n handleClick()\n childProps.onClick?.(e)\n },\n onKeyDown: (e: React.KeyboardEvent) => {\n handleKeyDown(e)\n childProps.onKeyDown?.(e)\n },\n className: `${childProps.className || ''} ${className}`.trim(),\n })\n}\n\nfunction DropdownMenu({ children, className = '' }: DropdownMenuProps) {\n const { menuId, triggerId, isOpen, setIsOpen, focusedIndex, setFocusedIndex, setItemCount, arrow, position, getTestId } = useDropdownContext()\n const menuRef = useRef<HTMLUListElement>(null)\n\n // Count children and set item count\n const childArray = React.Children.toArray(children).filter(\n (child) => React.isValidElement(child) && (child.type === DropdownItem)\n )\n\n useEffect(() => {\n setItemCount(childArray.length)\n }, [childArray.length, setItemCount])\n\n // Focus management\n useEffect(() => {\n if (isOpen && focusedIndex >= 0 && menuRef.current) {\n const items = menuRef.current.querySelectorAll('[role=\"menuitem\"]:not([aria-disabled=\"true\"])')\n const item = items[focusedIndex] as HTMLElement\n item?.focus()\n }\n }, [isOpen, focusedIndex])\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n const enabledItems = childArray.filter(\n (child) => React.isValidElement(child) && !(child.props as DropdownItemProps).disabled\n )\n const enabledCount = enabledItems.length\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n setFocusedIndex((focusedIndex + 1) % enabledCount)\n break\n case 'ArrowUp':\n event.preventDefault()\n setFocusedIndex((focusedIndex - 1 + enabledCount) % enabledCount)\n break\n case 'Home':\n event.preventDefault()\n setFocusedIndex(0)\n break\n case 'End':\n event.preventDefault()\n setFocusedIndex(enabledCount - 1)\n break\n case 'Escape':\n event.preventDefault()\n setIsOpen(false)\n setFocusedIndex(-1)\n // Return focus to trigger\n document.getElementById(triggerId)?.focus()\n break\n case 'Tab':\n setIsOpen(false)\n setFocusedIndex(-1)\n break\n }\n }\n\n const menuClasses = [\n dDropdownContent,\n dMenu,\n 'bg-base-100',\n 'rounded-box',\n 'z-50',\n 'shadow',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n // Clone children to pass index and extract key\n const childrenWithIndex = React.Children.map(children, (child, index) => {\n if (React.isValidElement(child)) {\n const childKey = child.key != null ? String(child.key) : undefined\n if (child.type === DropdownItem) {\n return React.cloneElement(child as React.ReactElement<any>, { _index: index, _key: childKey })\n }\n if (child.type === DropdownSubMenu) {\n return React.cloneElement(child as React.ReactElement<any>, { _key: childKey })\n }\n }\n return child\n })\n\n // Arrow position classes based on menu position\n const arrowPositionClasses: Record<string, string> = {\n top: 'bottom-0 left-1/2 -translate-x-1/2 translate-y-full border-t-base-100 border-l-transparent border-r-transparent border-b-transparent',\n bottom: 'top-0 left-1/2 -translate-x-1/2 -translate-y-full border-b-base-100 border-l-transparent border-r-transparent border-t-transparent',\n left: 'right-0 top-1/2 -translate-y-1/2 translate-x-full border-l-base-100 border-t-transparent border-b-transparent border-r-transparent',\n right: 'left-0 top-1/2 -translate-y-1/2 -translate-x-full border-r-base-100 border-t-transparent border-b-transparent border-l-transparent',\n }\n\n const arrowElement = arrow ? (\n <span\n className={`absolute w-0 h-0 border-8 border-solid ${arrowPositionClasses[position || 'bottom']}`}\n aria-hidden=\"true\"\n />\n ) : null\n\n return (\n <ul\n ref={menuRef}\n id={menuId}\n role=\"menu\"\n aria-labelledby={triggerId}\n tabIndex={-1}\n className={`${menuClasses} ${arrow ? 'relative' : ''}`}\n data-testid={getTestId('menu')}\n onKeyDown={handleKeyDown}\n >\n {arrowElement}\n {childrenWithIndex}\n </ul>\n )\n}\n\nfunction DropdownItem({\n children,\n icon,\n label,\n onClick,\n active = false,\n disabled = false,\n danger = false,\n className = '',\n _key,\n}: DropdownItemProps) {\n const { closeDropdown, getTestId } = useDropdownContext()\n const itemClasses = [active && 'active', disabled && 'disabled', className].filter(Boolean).join(' ')\n\n const handleClick = () => {\n if (!disabled) {\n onClick?.()\n closeDropdown()\n }\n }\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if ((event.key === 'Enter' || event.key === ' ') && !disabled) {\n event.preventDefault()\n handleClick()\n }\n }\n\n const content = label || children\n\n return (\n <li className={itemClasses} role=\"none\" data-key={_key} data-testid={_key ? getTestId(`item-${_key}`) : undefined}>\n <a\n role=\"menuitem\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled || undefined}\n className={`whitespace-nowrap ${danger ? 'text-error' : ''}`}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n >\n {icon && <span className=\"mr-2 inline-flex items-center\">{icon}</span>}\n {content}\n </a>\n </li>\n )\n}\n\nfunction DropdownSubMenu({\n children,\n title,\n icon,\n disabled = false,\n className = '',\n _key,\n}: DropdownSubMenuProps) {\n const [isSubOpen, setIsSubOpen] = useState(false)\n const subMenuRef = useRef<HTMLLIElement>(null)\n const summaryRef = useRef<HTMLElement>(null)\n const subMenuListRef = useRef<HTMLUListElement>(null)\n const subMenuId = useId()\n\n const handleMouseEnter = () => {\n if (!disabled) setIsSubOpen(true)\n }\n\n const handleMouseLeave = () => {\n setIsSubOpen(false)\n }\n\n // Focus first item in submenu\n const focusFirstItem = () => {\n setTimeout(() => {\n const firstItem = subMenuListRef.current?.querySelector('[role=\"menuitem\"]:not([aria-disabled=\"true\"])') as HTMLElement\n firstItem?.focus()\n }, 0)\n }\n\n // Keyboard handler for summary (submenu trigger)\n const handleSummaryKeyDown = (event: React.KeyboardEvent) => {\n if (disabled) return\n\n switch (event.key) {\n case 'ArrowRight':\n case 'Enter':\n case ' ':\n event.preventDefault()\n event.stopPropagation()\n setIsSubOpen(true)\n focusFirstItem()\n break\n case 'ArrowLeft':\n case 'Escape':\n event.preventDefault()\n event.stopPropagation()\n setIsSubOpen(false)\n break\n }\n }\n\n // Keyboard handler for submenu items\n const handleSubMenuKeyDown = (event: React.KeyboardEvent) => {\n switch (event.key) {\n case 'ArrowLeft':\n case 'Escape':\n event.preventDefault()\n event.stopPropagation()\n setIsSubOpen(false)\n summaryRef.current?.focus()\n break\n case 'ArrowDown':\n event.preventDefault()\n event.stopPropagation()\n const items = subMenuListRef.current?.querySelectorAll('[role=\"menuitem\"]:not([aria-disabled=\"true\"])')\n if (items) {\n const currentIndex = Array.from(items).findIndex(item => item === document.activeElement)\n const nextIndex = (currentIndex + 1) % items.length\n ;(items[nextIndex] as HTMLElement)?.focus()\n }\n break\n case 'ArrowUp':\n event.preventDefault()\n event.stopPropagation()\n const itemsUp = subMenuListRef.current?.querySelectorAll('[role=\"menuitem\"]:not([aria-disabled=\"true\"])')\n if (itemsUp) {\n const currentIndexUp = Array.from(itemsUp).findIndex(item => item === document.activeElement)\n const prevIndex = (currentIndexUp - 1 + itemsUp.length) % itemsUp.length\n ;(itemsUp[prevIndex] as HTMLElement)?.focus()\n }\n break\n }\n }\n\n const itemClasses = [disabled && 'disabled', className].filter(Boolean).join(' ')\n\n return (\n <li\n ref={subMenuRef}\n className={itemClasses}\n role=\"none\"\n data-key={_key}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n <details open={isSubOpen}>\n <summary\n ref={summaryRef}\n role=\"menuitem\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled || undefined}\n aria-haspopup=\"menu\"\n aria-expanded={isSubOpen}\n aria-controls={subMenuId}\n className=\"whitespace-nowrap\"\n onKeyDown={handleSummaryKeyDown}\n >\n {icon && <span className=\"mr-2 inline-flex items-center\">{icon}</span>}\n {title}\n </summary>\n <ul\n ref={subMenuListRef}\n id={subMenuId}\n className={`${dMenu} bg-base-100 rounded-box z-50 shadow`}\n role=\"menu\"\n aria-label={typeof title === 'string' ? title : undefined}\n onKeyDown={handleSubMenuKeyDown}\n >\n {children}\n </ul>\n </details>\n </li>\n )\n}\n\nfunction DropdownDivider({ className = '' }: DropdownDividerProps) {\n const classes = ['border-base-content/10', className].filter(Boolean).join(' ')\n return (\n <li role=\"separator\" className=\"my-1\">\n <hr className={classes} />\n </li>\n )\n}\n\nexport const Dropdown = Object.assign(DropdownRoot, {\n Trigger: DropdownTrigger,\n Menu: DropdownMenu,\n Item: DropdownItem,\n SubMenu: DropdownSubMenu,\n Divider: DropdownDivider,\n})\n"],"names":["dDropdown","dDropdownTop","dDropdownBottom","dDropdownLeft","dDropdownRight","dDropdownCenter","dDropdownEnd","dDropdownHover","dDropdownOpen","dDropdownContent","dMenu","DropdownContext","createContext","useDropdownContext","context","useContext","DropdownRoot","forwardRef","children","items","trigger","position","align","controlledOpen","onOpenChange","disabled","arrow","mouseEnterDelay","mouseLeaveDelay","_getPopupContainer","destroyOnHidden","popupRender","testId","className","rest","ref","componentDisabled","useConfig","effectiveDisabled","menuId","useId","triggerId","internalOpen","setInternalOpen","useState","focusedIndex","setFocusedIndex","itemCount","setItemCount","shouldRender","setShouldRender","itemRefs","useRef","dropdownRef","hoverTimeoutRef","triggers","useImperativeHandle","getTestId","suffix","isControlled","isOpen","setIsOpen","useCallback","open","source","closeDropdown","registerItem","index","itemDisabled","useEffect","timeout","handleClickOutside","event","handleMouseEnter","handleMouseLeave","handleContextMenu","positionClasses","alignClasses","showArrow","menuContent","jsx","DropdownMenu","item","DropdownDivider","menuItem","DropdownSubMenu","child","DropdownItem","childArray","React","hasTrigger","DropdownTrigger","hasMenu","content","isAutoTrigger","triggerChild","jsxs","Fragment","menuChild","dropdownClasses","handleKeyDown","handleClick","childProps","e","menuRef","enabledCount","menuClasses","childrenWithIndex","childKey","arrowElement","icon","label","onClick","active","danger","_key","itemClasses","title","isSubOpen","setIsSubOpen","subMenuRef","summaryRef","subMenuListRef","subMenuId","focusFirstItem","handleSummaryKeyDown","handleSubMenuKeyDown","nextIndex","itemsUp","prevIndex","classes","Dropdown"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Dropdown.js","sources":["../../src/components/Dropdown.tsx"],"sourcesContent":["import React, { createContext, useContext, useId, useRef, useState, useCallback, useEffect, forwardRef, useImperativeHandle } from 'react'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dDropdown = 'dropdown'\nconst dDropdownTop = 'dropdown-top'\nconst dDropdownBottom = 'dropdown-bottom'\nconst dDropdownLeft = 'dropdown-left'\nconst dDropdownRight = 'dropdown-right'\nconst dDropdownCenter = 'dropdown-center'\nconst dDropdownEnd = 'dropdown-end'\nconst dDropdownHover = 'dropdown-hover'\nconst dDropdownOpen = 'dropdown-open'\nconst dDropdownContent = 'dropdown-content'\nconst dMenu = 'menu'\n\n// Types for data-driven menu prop\nexport type DropdownTriggerType = 'click' | 'hover' | 'contextMenu'\nexport type DropdownPlacement = 'top' | 'topLeft' | 'topRight' | 'bottom' | 'bottomLeft' | 'bottomRight' | 'left' | 'right'\n\nexport interface DropdownMenuItem {\n key: string\n label: React.ReactNode\n icon?: React.ReactNode\n disabled?: boolean\n danger?: boolean\n onClick?: () => void\n children?: DropdownMenuItem[] // For submenus\n}\n\nexport interface DropdownMenuDivider {\n type: 'divider'\n key?: string\n}\n\nexport type DropdownMenuItemType = DropdownMenuItem | DropdownMenuDivider\n\nexport interface DropdownMenuConfig {\n /** Menu items */\n items: DropdownMenuItemType[]\n /** Callback when menu item is clicked */\n onClick?: (info: { key: string; keyPath: string[] }) => void\n}\n\nexport interface DropdownMenuProps {\n children?: React.ReactNode\n className?: string\n}\n\ninterface DropdownContextValue {\n position: 'top' | 'bottom' | 'left' | 'right'\n align: 'start' | 'center' | 'end'\n menuId: string\n triggerId: string\n isOpen: boolean\n setIsOpen: (open: boolean) => void\n focusedIndex: number\n setFocusedIndex: (index: number) => void\n registerItem: (index: number, ref: HTMLElement | null, disabled: boolean) => void\n itemCount: number\n setItemCount: (count: number) => void\n disabled: boolean\n arrow: boolean\n closeDropdown: () => void\n getTestId: (suffix: string) => string | undefined\n menuOnClick?: (info: { key: string; keyPath: string[] }) => void\n}\n\nconst DropdownContext = createContext<DropdownContextValue | undefined>(undefined)\n\nfunction useDropdownContext() {\n const context = useContext(DropdownContext)\n if (!context) {\n throw new Error('Dropdown compound components must be used within Dropdown')\n }\n return context\n}\n\nexport interface DropdownProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n /** Trigger element and dropdown content (compound pattern) */\n children?: React.ReactNode\n /** Menu configuration (data-driven pattern) */\n menu?: DropdownMenuConfig\n /** Trigger mode(s) for dropdown */\n trigger?: DropdownTriggerType[]\n /** Placement of dropdown menu */\n placement?: DropdownPlacement\n /** Whether to adjust dropdown placement automatically when dropdown is off screen */\n autoAdjustOverflow?: boolean\n /** Controlled open state */\n open?: boolean\n /** Callback when open state changes */\n onOpenChange?: (open: boolean, info?: { source: 'trigger' | 'menu' }) => void\n /** Disable the dropdown */\n disabled?: boolean\n /** Show arrow pointing to trigger */\n arrow?: boolean | { pointAtCenter?: boolean }\n /** Delay before showing dropdown on hover (seconds) */\n mouseEnterDelay?: number\n /** Delay before hiding dropdown on mouse leave (seconds) */\n mouseLeaveDelay?: number\n /** Container for the dropdown menu */\n getPopupContainer?: (triggerNode: HTMLElement) => HTMLElement\n /** Destroy dropdown when hidden */\n destroyOnHidden?: boolean\n /** Customize popup content */\n popupRender?: (menu: React.ReactNode) => React.ReactNode\n /** Test ID prefix for child elements */\n 'data-testid'?: string\n}\n\nexport interface DropdownTriggerProps {\n children: React.ReactNode\n className?: string\n}\n\nexport interface DropdownMenuProps {\n children?: React.ReactNode\n className?: string\n}\n\nexport interface DropdownItemProps {\n children?: React.ReactNode\n /** Icon to display before label */\n icon?: React.ReactNode\n /** Item label (alternative to children) */\n label?: React.ReactNode\n onClick?: () => void\n active?: boolean\n disabled?: boolean\n danger?: boolean\n className?: string\n /** @internal */\n _index?: number\n /** @internal */\n _key?: string\n}\n\nexport interface DropdownSubMenuProps {\n children: React.ReactNode\n /** Submenu title/label */\n title: React.ReactNode\n /** Icon to display before title */\n icon?: React.ReactNode\n disabled?: boolean\n className?: string\n /** @internal */\n _key?: string\n}\n\nexport interface DropdownDividerProps {\n className?: string\n}\n\nconst DropdownRoot = forwardRef<HTMLDivElement, DropdownProps>(function DropdownRoot(\n {\n children,\n menu,\n trigger = ['hover'],\n placement = 'bottomLeft',\n autoAdjustOverflow = true,\n open: controlledOpen,\n onOpenChange,\n disabled,\n arrow = false,\n mouseEnterDelay = 0.15,\n mouseLeaveDelay = 0.1,\n getPopupContainer: _getPopupContainer,\n destroyOnHidden = false,\n popupRender,\n 'data-testid': testId,\n className = '',\n ...rest\n },\n ref\n) {\n const { componentDisabled } = useConfig()\n const effectiveDisabled = disabled ?? componentDisabled ?? false\n\n // TODO: Implement autoAdjustOverflow logic to reposition dropdown when it goes off-screen\n // Currently the prop is accepted but not yet implemented\n\n // Convert placement to position + align\n const placementMap: Record<DropdownPlacement, { position: 'top' | 'bottom' | 'left' | 'right'; align: 'start' | 'center' | 'end' }> = {\n top: { position: 'top', align: 'center' },\n topLeft: { position: 'top', align: 'start' },\n topRight: { position: 'top', align: 'end' },\n bottom: { position: 'bottom', align: 'center' },\n bottomLeft: { position: 'bottom', align: 'start' },\n bottomRight: { position: 'bottom', align: 'end' },\n left: { position: 'left', align: 'start' },\n right: { position: 'right', align: 'start' },\n }\n\n const { position, align } = placementMap[placement]\n\n const menuId = useId()\n const triggerId = useId()\n const [internalOpen, setInternalOpen] = useState(false)\n const [focusedIndex, setFocusedIndex] = useState(-1)\n const [itemCount, setItemCount] = useState(0)\n const [shouldRender, setShouldRender] = useState(!destroyOnHidden)\n const itemRefs = useRef<Map<number, { ref: HTMLElement | null; disabled: boolean }>>(new Map())\n const dropdownRef = useRef<HTMLDivElement>(null)\n const hoverTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const triggers = trigger\n\n // Forward ref\n useImperativeHandle(ref, () => dropdownRef.current!, [])\n\n // Helper for test IDs\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n\n // Use controlled or uncontrolled open state\n const isControlled = controlledOpen !== undefined\n const isOpen = isControlled ? controlledOpen : internalOpen\n\n const setIsOpen = useCallback((open: boolean, source: 'trigger' | 'menu' = 'trigger') => {\n if (effectiveDisabled) return\n if (!isControlled) {\n setInternalOpen(open)\n }\n if (open) {\n setShouldRender(true)\n }\n onOpenChange?.(open, { source })\n }, [effectiveDisabled, isControlled, onOpenChange])\n\n const closeDropdown = useCallback(() => {\n setIsOpen(false, 'menu')\n setFocusedIndex(-1)\n document.getElementById(triggerId)?.focus()\n }, [setIsOpen, triggerId])\n\n const registerItem = useCallback((index: number, ref: HTMLElement | null, itemDisabled: boolean) => {\n if (ref) {\n itemRefs.current.set(index, { ref, disabled: itemDisabled })\n } else {\n itemRefs.current.delete(index)\n }\n }, [])\n\n // Handle destroyOnHidden\n useEffect(() => {\n if (destroyOnHidden && !isOpen) {\n const timeout = setTimeout(() => setShouldRender(false), 300)\n return () => clearTimeout(timeout)\n }\n }, [isOpen, destroyOnHidden])\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false, 'trigger')\n setFocusedIndex(-1)\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [isOpen, setIsOpen])\n\n // Hover handlers with delay\n const handleMouseEnter = useCallback(() => {\n if (!triggers.includes('hover')) return\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current)\n }\n hoverTimeoutRef.current = setTimeout(() => {\n setIsOpen(true, 'trigger')\n }, mouseEnterDelay * 1000)\n }, [triggers, mouseEnterDelay, setIsOpen])\n\n const handleMouseLeave = useCallback(() => {\n if (!triggers.includes('hover')) return\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current)\n }\n hoverTimeoutRef.current = setTimeout(() => {\n setIsOpen(false, 'trigger')\n setFocusedIndex(-1)\n }, mouseLeaveDelay * 1000)\n }, [triggers, mouseLeaveDelay, setIsOpen])\n\n // Context menu handler\n const handleContextMenu = useCallback((event: React.MouseEvent) => {\n if (!triggers.includes('contextMenu')) return\n event.preventDefault()\n setIsOpen(true, 'trigger')\n }, [triggers, setIsOpen])\n\n // Cleanup timeout on unmount\n useEffect(() => {\n return () => {\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current)\n }\n }\n }, [])\n\n const positionClasses: Record<string, string> = {\n top: dDropdownTop,\n bottom: dDropdownBottom,\n left: dDropdownLeft,\n right: dDropdownRight,\n }\n\n const alignClasses: Record<string, string> = {\n start: '',\n center: dDropdownCenter,\n end: dDropdownEnd,\n }\n\n const showArrow = typeof arrow === 'boolean' ? arrow : !!arrow\n\n // Render items from data-driven menu prop\n const renderItems = () => {\n if (!menu?.items) return null\n return menu.items.map((item, index) => {\n if ('type' in item && item.type === 'divider') {\n return <DropdownDivider key={item.key || `divider-${index}`} />\n }\n const menuItem = item as DropdownMenuItem\n if (menuItem.children && menuItem.children.length > 0) {\n return (\n <DropdownSubMenu\n key={menuItem.key}\n title={menuItem.label}\n icon={menuItem.icon}\n disabled={menuItem.disabled}\n >\n {menuItem.children.map((child) => (\n <DropdownItem\n key={child.key}\n icon={child.icon}\n disabled={child.disabled}\n danger={child.danger}\n onClick={child.onClick}\n >\n {child.label}\n </DropdownItem>\n ))}\n </DropdownSubMenu>\n )\n }\n return (\n <DropdownItem\n key={menuItem.key}\n icon={menuItem.icon}\n disabled={menuItem.disabled}\n danger={menuItem.danger}\n onClick={menuItem.onClick}\n >\n {menuItem.label}\n </DropdownItem>\n )\n })\n }\n\n // Determine content - either compound children or menu-generated content\n const menuContent = menu ? (\n (shouldRender || !destroyOnHidden) && (\n <DropdownMenu>{renderItems()}</DropdownMenu>\n )\n ) : null\n\n // Auto-detect trigger pattern\n const childArray = React.Children.toArray(children)\n const hasTrigger = childArray.some(\n (child) => React.isValidElement(child) && child.type === DropdownTrigger\n )\n const hasMenu = childArray.some(\n (child) => React.isValidElement(child) && child.type === DropdownMenu\n )\n\n let content: React.ReactNode\n let isAutoTrigger = false\n\n if (menu) {\n // Data-driven pattern with menu prop\n const triggerChild = childArray.find(\n (child) => React.isValidElement(child) && child.type === DropdownTrigger\n )\n\n // If no explicit Trigger, treat first child as trigger\n if (!triggerChild && childArray[0] && React.isValidElement(childArray[0])) {\n isAutoTrigger = true\n content = (\n <>\n <DropdownTrigger className={className}>{childArray[0]}</DropdownTrigger>\n {popupRender ? popupRender(menuContent) : menuContent}\n </>\n )\n } else {\n content = (\n <>\n {triggerChild}\n {popupRender ? popupRender(menuContent) : menuContent}\n </>\n )\n }\n } else if (!hasTrigger && !hasMenu && childArray.length >= 2) {\n // Auto-pattern: first child is trigger, second child is menu\n const [triggerChild, menuChild, ...rest] = childArray\n isAutoTrigger = true\n content = (\n <>\n {triggerChild && React.isValidElement(triggerChild) && (\n <DropdownTrigger className={className}>{triggerChild}</DropdownTrigger>\n )}\n {menuChild}\n {rest}\n </>\n )\n } else {\n // Standard compound pattern or other cases\n content = children\n }\n\n const dropdownClasses = [\n dDropdown,\n positionClasses[position],\n alignClasses[align],\n triggers.includes('hover') && dDropdownHover,\n isOpen && dDropdownOpen,\n !isAutoTrigger && className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <DropdownContext.Provider\n value={{\n position,\n align,\n menuId,\n triggerId,\n isOpen,\n setIsOpen,\n focusedIndex,\n setFocusedIndex,\n registerItem,\n itemCount,\n setItemCount,\n disabled: effectiveDisabled,\n arrow: showArrow,\n closeDropdown,\n getTestId,\n menuOnClick: menu?.onClick,\n }}\n >\n <div\n ref={dropdownRef}\n className={dropdownClasses}\n data-state={isOpen ? 'open' : 'closed'}\n data-testid={testId}\n aria-disabled={effectiveDisabled || undefined}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onContextMenu={handleContextMenu}\n {...rest}\n >\n {content}\n </div>\n </DropdownContext.Provider>\n )\n})\n\nfunction DropdownTrigger({ children, className = '' }: DropdownTriggerProps) {\n const { menuId, triggerId, isOpen, setIsOpen, setFocusedIndex, itemCount, disabled } = useDropdownContext()\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n switch (event.key) {\n case 'Enter':\n case ' ':\n case 'ArrowDown':\n event.preventDefault()\n setIsOpen(true)\n setFocusedIndex(0)\n break\n case 'ArrowUp':\n event.preventDefault()\n setIsOpen(true)\n setFocusedIndex(itemCount - 1)\n break\n case 'Escape':\n event.preventDefault()\n setIsOpen(false)\n setFocusedIndex(-1)\n break\n }\n }\n\n const handleClick = () => {\n setIsOpen(!isOpen)\n if (!isOpen) {\n setFocusedIndex(0)\n }\n }\n\n // Clone the child element to add event handlers and ARIA attributes\n const child = React.Children.only(children) as React.ReactElement<\n React.HTMLAttributes<HTMLElement> & {\n onClick?: (e: React.MouseEvent) => void\n onKeyDown?: (e: React.KeyboardEvent) => void\n className?: string\n }\n >\n\n const childProps = child.props\n\n return React.cloneElement(child, {\n id: triggerId,\n tabIndex: disabled ? -1 : 0,\n 'aria-haspopup': 'menu' as const,\n 'aria-expanded': isOpen,\n 'aria-controls': menuId,\n onClick: (e: React.MouseEvent) => {\n handleClick()\n childProps.onClick?.(e)\n },\n onKeyDown: (e: React.KeyboardEvent) => {\n handleKeyDown(e)\n childProps.onKeyDown?.(e)\n },\n className: `${childProps.className || ''} ${className}`.trim(),\n })\n}\n\nfunction DropdownMenu({ children, className = '' }: DropdownMenuProps) {\n const { menuId, triggerId, isOpen, setIsOpen, focusedIndex, setFocusedIndex, setItemCount, arrow, position, getTestId } = useDropdownContext()\n const menuRef = useRef<HTMLUListElement>(null)\n\n // Count children and set item count\n const childArray = React.Children.toArray(children).filter(\n (child) => React.isValidElement(child) && (child.type === DropdownItem)\n )\n\n useEffect(() => {\n setItemCount(childArray.length)\n }, [childArray.length, setItemCount])\n\n // Focus management\n useEffect(() => {\n if (isOpen && focusedIndex >= 0 && menuRef.current) {\n const items = menuRef.current.querySelectorAll('[role=\"menuitem\"]:not([aria-disabled=\"true\"])')\n const item = items[focusedIndex] as HTMLElement\n item?.focus()\n }\n }, [isOpen, focusedIndex])\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n const enabledItems = childArray.filter(\n (child) => React.isValidElement(child) && !(child.props as DropdownItemProps).disabled\n )\n const enabledCount = enabledItems.length\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n setFocusedIndex((focusedIndex + 1) % enabledCount)\n break\n case 'ArrowUp':\n event.preventDefault()\n setFocusedIndex((focusedIndex - 1 + enabledCount) % enabledCount)\n break\n case 'Home':\n event.preventDefault()\n setFocusedIndex(0)\n break\n case 'End':\n event.preventDefault()\n setFocusedIndex(enabledCount - 1)\n break\n case 'Escape':\n event.preventDefault()\n setIsOpen(false)\n setFocusedIndex(-1)\n // Return focus to trigger\n document.getElementById(triggerId)?.focus()\n break\n case 'Tab':\n setIsOpen(false)\n setFocusedIndex(-1)\n break\n }\n }\n\n const menuClasses = [\n dDropdownContent,\n dMenu,\n 'bg-base-100',\n 'rounded-box',\n 'z-50',\n 'shadow',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n // Clone children to pass index and extract key\n const childrenWithIndex = React.Children.map(children, (child, index) => {\n if (React.isValidElement(child)) {\n const childKey = child.key != null ? String(child.key) : undefined\n if (child.type === DropdownItem) {\n return React.cloneElement(child as React.ReactElement<any>, { _index: index, _key: childKey })\n }\n if (child.type === DropdownSubMenu) {\n return React.cloneElement(child as React.ReactElement<any>, { _key: childKey })\n }\n }\n return child\n })\n\n // Arrow position classes based on menu position\n const arrowPositionClasses: Record<string, string> = {\n top: 'bottom-0 left-1/2 -translate-x-1/2 translate-y-full border-t-base-100 border-l-transparent border-r-transparent border-b-transparent',\n bottom: 'top-0 left-1/2 -translate-x-1/2 -translate-y-full border-b-base-100 border-l-transparent border-r-transparent border-t-transparent',\n left: 'right-0 top-1/2 -translate-y-1/2 translate-x-full border-l-base-100 border-t-transparent border-b-transparent border-r-transparent',\n right: 'left-0 top-1/2 -translate-y-1/2 -translate-x-full border-r-base-100 border-t-transparent border-b-transparent border-l-transparent',\n }\n\n const arrowElement = arrow ? (\n <span\n className={`absolute w-0 h-0 border-8 border-solid ${arrowPositionClasses[position || 'bottom']}`}\n aria-hidden=\"true\"\n />\n ) : null\n\n return (\n <ul\n ref={menuRef}\n id={menuId}\n role=\"menu\"\n aria-labelledby={triggerId}\n tabIndex={-1}\n className={`${menuClasses} ${arrow ? 'relative' : ''}`}\n data-testid={getTestId('menu')}\n onKeyDown={handleKeyDown}\n >\n {arrowElement}\n {childrenWithIndex}\n </ul>\n )\n}\n\nfunction DropdownItem({\n children,\n icon,\n label,\n onClick,\n active = false,\n disabled = false,\n danger = false,\n className = '',\n _key,\n}: DropdownItemProps) {\n const { closeDropdown, getTestId, menuOnClick } = useDropdownContext()\n const itemClasses = [active && 'active', disabled && 'disabled', className].filter(Boolean).join(' ')\n\n const handleClick = () => {\n if (!disabled) {\n onClick?.()\n // Call menu.onClick if provided\n if (menuOnClick && _key) {\n menuOnClick({ key: _key, keyPath: [_key] })\n }\n closeDropdown()\n }\n }\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if ((event.key === 'Enter' || event.key === ' ') && !disabled) {\n event.preventDefault()\n handleClick()\n }\n }\n\n const content = label || children\n\n return (\n <li className={itemClasses} role=\"none\" data-key={_key} data-testid={_key ? getTestId(`item-${_key}`) : undefined}>\n <a\n role=\"menuitem\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled || undefined}\n className={`whitespace-nowrap ${danger ? 'text-error' : ''}`}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n >\n {icon && <span className=\"mr-2 inline-flex items-center\">{icon}</span>}\n {content}\n </a>\n </li>\n )\n}\n\nfunction DropdownSubMenu({\n children,\n title,\n icon,\n disabled = false,\n className = '',\n _key,\n}: DropdownSubMenuProps) {\n const [isSubOpen, setIsSubOpen] = useState(false)\n const subMenuRef = useRef<HTMLLIElement>(null)\n const summaryRef = useRef<HTMLElement>(null)\n const subMenuListRef = useRef<HTMLUListElement>(null)\n const subMenuId = useId()\n\n const handleMouseEnter = () => {\n if (!disabled) setIsSubOpen(true)\n }\n\n const handleMouseLeave = () => {\n setIsSubOpen(false)\n }\n\n // Focus first item in submenu\n const focusFirstItem = () => {\n setTimeout(() => {\n const firstItem = subMenuListRef.current?.querySelector('[role=\"menuitem\"]:not([aria-disabled=\"true\"])') as HTMLElement\n firstItem?.focus()\n }, 0)\n }\n\n // Keyboard handler for summary (submenu trigger)\n const handleSummaryKeyDown = (event: React.KeyboardEvent) => {\n if (disabled) return\n\n switch (event.key) {\n case 'ArrowRight':\n case 'Enter':\n case ' ':\n event.preventDefault()\n event.stopPropagation()\n setIsSubOpen(true)\n focusFirstItem()\n break\n case 'ArrowLeft':\n case 'Escape':\n event.preventDefault()\n event.stopPropagation()\n setIsSubOpen(false)\n break\n }\n }\n\n // Keyboard handler for submenu items\n const handleSubMenuKeyDown = (event: React.KeyboardEvent) => {\n switch (event.key) {\n case 'ArrowLeft':\n case 'Escape':\n event.preventDefault()\n event.stopPropagation()\n setIsSubOpen(false)\n summaryRef.current?.focus()\n break\n case 'ArrowDown':\n event.preventDefault()\n event.stopPropagation()\n const items = subMenuListRef.current?.querySelectorAll('[role=\"menuitem\"]:not([aria-disabled=\"true\"])')\n if (items) {\n const currentIndex = Array.from(items).findIndex(item => item === document.activeElement)\n const nextIndex = (currentIndex + 1) % items.length\n ;(items[nextIndex] as HTMLElement)?.focus()\n }\n break\n case 'ArrowUp':\n event.preventDefault()\n event.stopPropagation()\n const itemsUp = subMenuListRef.current?.querySelectorAll('[role=\"menuitem\"]:not([aria-disabled=\"true\"])')\n if (itemsUp) {\n const currentIndexUp = Array.from(itemsUp).findIndex(item => item === document.activeElement)\n const prevIndex = (currentIndexUp - 1 + itemsUp.length) % itemsUp.length\n ;(itemsUp[prevIndex] as HTMLElement)?.focus()\n }\n break\n }\n }\n\n const itemClasses = [disabled && 'disabled', className].filter(Boolean).join(' ')\n\n return (\n <li\n ref={subMenuRef}\n className={itemClasses}\n role=\"none\"\n data-key={_key}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n <details open={isSubOpen}>\n <summary\n ref={summaryRef}\n role=\"menuitem\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled || undefined}\n aria-haspopup=\"menu\"\n aria-expanded={isSubOpen}\n aria-controls={subMenuId}\n className=\"whitespace-nowrap\"\n onKeyDown={handleSummaryKeyDown}\n >\n {icon && <span className=\"mr-2 inline-flex items-center\">{icon}</span>}\n {title}\n </summary>\n <ul\n ref={subMenuListRef}\n id={subMenuId}\n className={`${dMenu} bg-base-100 rounded-box z-50 shadow`}\n role=\"menu\"\n aria-label={typeof title === 'string' ? title : undefined}\n onKeyDown={handleSubMenuKeyDown}\n >\n {children}\n </ul>\n </details>\n </li>\n )\n}\n\nfunction DropdownDivider({ className = '' }: DropdownDividerProps) {\n const classes = ['border-base-content/10', className].filter(Boolean).join(' ')\n return (\n <li role=\"separator\" className=\"my-1\">\n <hr className={classes} />\n </li>\n )\n}\n\nexport const Dropdown = Object.assign(DropdownRoot, {\n Trigger: DropdownTrigger,\n Menu: DropdownMenu,\n Item: DropdownItem,\n SubMenu: DropdownSubMenu,\n Divider: DropdownDivider,\n})\n"],"names":["dDropdown","dDropdownTop","dDropdownBottom","dDropdownLeft","dDropdownRight","dDropdownCenter","dDropdownEnd","dDropdownHover","dDropdownOpen","dDropdownContent","dMenu","DropdownContext","createContext","useDropdownContext","context","useContext","DropdownRoot","forwardRef","children","menu","trigger","placement","autoAdjustOverflow","controlledOpen","onOpenChange","disabled","arrow","mouseEnterDelay","mouseLeaveDelay","_getPopupContainer","destroyOnHidden","popupRender","testId","className","rest","ref","componentDisabled","useConfig","effectiveDisabled","placementMap","position","align","menuId","useId","triggerId","internalOpen","setInternalOpen","useState","focusedIndex","setFocusedIndex","itemCount","setItemCount","shouldRender","setShouldRender","itemRefs","useRef","dropdownRef","hoverTimeoutRef","triggers","useImperativeHandle","getTestId","suffix","isControlled","isOpen","setIsOpen","useCallback","open","source","closeDropdown","registerItem","index","itemDisabled","useEffect","timeout","handleClickOutside","event","handleMouseEnter","handleMouseLeave","handleContextMenu","positionClasses","alignClasses","showArrow","menuContent","jsx","DropdownMenu","item","DropdownDivider","menuItem","DropdownSubMenu","child","DropdownItem","childArray","React","hasTrigger","DropdownTrigger","hasMenu","content","isAutoTrigger","triggerChild","jsxs","Fragment","menuChild","dropdownClasses","handleKeyDown","handleClick","childProps","e","menuRef","enabledCount","menuClasses","childrenWithIndex","childKey","arrowElement","icon","label","onClick","active","danger","_key","menuOnClick","itemClasses","title","isSubOpen","setIsSubOpen","subMenuRef","summaryRef","subMenuListRef","subMenuId","focusFirstItem","handleSummaryKeyDown","handleSubMenuKeyDown","items","nextIndex","itemsUp","prevIndex","classes","Dropdown"],"mappings":"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"}
|