asterui 0.12.71 → 0.12.73

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 = ['click'],\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 const dropdownClasses = [\n dDropdown,\n positionClasses[position],\n alignClasses[align],\n triggers.includes('hover') && dDropdownHover,\n isOpen && dDropdownOpen,\n className,\n ]\n .filter(Boolean)\n .join(' ')\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 const content = items ? (\n <>\n {React.Children.toArray(children).find(\n (child) => React.isValidElement(child) && child.type === DropdownTrigger\n )}\n {popupRender ? popupRender(menuContent) : menuContent}\n </>\n ) : (\n children\n )\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={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 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","dropdownClasses","menuContent","jsx","DropdownMenu","item","DropdownDivider","menuItem","DropdownSubMenu","child","DropdownItem","content","jsxs","Fragment","React","DropdownTrigger","handleKeyDown","handleClick","childProps","e","menuRef","childArray","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 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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"}
@@ -46,6 +46,8 @@ export interface FormRule {
46
46
  export interface FormRuleMethods {
47
47
  getFieldValue: (name: string) => any;
48
48
  getFieldsValue: () => any;
49
+ isSubmitted: () => boolean;
50
+ isSubmitAttempted: () => boolean;
49
51
  }
50
52
  /** A rule can be an object or a function that returns a rule object */
51
53
  export type FormRuleInput = FormRule | ((methods: FormRuleMethods) => FormRule);
@@ -1,9 +1,9 @@
1
- import { jsx as t, jsxs as E } from "react/jsx-runtime";
1
+ import { jsx as t, jsxs as L } from "react/jsx-runtime";
2
2
  import { createContext as Fe, useId as ae, useEffect as ie, useRef as O, isValidElement as U, cloneElement as Ne, useContext as ke } from "react";
3
3
  import { useWatch as ce, useForm as de, useFieldArray as Ve, Controller as we } from "react-hook-form";
4
4
  import { useWatch as et } from "react-hook-form";
5
5
  import { useConfig as Ce } from "../providers/ConfigProvider.js";
6
- const Le = "input", Ee = "input-xs", Ae = "input-sm", Se = "input-md", je = "input-lg", ze = "input-xl", Me = "floating-label", Pe = "loading", Re = "loading-spinner", Te = "loading-xs", We = "tooltip", Be = "tooltip-top", le = "validator-hint", G = Fe(void 0), Y = {
6
+ const Ae = "input", Le = "input-xs", Se = "input-sm", Ee = "input-md", je = "input-lg", ze = "input-xl", Me = "floating-label", Pe = "loading", Re = "loading-spinner", Te = "loading-xs", We = "tooltip", _e = "tooltip-top", le = "validator-hint", G = Fe(void 0), Y = {
7
7
  email: {
8
8
  value: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i,
9
9
  message: "Please enter a valid email address"
@@ -23,106 +23,108 @@ function Q() {
23
23
  throw new Error("Form compound components must be used within Form");
24
24
  return i;
25
25
  }
26
- function Ie({
26
+ function Be({
27
27
  form: i,
28
28
  onFinish: a,
29
29
  onFinishFailed: s,
30
30
  initialValues: n,
31
31
  layout: m = "vertical",
32
- labelWidth: p = 60,
32
+ labelWidth: g = 60,
33
33
  size: w,
34
- disabled: y = !1,
34
+ disabled: b = !1,
35
35
  children: d,
36
36
  className: l = "",
37
37
  noValidate: $ = !0,
38
- ...b
38
+ ...F
39
39
  }) {
40
- const { componentSize: F } = Ce(), f = w ?? F ?? "md", z = de({
40
+ const { componentSize: N } = Ce(), f = w ?? N ?? "md", z = de({
41
41
  defaultValues: n
42
- }), N = i || z, I = async (C) => {
43
- if (C.preventDefault(), await N.trigger())
44
- a && a(N.getValues());
42
+ }), v = i || z, I = async (C) => {
43
+ if (C.preventDefault(), v.__submitAttempted = !0, await v.trigger())
44
+ a && a(v.getValues());
45
45
  else if (s) {
46
- const u = N.formState.errors, k = [], M = (P, D = "") => {
46
+ const u = v.formState.errors, k = [], M = (P, D = "") => {
47
47
  for (const R in P) {
48
48
  const T = D ? `${D}.${R}` : R, V = P[R];
49
49
  V?.message ? k.push({ name: T, errors: [V.message] }) : typeof V == "object" && V !== null && M(V, T);
50
50
  }
51
51
  };
52
- M(u), s({ values: N.getValues(), errorFields: k });
52
+ M(u), s({ values: v.getValues(), errorFields: k });
53
53
  }
54
- }, S = (C) => {
55
- C.preventDefault(), N.reset(n);
54
+ }, E = (C) => {
55
+ C.preventDefault(), v.reset(n), v.__submitAttempted = !1;
56
56
  };
57
- return /* @__PURE__ */ t(G.Provider, { value: { form: N, layout: m, labelWidth: p, size: f, disabled: y }, children: /* @__PURE__ */ t("form", { onSubmit: I, onReset: S, className: l, noValidate: $, ...b, children: d }) });
57
+ return /* @__PURE__ */ t(G.Provider, { value: { form: v, layout: m, labelWidth: g, size: f, disabled: b }, children: /* @__PURE__ */ t("form", { onSubmit: I, onReset: E, className: l, noValidate: $, ...F, children: d }) });
58
58
  }
59
- function De({
59
+ function Ie({
60
60
  name: i,
61
61
  label: a,
62
62
  floatingLabel: s,
63
63
  help: n,
64
64
  required: m = !1,
65
- rules: p,
65
+ rules: g,
66
66
  valuePropName: w = "value",
67
- inline: y = !1,
67
+ inline: b = !1,
68
68
  className: d = "",
69
69
  children: l,
70
70
  tooltip: $,
71
- extra: b,
72
- hasFeedback: F = !1,
71
+ extra: F,
72
+ hasFeedback: N = !1,
73
73
  dependencies: f,
74
74
  validateTrigger: z = "onChange",
75
- initialValue: N,
75
+ initialValue: v,
76
76
  hidden: I = !1,
77
- addonBefore: S,
77
+ addonBefore: E,
78
78
  addonAfter: C,
79
- "data-testid": h
79
+ "data-testid": p
80
80
  }) {
81
81
  const { form: u, size: k, listName: M, layout: P, labelWidth: D, disabled: R } = Q(), T = ae(), V = ae();
82
82
  if (!i)
83
- return /* @__PURE__ */ t("div", { className: `${y ? "w-auto" : "w-full"} ${d}`, style: I ? { display: "none" } : void 0, children: l });
84
- let g;
85
- Array.isArray(i) ? g = (M ? [M, ...i] : i).join(".") : g = i, ie(() => {
86
- N !== void 0 && u.getValues(g) === void 0 && u.setValue(g, N);
83
+ return /* @__PURE__ */ t("div", { className: `${b ? "w-auto" : "w-full"} ${d}`, style: I ? { display: "none" } : void 0, children: l });
84
+ let h;
85
+ Array.isArray(i) ? h = (M ? [M, ...i] : i).join(".") : h = i, ie(() => {
86
+ v !== void 0 && u.getValues(h) === void 0 && u.setValue(h, v);
87
87
  }, []);
88
- const X = ce({
88
+ const H = ce({
89
89
  control: u.control,
90
90
  name: f,
91
91
  disabled: !f || f.length === 0
92
- }), H = O(u);
93
- H.current = u;
92
+ }), J = O(u);
93
+ J.current = u;
94
94
  const Z = O(void 0);
95
95
  ie(() => {
96
96
  if (!f || f.length === 0) return;
97
97
  if (Z.current === void 0) {
98
- Z.current = JSON.stringify(X);
98
+ Z.current = JSON.stringify(H);
99
99
  return;
100
100
  }
101
- const e = JSON.stringify(X);
101
+ const e = JSON.stringify(H);
102
102
  if (Z.current !== e) {
103
103
  Z.current = e;
104
- const r = H.current.formState.touchedFields;
105
- g.split(".").reduce((v, K) => v?.[K], r) && H.current.trigger(g);
104
+ const r = J.current.formState.touchedFields;
105
+ h.split(".").reduce((x, K) => x?.[K], r) && J.current.trigger(h);
106
106
  }
107
- }, [X, f, g]);
107
+ }, [H, f, h]);
108
108
  const W = ((e) => {
109
109
  const r = e.split(".");
110
110
  let o = u.formState.errors;
111
- for (const v of r) {
111
+ for (const x of r) {
112
112
  if (!o) break;
113
- o = o[v];
113
+ o = o[x];
114
114
  }
115
115
  return o;
116
- })(g), A = W?.message, me = p ? Array.isArray(p) ? p : [p] : [], J = O(u);
117
- J.current = u;
116
+ })(h), S = W?.message, me = g ? Array.isArray(g) ? g : [g] : [], _ = O(u);
117
+ _.current = u;
118
118
  const fe = {
119
- getFieldValue: (e) => J.current.getValues(e),
120
- getFieldsValue: () => J.current.getValues()
121
- }, he = me.map(
119
+ getFieldValue: (e) => _.current.getValues(e),
120
+ getFieldsValue: () => _.current.getValues(),
121
+ isSubmitted: () => _.current.formState.isSubmitted,
122
+ isSubmitAttempted: () => !!_.current.__submitAttempted
123
+ }, pe = me.map(
122
124
  (e) => typeof e == "function" ? e(fe) : e
123
- ), j = {}, q = [], _ = [];
125
+ ), j = {}, q = [], X = [];
124
126
  m && (j.required = "This field is required");
125
- for (const e of he) {
127
+ for (const e of pe) {
126
128
  if (e.required && (j.required = typeof e.required == "string" ? e.required : e.message || "This field is required"), e.type && Y[e.type] && q.push({
127
129
  pattern: Y[e.type].value,
128
130
  message: e.message || Y[e.type].message
@@ -138,136 +140,136 @@ function De({
138
140
  const r = e.pattern instanceof RegExp ? e.pattern : e.pattern.value, o = e.pattern instanceof RegExp ? e.message || "Invalid format" : e.pattern.message;
139
141
  q.push({ pattern: r, message: o });
140
142
  }
141
- if (e.validate && _.push(e.validate), e.validator) {
143
+ if (e.validate && X.push(e.validate), e.validator) {
142
144
  const r = e.validator;
143
- _.push(async (o) => {
145
+ X.push(async (o) => {
144
146
  try {
145
147
  return await r(e, o), !0;
146
- } catch (v) {
147
- return v instanceof Error ? v.message : String(v);
148
+ } catch (x) {
149
+ return x instanceof Error ? x.message : String(x);
148
150
  }
149
151
  });
150
152
  }
151
153
  }
152
- (q.length > 0 || _.length > 0) && (j.validate = async (e) => {
154
+ (q.length > 0 || X.length > 0) && (j.validate = async (e) => {
153
155
  for (const { pattern: r, message: o } of q)
154
156
  if (e && !r.test(e))
155
157
  return o;
156
- for (const r of _) {
158
+ for (const r of X) {
157
159
  const o = await r(e);
158
160
  if (o !== !0)
159
161
  return o;
160
162
  }
161
163
  return !0;
162
164
  });
163
- const ee = Array.isArray(z) ? z : [z], te = ee.includes("onChange"), ge = ee.includes("onBlur"), pe = ({ hasError: e, isValidating: r }) => r ? /* @__PURE__ */ t("span", { className: `${Pe} ${Re} ${Te} text-base-content/50` }) : e ? /* @__PURE__ */ t("svg", { className: "w-4 h-4 text-error", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: /* @__PURE__ */ t("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) }) : /* @__PURE__ */ t("svg", { className: "w-4 h-4 text-success", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: /* @__PURE__ */ t("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }), ve = () => /* @__PURE__ */ t("div", { className: `${We} ${Be} ml-1`, "data-tip": $, children: /* @__PURE__ */ t("svg", { className: "w-4 h-4 text-base-content/50 cursor-help", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: /* @__PURE__ */ t("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" }) }) });
165
+ const ee = Array.isArray(z) ? z : [z], te = ee.includes("onChange"), he = ee.includes("onBlur"), ge = ({ hasError: e, isValidating: r }) => r ? /* @__PURE__ */ t("span", { className: `${Pe} ${Re} ${Te} text-base-content/50` }) : e ? /* @__PURE__ */ t("svg", { className: "w-4 h-4 text-error", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: /* @__PURE__ */ t("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) }) : /* @__PURE__ */ t("svg", { className: "w-4 h-4 text-success", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: /* @__PURE__ */ t("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }), ve = () => /* @__PURE__ */ t("div", { className: `${We} ${_e} ml-1`, "data-tip": $, children: /* @__PURE__ */ t("svg", { className: "w-4 h-4 text-base-content/50 cursor-help", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: /* @__PURE__ */ t("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" }) }) });
164
166
  return /* @__PURE__ */ t(
165
167
  we,
166
168
  {
167
- name: g,
169
+ name: h,
168
170
  control: u.control,
169
171
  rules: j,
170
172
  render: ({ field: e, fieldState: r }) => {
171
- const { value: o, onChange: v, onBlur: K, ref: xe } = e, ye = r.isTouched && u.formState.isValidating, x = {
173
+ const { value: o, onChange: x, onBlur: K, ref: xe } = e, ye = r.isTouched && u.formState.isValidating, y = {
172
174
  id: T,
173
175
  ref: xe,
174
176
  "aria-invalid": W ? !0 : void 0,
175
177
  "aria-describedby": W ? V : void 0,
176
- "data-testid": h ? `${h}-input` : void 0
178
+ "data-testid": p ? `${p}-input` : void 0
177
179
  };
178
- x.onBlur = () => {
179
- K(), ge && u.trigger(g);
180
+ y.onBlur = () => {
181
+ K(), he && u.trigger(h);
180
182
  };
181
183
  const se = U(l) ? l.props.onChange : void 0;
182
- w === "checked" ? (x.checked = o, x.onChange = (c) => {
183
- v(c.target.checked), te && u.trigger(g), se?.(c);
184
- }) : (x.value = o ?? "", x.onChange = (c) => {
184
+ w === "checked" ? (y.checked = o, y.onChange = (c) => {
185
+ x(c.target.checked), te && u.trigger(h), se?.(c);
186
+ }) : (y.value = o ?? "", y.onChange = (c) => {
185
187
  if (c && c.target !== void 0) {
186
188
  const B = c.target.value ?? c.currentTarget?.value;
187
- v(B ?? c);
189
+ x(B ?? c);
188
190
  } else
189
- v(c);
190
- te && u.trigger(g), se?.(c);
191
- }), k && U(l) && (l.props.size || (x.size = k)), W && (x.color = "error", x["aria-invalid"] = !0), R && (x.disabled = !0), (S || C) && (x.unstyled = !0);
192
- const re = U(l) ? Ne(l, x) : l, L = P === "horizontal", ne = P === "inline", oe = {
193
- xs: Ee,
194
- sm: Ae,
195
- md: Se,
191
+ x(c);
192
+ te && u.trigger(h), se?.(c);
193
+ }), k && U(l) && (l.props.size || (y.size = k)), W && (y.color = "error", y["aria-invalid"] = !0), R && (y.disabled = !0), (E || C) && (y.unstyled = !0);
194
+ const re = U(l) ? Ne(l, y) : l, A = P === "horizontal", ne = P === "inline", oe = {
195
+ xs: Le,
196
+ sm: Se,
197
+ md: Ee,
196
198
  lg: je,
197
199
  xl: ze
198
- }, $e = () => {
199
- const c = /* @__PURE__ */ E("div", { className: `${L ? "flex-1" : ""} ${F ? "relative" : ""}`, children: [
200
+ }, be = () => {
201
+ const c = /* @__PURE__ */ L("div", { className: `${A ? "flex-1" : ""} ${N ? "relative" : ""}`, children: [
200
202
  re,
201
- F && r.isTouched && /* @__PURE__ */ t("span", { className: "absolute right-3 top-1/2 -translate-y-1/2 pointer-events-none", children: /* @__PURE__ */ t(pe, { hasError: !!W, isValidating: ye }) })
203
+ N && r.isTouched && /* @__PURE__ */ t("span", { className: "absolute right-3 top-1/2 -translate-y-1/2 pointer-events-none", children: /* @__PURE__ */ t(ge, { hasError: !!W, isValidating: ye }) })
202
204
  ] });
203
205
  if (s) {
204
206
  const B = [
205
207
  Me,
206
208
  k && oe[k]
207
209
  ].filter(Boolean).join(" ");
208
- return /* @__PURE__ */ E("label", { className: B, children: [
210
+ return /* @__PURE__ */ L("label", { className: B, children: [
209
211
  re,
210
- /* @__PURE__ */ E("span", { children: [
212
+ /* @__PURE__ */ L("span", { children: [
211
213
  s,
212
214
  m && /* @__PURE__ */ t("span", { className: "text-error ml-1", children: "*" })
213
215
  ] })
214
216
  ] });
215
217
  }
216
218
  return c;
217
- }, be = (c) => {
218
- if (!S && !C) return c;
219
+ }, $e = (c) => {
220
+ if (!E && !C) return c;
219
221
  const B = [
220
- Le,
222
+ Ae,
221
223
  "flex",
222
224
  "items-center",
223
225
  "gap-2",
224
226
  k && oe[k]
225
227
  ].filter(Boolean).join(" ");
226
- return /* @__PURE__ */ E("label", { className: B, children: [
227
- S && /* @__PURE__ */ t("span", { className: "text-base-content/70", children: S }),
228
+ return /* @__PURE__ */ L("label", { className: B, children: [
229
+ E && /* @__PURE__ */ t("span", { className: "text-base-content/70", children: E }),
228
230
  c,
229
231
  C && /* @__PURE__ */ t("span", { className: "text-base-content/70", children: C })
230
232
  ] });
231
233
  };
232
- return /* @__PURE__ */ E("div", { className: `${y ? "w-auto" : "w-full"} ${L ? "mb-4" : ""} ${ne ? "inline-flex mr-4" : ""} ${d}`, style: I ? { display: "none" } : void 0, "data-testid": h, children: [
233
- /* @__PURE__ */ E("div", { className: L ? "flex items-center gap-4" : "", children: [
234
+ return /* @__PURE__ */ L("div", { className: `${b ? "w-auto" : "w-full"} ${A ? "mb-4" : ""} ${ne ? "inline-flex mr-4" : ""} ${d}`, style: I ? { display: "none" } : void 0, "data-testid": p, children: [
235
+ /* @__PURE__ */ L("div", { className: A ? "flex items-center gap-4" : "", children: [
234
236
  a && !s && /* @__PURE__ */ t(
235
237
  "label",
236
238
  {
237
239
  htmlFor: T,
238
- className: `block text-sm font-medium ${L ? "flex-shrink-0 text-right" : ""} ${!L && !ne ? "mb-1" : ""}`,
239
- style: L ? { width: D } : void 0,
240
- "data-testid": h ? `${h}-label` : void 0,
241
- children: /* @__PURE__ */ E("span", { className: "flex items-center", children: [
240
+ className: `block text-sm font-medium ${A ? "flex-shrink-0 text-right" : ""} ${!A && !ne ? "mb-1" : ""}`,
241
+ style: A ? { width: D } : void 0,
242
+ "data-testid": p ? `${p}-label` : void 0,
243
+ children: /* @__PURE__ */ L("span", { className: "flex items-center", children: [
242
244
  a,
243
245
  m && /* @__PURE__ */ t("span", { className: "text-error ml-1", children: "*" }),
244
246
  $ && /* @__PURE__ */ t(ve, {})
245
247
  ] })
246
248
  }
247
249
  ),
248
- be($e())
250
+ $e(be())
249
251
  ] }),
250
- !L && !y && /* @__PURE__ */ t("p", { id: V, className: `${le} ${A ? "!visible text-error" : ""} min-h-[1.25rem]`, role: A ? "alert" : void 0, "data-testid": h ? `${h}-error` : void 0, children: A || n && /* @__PURE__ */ t("span", { className: "text-base-content/70", children: n }) || " " }),
251
- L && (A || n) && /* @__PURE__ */ t("p", { id: V, className: `${le} ${A ? "!visible text-error" : ""} min-h-[1.25rem]`, role: A ? "alert" : void 0, "data-testid": h ? `${h}-error` : void 0, children: A || n && /* @__PURE__ */ t("span", { className: "text-base-content/70", children: n }) }),
252
- b && /* @__PURE__ */ t("div", { className: "text-sm text-base-content/60 mt-1", "data-testid": h ? `${h}-extra` : void 0, children: b })
252
+ !A && !b && /* @__PURE__ */ t("p", { id: V, className: `${le} ${S ? "!visible text-error" : ""} min-h-[1.25rem]`, role: S ? "alert" : void 0, "data-testid": p ? `${p}-error` : void 0, children: S || n && /* @__PURE__ */ t("span", { className: "text-base-content/70", children: n }) || " " }),
253
+ A && (S || n) && /* @__PURE__ */ t("p", { id: V, className: `${le} ${S ? "!visible text-error" : ""} min-h-[1.25rem]`, role: S ? "alert" : void 0, "data-testid": p ? `${p}-error` : void 0, children: S || n && /* @__PURE__ */ t("span", { className: "text-base-content/70", children: n }) }),
254
+ F && /* @__PURE__ */ t("div", { className: "text-sm text-base-content/60 mt-1", "data-testid": p ? `${p}-extra` : void 0, children: F })
253
255
  ] });
254
256
  }
255
257
  }
256
258
  );
257
259
  }
258
- function Ze({
260
+ function De({
259
261
  name: i,
260
262
  children: a
261
263
  }) {
262
- const { form: s, layout: n, size: m, disabled: p } = Q(), { fields: w, append: y, remove: d, move: l } = Ve({
264
+ const { form: s, layout: n, size: m, disabled: g } = Q(), { fields: w, append: b, remove: d, move: l } = Ve({
263
265
  control: s.control,
264
266
  name: i
265
- }), $ = w.map((b, F) => ({
266
- ...b,
267
- name: F
267
+ }), $ = w.map((F, N) => ({
268
+ ...F,
269
+ name: N
268
270
  }));
269
- return /* @__PURE__ */ t(G.Provider, { value: { form: s, layout: n, size: m, listName: i, disabled: p }, children: a($, {
270
- add: y,
271
+ return /* @__PURE__ */ t(G.Provider, { value: { form: s, layout: n, size: m, listName: i, disabled: g }, children: a($, {
272
+ add: b,
271
273
  remove: d,
272
274
  move: l
273
275
  }) });
@@ -280,24 +282,24 @@ function ue(i) {
280
282
  });
281
283
  }, s.validateFields = a.trigger, s.resetFields = a.reset, s.isFieldTouched = (n) => !!a.formState.touchedFields[n], s.getFieldError = (n) => a.formState.errors[n]?.message, s;
282
284
  }
283
- function qe({ fields: i, className: a = "", "data-testid": s }) {
284
- const { form: n } = Q(), { errors: m } = n.formState, p = (d, l = "") => {
285
+ function Ze({ fields: i, className: a = "", "data-testid": s }) {
286
+ const { form: n } = Q(), { errors: m } = n.formState, g = (d, l = "") => {
285
287
  const $ = [];
286
- for (const b in d) {
287
- const F = l ? `${l}.${b}` : b, f = d[b];
288
- f?.message ? $.push({ field: F, message: f.message }) : typeof f == "object" && f !== null && $.push(...p(f, F));
288
+ for (const F in d) {
289
+ const N = l ? `${l}.${F}` : F, f = d[F];
290
+ f?.message ? $.push({ field: N, message: f.message }) : typeof f == "object" && f !== null && $.push(...g(f, N));
289
291
  }
290
292
  return $;
291
- }, w = p(m), y = i ? w.filter((d) => i.includes(d.field)) : w;
292
- return y.length === 0 ? null : /* @__PURE__ */ t("ul", { className: `text-error text-sm space-y-1 ${a}`, role: "alert", "data-testid": s, children: y.map((d, l) => /* @__PURE__ */ E("li", { className: "flex items-start gap-2", "data-testid": s ? `${s}-${d.field}` : void 0, children: [
293
+ }, w = g(m), b = i ? w.filter((d) => i.includes(d.field)) : w;
294
+ return b.length === 0 ? null : /* @__PURE__ */ t("ul", { className: `text-error text-sm space-y-1 ${a}`, role: "alert", "data-testid": s, children: b.map((d, l) => /* @__PURE__ */ L("li", { className: "flex items-start gap-2", "data-testid": s ? `${s}-${d.field}` : void 0, children: [
293
295
  /* @__PURE__ */ t("svg", { className: "w-4 h-4 mt-0.5 flex-shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: /* @__PURE__ */ t("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" }) }),
294
296
  /* @__PURE__ */ t("span", { children: d.message })
295
297
  ] }, `${d.field}-${l}`)) });
296
298
  }
297
- const Ue = Object.assign(Ie, {
298
- Item: De,
299
- List: Ze,
300
- ErrorList: qe,
299
+ const Ue = Object.assign(Be, {
300
+ Item: Ie,
301
+ List: De,
302
+ ErrorList: Ze,
301
303
  useForm: ue,
302
304
  useWatch: ce
303
305
  }), Ye = ue;