asterui 0.12.72 → 0.12.74

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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"}
@@ -211,7 +211,6 @@ function y(e) {
211
211
  return We;
212
212
  case "error":
213
213
  return Oe;
214
- case "info":
215
214
  default:
216
215
  return Ee;
217
216
  }
@@ -277,7 +276,6 @@ function y(e) {
277
276
  )
278
277
  }
279
278
  );
280
- case "info":
281
279
  default:
282
280
  return /* @__PURE__ */ t(
283
281
  "svg",
@@ -1 +1 @@
1
- {"version":3,"file":"Modal.js","sources":["../../src/components/Modal.tsx"],"sourcesContent":["import React, { useEffect, useRef, useId, forwardRef, useImperativeHandle } from 'react'\nimport { createRoot } from 'react-dom/client'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dModal = 'modal'\nconst dModalTop = 'modal-top'\nconst dModalMiddle = 'modal-middle'\nconst dModalBottom = 'modal-bottom'\nconst dModalStart = 'modal-start'\nconst dModalEnd = 'modal-end'\nconst dModalBox = 'modal-box'\nconst dModalAction = 'modal-action'\nconst dModalBackdrop = 'modal-backdrop'\nconst dBtn = 'btn'\nconst dBtnPrimary = 'btn-primary'\nconst dBtnError = 'btn-error'\nconst dAlert = 'alert'\nconst dAlertInfo = 'alert-info'\nconst dAlertSuccess = 'alert-success'\nconst dAlertWarning = 'alert-warning'\nconst dAlertError = 'alert-error'\n\nexport type ModalPosition = 'top' | 'middle' | 'bottom'\nexport type ModalAlign = 'start' | 'end'\nexport type Breakpoint = 'base' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'\n\nexport type ResponsivePosition = Partial<Record<Breakpoint, ModalPosition>>\n\nexport interface ModalProps extends Omit<React.HTMLAttributes<HTMLDialogElement>, 'title'> {\n children: React.ReactNode\n title?: React.ReactNode\n footer?: React.ReactNode\n open?: boolean\n onOk?: () => void | Promise<void>\n onCancel?: () => void\n okText?: string\n cancelText?: string\n maskClosable?: boolean\n closable?: boolean\n /** Modal position - can be a single value or responsive object */\n position?: ModalPosition | ResponsivePosition\n align?: ModalAlign\n /** Width of the modal box */\n width?: number | string\n /** Center the modal vertically */\n centered?: boolean\n /** Callback when modal is closed */\n onClose?: () => void\n /** Callback after modal close animation completes */\n afterClose?: () => void\n /** Where to place initial focus: 'ok', 'cancel', or 'close' button */\n initialFocus?: 'ok' | 'cancel' | 'close'\n /** Use alertdialog role for urgent messages */\n alertDialog?: boolean\n /** Show loading spinner on OK button */\n confirmLoading?: boolean\n /** Props for the OK button */\n okButtonProps?: React.ButtonHTMLAttributes<HTMLButtonElement>\n /** Props for the Cancel button */\n cancelButtonProps?: React.ButtonHTMLAttributes<HTMLButtonElement>\n /** Custom close icon */\n closeIcon?: React.ReactNode\n /** CSS z-index for the modal */\n zIndex?: number\n /** Destroy child components when modal is closed */\n destroyOnClose?: boolean\n /** Test ID prefix for child elements */\n 'data-testid'?: string\n}\n\nexport interface ModalFuncProps {\n title?: React.ReactNode\n content?: React.ReactNode\n onOk?: () => void | Promise<void>\n onCancel?: () => void\n okText?: string\n cancelText?: string\n type?: 'info' | 'success' | 'warning' | 'error'\n}\n\nconst Modal = forwardRef<HTMLDialogElement, ModalProps>(function Modal(\n {\n children,\n title,\n footer,\n open = false,\n onOk,\n onCancel,\n okText,\n cancelText,\n maskClosable = true,\n closable = true,\n position,\n align,\n width,\n centered,\n onClose,\n afterClose,\n initialFocus,\n alertDialog = false,\n confirmLoading,\n okButtonProps,\n cancelButtonProps,\n closeIcon,\n zIndex,\n destroyOnClose = false,\n 'data-testid': testId,\n className = '',\n style,\n ...rest\n },\n ref\n) {\n const { locale } = useConfig()\n const dialogRef = useRef<HTMLDialogElement>(null)\n const okButtonRef = useRef<HTMLButtonElement>(null)\n const cancelButtonRef = useRef<HTMLButtonElement>(null)\n const closeButtonRef = useRef<HTMLButtonElement>(null)\n const previousActiveElement = useRef<HTMLElement | null>(null)\n const [internalLoading, setInternalLoading] = React.useState(false)\n const [shouldRender, setShouldRender] = React.useState(open || !destroyOnClose)\n const titleId = useId()\n const contentId = useId()\n\n // Use external confirmLoading if provided, otherwise internal state\n const loading = confirmLoading ?? internalLoading\n\n // Resolve locale strings\n const resolvedOkText = okText ?? locale.Modal?.okText ?? 'OK'\n const resolvedCancelText = cancelText ?? locale.Modal?.cancelText ?? 'Cancel'\n\n // Forward ref\n useImperativeHandle(ref, () => dialogRef.current!, [])\n\n // Handle close - use onClose if provided, otherwise onCancel\n const closeHandler = onClose || onCancel\n\n useEffect(() => {\n const dialog = dialogRef.current\n if (!dialog) return\n\n if (open) {\n setShouldRender(true)\n if (!dialog.open) {\n // Save currently focused element for restoration\n previousActiveElement.current = document.activeElement as HTMLElement\n dialog.showModal()\n\n // Handle custom initial focus placement\n if (initialFocus) {\n setTimeout(() => {\n switch (initialFocus) {\n case 'ok':\n okButtonRef.current?.focus()\n break\n case 'cancel':\n cancelButtonRef.current?.focus()\n break\n case 'close':\n closeButtonRef.current?.focus()\n break\n }\n }, 0)\n }\n }\n } else {\n if (dialog.open) {\n dialog.close()\n // Restore focus to previously focused element\n previousActiveElement.current?.focus()\n // Call afterClose after animation\n if (afterClose) {\n setTimeout(afterClose, 300)\n }\n // Handle destroyOnClose\n if (destroyOnClose) {\n setTimeout(() => setShouldRender(false), 300)\n }\n }\n }\n }, [open, initialFocus, afterClose, destroyOnClose])\n\n useEffect(() => {\n const dialog = dialogRef.current\n if (!dialog) return\n\n const onDialogClose = () => {\n closeHandler?.()\n }\n\n dialog.addEventListener('close', onDialogClose)\n return () => {\n dialog.removeEventListener('close', onDialogClose)\n }\n }, [closeHandler])\n\n // Static class mappings for positions (no interpolation per qa.md)\n const positionClasses: Record<ModalPosition, string> = {\n top: dModalTop,\n middle: dModalMiddle,\n bottom: dModalBottom,\n }\n\n // Responsive position class mappings for each breakpoint\n const responsivePositionClasses: Record<Breakpoint, Record<ModalPosition, string>> = {\n base: {\n top: dModalTop,\n middle: dModalMiddle,\n bottom: dModalBottom,\n },\n sm: {\n top: 'sm:modal-top',\n middle: 'sm:modal-middle',\n bottom: 'sm:modal-bottom',\n },\n md: {\n top: 'md:modal-top',\n middle: 'md:modal-middle',\n bottom: 'md:modal-bottom',\n },\n lg: {\n top: 'lg:modal-top',\n middle: 'lg:modal-middle',\n bottom: 'lg:modal-bottom',\n },\n xl: {\n top: 'xl:modal-top',\n middle: 'xl:modal-middle',\n bottom: 'xl:modal-bottom',\n },\n '2xl': {\n top: '2xl:modal-top',\n middle: '2xl:modal-middle',\n bottom: '2xl:modal-bottom',\n },\n }\n\n const alignClasses: Record<ModalAlign, string> = {\n start: dModalStart,\n end: dModalEnd,\n }\n\n // Build position classes - handle both simple and responsive values\n const getPositionClasses = (): string[] => {\n // centered is an alias for position=\"middle\"\n if (centered) {\n return [positionClasses.middle]\n }\n\n if (!position) {\n return []\n }\n\n // Simple string position\n if (typeof position === 'string') {\n return [positionClasses[position]]\n }\n\n // Responsive object position\n const classes: string[] = []\n for (const [breakpoint, pos] of Object.entries(position) as [Breakpoint, ModalPosition][]) {\n if (pos) {\n classes.push(responsivePositionClasses[breakpoint][pos])\n }\n }\n return classes\n }\n\n const classes = [dModal, ...getPositionClasses(), align && alignClasses[align], className]\n .filter(Boolean)\n .join(' ')\n\n const handleOk = async () => {\n if (onOk) {\n if (confirmLoading === undefined) {\n setInternalLoading(true)\n }\n try {\n await onOk()\n if (confirmLoading === undefined) {\n setInternalLoading(false)\n }\n } catch (error) {\n if (confirmLoading === undefined) {\n setInternalLoading(false)\n }\n throw error\n }\n }\n }\n\n const handleBackdropClick = () => {\n if (maskClosable && closeHandler) {\n closeHandler()\n }\n }\n\n // Calculate modal-box style for custom width\n const modalBoxStyle: React.CSSProperties = width\n ? { width: typeof width === 'number' ? `${width}px` : width, maxWidth: '90vw' }\n : {}\n\n // Calculate dialog style for zIndex\n const dialogStyle: React.CSSProperties = {\n ...style,\n ...(zIndex !== undefined ? { zIndex } : {}),\n }\n\n // Render default footer if no custom footer provided and either onOk or onCancel exists\n const shouldRenderDefaultFooter = !footer && (onOk || onCancel)\n const shouldRenderCustomFooter = footer !== null && footer !== undefined\n\n // Helper for test IDs\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n\n if (!shouldRender) {\n return null\n }\n\n return (\n <dialog\n ref={dialogRef}\n role={alertDialog ? 'alertdialog' : 'dialog'}\n aria-modal=\"true\"\n className={classes}\n style={dialogStyle}\n data-state={open ? 'open' : 'closed'}\n data-testid={testId}\n aria-labelledby={title ? titleId : undefined}\n aria-describedby={contentId}\n {...rest}\n >\n <div className={dModalBox} style={modalBoxStyle}>\n {title && (\n <h3 id={titleId} className=\"text-lg font-bold mb-4\" data-testid={getTestId('title')}>\n {title}\n </h3>\n )}\n <div id={contentId} className=\"py-4\" data-testid={getTestId('content')}>\n {children}\n </div>\n {shouldRenderDefaultFooter && (\n <div className={dModalAction}>\n {onCancel && (\n <button\n ref={cancelButtonRef}\n className={dBtn}\n onClick={onCancel}\n data-testid={getTestId('cancel-button')}\n {...cancelButtonProps}\n >\n {resolvedCancelText}\n </button>\n )}\n {onOk && (\n <button\n ref={okButtonRef}\n className={`${dBtn} ${dBtnPrimary} ${loading ? 'loading' : ''}`}\n onClick={handleOk}\n disabled={loading || okButtonProps?.disabled}\n aria-busy={loading || undefined}\n data-testid={getTestId('ok-button')}\n {...okButtonProps}\n >\n {resolvedOkText}\n </button>\n )}\n </div>\n )}\n {shouldRenderCustomFooter && <div className={dModalAction}>{footer}</div>}\n </div>\n {closable && maskClosable && (\n <form method=\"dialog\" className={dModalBackdrop} data-testid={getTestId('backdrop')}>\n <button\n ref={closeButtonRef}\n onClick={handleBackdropClick}\n data-testid={getTestId('close-button')}\n aria-label=\"Close modal\"\n >\n {closeIcon || <span className=\"sr-only\">Close modal</span>}\n </button>\n </form>\n )}\n </dialog>\n )\n})\n\nfunction createModal(config: ModalFuncProps & { showCancel?: boolean }) {\n const div = document.createElement('div')\n document.body.appendChild(div)\n const root = createRoot(div)\n\n const destroy = () => {\n root.unmount()\n if (div.parentNode) {\n div.parentNode.removeChild(div)\n }\n }\n\n const ModalContent = () => {\n const { locale } = useConfig()\n const [open, setOpen] = React.useState(true)\n const [loading, setLoading] = React.useState(false)\n\n const handleClose = () => {\n setOpen(false)\n setTimeout(destroy, 300) // Wait for animation\n }\n\n const handleOk = async () => {\n if (config.onOk) {\n setLoading(true)\n try {\n await config.onOk()\n handleClose()\n } catch (error) {\n setLoading(false)\n }\n } else {\n handleClose()\n }\n }\n\n const handleCancel = () => {\n config.onCancel?.()\n handleClose()\n }\n\n const getAlertClass = () => {\n switch (config.type) {\n case 'success':\n return dAlertSuccess\n case 'warning':\n return dAlertWarning\n case 'error':\n return dAlertError\n case 'info':\n default:\n return dAlertInfo\n }\n }\n\n const getIcon = () => {\n switch (config.type) {\n case 'success':\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n )\n case 'warning':\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n )\n case 'error':\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n )\n case 'info':\n default:\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n className=\"stroke-current shrink-0 w-6 h-6\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n ></path>\n </svg>\n )\n }\n }\n\n // Use alertdialog role for warning/error types\n const isAlert = config.type === 'warning' || config.type === 'error'\n\n // Resolve locale strings\n const resolvedOkText = config.okText ?? locale.Modal?.okText ?? 'OK'\n const resolvedCancelText = config.cancelText ?? locale.Modal?.cancelText ?? 'Cancel'\n\n return (\n <Modal\n open={open}\n onOk={config.showCancel ? undefined : handleOk}\n onCancel={handleCancel}\n alertDialog={isAlert}\n title={\n config.type ? (\n <div className={`${dAlert} ${getAlertClass()}`}>\n {getIcon()}\n <div>{config.title && <h3 className=\"font-bold\">{config.title}</h3>}</div>\n </div>\n ) : (\n config.title\n )\n }\n okText={resolvedOkText}\n cancelText={resolvedCancelText}\n footer={\n config.showCancel ? (\n <>\n <button className={dBtn} onClick={handleCancel}>\n {resolvedCancelText}\n </button>\n <button\n className={`${dBtn} ${config.type === 'error' ? dBtnError : dBtnPrimary} ${loading ? 'loading' : ''}`}\n onClick={handleOk}\n disabled={loading}\n >\n {resolvedOkText}\n </button>\n </>\n ) : (\n <button\n className={`${dBtn} ${config.type === 'error' ? dBtnError : dBtnPrimary} ${loading ? 'loading' : ''}`}\n onClick={handleOk}\n disabled={loading}\n >\n {resolvedOkText}\n </button>\n )\n }\n >\n {config.type && config.content && <div className=\"text-sm\">{config.content}</div>}\n {!config.type && config.content}\n </Modal>\n )\n }\n\n root.render(<ModalContent />)\n\n return {\n destroy,\n }\n}\n\nfunction confirm(config: ModalFuncProps) {\n return createModal({ ...config, showCancel: true })\n}\n\nfunction info(config: ModalFuncProps) {\n return createModal({ ...config, type: 'info', showCancel: false })\n}\n\nfunction success(config: ModalFuncProps) {\n return createModal({ ...config, type: 'success', showCancel: false })\n}\n\nfunction warning(config: ModalFuncProps) {\n return createModal({ ...config, type: 'warning', showCancel: false })\n}\n\nfunction error(config: ModalFuncProps) {\n return createModal({ ...config, type: 'error', showCancel: false })\n}\n\nconst ModalWithStatics = Modal as typeof Modal & {\n confirm: typeof confirm\n info: typeof info\n success: typeof success\n warning: typeof warning\n error: typeof error\n}\n\nModalWithStatics.confirm = confirm\nModalWithStatics.info = info\nModalWithStatics.success = success\nModalWithStatics.warning = warning\nModalWithStatics.error = error\n\nexport { ModalWithStatics as Modal }\n"],"names":["dModal","dModalTop","dModalMiddle","dModalBottom","dModalStart","dModalEnd","dModalBox","dModalAction","dModalBackdrop","dBtn","dBtnPrimary","dBtnError","dAlert","dAlertInfo","dAlertSuccess","dAlertWarning","dAlertError","Modal","forwardRef","children","title","footer","open","onOk","onCancel","okText","cancelText","maskClosable","closable","position","align","width","centered","onClose","afterClose","initialFocus","alertDialog","confirmLoading","okButtonProps","cancelButtonProps","closeIcon","zIndex","destroyOnClose","testId","className","style","rest","ref","locale","useConfig","dialogRef","useRef","okButtonRef","cancelButtonRef","closeButtonRef","previousActiveElement","internalLoading","setInternalLoading","React","shouldRender","setShouldRender","titleId","useId","contentId","loading","resolvedOkText","resolvedCancelText","useImperativeHandle","closeHandler","useEffect","dialog","onDialogClose","positionClasses","responsivePositionClasses","alignClasses","classes","breakpoint","pos","handleOk","error","handleBackdropClick","modalBoxStyle","dialogStyle","shouldRenderDefaultFooter","shouldRenderCustomFooter","getTestId","suffix","jsxs","jsx","createModal","config","div","root","createRoot","destroy","ModalContent","setOpen","setLoading","handleClose","handleCancel","getAlertClass","getIcon","isAlert","Fragment","confirm","info","success","warning","ModalWithStatics"],"mappings":"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"}
1
+ {"version":3,"file":"Modal.js","sources":["../../src/components/Modal.tsx"],"sourcesContent":["import React, { useEffect, useRef, useId, forwardRef, useImperativeHandle } from 'react'\nimport { createRoot } from 'react-dom/client'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dModal = 'modal'\nconst dModalTop = 'modal-top'\nconst dModalMiddle = 'modal-middle'\nconst dModalBottom = 'modal-bottom'\nconst dModalStart = 'modal-start'\nconst dModalEnd = 'modal-end'\nconst dModalBox = 'modal-box'\nconst dModalAction = 'modal-action'\nconst dModalBackdrop = 'modal-backdrop'\nconst dBtn = 'btn'\nconst dBtnPrimary = 'btn-primary'\nconst dBtnError = 'btn-error'\nconst dAlert = 'alert'\nconst dAlertInfo = 'alert-info'\nconst dAlertSuccess = 'alert-success'\nconst dAlertWarning = 'alert-warning'\nconst dAlertError = 'alert-error'\n\nexport type ModalPosition = 'top' | 'middle' | 'bottom'\nexport type ModalAlign = 'start' | 'end'\nexport type Breakpoint = 'base' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'\n\nexport type ResponsivePosition = Partial<Record<Breakpoint, ModalPosition>>\n\nexport interface ModalProps extends Omit<React.HTMLAttributes<HTMLDialogElement>, 'title'> {\n children: React.ReactNode\n title?: React.ReactNode\n footer?: React.ReactNode\n open?: boolean\n onOk?: () => void | Promise<void>\n onCancel?: () => void\n okText?: string\n cancelText?: string\n maskClosable?: boolean\n closable?: boolean\n /** Modal position - can be a single value or responsive object */\n position?: ModalPosition | ResponsivePosition\n align?: ModalAlign\n /** Width of the modal box */\n width?: number | string\n /** Center the modal vertically */\n centered?: boolean\n /** Callback when modal is closed */\n onClose?: () => void\n /** Callback after modal close animation completes */\n afterClose?: () => void\n /** Where to place initial focus: 'ok', 'cancel', or 'close' button */\n initialFocus?: 'ok' | 'cancel' | 'close'\n /** Use alertdialog role for urgent messages */\n alertDialog?: boolean\n /** Show loading spinner on OK button */\n confirmLoading?: boolean\n /** Props for the OK button */\n okButtonProps?: React.ButtonHTMLAttributes<HTMLButtonElement>\n /** Props for the Cancel button */\n cancelButtonProps?: React.ButtonHTMLAttributes<HTMLButtonElement>\n /** Custom close icon */\n closeIcon?: React.ReactNode\n /** CSS z-index for the modal */\n zIndex?: number\n /** Destroy child components when modal is closed */\n destroyOnClose?: boolean\n /** Test ID prefix for child elements */\n 'data-testid'?: string\n}\n\nexport interface ModalFuncProps {\n title?: React.ReactNode\n content?: React.ReactNode\n onOk?: () => void | Promise<void>\n onCancel?: () => void\n okText?: string\n cancelText?: string\n type?: 'info' | 'success' | 'warning' | 'error'\n}\n\nconst Modal = forwardRef<HTMLDialogElement, ModalProps>(function Modal(\n {\n children,\n title,\n footer,\n open = false,\n onOk,\n onCancel,\n okText,\n cancelText,\n maskClosable = true,\n closable = true,\n position,\n align,\n width,\n centered,\n onClose,\n afterClose,\n initialFocus,\n alertDialog = false,\n confirmLoading,\n okButtonProps,\n cancelButtonProps,\n closeIcon,\n zIndex,\n destroyOnClose = false,\n 'data-testid': testId,\n className = '',\n style,\n ...rest\n },\n ref\n) {\n const { locale } = useConfig()\n const dialogRef = useRef<HTMLDialogElement>(null)\n const okButtonRef = useRef<HTMLButtonElement>(null)\n const cancelButtonRef = useRef<HTMLButtonElement>(null)\n const closeButtonRef = useRef<HTMLButtonElement>(null)\n const previousActiveElement = useRef<HTMLElement | null>(null)\n const [internalLoading, setInternalLoading] = React.useState(false)\n const [shouldRender, setShouldRender] = React.useState(open || !destroyOnClose)\n const titleId = useId()\n const contentId = useId()\n\n // Use external confirmLoading if provided, otherwise internal state\n const loading = confirmLoading ?? internalLoading\n\n // Resolve locale strings\n const resolvedOkText = okText ?? locale.Modal?.okText ?? 'OK'\n const resolvedCancelText = cancelText ?? locale.Modal?.cancelText ?? 'Cancel'\n\n // Forward ref\n useImperativeHandle(ref, () => dialogRef.current!, [])\n\n // Handle close - use onClose if provided, otherwise onCancel\n const closeHandler = onClose || onCancel\n\n useEffect(() => {\n const dialog = dialogRef.current\n if (!dialog) return\n\n if (open) {\n setShouldRender(true)\n if (!dialog.open) {\n // Save currently focused element for restoration\n previousActiveElement.current = document.activeElement as HTMLElement\n dialog.showModal()\n\n // Handle custom initial focus placement\n if (initialFocus) {\n setTimeout(() => {\n switch (initialFocus) {\n case 'ok':\n okButtonRef.current?.focus()\n break\n case 'cancel':\n cancelButtonRef.current?.focus()\n break\n case 'close':\n closeButtonRef.current?.focus()\n break\n }\n }, 0)\n }\n }\n } else {\n if (dialog.open) {\n dialog.close()\n // Restore focus to previously focused element\n previousActiveElement.current?.focus()\n // Call afterClose after animation\n if (afterClose) {\n setTimeout(afterClose, 300)\n }\n // Handle destroyOnClose\n if (destroyOnClose) {\n setTimeout(() => setShouldRender(false), 300)\n }\n }\n }\n }, [open, initialFocus, afterClose, destroyOnClose])\n\n useEffect(() => {\n const dialog = dialogRef.current\n if (!dialog) return\n\n const onDialogClose = () => {\n closeHandler?.()\n }\n\n dialog.addEventListener('close', onDialogClose)\n return () => {\n dialog.removeEventListener('close', onDialogClose)\n }\n }, [closeHandler])\n\n // Static class mappings for positions (no interpolation per qa.md)\n const positionClasses: Record<ModalPosition, string> = {\n top: dModalTop,\n middle: dModalMiddle,\n bottom: dModalBottom,\n }\n\n // Responsive position class mappings for each breakpoint\n const responsivePositionClasses: Record<Breakpoint, Record<ModalPosition, string>> = {\n base: {\n top: dModalTop,\n middle: dModalMiddle,\n bottom: dModalBottom,\n },\n sm: {\n top: 'sm:modal-top',\n middle: 'sm:modal-middle',\n bottom: 'sm:modal-bottom',\n },\n md: {\n top: 'md:modal-top',\n middle: 'md:modal-middle',\n bottom: 'md:modal-bottom',\n },\n lg: {\n top: 'lg:modal-top',\n middle: 'lg:modal-middle',\n bottom: 'lg:modal-bottom',\n },\n xl: {\n top: 'xl:modal-top',\n middle: 'xl:modal-middle',\n bottom: 'xl:modal-bottom',\n },\n '2xl': {\n top: '2xl:modal-top',\n middle: '2xl:modal-middle',\n bottom: '2xl:modal-bottom',\n },\n }\n\n const alignClasses: Record<ModalAlign, string> = {\n start: dModalStart,\n end: dModalEnd,\n }\n\n // Build position classes - handle both simple and responsive values\n const getPositionClasses = (): string[] => {\n // centered is an alias for position=\"middle\"\n if (centered) {\n return [positionClasses.middle]\n }\n\n if (!position) {\n return []\n }\n\n // Simple string position\n if (typeof position === 'string') {\n return [positionClasses[position]]\n }\n\n // Responsive object position\n const classes: string[] = []\n for (const [breakpoint, pos] of Object.entries(position) as [Breakpoint, ModalPosition][]) {\n if (pos) {\n classes.push(responsivePositionClasses[breakpoint][pos])\n }\n }\n return classes\n }\n\n const classes = [dModal, ...getPositionClasses(), align && alignClasses[align], className]\n .filter(Boolean)\n .join(' ')\n\n const handleOk = async () => {\n if (onOk) {\n if (confirmLoading === undefined) {\n setInternalLoading(true)\n }\n try {\n await onOk()\n if (confirmLoading === undefined) {\n setInternalLoading(false)\n }\n } catch (error) {\n if (confirmLoading === undefined) {\n setInternalLoading(false)\n }\n throw error\n }\n }\n }\n\n const handleBackdropClick = () => {\n if (maskClosable && closeHandler) {\n closeHandler()\n }\n }\n\n // Calculate modal-box style for custom width\n const modalBoxStyle: React.CSSProperties = width\n ? { width: typeof width === 'number' ? `${width}px` : width, maxWidth: '90vw' }\n : {}\n\n // Calculate dialog style for zIndex\n const dialogStyle: React.CSSProperties = {\n ...style,\n ...(zIndex !== undefined ? { zIndex } : {}),\n }\n\n // Render default footer if no custom footer provided and either onOk or onCancel exists\n const shouldRenderDefaultFooter = !footer && (onOk || onCancel)\n const shouldRenderCustomFooter = footer !== null && footer !== undefined\n\n // Helper for test IDs\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n\n if (!shouldRender) {\n return null\n }\n\n return (\n <dialog\n ref={dialogRef}\n role={alertDialog ? 'alertdialog' : 'dialog'}\n aria-modal=\"true\"\n className={classes}\n style={dialogStyle}\n data-state={open ? 'open' : 'closed'}\n data-testid={testId}\n aria-labelledby={title ? titleId : undefined}\n aria-describedby={contentId}\n {...rest}\n >\n <div className={dModalBox} style={modalBoxStyle}>\n {title && (\n <h3 id={titleId} className=\"text-lg font-bold mb-4\" data-testid={getTestId('title')}>\n {title}\n </h3>\n )}\n <div id={contentId} className=\"py-4\" data-testid={getTestId('content')}>\n {children}\n </div>\n {shouldRenderDefaultFooter && (\n <div className={dModalAction}>\n {onCancel && (\n <button\n ref={cancelButtonRef}\n className={dBtn}\n onClick={onCancel}\n data-testid={getTestId('cancel-button')}\n {...cancelButtonProps}\n >\n {resolvedCancelText}\n </button>\n )}\n {onOk && (\n <button\n ref={okButtonRef}\n className={`${dBtn} ${dBtnPrimary} ${loading ? 'loading' : ''}`}\n onClick={handleOk}\n disabled={loading || okButtonProps?.disabled}\n aria-busy={loading || undefined}\n data-testid={getTestId('ok-button')}\n {...okButtonProps}\n >\n {resolvedOkText}\n </button>\n )}\n </div>\n )}\n {shouldRenderCustomFooter && <div className={dModalAction}>{footer}</div>}\n </div>\n {closable && maskClosable && (\n <form method=\"dialog\" className={dModalBackdrop} data-testid={getTestId('backdrop')}>\n <button\n ref={closeButtonRef}\n onClick={handleBackdropClick}\n data-testid={getTestId('close-button')}\n aria-label=\"Close modal\"\n >\n {closeIcon || <span className=\"sr-only\">Close modal</span>}\n </button>\n </form>\n )}\n </dialog>\n )\n})\n\nfunction createModal(config: ModalFuncProps & { showCancel?: boolean }) {\n const div = document.createElement('div')\n document.body.appendChild(div)\n const root = createRoot(div)\n\n const destroy = () => {\n root.unmount()\n if (div.parentNode) {\n div.parentNode.removeChild(div)\n }\n }\n\n const ModalContent = () => {\n const { locale } = useConfig()\n const [open, setOpen] = React.useState(true)\n const [loading, setLoading] = React.useState(false)\n\n const handleClose = () => {\n setOpen(false)\n setTimeout(destroy, 300) // Wait for animation\n }\n\n const handleOk = async () => {\n if (config.onOk) {\n setLoading(true)\n try {\n await config.onOk()\n handleClose()\n } catch (error) {\n setLoading(false)\n }\n } else {\n handleClose()\n }\n }\n\n const handleCancel = () => {\n config.onCancel?.()\n handleClose()\n }\n\n const getAlertClass = () => {\n switch (config.type) {\n case 'success':\n return dAlertSuccess\n case 'warning':\n return dAlertWarning\n case 'error':\n return dAlertError\n case 'info':\n default:\n return dAlertInfo\n }\n }\n\n const getIcon = () => {\n switch (config.type) {\n case 'success':\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n )\n case 'warning':\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n )\n case 'error':\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n )\n case 'info':\n default:\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n className=\"stroke-current shrink-0 w-6 h-6\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n ></path>\n </svg>\n )\n }\n }\n\n // Use alertdialog role for warning/error types\n const isAlert = config.type === 'warning' || config.type === 'error'\n\n // Resolve locale strings\n const resolvedOkText = config.okText ?? locale.Modal?.okText ?? 'OK'\n const resolvedCancelText = config.cancelText ?? locale.Modal?.cancelText ?? 'Cancel'\n\n return (\n <Modal\n open={open}\n onOk={config.showCancel ? undefined : handleOk}\n onCancel={handleCancel}\n alertDialog={isAlert}\n title={\n config.type ? (\n <div className={`${dAlert} ${getAlertClass()}`}>\n {getIcon()}\n <div>{config.title && <h3 className=\"font-bold\">{config.title}</h3>}</div>\n </div>\n ) : (\n config.title\n )\n }\n okText={resolvedOkText}\n cancelText={resolvedCancelText}\n footer={\n config.showCancel ? (\n <>\n <button className={dBtn} onClick={handleCancel}>\n {resolvedCancelText}\n </button>\n <button\n className={`${dBtn} ${config.type === 'error' ? dBtnError : dBtnPrimary} ${loading ? 'loading' : ''}`}\n onClick={handleOk}\n disabled={loading}\n >\n {resolvedOkText}\n </button>\n </>\n ) : (\n <button\n className={`${dBtn} ${config.type === 'error' ? dBtnError : dBtnPrimary} ${loading ? 'loading' : ''}`}\n onClick={handleOk}\n disabled={loading}\n >\n {resolvedOkText}\n </button>\n )\n }\n >\n {config.type && config.content && <div className=\"text-sm\">{config.content}</div>}\n {!config.type && config.content}\n </Modal>\n )\n }\n\n root.render(<ModalContent />)\n\n return {\n destroy,\n }\n}\n\nfunction confirm(config: ModalFuncProps) {\n return createModal({ ...config, showCancel: true })\n}\n\nfunction info(config: ModalFuncProps) {\n return createModal({ ...config, type: 'info', showCancel: false })\n}\n\nfunction success(config: ModalFuncProps) {\n return createModal({ ...config, type: 'success', showCancel: false })\n}\n\nfunction warning(config: ModalFuncProps) {\n return createModal({ ...config, type: 'warning', showCancel: false })\n}\n\nfunction error(config: ModalFuncProps) {\n return createModal({ ...config, type: 'error', showCancel: false })\n}\n\nconst ModalWithStatics = Modal as typeof Modal & {\n confirm: typeof confirm\n info: typeof info\n success: typeof success\n warning: typeof warning\n error: typeof error\n}\n\nModalWithStatics.confirm = confirm\nModalWithStatics.info = info\nModalWithStatics.success = success\nModalWithStatics.warning = warning\nModalWithStatics.error = error\n\nexport { ModalWithStatics as Modal }\n"],"names":["dModal","dModalTop","dModalMiddle","dModalBottom","dModalStart","dModalEnd","dModalBox","dModalAction","dModalBackdrop","dBtn","dBtnPrimary","dBtnError","dAlert","dAlertInfo","dAlertSuccess","dAlertWarning","dAlertError","Modal","forwardRef","children","title","footer","open","onOk","onCancel","okText","cancelText","maskClosable","closable","position","align","width","centered","onClose","afterClose","initialFocus","alertDialog","confirmLoading","okButtonProps","cancelButtonProps","closeIcon","zIndex","destroyOnClose","testId","className","style","rest","ref","locale","useConfig","dialogRef","useRef","okButtonRef","cancelButtonRef","closeButtonRef","previousActiveElement","internalLoading","setInternalLoading","React","shouldRender","setShouldRender","titleId","useId","contentId","loading","resolvedOkText","resolvedCancelText","useImperativeHandle","closeHandler","useEffect","dialog","onDialogClose","positionClasses","responsivePositionClasses","alignClasses","classes","breakpoint","pos","handleOk","error","handleBackdropClick","modalBoxStyle","dialogStyle","shouldRenderDefaultFooter","shouldRenderCustomFooter","getTestId","suffix","jsxs","jsx","createModal","config","div","root","createRoot","destroy","ModalContent","setOpen","setLoading","handleClose","handleCancel","getAlertClass","getIcon","isAlert","Fragment","confirm","info","success","warning","ModalWithStatics"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { default as React } from 'react';
2
- export type TypographySize = 'sm' | 'base' | 'lg' | 'xl' | '2xl';
2
+ export type TypographySize = 'xs' | 'sm' | 'base' | 'lg' | 'xl' | '2xl';
3
3
  export type TitleLevel = 1 | 2 | 3 | 4 | 5;
4
4
  export interface TypographyProps extends React.HTMLAttributes<HTMLDivElement> {
5
5
  children: React.ReactNode;
@@ -34,6 +34,7 @@ export interface TextProps extends React.HTMLAttributes<HTMLSpanElement> {
34
34
  underline?: boolean;
35
35
  delete?: boolean;
36
36
  type?: 'default' | 'secondary' | 'success' | 'warning' | 'error';
37
+ size?: TypographySize;
37
38
  copyable?: boolean;
38
39
  'data-testid'?: string;
39
40
  }
@@ -47,7 +48,7 @@ export interface TypographyLinkProps extends React.AnchorHTMLAttributes<HTMLAnch
47
48
  declare function TypographyRoot({ children, size, className, 'data-testid': testId, ...rest }: TypographyProps): import("react/jsx-runtime").JSX.Element;
48
49
  declare function Title({ level, children, copyable, ellipsis, className, id, 'data-testid': testId, ...rest }: TitleProps): import("react/jsx-runtime").JSX.Element;
49
50
  declare function Paragraph({ children, ellipsis, copyable, size, align, className, 'data-testid': testId, ...rest }: ParagraphProps): import("react/jsx-runtime").JSX.Element;
50
- declare function Text({ children, code, mark, strong, italic, underline, delete: del, type, copyable, className, 'data-testid': testId, ...rest }: TextProps): import("react/jsx-runtime").JSX.Element;
51
+ declare function Text({ children, code, mark, strong, italic, underline, delete: del, type, size, copyable, className, 'data-testid': testId, ...rest }: TextProps): import("react/jsx-runtime").JSX.Element;
51
52
  declare function Link({ href, children, target, external, size, className, 'data-testid': testId, ...rest }: TypographyLinkProps): import("react/jsx-runtime").JSX.Element;
52
53
  export declare const Typography: typeof TypographyRoot & {
53
54
  Title: typeof Title;
@@ -1,8 +1,8 @@
1
1
  import { jsx as t, jsxs as g, Fragment as w } from "react/jsx-runtime";
2
- import { useState as C } from "react";
3
- const $ = "btn", k = "btn-ghost", B = "btn-xs", T = "link", j = "link-primary";
4
- function y({ text: a, "data-testid": e }) {
5
- const [d, o] = C(!1);
2
+ import { useState as N } from "react";
3
+ const k = "btn", $ = "btn-ghost", B = "btn-xs", T = "link", j = "link-primary";
4
+ function C({ text: a, "data-testid": e }) {
5
+ const [d, o] = N(!1);
6
6
  return /* @__PURE__ */ t(
7
7
  "button",
8
8
  {
@@ -13,7 +13,7 @@ function y({ text: a, "data-testid": e }) {
13
13
  console.error("Failed to copy:", x);
14
14
  }
15
15
  },
16
- className: `${$} ${k} ${B} ml-2 opacity-0 group-hover:opacity-100 transition-opacity`,
16
+ className: `${k} ${$} ${B} ml-2 opacity-0 group-hover:opacity-100 transition-opacity`,
17
17
  title: "Copy to clipboard",
18
18
  "data-testid": e,
19
19
  children: d ? /* @__PURE__ */ t("svg", { className: "w-4 h-4", fill: "currentColor", viewBox: "0 0 20 20", children: /* @__PURE__ */ t(
@@ -37,6 +37,7 @@ function M({ children: a, size: e = "base", className: d = "", "data-testid": o,
37
37
  // Fallback styles (always apply)
38
38
  "text-base-content leading-relaxed",
39
39
  {
40
+ xs: "prose-xs text-xs",
40
41
  sm: "prose-sm text-sm",
41
42
  base: "prose-base text-base",
42
43
  lg: "prose-lg text-lg",
@@ -47,30 +48,30 @@ function M({ children: a, size: e = "base", className: d = "", "data-testid": o,
47
48
  ].filter(Boolean).join(" ");
48
49
  return /* @__PURE__ */ t("div", { className: s, "data-testid": o, ...l, children: a });
49
50
  }
50
- function L({ level: a = 1, children: e, copyable: d, ellipsis: o, className: l = "", id: x, "data-testid": s, ...i }) {
51
- const c = typeof e == "string" ? e : "", r = x || (c ? c.toLowerCase().replace(/\s+/g, "-") : void 0), h = (n) => s ? `${s}-${n}` : void 0, u = {
51
+ function L({ level: a = 1, children: e, copyable: d, ellipsis: o, className: l = "", id: x, "data-testid": s, ...r }) {
52
+ const n = typeof e == "string" ? e : "", i = x || (n ? n.toLowerCase().replace(/\s+/g, "-") : void 0), u = (b) => s ? `${s}-${b}` : void 0, p = {
52
53
  1: "text-4xl font-bold mb-4",
53
54
  2: "text-3xl font-bold mb-3",
54
55
  3: "text-2xl font-semibold mb-3",
55
56
  4: "text-xl font-semibold mb-2",
56
57
  5: "text-lg font-semibold mb-2"
57
- }, f = o ? "truncate" : "", p = `group ${u[a]} ${f} ${l}`.trim(), m = /* @__PURE__ */ g(w, { children: [
58
+ }, f = o ? "truncate" : "", m = `group ${p[a]} ${f} ${l}`.trim(), h = /* @__PURE__ */ g(w, { children: [
58
59
  e,
59
- d && /* @__PURE__ */ t(y, { text: c, "data-testid": h("copy") })
60
+ d && /* @__PURE__ */ t(C, { text: n, "data-testid": u("copy") })
60
61
  ] });
61
62
  switch (a) {
62
63
  case 1:
63
- return /* @__PURE__ */ t("h1", { id: r, className: p, "data-testid": s, ...i, children: m });
64
+ return /* @__PURE__ */ t("h1", { id: i, className: m, "data-testid": s, ...r, children: h });
64
65
  case 2:
65
- return /* @__PURE__ */ t("h2", { id: r, className: p, "data-testid": s, ...i, children: m });
66
+ return /* @__PURE__ */ t("h2", { id: i, className: m, "data-testid": s, ...r, children: h });
66
67
  case 3:
67
- return /* @__PURE__ */ t("h3", { id: r, className: p, "data-testid": s, ...i, children: m });
68
+ return /* @__PURE__ */ t("h3", { id: i, className: m, "data-testid": s, ...r, children: h });
68
69
  case 4:
69
- return /* @__PURE__ */ t("h4", { id: r, className: p, "data-testid": s, ...i, children: m });
70
+ return /* @__PURE__ */ t("h4", { id: i, className: m, "data-testid": s, ...r, children: h });
70
71
  case 5:
71
- return /* @__PURE__ */ t("h5", { id: r, className: p, "data-testid": s, ...i, children: m });
72
+ return /* @__PURE__ */ t("h5", { id: i, className: m, "data-testid": s, ...r, children: h });
72
73
  default:
73
- return /* @__PURE__ */ t("h1", { id: r, className: p, "data-testid": s, ...i, children: m });
74
+ return /* @__PURE__ */ t("h1", { id: i, className: m, "data-testid": s, ...r, children: h });
74
75
  }
75
76
  }
76
77
  const E = {
@@ -81,11 +82,11 @@ const E = {
81
82
  5: "line-clamp-5",
82
83
  6: "line-clamp-6"
83
84
  };
84
- function H({ children: a, ellipsis: e, copyable: d, size: o, align: l, className: x = "", "data-testid": s, ...i }) {
85
- const [c, r] = C(!1), h = typeof a == "string" ? a : "", u = (N) => s ? `${s}-${N}` : void 0, f = typeof e == "object", p = f && e.rows || 3, m = f ? e.expandable : !1, n = Math.min(Math.max(p, 1), 6), b = [
85
+ function H({ children: a, ellipsis: e, copyable: d, size: o, align: l, className: x = "", "data-testid": s, ...r }) {
86
+ const [n, i] = N(!1), u = typeof a == "string" ? a : "", p = (v) => s ? `${s}-${v}` : void 0, f = typeof e == "object", m = f && e.rows || 3, h = f ? e.expandable : !1, b = Math.min(Math.max(m, 1), 6), y = [
86
87
  "group",
87
88
  "mb-4",
88
- e && !c ? E[n] : "",
89
+ e && !n ? E[b] : "",
89
90
  o === "sm" && "text-sm",
90
91
  o === "base" && "text-base",
91
92
  o === "lg" && "text-lg",
@@ -96,19 +97,19 @@ function H({ children: a, ellipsis: e, copyable: d, size: o, align: l, className
96
97
  l === "right" && "text-right",
97
98
  x
98
99
  ].filter(Boolean).join(" ");
99
- return /* @__PURE__ */ g("div", { "data-testid": s, ...i, children: [
100
- /* @__PURE__ */ g("p", { className: b, "data-testid": u("text"), children: [
100
+ return /* @__PURE__ */ g("div", { "data-testid": s, ...r, children: [
101
+ /* @__PURE__ */ g("p", { className: y, "data-testid": p("text"), children: [
101
102
  a,
102
- d && /* @__PURE__ */ t(y, { text: h, "data-testid": u("copy") })
103
+ d && /* @__PURE__ */ t(C, { text: u, "data-testid": p("copy") })
103
104
  ] }),
104
- m && e && /* @__PURE__ */ t(
105
+ h && e && /* @__PURE__ */ t(
105
106
  "button",
106
107
  {
107
108
  onClick: () => {
108
- r(!c), f && e.onExpand && e.onExpand();
109
+ i(!n), f && e.onExpand && e.onExpand();
109
110
  },
110
111
  className: "text-primary text-sm hover:underline",
111
- children: c ? "Show less" : "Show more"
112
+ children: n ? "Show less" : "Show more"
112
113
  }
113
114
  )
114
115
  ] });
@@ -121,29 +122,41 @@ function R({
121
122
  italic: l,
122
123
  underline: x,
123
124
  delete: s,
124
- type: i = "default",
125
- copyable: c,
126
- className: r = "",
127
- "data-testid": h,
128
- ...u
125
+ type: r = "default",
126
+ size: n,
127
+ copyable: i,
128
+ className: u = "",
129
+ "data-testid": p,
130
+ ...f
129
131
  }) {
130
- const f = typeof a == "string" ? a : "", p = (b) => h ? `${h}-${b}` : void 0, m = {
132
+ const m = typeof a == "string" ? a : "", h = (v) => p ? `${p}-${v}` : void 0, b = {
131
133
  default: "",
132
134
  secondary: "text-base-content/70",
133
135
  success: "text-success",
134
136
  warning: "text-warning",
135
137
  error: "text-error"
136
138
  };
137
- let n = a;
138
- e && (n = /* @__PURE__ */ t("code", { className: "px-1.5 py-0.5 bg-base-200 rounded text-sm font-mono", children: n })), d && (n = /* @__PURE__ */ t("mark", { className: "bg-warning/30 px-1", children: n })), o && (n = /* @__PURE__ */ t("strong", { className: "font-bold", children: n })), l && (n = /* @__PURE__ */ t("em", { className: "italic", children: n })), x && (n = /* @__PURE__ */ t("u", { className: "underline", children: n })), s && (n = /* @__PURE__ */ t("del", { className: "line-through opacity-70", children: n }));
139
- const v = `group inline ${m[i]} ${r}`.trim();
140
- return /* @__PURE__ */ g("span", { className: v, "data-testid": h, ...u, children: [
141
- n,
142
- c && /* @__PURE__ */ t(y, { text: f, "data-testid": p("copy") })
139
+ let c = a;
140
+ e && (c = /* @__PURE__ */ t("code", { className: "px-1.5 py-0.5 bg-base-200 rounded text-sm font-mono", children: c })), d && (c = /* @__PURE__ */ t("mark", { className: "bg-warning/30 px-1", children: c })), o && (c = /* @__PURE__ */ t("strong", { className: "font-bold", children: c })), l && (c = /* @__PURE__ */ t("em", { className: "italic", children: c })), x && (c = /* @__PURE__ */ t("u", { className: "underline", children: c })), s && (c = /* @__PURE__ */ t("del", { className: "line-through opacity-70", children: c }));
141
+ const y = [
142
+ "group",
143
+ "inline",
144
+ b[r],
145
+ n === "xs" && "text-xs",
146
+ n === "sm" && "text-sm",
147
+ n === "base" && "text-base",
148
+ n === "lg" && "text-lg",
149
+ n === "xl" && "text-xl",
150
+ n === "2xl" && "text-2xl",
151
+ u
152
+ ].filter(Boolean).join(" ");
153
+ return /* @__PURE__ */ g("span", { className: y, "data-testid": p, ...f, children: [
154
+ c,
155
+ i && /* @__PURE__ */ t(C, { text: m, "data-testid": h("copy") })
143
156
  ] });
144
157
  }
145
- function V({ href: a = "#", children: e, target: d, external: o, size: l, className: x = "", "data-testid": s, ...i }) {
146
- const c = o || a && a.startsWith("http"), r = d || (c ? "_blank" : void 0), h = c ? "noopener noreferrer" : void 0, u = [
158
+ function V({ href: a = "#", children: e, target: d, external: o, size: l, className: x = "", "data-testid": s, ...r }) {
159
+ const n = o || a && a.startsWith("http"), i = d || (n ? "_blank" : void 0), u = n ? "noopener noreferrer" : void 0, p = [
147
160
  T,
148
161
  j,
149
162
  l === "sm" && "text-sm",
@@ -157,14 +170,14 @@ function V({ href: a = "#", children: e, target: d, external: o, size: l, classN
157
170
  "a",
158
171
  {
159
172
  href: a,
160
- target: r,
161
- rel: h,
162
- className: u,
173
+ target: i,
174
+ rel: u,
175
+ className: p,
163
176
  "data-testid": s,
164
- ...i,
177
+ ...r,
165
178
  children: [
166
179
  e,
167
- c && /* @__PURE__ */ g("svg", { className: "w-3 h-3 inline-block ml-1", fill: "currentColor", viewBox: "0 0 20 20", children: [
180
+ n && /* @__PURE__ */ g("svg", { className: "w-3 h-3 inline-block ml-1", fill: "currentColor", viewBox: "0 0 20 20", children: [
168
181
  /* @__PURE__ */ t("path", { d: "M11 3a1 1 0 100 2h2.586l-6.293 6.293a1 1 0 101.414 1.414L15 6.414V9a1 1 0 102 0V4a1 1 0 00-1-1h-5z" }),
169
182
  /* @__PURE__ */ t("path", { d: "M5 5a2 2 0 00-2 2v8a2 2 0 002 2h8a2 2 0 002-2v-3a1 1 0 10-2 0v3H5V7h3a1 1 0 000-2H5z" })
170
183
  ] })