asterui 0.12.58 → 0.12.60
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.
- package/dist/components/Autocomplete.js +1 -1
- package/dist/components/Autocomplete.js.map +1 -1
- package/dist/components/Button.js +1 -1
- package/dist/components/Button.js.map +1 -1
- package/dist/components/Cascader.js +147 -146
- package/dist/components/Cascader.js.map +1 -1
- package/dist/components/Checkbox.js +1 -1
- package/dist/components/Checkbox.js.map +1 -1
- package/dist/components/ColorPicker.js +1 -1
- package/dist/components/ColorPicker.js.map +1 -1
- package/dist/components/ContextMenu.js +90 -89
- package/dist/components/ContextMenu.js.map +1 -1
- package/dist/components/CopyButton.js +1 -1
- package/dist/components/CopyButton.js.map +1 -1
- package/dist/components/Countdown.js +1 -1
- package/dist/components/Countdown.js.map +1 -1
- package/dist/components/DatePicker.js +1 -1
- package/dist/components/DatePicker.js.map +1 -1
- package/dist/components/Dock.js +1 -1
- package/dist/components/Dock.js.map +1 -1
- package/dist/components/Drawer.js +66 -65
- package/dist/components/Drawer.js.map +1 -1
- package/dist/components/Dropdown.js +174 -173
- package/dist/components/Dropdown.js.map +1 -1
- package/dist/components/Empty.js +1 -1
- package/dist/components/Empty.js.map +1 -1
- package/dist/components/FileInput.js +1 -1
- package/dist/components/FileInput.js.map +1 -1
- package/dist/components/Filter.js +1 -1
- package/dist/components/Filter.js.map +1 -1
- package/dist/components/Form.js +1 -1
- package/dist/components/Form.js.map +1 -1
- package/dist/components/Input.js +1 -1
- package/dist/components/Input.js.map +1 -1
- package/dist/components/InputNumber.js +1 -1
- package/dist/components/InputNumber.js.map +1 -1
- package/dist/components/List.js +1 -1
- package/dist/components/List.js.map +1 -1
- package/dist/components/Loading.js +1 -1
- package/dist/components/Loading.js.map +1 -1
- package/dist/components/Mention.js +66 -65
- package/dist/components/Mention.js.map +1 -1
- package/dist/components/Modal.js +1 -1
- package/dist/components/Modal.js.map +1 -1
- package/dist/components/OTPInput.js +1 -1
- package/dist/components/OTPInput.js.map +1 -1
- package/dist/components/Pagination.js +1 -1
- package/dist/components/Pagination.js.map +1 -1
- package/dist/components/Popconfirm.js +1 -1
- package/dist/components/Popconfirm.js.map +1 -1
- package/dist/components/Radio.js +1 -1
- package/dist/components/Radio.js.map +1 -1
- package/dist/components/Range.js +1 -1
- package/dist/components/Range.js.map +1 -1
- package/dist/components/Rating.js +1 -1
- package/dist/components/Rating.js.map +1 -1
- package/dist/components/RichTextEditor.js +1 -1
- package/dist/components/RichTextEditor.js.map +1 -1
- package/dist/components/Segmented.js +1 -1
- package/dist/components/Segmented.js.map +1 -1
- package/dist/components/Select.js +1 -1
- package/dist/components/Select.js.map +1 -1
- package/dist/components/Table.d.ts +19 -0
- package/dist/components/Table.js +348 -310
- package/dist/components/Table.js.map +1 -1
- package/dist/components/Tabs.js +1 -1
- package/dist/components/Tabs.js.map +1 -1
- package/dist/components/Textarea.js +1 -1
- package/dist/components/Textarea.js.map +1 -1
- package/dist/components/ThemeController.js +1 -1
- package/dist/components/ThemeController.js.map +1 -1
- package/dist/components/TimePicker.js +1 -1
- package/dist/components/TimePicker.js.map +1 -1
- package/dist/components/Toggle.js +1 -1
- package/dist/components/Toggle.js.map +1 -1
- package/dist/components/Tour.js +83 -82
- package/dist/components/Tour.js.map +1 -1
- package/dist/components/Transfer.js +107 -103
- package/dist/components/Transfer.js.map +1 -1
- package/dist/components/TreeSelect.js +245 -244
- package/dist/components/TreeSelect.js.map +1 -1
- package/dist/hooks/useTheme.d.ts +1 -1
- package/dist/hooks/useTheme.js +1 -1
- package/dist/hooks/useTheme.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.js +2 -2
- package/dist/{components → providers}/ConfigProvider.d.ts +8 -0
- package/dist/providers/ConfigProvider.js +50 -0
- package/dist/providers/ConfigProvider.js.map +1 -0
- package/dist/providers/ThemeProvider.js.map +1 -0
- package/package.json +1 -1
- package/dist/components/ConfigProvider.js +0 -46
- package/dist/components/ConfigProvider.js.map +0 -1
- package/dist/components/ThemeProvider.js.map +0 -1
- /package/dist/{components → providers}/ThemeProvider.d.ts +0 -0
- /package/dist/{components → providers}/ThemeProvider.js +0 -0
|
@@ -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'\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 = false,\n arrow = false,\n mouseEnterDelay = 0.15,\n mouseLeaveDelay = 0.1,\n getPopupContainer,\n destroyOnHidden = false,\n popupRender,\n 'data-testid': testId,\n className = '',\n ...rest\n },\n ref\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 (disabled) return\n if (!isControlled) {\n setInternalOpen(open)\n }\n if (open) {\n setShouldRender(true)\n }\n onOpenChange?.(open, { source })\n }, [disabled, 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,\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={disabled || 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","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 = ['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,\n destroyOnHidden = false,\n popupRender,\n 'data-testid': testId,\n className = '',\n ...rest\n },\n ref\n) {\n const { componentDisabled, getPopupContainer: globalGetPopupContainer } = useConfig()\n const effectiveDisabled = disabled ?? componentDisabled ?? false\n const effectiveGetPopupContainer = getPopupContainer ?? globalGetPopupContainer\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","globalGetPopupContainer","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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"}
|
package/dist/components/Empty.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as a, jsxs as e } from "react/jsx-runtime";
|
|
2
2
|
import { forwardRef as y } from "react";
|
|
3
|
-
import { useComponentLocale as v } from "
|
|
3
|
+
import { useComponentLocale as v } from "../providers/ConfigProvider.js";
|
|
4
4
|
const i = () => /* @__PURE__ */ a(
|
|
5
5
|
"svg",
|
|
6
6
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Empty.js","sources":["../../src/components/Empty.tsx"],"sourcesContent":["import React, { forwardRef } from 'react'\nimport { useComponentLocale } from '
|
|
1
|
+
{"version":3,"file":"Empty.js","sources":["../../src/components/Empty.tsx"],"sourcesContent":["import React, { forwardRef } from 'react'\nimport { useComponentLocale } from '../providers/ConfigProvider'\n\nexport interface EmptyProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Extra content like buttons or actions */\n children?: React.ReactNode\n /** Text or node to display as description */\n description?: React.ReactNode\n /** Custom image or icon; set to null to hide */\n image?: React.ReactNode\n /** Styling applied to the image container */\n imageStyle?: React.CSSProperties\n /** Test ID for the component */\n 'data-testid'?: string\n}\n\nconst DefaultEmptyImage: React.FC = () => (\n <svg\n width=\"184\"\n height=\"152\"\n viewBox=\"0 0 184 152\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"mx-auto\"\n aria-hidden=\"true\"\n >\n <g fill=\"none\" fillRule=\"evenodd\">\n <g transform=\"translate(24 31.67)\">\n <ellipse\n className=\"fill-base-300\"\n cx=\"67.797\"\n cy=\"106.89\"\n rx=\"67.797\"\n ry=\"12.668\"\n />\n <path\n className=\"fill-base-200\"\n d=\"M122.034 69.674L98.109 40.229c-1.148-1.386-2.826-2.225-4.593-2.225h-51.44c-1.766 0-3.444.839-4.592 2.225L13.56 69.674v15.383h108.475V69.674z\"\n />\n <path\n className=\"fill-base-100\"\n d=\"M101.537 86.214L80.63 61.102c-1.001-1.207-2.507-1.867-4.048-1.867H31.724c-1.54 0-3.047.66-4.048 1.867L6.769 86.214v13.792h94.768V86.214z\"\n transform=\"translate(13.56)\"\n />\n <ellipse\n className=\"fill-base-300\"\n cx=\"67.797\"\n cy=\"106.89\"\n rx=\"67.797\"\n ry=\"12.668\"\n />\n <path\n className=\"fill-base-200\"\n d=\"M122.034 69.674L98.109 40.229c-1.148-1.386-2.826-2.225-4.593-2.225h-51.44c-1.766 0-3.444.839-4.592 2.225L13.56 69.674v15.383h108.475V69.674z\"\n />\n <path\n className=\"fill-base-content opacity-10\"\n d=\"M33.83 0h67.933a4 4 0 0 1 4 4v93.344a4 4 0 0 1-4 4H33.83a4 4 0 0 1-4-4V4a4 4 0 0 1 4-4z\"\n />\n <path\n className=\"fill-base-100\"\n d=\"M42.678 9.953h50.237a2 2 0 0 1 2 2V36.91a2 2 0 0 1-2 2H42.678a2 2 0 0 1-2-2V11.953a2 2 0 0 1 2-2zM42.94 49.767h49.713a2.262 2.262 0 1 1 0 4.524H42.94a2.262 2.262 0 0 1 0-4.524zM42.94 61.53h49.713a2.262 2.262 0 1 1 0 4.525H42.94a2.262 2.262 0 0 1 0-4.525zM121.813 105.032c-.775 3.071-3.497 5.36-6.735 5.36H20.515c-3.238 0-5.96-2.29-6.734-5.36a7.309 7.309 0 0 1-.222-1.79V69.675h26.318c2.907 0 5.25 2.448 5.25 5.42v.04c0 2.971 2.37 5.37 5.277 5.37h34.785c2.907 0 5.277-2.421 5.277-5.393V75.1c0-2.972 2.343-5.426 5.25-5.426h26.318v33.569c0 .617-.077 1.216-.221 1.789z\"\n />\n </g>\n <path\n className=\"fill-base-content opacity-10\"\n d=\"M149.121 33.292l-6.83 2.65a1 1 0 0 1-1.317-1.23l1.937-6.207c-2.589-2.944-4.109-6.534-4.109-10.408C138.802 8.102 148.92 0 161.402 0 173.881 0 184 8.102 184 18.097c0 9.995-10.118 18.097-22.599 18.097-4.528 0-8.744-1.066-12.28-2.902z\"\n />\n <g className=\"fill-base-100\" transform=\"translate(149.65 15.383)\">\n <ellipse cx=\"20.654\" cy=\"3.167\" rx=\"2.849\" ry=\"2.815\" />\n <path d=\"M5.698 5.63H0L2.898.704zM9.259.704h4.985V5.63H9.259z\" />\n </g>\n </g>\n </svg>\n)\n\n// Simple/minimal empty image (matches Ant Design's PRESENTED_IMAGE_SIMPLE)\nconst SimpleEmptyImage: React.FC = () => (\n <svg\n width=\"64\"\n height=\"41\"\n viewBox=\"0 0 64 41\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"mx-auto\"\n aria-hidden=\"true\"\n >\n <g transform=\"translate(0 1)\" fill=\"none\" fillRule=\"evenodd\">\n <ellipse className=\"fill-base-300\" cx=\"32\" cy=\"33\" rx=\"32\" ry=\"7\" />\n <g fillRule=\"nonzero\" className=\"stroke-base-content/20\">\n <path d=\"M55 12.76L44.854 1.258C44.367.474 43.656 0 42.907 0H21.093c-.749 0-1.46.474-1.947 1.257L9 12.761V22h46v-9.24z\" />\n <path\n d=\"M41.613 15.931c0-1.605.994-2.93 2.227-2.931H55v18.137C55 33.26 53.68 35 52.05 35h-40.1C10.32 35 9 33.259 9 31.137V13h11.16c1.233 0 2.227 1.323 2.227 2.928v.022c0 1.605 1.005 2.901 2.237 2.901h14.752c1.232 0 2.237-1.308 2.237-2.913v-.007z\"\n className=\"fill-base-200\"\n />\n </g>\n </g>\n </svg>\n)\n\nconst EmptyRoot = forwardRef<HTMLDivElement, EmptyProps>(\n (\n {\n children,\n className = '',\n description,\n image,\n imageStyle,\n 'data-testid': testId = 'empty',\n ...rest\n },\n ref\n ) => {\n const locale = useComponentLocale('Empty')\n const displayDescription = description ?? locale.description\n\n const classes = ['flex flex-col items-center justify-center py-8 px-4', className]\n .filter(Boolean)\n .join(' ')\n\n return (\n <div\n ref={ref}\n className={classes}\n role=\"status\"\n aria-label={typeof displayDescription === 'string' ? displayDescription : 'Empty'}\n data-testid={testId}\n {...rest}\n >\n {image !== null && (\n <div className=\"mb-2\" style={imageStyle} data-testid={`${testId}-image`}>\n {image === undefined ? <DefaultEmptyImage /> : image}\n </div>\n )}\n {displayDescription && (\n <div className=\"text-base-content/60 text-sm mb-4\" data-testid={`${testId}-description`}>\n {displayDescription}\n </div>\n )}\n {children && (\n <div className=\"mt-2\" data-testid={`${testId}-footer`}>\n {children}\n </div>\n )}\n </div>\n )\n }\n)\n\nEmptyRoot.displayName = 'Empty'\n\n// Export with static image constants (like Ant Design)\nexport const Empty = Object.assign(EmptyRoot, {\n PRESENTED_IMAGE_DEFAULT: <DefaultEmptyImage />,\n PRESENTED_IMAGE_SIMPLE: <SimpleEmptyImage />,\n})\n"],"names":["DefaultEmptyImage","jsx","jsxs","SimpleEmptyImage","EmptyRoot","forwardRef","children","className","description","image","imageStyle","testId","rest","ref","locale","useComponentLocale","displayDescription","classes","Empty"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as d } from "react/jsx-runtime";
|
|
2
2
|
import { forwardRef as I } from "react";
|
|
3
|
-
import { useConfig as m } from "
|
|
3
|
+
import { useConfig as m } from "../providers/ConfigProvider.js";
|
|
4
4
|
const F = "file-input", g = "file-input-xs", y = "file-input-sm", x = "file-input-md", S = "file-input-lg", w = "file-input-xl", C = "file-input-neutral", z = "file-input-primary", N = "file-input-secondary", h = "file-input-accent", j = "file-input-info", X = "file-input-success", v = "file-input-warning", A = "file-input-error", e = "file-input-ghost", B = I(
|
|
5
5
|
({ size: i, color: n, ghost: s = !1, bordered: l = !0, className: o = "", ...u }, p) => {
|
|
6
6
|
const { componentSize: c } = m(), t = i ?? c ?? "md", r = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileInput.js","sources":["../../src/components/FileInput.tsx"],"sourcesContent":["import React, { forwardRef } from 'react'\nimport { useConfig } from '
|
|
1
|
+
{"version":3,"file":"FileInput.js","sources":["../../src/components/FileInput.tsx"],"sourcesContent":["import React, { forwardRef } from 'react'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dFileInput = 'file-input'\nconst dFileInputXs = 'file-input-xs'\nconst dFileInputSm = 'file-input-sm'\nconst dFileInputMd = 'file-input-md'\nconst dFileInputLg = 'file-input-lg'\nconst dFileInputXl = 'file-input-xl'\nconst dFileInputNeutral = 'file-input-neutral'\nconst dFileInputPrimary = 'file-input-primary'\nconst dFileInputSecondary = 'file-input-secondary'\nconst dFileInputAccent = 'file-input-accent'\nconst dFileInputInfo = 'file-input-info'\nconst dFileInputSuccess = 'file-input-success'\nconst dFileInputWarning = 'file-input-warning'\nconst dFileInputError = 'file-input-error'\nconst dFileInputGhost = 'file-input-ghost'\n\nexport interface FileInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'type'> {\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n color?: 'neutral' | 'primary' | 'secondary' | 'accent' | 'info' | 'success' | 'warning' | 'error'\n ghost?: boolean\n bordered?: boolean\n className?: string\n}\n\nexport const FileInput = forwardRef<HTMLInputElement, FileInputProps>(\n ({ size, color, ghost = false, bordered = true, className = '', ...props }, ref) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n\n const sizeClasses = {\n xs: dFileInputXs,\n sm: dFileInputSm,\n md: dFileInputMd,\n lg: dFileInputLg,\n xl: dFileInputXl,\n }\n\n const colorClasses = {\n neutral: dFileInputNeutral,\n primary: dFileInputPrimary,\n secondary: dFileInputSecondary,\n accent: dFileInputAccent,\n info: dFileInputInfo,\n success: dFileInputSuccess,\n warning: dFileInputWarning,\n error: dFileInputError,\n }\n\n const fileInputClasses = [\n dFileInput,\n 'w-full',\n // In DaisyUI 5, borders are on by default. Use ghost to remove them.\n !bordered && dFileInputGhost,\n ghost && dFileInputGhost,\n effectiveSize && sizeClasses[effectiveSize],\n color && colorClasses[color],\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return <input ref={ref} type=\"file\" className={fileInputClasses} {...props} />\n }\n)\n\nFileInput.displayName = 'FileInput'\n"],"names":["dFileInput","dFileInputXs","dFileInputSm","dFileInputMd","dFileInputLg","dFileInputXl","dFileInputNeutral","dFileInputPrimary","dFileInputSecondary","dFileInputAccent","dFileInputInfo","dFileInputSuccess","dFileInputWarning","dFileInputError","dFileInputGhost","FileInput","forwardRef","size","color","ghost","bordered","className","props","ref","componentSize","useConfig","effectiveSize","sizeClasses","colorClasses","fileInputClasses","jsx"],"mappings":";;;AAIA,MAAMA,IAAa,cACbC,IAAe,iBACfC,IAAe,iBACfC,IAAe,iBACfC,IAAe,iBACfC,IAAe,iBACfC,IAAoB,sBACpBC,IAAoB,sBACpBC,IAAsB,wBACtBC,IAAmB,qBACnBC,IAAiB,mBACjBC,IAAoB,sBACpBC,IAAoB,sBACpBC,IAAkB,oBAClBC,IAAkB,oBAUXC,IAAYC;AAAA,EACvB,CAAC,EAAE,MAAAC,GAAM,OAAAC,GAAO,OAAAC,IAAQ,IAAO,UAAAC,IAAW,IAAM,WAAAC,IAAY,IAAI,GAAGC,EAAA,GAASC,MAAQ;AAClF,UAAM,EAAE,eAAAC,EAAA,IAAkBC,EAAA,GACpBC,IAAgBT,KAAQO,KAAiB,MAEzCG,IAAc;AAAA,MAClB,IAAI1B;AAAA,MACJ,IAAIC;AAAA,MACJ,IAAIC;AAAA,MACJ,IAAIC;AAAA,MACJ,IAAIC;AAAA,IAAA,GAGAuB,IAAe;AAAA,MACnB,SAAStB;AAAA,MACT,SAASC;AAAA,MACT,WAAWC;AAAA,MACX,QAAQC;AAAA,MACR,MAAMC;AAAA,MACN,SAASC;AAAA,MACT,SAASC;AAAA,MACT,OAAOC;AAAA,IAAA,GAGHgB,IAAmB;AAAA,MACvB7B;AAAA,MACA;AAAA;AAAA,MAEA,CAACoB,KAAYN;AAAA,MACbK,KAASL;AAAA,MACTY,KAAiBC,EAAYD,CAAa;AAAA,MAC1CR,KAASU,EAAaV,CAAK;AAAA,MAC3BG;AAAA,IAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,WAAO,gBAAAS,EAAC,WAAM,KAAAP,GAAU,MAAK,QAAO,WAAWM,GAAmB,GAAGP,GAAO;AAAA,EAC9E;AACF;AAEAP,EAAU,cAAc;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsxs as N, jsx as r } from "react/jsx-runtime";
|
|
2
2
|
import { useId as I, useState as R } from "react";
|
|
3
|
-
import { useConfig as $ } from "
|
|
3
|
+
import { useConfig as $ } from "../providers/ConfigProvider.js";
|
|
4
4
|
const q = "filter", i = "btn", F = "btn-xs", V = "btn-sm", X = "btn-lg", k = "btn-xl", O = "btn-square", c = {
|
|
5
5
|
xs: F,
|
|
6
6
|
sm: V,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Filter.js","sources":["../../src/components/Filter.tsx"],"sourcesContent":["import React, { useState, useId } from 'react'\nimport { useConfig } from '
|
|
1
|
+
{"version":3,"file":"Filter.js","sources":["../../src/components/Filter.tsx"],"sourcesContent":["import React, { useState, useId } from 'react'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dFilter = 'filter'\nconst dBtn = 'btn'\nconst dBtnXs = 'btn-xs'\nconst dBtnSm = 'btn-sm'\nconst dBtnLg = 'btn-lg'\nconst dBtnXl = 'btn-xl'\nconst dBtnSquare = 'btn-square'\n\nexport interface FilterOption {\n label: string\n value: string\n disabled?: boolean\n}\n\nexport interface FilterProps {\n /** Filter options */\n options: (string | FilterOption)[]\n /** Controlled value */\n value?: string\n /** Default value for uncontrolled mode */\n defaultValue?: string\n /** Change handler */\n onChange?: (value: string | undefined) => void\n /** Radio group name (auto-generated if not provided) */\n name?: string\n /** Button size */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n /** Show reset button */\n showReset?: boolean\n /** Reset button label */\n resetLabel?: React.ReactNode\n /** Additional CSS classes for container */\n className?: string\n}\n\nconst sizeClasses: Record<string, string> = {\n xs: dBtnXs,\n sm: dBtnSm,\n md: '',\n lg: dBtnLg,\n xl: dBtnXl,\n}\n\nexport const Filter: React.FC<FilterProps> = ({\n options,\n value,\n defaultValue,\n onChange,\n name,\n size,\n showReset = true,\n resetLabel = '×',\n className = '',\n}) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n\n const autoId = useId()\n const groupName = name || `filter-${autoId}`\n\n const [internalValue, setInternalValue] = useState<string | undefined>(defaultValue)\n const currentValue = value !== undefined ? value : internalValue\n const isControlled = value !== undefined\n\n const normalizedOptions: FilterOption[] = options.map((opt) =>\n typeof opt === 'string' ? { label: opt, value: opt } : opt\n )\n\n const handleChange = (newValue: string) => {\n if (!isControlled) {\n setInternalValue(newValue)\n }\n onChange?.(newValue)\n }\n\n const handleReset = () => {\n if (!isControlled) {\n setInternalValue(undefined)\n }\n onChange?.(undefined)\n }\n\n const buttonClasses = [dBtn, sizeClasses[effectiveSize]].filter(Boolean).join(' ')\n const resetClasses = [dBtn, dBtnSquare, sizeClasses[effectiveSize]].filter(Boolean).join(' ')\n\n return (\n <form className={`${dFilter} ${className}`.trim()} onReset={handleReset}>\n {showReset && (\n <input\n className={resetClasses}\n type=\"reset\"\n value={typeof resetLabel === 'string' ? resetLabel : undefined}\n aria-label=\"Reset filter\"\n />\n )}\n {normalizedOptions.map((option) => (\n <input\n key={option.value}\n className={buttonClasses}\n type=\"radio\"\n name={groupName}\n value={option.value}\n aria-label={option.label}\n checked={currentValue === option.value}\n onChange={() => handleChange(option.value)}\n disabled={option.disabled}\n />\n ))}\n </form>\n )\n}\n"],"names":["dFilter","dBtn","dBtnXs","dBtnSm","dBtnLg","dBtnXl","dBtnSquare","sizeClasses","Filter","options","value","defaultValue","onChange","name","size","showReset","resetLabel","className","componentSize","useConfig","effectiveSize","autoId","useId","groupName","internalValue","setInternalValue","useState","currentValue","isControlled","normalizedOptions","opt","handleChange","newValue","handleReset","buttonClasses","resetClasses","jsxs","jsx","option"],"mappings":";;;AAIA,MAAMA,IAAU,UACVC,IAAO,OACPC,IAAS,UACTC,IAAS,UACTC,IAAS,UACTC,IAAS,UACTC,IAAa,cA6BbC,IAAsC;AAAA,EAC1C,IAAIL;AAAA,EACJ,IAAIC;AAAA,EACJ,IAAI;AAAA,EACJ,IAAIC;AAAA,EACJ,IAAIC;AACN,GAEaG,IAAgC,CAAC;AAAA,EAC5C,SAAAC;AAAA,EACA,OAAAC;AAAA,EACA,cAAAC;AAAA,EACA,UAAAC;AAAA,EACA,MAAAC;AAAA,EACA,MAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,YAAAC,IAAa;AAAA,EACb,WAAAC,IAAY;AACd,MAAM;AACJ,QAAM,EAAE,eAAAC,EAAA,IAAkBC,EAAA,GACpBC,IAAgBN,KAAQI,KAAiB,MAEzCG,IAASC,EAAA,GACTC,IAAYV,KAAQ,UAAUQ,CAAM,IAEpC,CAACG,GAAeC,CAAgB,IAAIC,EAA6Bf,CAAY,GAC7EgB,IAAejB,MAAU,SAAYA,IAAQc,GAC7CI,IAAelB,MAAU,QAEzBmB,IAAoCpB,EAAQ;AAAA,IAAI,CAACqB,MACrD,OAAOA,KAAQ,WAAW,EAAE,OAAOA,GAAK,OAAOA,MAAQA;AAAA,EAAA,GAGnDC,IAAe,CAACC,MAAqB;AACzC,IAAKJ,KACHH,EAAiBO,CAAQ,GAE3BpB,IAAWoB,CAAQ;AAAA,EACrB,GAEMC,IAAc,MAAM;AACxB,IAAKL,KACHH,EAAiB,MAAS,GAE5Bb,IAAW,MAAS;AAAA,EACtB,GAEMsB,IAAgB,CAACjC,GAAMM,EAAYa,CAAa,CAAC,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAC3Ee,IAAe,CAAClC,GAAMK,GAAYC,EAAYa,CAAa,CAAC,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE5F,SACE,gBAAAgB,EAAC,QAAA,EAAK,WAAW,GAAGpC,CAAO,IAAIiB,CAAS,GAAG,KAAA,GAAQ,SAASgB,GACzD,UAAA;AAAA,IAAAlB,KACC,gBAAAsB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWF;AAAA,QACX,MAAK;AAAA,QACL,OAAO,OAAOnB,KAAe,WAAWA,IAAa;AAAA,QACrD,cAAW;AAAA,MAAA;AAAA,IAAA;AAAA,IAGda,EAAkB,IAAI,CAACS,MACtB,gBAAAD;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WAAWH;AAAA,QACX,MAAK;AAAA,QACL,MAAMX;AAAA,QACN,OAAOe,EAAO;AAAA,QACd,cAAYA,EAAO;AAAA,QACnB,SAASX,MAAiBW,EAAO;AAAA,QACjC,UAAU,MAAMP,EAAaO,EAAO,KAAK;AAAA,QACzC,UAAUA,EAAO;AAAA,MAAA;AAAA,MARZA,EAAO;AAAA,IAAA,CAUf;AAAA,EAAA,GACH;AAEJ;"}
|
package/dist/components/Form.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as t, jsxs as E } from "react/jsx-runtime";
|
|
2
2
|
import { createContext as be, useId as ae, useEffect as ie, useRef as K, isValidElement as U, cloneElement as $e, useContext as Ne } from "react";
|
|
3
3
|
import { useForm as ce, useFieldArray as Fe, useWatch as ke, Controller as Ve } from "react-hook-form";
|
|
4
|
-
import { useConfig as we } from "
|
|
4
|
+
import { useConfig as we } from "../providers/ConfigProvider.js";
|
|
5
5
|
const Ce = "input", Le = "input-xs", Ee = "input-sm", Ae = "input-md", Se = "input-lg", je = "input-xl", ze = "floating-label", Me = "loading", Pe = "loading-spinner", Re = "loading-xs", Te = "tooltip", Be = "tooltip-top", le = "validator-hint", G = be(void 0), Y = {
|
|
6
6
|
email: {
|
|
7
7
|
value: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Form.js","sources":["../../src/components/Form.tsx"],"sourcesContent":["import React, { createContext, useContext, cloneElement, isValidElement, useId, useEffect, useRef } from 'react'\nimport { useForm, UseFormReturn, FieldValues, SubmitHandler, UseFormProps, Controller, useFieldArray, FieldArrayPath, FieldArray, useWatch } from 'react-hook-form'\nimport { useConfig } from './ConfigProvider'\n\n// DaisyUI classes\nconst dInput = 'input'\nconst dInputXs = 'input-xs'\nconst dInputSm = 'input-sm'\nconst dInputMd = 'input-md'\nconst dInputLg = 'input-lg'\nconst dInputXl = 'input-xl'\nconst dFloatingLabel = 'floating-label'\nconst dLoading = 'loading'\nconst dLoadingSpinner = 'loading-spinner'\nconst dLoadingXs = 'loading-xs'\nconst dTooltip = 'tooltip'\nconst dTooltipTop = 'tooltip-top'\nconst dValidatorHint = 'validator-hint'\n\ninterface FormContextValue {\n form: UseFormReturn<any>\n layout?: 'vertical' | 'horizontal' | 'inline'\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n labelWidth?: number\n listName?: string\n disabled?: boolean\n}\n\nconst FormContext = createContext<FormContextValue | undefined>(undefined)\n\n// Built-in type validators\nconst TYPE_VALIDATORS = {\n email: {\n value: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}$/i,\n message: 'Please enter a valid email address',\n },\n url: {\n value: /^https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_\\+.~#?&//=]*)$/,\n message: 'Please enter a valid URL',\n },\n number: {\n value: /^-?\\d+(\\.\\d+)?$/,\n message: 'Please enter a valid number',\n },\n}\n\nexport interface FormProps<TFieldValues extends FieldValues = FieldValues>\n extends Omit<React.FormHTMLAttributes<HTMLFormElement>, 'onSubmit'> {\n form?: UseFormReturn<TFieldValues>\n onFinish?: SubmitHandler<TFieldValues>\n /** Called when form validation fails */\n onFinishFailed?: (errorInfo: { values: TFieldValues; errorFields: Array<{ name: string; errors: string[] }> }) => void\n initialValues?: UseFormProps<TFieldValues>['defaultValues']\n layout?: 'vertical' | 'horizontal' | 'inline'\n /** Label width in pixels for horizontal layout (default: 80) */\n labelWidth?: number\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n /** Disable all form fields */\n disabled?: boolean\n children: React.ReactNode\n /** Test ID for the form element */\n 'data-testid'?: string\n}\n\nexport interface FormRule {\n required?: boolean | string\n type?: 'email' | 'url' | 'number'\n min?: number | { value: number; message: string }\n max?: number | { value: number; message: string }\n pattern?: RegExp | { value: RegExp; message: string }\n message?: string\n validate?: (value: any) => boolean | string | Promise<boolean | string>\n /** Ant Design style validator (for compatibility) */\n validator?: (rule: any, value: any) => Promise<void>\n}\n\n/** Form methods passed to rule functions (Ant Design style) */\nexport interface FormRuleMethods {\n getFieldValue: (name: string) => any\n getFieldsValue: () => any\n}\n\n/** A rule can be an object or a function that returns a rule object */\nexport type FormRuleInput = FormRule | ((methods: FormRuleMethods) => FormRule)\n\nexport type ValidateTrigger = 'onChange' | 'onBlur' | 'onSubmit' | ('onChange' | 'onBlur' | 'onSubmit')[]\n\nexport interface FormItemProps {\n name?: string | string[]\n label?: string\n /** Floating label text (alternative to label, uses DaisyUI floating-label) */\n floatingLabel?: string\n help?: string\n required?: boolean\n rules?: FormRuleInput | FormRuleInput[]\n valuePropName?: string\n inline?: boolean\n className?: string\n children: React.ReactElement\n /** Tooltip text to show next to label */\n tooltip?: string\n /** Additional content below the form control */\n extra?: React.ReactNode\n /** Show validation feedback icon */\n hasFeedback?: boolean\n /** Field names that this field depends on for validation */\n dependencies?: string[]\n /** When to trigger validation */\n validateTrigger?: ValidateTrigger\n /** Initial value for this field (overrides Form's initialValues) */\n initialValue?: any\n /** Hide this field (still validates and submits) */\n hidden?: boolean\n /** Text/element before input (outside, using DaisyUI label) */\n addonBefore?: React.ReactNode\n /** Text/element after input (outside, using DaisyUI label) */\n addonAfter?: React.ReactNode\n /** Test ID for the form item (used as prefix for child elements) */\n 'data-testid'?: string\n}\n\nexport interface FormListProps<TFieldValues extends FieldValues = FieldValues> {\n name: FieldArrayPath<TFieldValues>\n children: (\n fields: FieldArray<TFieldValues>[],\n operations: {\n add: (value?: any) => void\n remove: (index: number) => void\n move: (from: number, to: number) => void\n }\n ) => React.ReactNode\n}\n\nfunction useFormContext() {\n const context = useContext(FormContext)\n if (!context) {\n throw new Error('Form compound components must be used within Form')\n }\n return context\n}\n\nfunction FormRoot<TFieldValues extends FieldValues = FieldValues>({\n form: externalForm,\n onFinish,\n onFinishFailed,\n initialValues,\n layout = 'vertical',\n labelWidth = 60,\n size,\n disabled = false,\n children,\n className = '',\n noValidate = true,\n ...props\n}: FormProps<TFieldValues>) {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n\n const internalForm = useForm<TFieldValues>({\n defaultValues: initialValues,\n })\n\n const form = externalForm || internalForm\n\n const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault()\n\n // Trigger validation\n const isValid = await form.trigger()\n\n if (isValid) {\n if (onFinish) {\n onFinish(form.getValues())\n }\n } else {\n if (onFinishFailed) {\n const errors = form.formState.errors\n const errorFields: Array<{ name: string; errors: string[] }> = []\n\n // Flatten errors into errorFields array\n const flattenErrors = (obj: any, prefix = '') => {\n for (const key in obj) {\n const fullKey = prefix ? `${prefix}.${key}` : key\n const value = obj[key]\n if (value?.message) {\n errorFields.push({ name: fullKey, errors: [value.message as string] })\n } else if (typeof value === 'object' && value !== null) {\n flattenErrors(value, fullKey)\n }\n }\n }\n flattenErrors(errors)\n\n onFinishFailed({ values: form.getValues(), errorFields })\n }\n }\n }\n\n const handleReset = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault()\n form.reset(initialValues as any)\n }\n\n return (\n <FormContext.Provider value={{ form, layout, labelWidth, size: effectiveSize, disabled }}>\n <form onSubmit={handleSubmit} onReset={handleReset} className={className} noValidate={noValidate} {...props}>\n {children}\n </form>\n </FormContext.Provider>\n )\n}\n\nfunction FormItem({\n name,\n label,\n floatingLabel,\n help,\n required = false,\n rules,\n valuePropName = 'value',\n inline = false,\n className = '',\n children,\n tooltip,\n extra,\n hasFeedback = false,\n dependencies,\n validateTrigger = 'onChange',\n initialValue,\n hidden = false,\n addonBefore,\n addonAfter,\n 'data-testid': testId,\n}: FormItemProps) {\n const { form, size, listName, layout, labelWidth, disabled: formDisabled } = useFormContext()\n const inputId = useId()\n const errorId = useId()\n\n if (!name) {\n // Render without form control if no name provided\n return <div className={`${inline ? 'w-auto' : 'w-full'} ${className}`} style={hidden ? { display: 'none' } : undefined}>{children}</div>\n }\n\n // Handle nested field names (for Form.List)\n let fieldName: string\n if (Array.isArray(name)) {\n // If we're inside a Form.List, prepend the list name\n const fullPath = listName ? [listName, ...name] : name\n fieldName = fullPath.join('.')\n } else {\n fieldName = name\n }\n\n // Set initial value if provided\n useEffect(() => {\n if (initialValue !== undefined) {\n const currentValue = form.getValues(fieldName as any)\n if (currentValue === undefined) {\n form.setValue(fieldName as any, initialValue)\n }\n }\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n // Watch dependencies and re-validate when they change\n const watchedDeps = useWatch({\n control: form.control,\n name: dependencies as any,\n disabled: !dependencies || dependencies.length === 0,\n })\n\n // Use refs to avoid infinite loops\n const formRef = useRef(form)\n formRef.current = form\n const prevDepsRef = useRef<string | undefined>(undefined)\n\n useEffect(() => {\n // Skip if no dependencies\n if (!dependencies || dependencies.length === 0) return\n\n // Skip initial render\n if (prevDepsRef.current === undefined) {\n prevDepsRef.current = JSON.stringify(watchedDeps)\n return\n }\n\n // Only trigger if dependency values actually changed\n const currentDeps = JSON.stringify(watchedDeps)\n if (prevDepsRef.current !== currentDeps) {\n prevDepsRef.current = currentDeps\n // Only re-validate if this field has been touched\n const touchedFields = formRef.current.formState.touchedFields as any\n const isTouched = fieldName.split('.').reduce((obj, key) => obj?.[key], touchedFields)\n if (isTouched) {\n formRef.current.trigger(fieldName as any)\n }\n }\n }, [watchedDeps, dependencies, fieldName])\n\n // Get error by traversing the error object path\n const getErrorByPath = (path: string) => {\n const keys = path.split('.')\n let error: any = form.formState.errors\n for (const key of keys) {\n if (!error) break\n error = error[key]\n }\n return error\n }\n\n const error = getErrorByPath(fieldName)\n const errorMessage = error?.message as string | undefined\n\n // Normalize rules to array\n const rulesInputArray: FormRuleInput[] = rules\n ? Array.isArray(rules) ? rules : [rules]\n : []\n\n // Store form ref for use in validators (to get fresh values at validation time)\n const validatorFormRef = useRef(form)\n validatorFormRef.current = form\n\n // Create form methods for rule functions (Ant Design style)\n // These methods always access current form values via ref\n const formMethods: FormRuleMethods = {\n getFieldValue: (name: string) => validatorFormRef.current.getValues(name as any),\n getFieldsValue: () => validatorFormRef.current.getValues(),\n }\n\n // Resolve function rules to rule objects\n const rulesArray: FormRule[] = rulesInputArray.map(rule =>\n typeof rule === 'function' ? rule(formMethods) : rule\n )\n\n // Build validation rules\n const validationRules: any = {}\n const patternValidators: Array<{ pattern: RegExp; message: string }> = []\n const customValidators: Array<(value: any) => boolean | string | Promise<boolean | string>> = []\n\n // Handle top-level required prop\n if (required) {\n validationRules.required = 'This field is required'\n }\n\n // Process each rule\n for (const rule of rulesArray) {\n // Required\n if (rule.required) {\n validationRules.required = typeof rule.required === 'string'\n ? rule.required\n : rule.message || 'This field is required'\n }\n\n // Type validator\n if (rule.type && TYPE_VALIDATORS[rule.type]) {\n patternValidators.push({\n pattern: TYPE_VALIDATORS[rule.type].value,\n message: rule.message || TYPE_VALIDATORS[rule.type].message,\n })\n }\n\n // Min length\n if (rule.min !== undefined) {\n const minValue = typeof rule.min === 'object' ? rule.min.value : rule.min\n const minMessage = typeof rule.min === 'object'\n ? rule.min.message\n : rule.message || `Minimum length is ${minValue} characters`\n validationRules.minLength = { value: minValue, message: minMessage }\n }\n\n // Max length\n if (rule.max !== undefined) {\n const maxValue = typeof rule.max === 'object' ? rule.max.value : rule.max\n const maxMessage = typeof rule.max === 'object'\n ? rule.max.message\n : rule.message || `Maximum length is ${maxValue} characters`\n validationRules.maxLength = { value: maxValue, message: maxMessage }\n }\n\n // Pattern - collect all patterns\n if (rule.pattern) {\n const patternValue = rule.pattern instanceof RegExp ? rule.pattern : rule.pattern.value\n const patternMessage = rule.pattern instanceof RegExp\n ? rule.message || 'Invalid format'\n : rule.pattern.message\n patternValidators.push({ pattern: patternValue, message: patternMessage })\n }\n\n // Custom validator (our style)\n if (rule.validate) {\n customValidators.push(rule.validate)\n }\n\n // Ant Design style validator\n if (rule.validator) {\n const antValidator = rule.validator\n customValidators.push(async (value: any) => {\n try {\n await antValidator(rule, value)\n return true\n } catch (err) {\n return err instanceof Error ? err.message : String(err)\n }\n })\n }\n }\n\n // Combine all pattern and custom validators into a single validate function\n if (patternValidators.length > 0 || customValidators.length > 0) {\n validationRules.validate = async (value: any) => {\n // Check all patterns (skip if empty - required rule handles that)\n for (const { pattern, message } of patternValidators) {\n if (value && !pattern.test(value)) {\n return message\n }\n }\n\n // Run all custom validators (always run - they may validate empty/false values)\n for (const validator of customValidators) {\n const result = await validator(value)\n if (result !== true) {\n return result\n }\n }\n\n return true\n }\n }\n\n // Normalize validateTrigger to array\n const triggers = Array.isArray(validateTrigger) ? validateTrigger : [validateTrigger]\n const shouldValidateOnChange = triggers.includes('onChange')\n const shouldValidateOnBlur = triggers.includes('onBlur')\n\n // Feedback icons\n const FeedbackIcon = ({ hasError, isValidating }: { hasError: boolean; isValidating: boolean }) => {\n if (isValidating) {\n return (\n <span className={`${dLoading} ${dLoadingSpinner} ${dLoadingXs} text-base-content/50`} />\n )\n }\n if (hasError) {\n return (\n <svg className=\"w-4 h-4 text-error\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n )\n }\n return (\n <svg className=\"w-4 h-4 text-success\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n )\n }\n\n // Tooltip icon\n const TooltipIcon = () => (\n <div className={`${dTooltip} ${dTooltipTop} ml-1`} data-tip={tooltip}>\n <svg className=\"w-4 h-4 text-base-content/50 cursor-help\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n </div>\n )\n\n return (\n <Controller\n name={fieldName}\n control={form.control}\n rules={validationRules}\n render={({ field, fieldState }) => {\n const { value, onChange, onBlur, ref } = field\n const isValidating = fieldState.isTouched && form.formState.isValidating\n\n // Clone the child element and inject form control props\n const childProps: any = {\n id: inputId,\n ref,\n 'aria-invalid': error ? true : undefined,\n 'aria-describedby': error ? errorId : undefined,\n 'data-testid': testId ? `${testId}-input` : undefined,\n }\n\n // Handle onBlur based on validateTrigger\n childProps.onBlur = () => {\n onBlur()\n if (shouldValidateOnBlur) {\n form.trigger(fieldName as any)\n }\n }\n\n // Get the original onChange from the child element (if any)\n const originalOnChange = isValidElement(children) ? (children.props as any).onChange : undefined\n\n // Handle different value prop names (e.g., 'checked' for checkboxes)\n if (valuePropName === 'checked') {\n childProps.checked = value\n childProps.onChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(e.target.checked)\n if (shouldValidateOnChange) {\n form.trigger(fieldName as any)\n }\n // Call original onChange if provided\n originalOnChange?.(e)\n }\n } else {\n childProps.value = value || ''\n childProps.onChange = (eventOrValue: any) => {\n // Handle components that pass value directly (e.g., Range, Rating)\n // vs components that pass event object (e.g., Input, Select)\n if (eventOrValue && eventOrValue.target !== undefined) {\n onChange(eventOrValue.target.value)\n } else {\n onChange(eventOrValue)\n }\n if (shouldValidateOnChange) {\n form.trigger(fieldName as any)\n }\n // Call original onChange if provided\n originalOnChange?.(eventOrValue)\n }\n }\n\n // Apply size if specified at form level\n if (size && isValidElement(children)) {\n const existingProps = children.props as any\n if (!existingProps.size) {\n childProps.size = size\n }\n }\n\n // Apply error styling and accessibility\n if (error) {\n childProps.color = 'error'\n childProps['aria-invalid'] = true\n }\n\n // Apply form-level disabled state\n if (formDisabled) {\n childProps.disabled = true\n }\n\n // When wrapped with addons, the child input should be unstyled (the wrapper has the styling)\n const hasAddons = addonBefore || addonAfter\n if (hasAddons) {\n childProps.unstyled = true\n }\n\n const enhancedChild = isValidElement(children)\n ? cloneElement(children as React.ReactElement<any>, childProps)\n : children\n\n const isHorizontal = layout === 'horizontal'\n const isInline = layout === 'inline'\n\n // Size class for floating label\n const floatingSizeClasses: Record<string, string> = {\n xs: dInputXs,\n sm: dInputSm,\n md: dInputMd,\n lg: dInputLg,\n xl: dInputXl,\n }\n\n // Build the input element with optional floating label wrapper\n const renderInputElement = () => {\n const inputWithFeedback = (\n <div className={`${isHorizontal ? 'flex-1' : ''} ${hasFeedback ? 'relative' : ''}`}>\n {enhancedChild}\n {hasFeedback && fieldState.isTouched && (\n <span className=\"absolute right-3 top-1/2 -translate-y-1/2 pointer-events-none\">\n <FeedbackIcon hasError={!!error} isValidating={isValidating} />\n </span>\n )}\n </div>\n )\n\n // Floating label variant\n if (floatingLabel) {\n const floatingClasses = [\n dFloatingLabel,\n size && floatingSizeClasses[size],\n ].filter(Boolean).join(' ')\n\n return (\n <label className={floatingClasses}>\n {enhancedChild}\n <span>{floatingLabel}{required && <span className=\"text-error ml-1\">*</span>}</span>\n </label>\n )\n }\n\n return inputWithFeedback\n }\n\n // Wrap with external addons if specified using DaisyUI input wrapper pattern\n const renderWithAddons = (input: React.ReactNode) => {\n if (!addonBefore && !addonAfter) return input\n\n const addonClasses = [\n dInput,\n 'flex',\n 'items-center',\n 'gap-2',\n size && floatingSizeClasses[size],\n ].filter(Boolean).join(' ')\n\n return (\n <label className={addonClasses}>\n {addonBefore && <span className=\"text-base-content/70\">{addonBefore}</span>}\n {input}\n {addonAfter && <span className=\"text-base-content/70\">{addonAfter}</span>}\n </label>\n )\n }\n\n return (\n <div className={`${inline ? 'w-auto' : 'w-full'} ${isHorizontal ? 'mb-4' : ''} ${isInline ? 'inline-flex mr-4' : ''} ${className}`} style={hidden ? { display: 'none' } : undefined} data-testid={testId}>\n <div className={isHorizontal ? 'flex items-center gap-4' : ''}>\n {label && !floatingLabel && (\n <label\n htmlFor={inputId}\n className={`block text-sm font-medium ${isHorizontal ? 'flex-shrink-0 text-right' : ''} ${!isHorizontal && !isInline ? 'mb-1' : ''}`}\n style={isHorizontal ? { width: labelWidth } : undefined}\n data-testid={testId ? `${testId}-label` : undefined}\n >\n <span className=\"flex items-center\">\n {label}\n {required && <span className=\"text-error ml-1\">*</span>}\n {tooltip && <TooltipIcon />}\n </span>\n </label>\n )}\n {renderWithAddons(renderInputElement())}\n </div>\n {!isHorizontal && !inline && (\n <p id={errorId} className={`${dValidatorHint} ${errorMessage ? '!visible text-error' : ''} min-h-[1.25rem]`} role={errorMessage ? 'alert' : undefined} data-testid={testId ? `${testId}-error` : undefined}>\n {errorMessage || (help && <span className=\"text-base-content/70\">{help}</span>) || '\\u00A0'}\n </p>\n )}\n {isHorizontal && (errorMessage || help) && (\n <p id={errorId} className={`${dValidatorHint} ${errorMessage ? '!visible text-error' : ''} min-h-[1.25rem]`} role={errorMessage ? 'alert' : undefined} data-testid={testId ? `${testId}-error` : undefined}>\n {errorMessage || (help && <span className=\"text-base-content/70\">{help}</span>)}\n </p>\n )}\n {extra && (\n <div className=\"text-sm text-base-content/60 mt-1\" data-testid={testId ? `${testId}-extra` : undefined}>{extra}</div>\n )}\n </div>\n )\n }}\n />\n )\n}\n\nfunction FormList<TFieldValues extends FieldValues = FieldValues>({\n name,\n children,\n}: FormListProps<TFieldValues>) {\n const { form, layout, size, disabled } = useFormContext()\n\n const { fields, append, remove, move } = useFieldArray({\n control: form.control,\n name,\n })\n\n // Add name (index) to each field for proper path construction\n const fieldsWithName = fields.map((field, index) => ({\n ...field,\n name: index,\n }))\n\n return (\n <FormContext.Provider value={{ form, layout, size, listName: name as string, disabled }}>\n {children(fieldsWithName as any, {\n add: append,\n remove,\n move,\n })}\n </FormContext.Provider>\n )\n}\n\n// Enhanced hook to expose full form API\nexport function useFormInstance<TFieldValues extends FieldValues = FieldValues>() {\n const formInstance = useForm<TFieldValues>()\n\n // Add convenience methods to the instance\n const enhancedInstance = formInstance as typeof formInstance & {\n setFieldValue: typeof formInstance.setValue\n getFieldValue: (name: any) => any\n getFieldsValue: typeof formInstance.getValues\n setFieldsValue: (values: any) => void\n validateFields: typeof formInstance.trigger\n resetFields: typeof formInstance.reset\n isFieldTouched: (name: string) => boolean\n getFieldError: (name: string) => string | undefined\n }\n\n // Add the alias methods\n enhancedInstance.setFieldValue = formInstance.setValue\n enhancedInstance.getFieldValue = (name: any) => formInstance.getValues(name)\n enhancedInstance.getFieldsValue = formInstance.getValues\n enhancedInstance.setFieldsValue = (values: any) => {\n Object.keys(values).forEach((key) => {\n formInstance.setValue(key as any, values[key])\n })\n }\n enhancedInstance.validateFields = formInstance.trigger\n enhancedInstance.resetFields = formInstance.reset\n enhancedInstance.isFieldTouched = (name: string) => {\n const touched = formInstance.formState.touchedFields as any\n return !!touched[name]\n }\n enhancedInstance.getFieldError = (name: string) => {\n const errors = formInstance.formState.errors as any\n return errors[name]?.message as string | undefined\n }\n\n return enhancedInstance\n}\n\nexport interface FormErrorListProps {\n /** Specific field names to show errors for (shows all errors if not specified) */\n fields?: string[]\n /** Custom className */\n className?: string\n /** Test ID for the error list */\n 'data-testid'?: string\n}\n\nfunction FormErrorList({ fields, className = '', 'data-testid': testId }: FormErrorListProps) {\n const { form } = useFormContext()\n const { errors } = form.formState\n\n // Flatten nested errors into a list\n const flattenErrors = (obj: any, prefix = ''): Array<{ field: string; message: string }> => {\n const result: Array<{ field: string; message: string }> = []\n\n for (const key in obj) {\n const fullKey = prefix ? `${prefix}.${key}` : key\n const value = obj[key]\n\n if (value?.message) {\n result.push({ field: fullKey, message: value.message as string })\n } else if (typeof value === 'object' && value !== null) {\n result.push(...flattenErrors(value, fullKey))\n }\n }\n\n return result\n }\n\n const allErrors = flattenErrors(errors)\n const filteredErrors = fields\n ? allErrors.filter(e => fields.includes(e.field))\n : allErrors\n\n if (filteredErrors.length === 0) {\n return null\n }\n\n return (\n <ul className={`text-error text-sm space-y-1 ${className}`} role=\"alert\" data-testid={testId}>\n {filteredErrors.map((error, index) => (\n <li key={`${error.field}-${index}`} className=\"flex items-start gap-2\" data-testid={testId ? `${testId}-${error.field}` : undefined}>\n <svg className=\"w-4 h-4 mt-0.5 flex-shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <span>{error.message}</span>\n </li>\n ))}\n </ul>\n )\n}\n\nexport const Form = Object.assign(FormRoot, {\n Item: FormItem,\n List: FormList,\n ErrorList: FormErrorList,\n useForm: useFormInstance,\n})\n\nexport type { UseFormReturn as FormInstance }\n"],"names":["dInput","dInputXs","dInputSm","dInputMd","dInputLg","dInputXl","dFloatingLabel","dLoading","dLoadingSpinner","dLoadingXs","dTooltip","dTooltipTop","dValidatorHint","FormContext","createContext","TYPE_VALIDATORS","useFormContext","context","useContext","FormRoot","externalForm","onFinish","onFinishFailed","initialValues","layout","labelWidth","size","disabled","children","className","noValidate","props","componentSize","useConfig","effectiveSize","internalForm","useForm","form","handleSubmit","e","errors","errorFields","flattenErrors","obj","prefix","key","fullKey","value","handleReset","jsx","FormItem","name","label","floatingLabel","help","required","rules","valuePropName","inline","tooltip","extra","hasFeedback","dependencies","validateTrigger","initialValue","hidden","addonBefore","addonAfter","testId","listName","formDisabled","inputId","useId","errorId","fieldName","useEffect","watchedDeps","useWatch","formRef","useRef","prevDepsRef","currentDeps","touchedFields","error","path","keys","errorMessage","rulesInputArray","validatorFormRef","formMethods","rulesArray","rule","validationRules","patternValidators","customValidators","minValue","minMessage","maxValue","maxMessage","patternValue","patternMessage","antValidator","err","pattern","message","validator","result","triggers","shouldValidateOnChange","shouldValidateOnBlur","FeedbackIcon","hasError","isValidating","TooltipIcon","Controller","field","fieldState","onChange","onBlur","ref","childProps","originalOnChange","isValidElement","eventOrValue","enhancedChild","cloneElement","isHorizontal","isInline","floatingSizeClasses","renderInputElement","inputWithFeedback","jsxs","floatingClasses","renderWithAddons","input","addonClasses","FormList","fields","append","remove","move","useFieldArray","fieldsWithName","index","useFormInstance","formInstance","enhancedInstance","values","FormErrorList","allErrors","filteredErrors","Form"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Form.js","sources":["../../src/components/Form.tsx"],"sourcesContent":["import React, { createContext, useContext, cloneElement, isValidElement, useId, useEffect, useRef } from 'react'\nimport { useForm, UseFormReturn, FieldValues, SubmitHandler, UseFormProps, Controller, useFieldArray, FieldArrayPath, FieldArray, useWatch } from 'react-hook-form'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dInput = 'input'\nconst dInputXs = 'input-xs'\nconst dInputSm = 'input-sm'\nconst dInputMd = 'input-md'\nconst dInputLg = 'input-lg'\nconst dInputXl = 'input-xl'\nconst dFloatingLabel = 'floating-label'\nconst dLoading = 'loading'\nconst dLoadingSpinner = 'loading-spinner'\nconst dLoadingXs = 'loading-xs'\nconst dTooltip = 'tooltip'\nconst dTooltipTop = 'tooltip-top'\nconst dValidatorHint = 'validator-hint'\n\ninterface FormContextValue {\n form: UseFormReturn<any>\n layout?: 'vertical' | 'horizontal' | 'inline'\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n labelWidth?: number\n listName?: string\n disabled?: boolean\n}\n\nconst FormContext = createContext<FormContextValue | undefined>(undefined)\n\n// Built-in type validators\nconst TYPE_VALIDATORS = {\n email: {\n value: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}$/i,\n message: 'Please enter a valid email address',\n },\n url: {\n value: /^https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_\\+.~#?&//=]*)$/,\n message: 'Please enter a valid URL',\n },\n number: {\n value: /^-?\\d+(\\.\\d+)?$/,\n message: 'Please enter a valid number',\n },\n}\n\nexport interface FormProps<TFieldValues extends FieldValues = FieldValues>\n extends Omit<React.FormHTMLAttributes<HTMLFormElement>, 'onSubmit'> {\n form?: UseFormReturn<TFieldValues>\n onFinish?: SubmitHandler<TFieldValues>\n /** Called when form validation fails */\n onFinishFailed?: (errorInfo: { values: TFieldValues; errorFields: Array<{ name: string; errors: string[] }> }) => void\n initialValues?: UseFormProps<TFieldValues>['defaultValues']\n layout?: 'vertical' | 'horizontal' | 'inline'\n /** Label width in pixels for horizontal layout (default: 80) */\n labelWidth?: number\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n /** Disable all form fields */\n disabled?: boolean\n children: React.ReactNode\n /** Test ID for the form element */\n 'data-testid'?: string\n}\n\nexport interface FormRule {\n required?: boolean | string\n type?: 'email' | 'url' | 'number'\n min?: number | { value: number; message: string }\n max?: number | { value: number; message: string }\n pattern?: RegExp | { value: RegExp; message: string }\n message?: string\n validate?: (value: any) => boolean | string | Promise<boolean | string>\n /** Ant Design style validator (for compatibility) */\n validator?: (rule: any, value: any) => Promise<void>\n}\n\n/** Form methods passed to rule functions (Ant Design style) */\nexport interface FormRuleMethods {\n getFieldValue: (name: string) => any\n getFieldsValue: () => any\n}\n\n/** A rule can be an object or a function that returns a rule object */\nexport type FormRuleInput = FormRule | ((methods: FormRuleMethods) => FormRule)\n\nexport type ValidateTrigger = 'onChange' | 'onBlur' | 'onSubmit' | ('onChange' | 'onBlur' | 'onSubmit')[]\n\nexport interface FormItemProps {\n name?: string | string[]\n label?: string\n /** Floating label text (alternative to label, uses DaisyUI floating-label) */\n floatingLabel?: string\n help?: string\n required?: boolean\n rules?: FormRuleInput | FormRuleInput[]\n valuePropName?: string\n inline?: boolean\n className?: string\n children: React.ReactElement\n /** Tooltip text to show next to label */\n tooltip?: string\n /** Additional content below the form control */\n extra?: React.ReactNode\n /** Show validation feedback icon */\n hasFeedback?: boolean\n /** Field names that this field depends on for validation */\n dependencies?: string[]\n /** When to trigger validation */\n validateTrigger?: ValidateTrigger\n /** Initial value for this field (overrides Form's initialValues) */\n initialValue?: any\n /** Hide this field (still validates and submits) */\n hidden?: boolean\n /** Text/element before input (outside, using DaisyUI label) */\n addonBefore?: React.ReactNode\n /** Text/element after input (outside, using DaisyUI label) */\n addonAfter?: React.ReactNode\n /** Test ID for the form item (used as prefix for child elements) */\n 'data-testid'?: string\n}\n\nexport interface FormListProps<TFieldValues extends FieldValues = FieldValues> {\n name: FieldArrayPath<TFieldValues>\n children: (\n fields: FieldArray<TFieldValues>[],\n operations: {\n add: (value?: any) => void\n remove: (index: number) => void\n move: (from: number, to: number) => void\n }\n ) => React.ReactNode\n}\n\nfunction useFormContext() {\n const context = useContext(FormContext)\n if (!context) {\n throw new Error('Form compound components must be used within Form')\n }\n return context\n}\n\nfunction FormRoot<TFieldValues extends FieldValues = FieldValues>({\n form: externalForm,\n onFinish,\n onFinishFailed,\n initialValues,\n layout = 'vertical',\n labelWidth = 60,\n size,\n disabled = false,\n children,\n className = '',\n noValidate = true,\n ...props\n}: FormProps<TFieldValues>) {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n\n const internalForm = useForm<TFieldValues>({\n defaultValues: initialValues,\n })\n\n const form = externalForm || internalForm\n\n const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault()\n\n // Trigger validation\n const isValid = await form.trigger()\n\n if (isValid) {\n if (onFinish) {\n onFinish(form.getValues())\n }\n } else {\n if (onFinishFailed) {\n const errors = form.formState.errors\n const errorFields: Array<{ name: string; errors: string[] }> = []\n\n // Flatten errors into errorFields array\n const flattenErrors = (obj: any, prefix = '') => {\n for (const key in obj) {\n const fullKey = prefix ? `${prefix}.${key}` : key\n const value = obj[key]\n if (value?.message) {\n errorFields.push({ name: fullKey, errors: [value.message as string] })\n } else if (typeof value === 'object' && value !== null) {\n flattenErrors(value, fullKey)\n }\n }\n }\n flattenErrors(errors)\n\n onFinishFailed({ values: form.getValues(), errorFields })\n }\n }\n }\n\n const handleReset = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault()\n form.reset(initialValues as any)\n }\n\n return (\n <FormContext.Provider value={{ form, layout, labelWidth, size: effectiveSize, disabled }}>\n <form onSubmit={handleSubmit} onReset={handleReset} className={className} noValidate={noValidate} {...props}>\n {children}\n </form>\n </FormContext.Provider>\n )\n}\n\nfunction FormItem({\n name,\n label,\n floatingLabel,\n help,\n required = false,\n rules,\n valuePropName = 'value',\n inline = false,\n className = '',\n children,\n tooltip,\n extra,\n hasFeedback = false,\n dependencies,\n validateTrigger = 'onChange',\n initialValue,\n hidden = false,\n addonBefore,\n addonAfter,\n 'data-testid': testId,\n}: FormItemProps) {\n const { form, size, listName, layout, labelWidth, disabled: formDisabled } = useFormContext()\n const inputId = useId()\n const errorId = useId()\n\n if (!name) {\n // Render without form control if no name provided\n return <div className={`${inline ? 'w-auto' : 'w-full'} ${className}`} style={hidden ? { display: 'none' } : undefined}>{children}</div>\n }\n\n // Handle nested field names (for Form.List)\n let fieldName: string\n if (Array.isArray(name)) {\n // If we're inside a Form.List, prepend the list name\n const fullPath = listName ? [listName, ...name] : name\n fieldName = fullPath.join('.')\n } else {\n fieldName = name\n }\n\n // Set initial value if provided\n useEffect(() => {\n if (initialValue !== undefined) {\n const currentValue = form.getValues(fieldName as any)\n if (currentValue === undefined) {\n form.setValue(fieldName as any, initialValue)\n }\n }\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n // Watch dependencies and re-validate when they change\n const watchedDeps = useWatch({\n control: form.control,\n name: dependencies as any,\n disabled: !dependencies || dependencies.length === 0,\n })\n\n // Use refs to avoid infinite loops\n const formRef = useRef(form)\n formRef.current = form\n const prevDepsRef = useRef<string | undefined>(undefined)\n\n useEffect(() => {\n // Skip if no dependencies\n if (!dependencies || dependencies.length === 0) return\n\n // Skip initial render\n if (prevDepsRef.current === undefined) {\n prevDepsRef.current = JSON.stringify(watchedDeps)\n return\n }\n\n // Only trigger if dependency values actually changed\n const currentDeps = JSON.stringify(watchedDeps)\n if (prevDepsRef.current !== currentDeps) {\n prevDepsRef.current = currentDeps\n // Only re-validate if this field has been touched\n const touchedFields = formRef.current.formState.touchedFields as any\n const isTouched = fieldName.split('.').reduce((obj, key) => obj?.[key], touchedFields)\n if (isTouched) {\n formRef.current.trigger(fieldName as any)\n }\n }\n }, [watchedDeps, dependencies, fieldName])\n\n // Get error by traversing the error object path\n const getErrorByPath = (path: string) => {\n const keys = path.split('.')\n let error: any = form.formState.errors\n for (const key of keys) {\n if (!error) break\n error = error[key]\n }\n return error\n }\n\n const error = getErrorByPath(fieldName)\n const errorMessage = error?.message as string | undefined\n\n // Normalize rules to array\n const rulesInputArray: FormRuleInput[] = rules\n ? Array.isArray(rules) ? rules : [rules]\n : []\n\n // Store form ref for use in validators (to get fresh values at validation time)\n const validatorFormRef = useRef(form)\n validatorFormRef.current = form\n\n // Create form methods for rule functions (Ant Design style)\n // These methods always access current form values via ref\n const formMethods: FormRuleMethods = {\n getFieldValue: (name: string) => validatorFormRef.current.getValues(name as any),\n getFieldsValue: () => validatorFormRef.current.getValues(),\n }\n\n // Resolve function rules to rule objects\n const rulesArray: FormRule[] = rulesInputArray.map(rule =>\n typeof rule === 'function' ? rule(formMethods) : rule\n )\n\n // Build validation rules\n const validationRules: any = {}\n const patternValidators: Array<{ pattern: RegExp; message: string }> = []\n const customValidators: Array<(value: any) => boolean | string | Promise<boolean | string>> = []\n\n // Handle top-level required prop\n if (required) {\n validationRules.required = 'This field is required'\n }\n\n // Process each rule\n for (const rule of rulesArray) {\n // Required\n if (rule.required) {\n validationRules.required = typeof rule.required === 'string'\n ? rule.required\n : rule.message || 'This field is required'\n }\n\n // Type validator\n if (rule.type && TYPE_VALIDATORS[rule.type]) {\n patternValidators.push({\n pattern: TYPE_VALIDATORS[rule.type].value,\n message: rule.message || TYPE_VALIDATORS[rule.type].message,\n })\n }\n\n // Min length\n if (rule.min !== undefined) {\n const minValue = typeof rule.min === 'object' ? rule.min.value : rule.min\n const minMessage = typeof rule.min === 'object'\n ? rule.min.message\n : rule.message || `Minimum length is ${minValue} characters`\n validationRules.minLength = { value: minValue, message: minMessage }\n }\n\n // Max length\n if (rule.max !== undefined) {\n const maxValue = typeof rule.max === 'object' ? rule.max.value : rule.max\n const maxMessage = typeof rule.max === 'object'\n ? rule.max.message\n : rule.message || `Maximum length is ${maxValue} characters`\n validationRules.maxLength = { value: maxValue, message: maxMessage }\n }\n\n // Pattern - collect all patterns\n if (rule.pattern) {\n const patternValue = rule.pattern instanceof RegExp ? rule.pattern : rule.pattern.value\n const patternMessage = rule.pattern instanceof RegExp\n ? rule.message || 'Invalid format'\n : rule.pattern.message\n patternValidators.push({ pattern: patternValue, message: patternMessage })\n }\n\n // Custom validator (our style)\n if (rule.validate) {\n customValidators.push(rule.validate)\n }\n\n // Ant Design style validator\n if (rule.validator) {\n const antValidator = rule.validator\n customValidators.push(async (value: any) => {\n try {\n await antValidator(rule, value)\n return true\n } catch (err) {\n return err instanceof Error ? err.message : String(err)\n }\n })\n }\n }\n\n // Combine all pattern and custom validators into a single validate function\n if (patternValidators.length > 0 || customValidators.length > 0) {\n validationRules.validate = async (value: any) => {\n // Check all patterns (skip if empty - required rule handles that)\n for (const { pattern, message } of patternValidators) {\n if (value && !pattern.test(value)) {\n return message\n }\n }\n\n // Run all custom validators (always run - they may validate empty/false values)\n for (const validator of customValidators) {\n const result = await validator(value)\n if (result !== true) {\n return result\n }\n }\n\n return true\n }\n }\n\n // Normalize validateTrigger to array\n const triggers = Array.isArray(validateTrigger) ? validateTrigger : [validateTrigger]\n const shouldValidateOnChange = triggers.includes('onChange')\n const shouldValidateOnBlur = triggers.includes('onBlur')\n\n // Feedback icons\n const FeedbackIcon = ({ hasError, isValidating }: { hasError: boolean; isValidating: boolean }) => {\n if (isValidating) {\n return (\n <span className={`${dLoading} ${dLoadingSpinner} ${dLoadingXs} text-base-content/50`} />\n )\n }\n if (hasError) {\n return (\n <svg className=\"w-4 h-4 text-error\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n )\n }\n return (\n <svg className=\"w-4 h-4 text-success\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n )\n }\n\n // Tooltip icon\n const TooltipIcon = () => (\n <div className={`${dTooltip} ${dTooltipTop} ml-1`} data-tip={tooltip}>\n <svg className=\"w-4 h-4 text-base-content/50 cursor-help\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n </div>\n )\n\n return (\n <Controller\n name={fieldName}\n control={form.control}\n rules={validationRules}\n render={({ field, fieldState }) => {\n const { value, onChange, onBlur, ref } = field\n const isValidating = fieldState.isTouched && form.formState.isValidating\n\n // Clone the child element and inject form control props\n const childProps: any = {\n id: inputId,\n ref,\n 'aria-invalid': error ? true : undefined,\n 'aria-describedby': error ? errorId : undefined,\n 'data-testid': testId ? `${testId}-input` : undefined,\n }\n\n // Handle onBlur based on validateTrigger\n childProps.onBlur = () => {\n onBlur()\n if (shouldValidateOnBlur) {\n form.trigger(fieldName as any)\n }\n }\n\n // Get the original onChange from the child element (if any)\n const originalOnChange = isValidElement(children) ? (children.props as any).onChange : undefined\n\n // Handle different value prop names (e.g., 'checked' for checkboxes)\n if (valuePropName === 'checked') {\n childProps.checked = value\n childProps.onChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(e.target.checked)\n if (shouldValidateOnChange) {\n form.trigger(fieldName as any)\n }\n // Call original onChange if provided\n originalOnChange?.(e)\n }\n } else {\n childProps.value = value || ''\n childProps.onChange = (eventOrValue: any) => {\n // Handle components that pass value directly (e.g., Range, Rating)\n // vs components that pass event object (e.g., Input, Select)\n if (eventOrValue && eventOrValue.target !== undefined) {\n onChange(eventOrValue.target.value)\n } else {\n onChange(eventOrValue)\n }\n if (shouldValidateOnChange) {\n form.trigger(fieldName as any)\n }\n // Call original onChange if provided\n originalOnChange?.(eventOrValue)\n }\n }\n\n // Apply size if specified at form level\n if (size && isValidElement(children)) {\n const existingProps = children.props as any\n if (!existingProps.size) {\n childProps.size = size\n }\n }\n\n // Apply error styling and accessibility\n if (error) {\n childProps.color = 'error'\n childProps['aria-invalid'] = true\n }\n\n // Apply form-level disabled state\n if (formDisabled) {\n childProps.disabled = true\n }\n\n // When wrapped with addons, the child input should be unstyled (the wrapper has the styling)\n const hasAddons = addonBefore || addonAfter\n if (hasAddons) {\n childProps.unstyled = true\n }\n\n const enhancedChild = isValidElement(children)\n ? cloneElement(children as React.ReactElement<any>, childProps)\n : children\n\n const isHorizontal = layout === 'horizontal'\n const isInline = layout === 'inline'\n\n // Size class for floating label\n const floatingSizeClasses: Record<string, string> = {\n xs: dInputXs,\n sm: dInputSm,\n md: dInputMd,\n lg: dInputLg,\n xl: dInputXl,\n }\n\n // Build the input element with optional floating label wrapper\n const renderInputElement = () => {\n const inputWithFeedback = (\n <div className={`${isHorizontal ? 'flex-1' : ''} ${hasFeedback ? 'relative' : ''}`}>\n {enhancedChild}\n {hasFeedback && fieldState.isTouched && (\n <span className=\"absolute right-3 top-1/2 -translate-y-1/2 pointer-events-none\">\n <FeedbackIcon hasError={!!error} isValidating={isValidating} />\n </span>\n )}\n </div>\n )\n\n // Floating label variant\n if (floatingLabel) {\n const floatingClasses = [\n dFloatingLabel,\n size && floatingSizeClasses[size],\n ].filter(Boolean).join(' ')\n\n return (\n <label className={floatingClasses}>\n {enhancedChild}\n <span>{floatingLabel}{required && <span className=\"text-error ml-1\">*</span>}</span>\n </label>\n )\n }\n\n return inputWithFeedback\n }\n\n // Wrap with external addons if specified using DaisyUI input wrapper pattern\n const renderWithAddons = (input: React.ReactNode) => {\n if (!addonBefore && !addonAfter) return input\n\n const addonClasses = [\n dInput,\n 'flex',\n 'items-center',\n 'gap-2',\n size && floatingSizeClasses[size],\n ].filter(Boolean).join(' ')\n\n return (\n <label className={addonClasses}>\n {addonBefore && <span className=\"text-base-content/70\">{addonBefore}</span>}\n {input}\n {addonAfter && <span className=\"text-base-content/70\">{addonAfter}</span>}\n </label>\n )\n }\n\n return (\n <div className={`${inline ? 'w-auto' : 'w-full'} ${isHorizontal ? 'mb-4' : ''} ${isInline ? 'inline-flex mr-4' : ''} ${className}`} style={hidden ? { display: 'none' } : undefined} data-testid={testId}>\n <div className={isHorizontal ? 'flex items-center gap-4' : ''}>\n {label && !floatingLabel && (\n <label\n htmlFor={inputId}\n className={`block text-sm font-medium ${isHorizontal ? 'flex-shrink-0 text-right' : ''} ${!isHorizontal && !isInline ? 'mb-1' : ''}`}\n style={isHorizontal ? { width: labelWidth } : undefined}\n data-testid={testId ? `${testId}-label` : undefined}\n >\n <span className=\"flex items-center\">\n {label}\n {required && <span className=\"text-error ml-1\">*</span>}\n {tooltip && <TooltipIcon />}\n </span>\n </label>\n )}\n {renderWithAddons(renderInputElement())}\n </div>\n {!isHorizontal && !inline && (\n <p id={errorId} className={`${dValidatorHint} ${errorMessage ? '!visible text-error' : ''} min-h-[1.25rem]`} role={errorMessage ? 'alert' : undefined} data-testid={testId ? `${testId}-error` : undefined}>\n {errorMessage || (help && <span className=\"text-base-content/70\">{help}</span>) || '\\u00A0'}\n </p>\n )}\n {isHorizontal && (errorMessage || help) && (\n <p id={errorId} className={`${dValidatorHint} ${errorMessage ? '!visible text-error' : ''} min-h-[1.25rem]`} role={errorMessage ? 'alert' : undefined} data-testid={testId ? `${testId}-error` : undefined}>\n {errorMessage || (help && <span className=\"text-base-content/70\">{help}</span>)}\n </p>\n )}\n {extra && (\n <div className=\"text-sm text-base-content/60 mt-1\" data-testid={testId ? `${testId}-extra` : undefined}>{extra}</div>\n )}\n </div>\n )\n }}\n />\n )\n}\n\nfunction FormList<TFieldValues extends FieldValues = FieldValues>({\n name,\n children,\n}: FormListProps<TFieldValues>) {\n const { form, layout, size, disabled } = useFormContext()\n\n const { fields, append, remove, move } = useFieldArray({\n control: form.control,\n name,\n })\n\n // Add name (index) to each field for proper path construction\n const fieldsWithName = fields.map((field, index) => ({\n ...field,\n name: index,\n }))\n\n return (\n <FormContext.Provider value={{ form, layout, size, listName: name as string, disabled }}>\n {children(fieldsWithName as any, {\n add: append,\n remove,\n move,\n })}\n </FormContext.Provider>\n )\n}\n\n// Enhanced hook to expose full form API\nexport function useFormInstance<TFieldValues extends FieldValues = FieldValues>() {\n const formInstance = useForm<TFieldValues>()\n\n // Add convenience methods to the instance\n const enhancedInstance = formInstance as typeof formInstance & {\n setFieldValue: typeof formInstance.setValue\n getFieldValue: (name: any) => any\n getFieldsValue: typeof formInstance.getValues\n setFieldsValue: (values: any) => void\n validateFields: typeof formInstance.trigger\n resetFields: typeof formInstance.reset\n isFieldTouched: (name: string) => boolean\n getFieldError: (name: string) => string | undefined\n }\n\n // Add the alias methods\n enhancedInstance.setFieldValue = formInstance.setValue\n enhancedInstance.getFieldValue = (name: any) => formInstance.getValues(name)\n enhancedInstance.getFieldsValue = formInstance.getValues\n enhancedInstance.setFieldsValue = (values: any) => {\n Object.keys(values).forEach((key) => {\n formInstance.setValue(key as any, values[key])\n })\n }\n enhancedInstance.validateFields = formInstance.trigger\n enhancedInstance.resetFields = formInstance.reset\n enhancedInstance.isFieldTouched = (name: string) => {\n const touched = formInstance.formState.touchedFields as any\n return !!touched[name]\n }\n enhancedInstance.getFieldError = (name: string) => {\n const errors = formInstance.formState.errors as any\n return errors[name]?.message as string | undefined\n }\n\n return enhancedInstance\n}\n\nexport interface FormErrorListProps {\n /** Specific field names to show errors for (shows all errors if not specified) */\n fields?: string[]\n /** Custom className */\n className?: string\n /** Test ID for the error list */\n 'data-testid'?: string\n}\n\nfunction FormErrorList({ fields, className = '', 'data-testid': testId }: FormErrorListProps) {\n const { form } = useFormContext()\n const { errors } = form.formState\n\n // Flatten nested errors into a list\n const flattenErrors = (obj: any, prefix = ''): Array<{ field: string; message: string }> => {\n const result: Array<{ field: string; message: string }> = []\n\n for (const key in obj) {\n const fullKey = prefix ? `${prefix}.${key}` : key\n const value = obj[key]\n\n if (value?.message) {\n result.push({ field: fullKey, message: value.message as string })\n } else if (typeof value === 'object' && value !== null) {\n result.push(...flattenErrors(value, fullKey))\n }\n }\n\n return result\n }\n\n const allErrors = flattenErrors(errors)\n const filteredErrors = fields\n ? allErrors.filter(e => fields.includes(e.field))\n : allErrors\n\n if (filteredErrors.length === 0) {\n return null\n }\n\n return (\n <ul className={`text-error text-sm space-y-1 ${className}`} role=\"alert\" data-testid={testId}>\n {filteredErrors.map((error, index) => (\n <li key={`${error.field}-${index}`} className=\"flex items-start gap-2\" data-testid={testId ? `${testId}-${error.field}` : undefined}>\n <svg className=\"w-4 h-4 mt-0.5 flex-shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <span>{error.message}</span>\n </li>\n ))}\n </ul>\n )\n}\n\nexport const Form = Object.assign(FormRoot, {\n Item: FormItem,\n List: FormList,\n ErrorList: FormErrorList,\n useForm: useFormInstance,\n})\n\nexport type { UseFormReturn as FormInstance }\n"],"names":["dInput","dInputXs","dInputSm","dInputMd","dInputLg","dInputXl","dFloatingLabel","dLoading","dLoadingSpinner","dLoadingXs","dTooltip","dTooltipTop","dValidatorHint","FormContext","createContext","TYPE_VALIDATORS","useFormContext","context","useContext","FormRoot","externalForm","onFinish","onFinishFailed","initialValues","layout","labelWidth","size","disabled","children","className","noValidate","props","componentSize","useConfig","effectiveSize","internalForm","useForm","form","handleSubmit","e","errors","errorFields","flattenErrors","obj","prefix","key","fullKey","value","handleReset","jsx","FormItem","name","label","floatingLabel","help","required","rules","valuePropName","inline","tooltip","extra","hasFeedback","dependencies","validateTrigger","initialValue","hidden","addonBefore","addonAfter","testId","listName","formDisabled","inputId","useId","errorId","fieldName","useEffect","watchedDeps","useWatch","formRef","useRef","prevDepsRef","currentDeps","touchedFields","error","path","keys","errorMessage","rulesInputArray","validatorFormRef","formMethods","rulesArray","rule","validationRules","patternValidators","customValidators","minValue","minMessage","maxValue","maxMessage","patternValue","patternMessage","antValidator","err","pattern","message","validator","result","triggers","shouldValidateOnChange","shouldValidateOnBlur","FeedbackIcon","hasError","isValidating","TooltipIcon","Controller","field","fieldState","onChange","onBlur","ref","childProps","originalOnChange","isValidElement","eventOrValue","enhancedChild","cloneElement","isHorizontal","isInline","floatingSizeClasses","renderInputElement","inputWithFeedback","jsxs","floatingClasses","renderWithAddons","input","addonClasses","FormList","fields","append","remove","move","useFieldArray","fieldsWithName","index","useFormInstance","formInstance","enhancedInstance","values","FormErrorList","allErrors","filteredErrors","Form"],"mappings":"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"}
|
package/dist/components/Input.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as p, jsxs as L } from "react/jsx-runtime";
|
|
2
2
|
import { forwardRef as St, useRef as Bt, useCallback as z, useState as Q, useEffect as Y } from "react";
|
|
3
|
-
import { useConfig as Mt } from "
|
|
3
|
+
import { useConfig as Mt } from "../providers/ConfigProvider.js";
|
|
4
4
|
const F = "input", lt = "input-xs", ut = "input-sm", at = "input-md", pt = "input-lg", dt = "input-xl", Wt = "input-neutral", Tt = "input-primary", $t = "input-secondary", Lt = "input-accent", Ft = "input-info", Ut = "input-success", ft = "input-warning", gt = "input-error", Xt = "input-ghost", Zt = "floating-label";
|
|
5
5
|
function q(e, s, i) {
|
|
6
6
|
let l = "", o = 0;
|