@aster-ui/prefixed 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.
Files changed (96) hide show
  1. package/dist/components/Autocomplete.js +1 -1
  2. package/dist/components/Autocomplete.js.map +1 -1
  3. package/dist/components/Button.js +1 -1
  4. package/dist/components/Button.js.map +1 -1
  5. package/dist/components/Cascader.js +147 -146
  6. package/dist/components/Cascader.js.map +1 -1
  7. package/dist/components/Checkbox.js +1 -1
  8. package/dist/components/Checkbox.js.map +1 -1
  9. package/dist/components/ColorPicker.js +1 -1
  10. package/dist/components/ColorPicker.js.map +1 -1
  11. package/dist/components/ContextMenu.js +90 -89
  12. package/dist/components/ContextMenu.js.map +1 -1
  13. package/dist/components/CopyButton.js +1 -1
  14. package/dist/components/CopyButton.js.map +1 -1
  15. package/dist/components/Countdown.js +1 -1
  16. package/dist/components/Countdown.js.map +1 -1
  17. package/dist/components/DatePicker.js +1 -1
  18. package/dist/components/DatePicker.js.map +1 -1
  19. package/dist/components/Dock.js +1 -1
  20. package/dist/components/Dock.js.map +1 -1
  21. package/dist/components/Drawer.js +76 -75
  22. package/dist/components/Drawer.js.map +1 -1
  23. package/dist/components/Dropdown.js +174 -173
  24. package/dist/components/Dropdown.js.map +1 -1
  25. package/dist/components/Empty.js +1 -1
  26. package/dist/components/Empty.js.map +1 -1
  27. package/dist/components/FileInput.js +1 -1
  28. package/dist/components/FileInput.js.map +1 -1
  29. package/dist/components/Filter.js +1 -1
  30. package/dist/components/Filter.js.map +1 -1
  31. package/dist/components/Form.js +1 -1
  32. package/dist/components/Form.js.map +1 -1
  33. package/dist/components/Input.js +1 -1
  34. package/dist/components/Input.js.map +1 -1
  35. package/dist/components/InputNumber.js +1 -1
  36. package/dist/components/InputNumber.js.map +1 -1
  37. package/dist/components/List.js +1 -1
  38. package/dist/components/List.js.map +1 -1
  39. package/dist/components/Loading.js +1 -1
  40. package/dist/components/Loading.js.map +1 -1
  41. package/dist/components/Mention.js +66 -65
  42. package/dist/components/Mention.js.map +1 -1
  43. package/dist/components/Modal.js +1 -1
  44. package/dist/components/Modal.js.map +1 -1
  45. package/dist/components/OTPInput.js +1 -1
  46. package/dist/components/OTPInput.js.map +1 -1
  47. package/dist/components/Pagination.js +1 -1
  48. package/dist/components/Pagination.js.map +1 -1
  49. package/dist/components/Popconfirm.js +1 -1
  50. package/dist/components/Popconfirm.js.map +1 -1
  51. package/dist/components/Radio.js +1 -1
  52. package/dist/components/Radio.js.map +1 -1
  53. package/dist/components/Range.js +1 -1
  54. package/dist/components/Range.js.map +1 -1
  55. package/dist/components/Rating.js +1 -1
  56. package/dist/components/Rating.js.map +1 -1
  57. package/dist/components/RichTextEditor.js +1 -1
  58. package/dist/components/RichTextEditor.js.map +1 -1
  59. package/dist/components/Segmented.js +1 -1
  60. package/dist/components/Segmented.js.map +1 -1
  61. package/dist/components/Select.js +1 -1
  62. package/dist/components/Select.js.map +1 -1
  63. package/dist/components/Table.d.ts +19 -0
  64. package/dist/components/Table.js +359 -321
  65. package/dist/components/Table.js.map +1 -1
  66. package/dist/components/Tabs.js +1 -1
  67. package/dist/components/Tabs.js.map +1 -1
  68. package/dist/components/Textarea.js +1 -1
  69. package/dist/components/Textarea.js.map +1 -1
  70. package/dist/components/ThemeController.js +1 -1
  71. package/dist/components/ThemeController.js.map +1 -1
  72. package/dist/components/TimePicker.js +1 -1
  73. package/dist/components/TimePicker.js.map +1 -1
  74. package/dist/components/Toggle.js +1 -1
  75. package/dist/components/Toggle.js.map +1 -1
  76. package/dist/components/Tour.js +83 -82
  77. package/dist/components/Tour.js.map +1 -1
  78. package/dist/components/Transfer.js +107 -103
  79. package/dist/components/Transfer.js.map +1 -1
  80. package/dist/components/TreeSelect.js +245 -244
  81. package/dist/components/TreeSelect.js.map +1 -1
  82. package/dist/hooks/useTheme.d.ts +1 -1
  83. package/dist/hooks/useTheme.js +1 -1
  84. package/dist/hooks/useTheme.js.map +1 -1
  85. package/dist/index.d.ts +4 -4
  86. package/dist/index.js +2 -2
  87. package/dist/{components → providers}/ConfigProvider.d.ts +8 -0
  88. package/dist/providers/ConfigProvider.js +50 -0
  89. package/dist/providers/ConfigProvider.js.map +1 -0
  90. package/dist/providers/ThemeProvider.js.map +1 -0
  91. package/package.json +1 -1
  92. package/dist/components/ConfigProvider.js +0 -46
  93. package/dist/components/ConfigProvider.js.map +0 -1
  94. package/dist/components/ThemeProvider.js.map +0 -1
  95. /package/dist/{components → providers}/ThemeProvider.d.ts +0 -0
  96. /package/dist/{components → providers}/ThemeProvider.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"Mention.js","sources":["../../src/components/Mention.tsx"],"sourcesContent":["import React, { useState, useRef, useCallback, useEffect } from 'react'\nimport { createPortal } from 'react-dom'\n\n// DaisyUI classes\nconst dTextarea = 'd-textarea'\nconst dTextareaBordered = 'd-textarea-bordered'\nconst dMenu = 'd-menu'\nconst dMenuSm = 'd-menu-sm'\nconst dLoading = 'd-loading'\nconst dLoadingSpinner = 'd-loading-spinner'\nconst dLoadingSm = 'd-loading-sm'\nconst dAvatar = 'd-avatar'\n\nexport interface MentionOption {\n value: string\n label?: string\n avatar?: string\n disabled?: boolean\n}\n\nexport interface MentionProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'onSelect' | 'defaultValue' | 'prefix'> {\n value?: string\n defaultValue?: string\n onChange?: (value: string) => void\n onSelect?: (option: MentionOption, prefix: string) => void\n onSearch?: (text: string, prefix: string) => void\n options?: MentionOption[]\n loading?: boolean\n prefix?: string | string[]\n split?: string\n placeholder?: string\n disabled?: boolean\n readOnly?: boolean\n rows?: number\n autoSize?: boolean | { minRows?: number; maxRows?: number }\n notFoundContent?: React.ReactNode\n filterOption?: boolean | ((input: string, option: MentionOption) => boolean)\n dropdownClassName?: string\n}\n\nexport const Mention: React.FC<MentionProps> = ({\n value,\n defaultValue = '',\n onChange,\n onSelect,\n onSearch,\n options = [],\n loading = false,\n prefix = '@',\n split = ' ',\n placeholder,\n disabled = false,\n readOnly = false,\n rows = 3,\n autoSize = false,\n notFoundContent = 'No matches found',\n filterOption = true,\n className = '',\n dropdownClassName = '',\n ...rest\n}) => {\n const [internalValue, setInternalValue] = useState(defaultValue)\n const currentValue = value !== undefined ? value : internalValue\n\n const [isOpen, setIsOpen] = useState(false)\n const [activePrefix, setActivePrefix] = useState<string | null>(null)\n const [searchText, setSearchText] = useState('')\n const [activeIndex, setActiveIndex] = useState(0)\n const [mentionStart, setMentionStart] = useState<number | null>(null)\n const [dropdownPosition, setDropdownPosition] = useState({ top: 0, left: 0 })\n\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n const dropdownRef = useRef<HTMLDivElement>(null)\n const measureRef = useRef<HTMLDivElement>(null)\n\n const prefixes = Array.isArray(prefix) ? prefix : [prefix]\n\n // Filter options based on search text\n const filteredOptions = useCallback(() => {\n if (!filterOption) return options\n\n const filterFn =\n typeof filterOption === 'function'\n ? filterOption\n : (input: string, option: MentionOption) => {\n const label = option.label || option.value\n return label.toLowerCase().includes(input.toLowerCase())\n }\n\n return options.filter((opt) => filterFn(searchText, opt))\n }, [options, searchText, filterOption])\n\n const filtered = filteredOptions()\n\n // Update textarea height for autoSize\n const updateHeight = useCallback(() => {\n const textarea = textareaRef.current\n if (!textarea || !autoSize) return\n\n textarea.style.height = 'auto'\n const scrollHeight = textarea.scrollHeight\n\n if (typeof autoSize === 'object') {\n const lineHeight = parseInt(getComputedStyle(textarea).lineHeight) || 20\n const minHeight = autoSize.minRows ? autoSize.minRows * lineHeight : 0\n const maxHeight = autoSize.maxRows ? autoSize.maxRows * lineHeight : Infinity\n\n textarea.style.height = `${Math.min(Math.max(scrollHeight, minHeight), maxHeight)}px`\n } else {\n textarea.style.height = `${scrollHeight}px`\n }\n }, [autoSize])\n\n useEffect(() => {\n updateHeight()\n }, [currentValue, updateHeight])\n\n // Calculate dropdown position\n const updateDropdownPosition = useCallback(() => {\n const textarea = textareaRef.current\n const measure = measureRef.current\n if (!textarea || !measure || mentionStart === null) return\n\n // Get text before cursor to measure position\n const textBeforeCursor = currentValue.substring(0, mentionStart)\n\n // Create a temporary element to measure text position\n measure.textContent = textBeforeCursor\n\n const textareaRect = textarea.getBoundingClientRect()\n const measureRect = measure.getBoundingClientRect()\n\n // Calculate position relative to viewport\n const lineHeight = parseInt(getComputedStyle(textarea).lineHeight) || 20\n\n setDropdownPosition({\n top: textareaRect.top + window.scrollY + lineHeight + 4,\n left: textareaRect.left + window.scrollX + Math.min(measureRect.width % textareaRect.width, textareaRect.width - 200),\n })\n }, [currentValue, mentionStart])\n\n useEffect(() => {\n if (isOpen) {\n updateDropdownPosition()\n }\n }, [isOpen, updateDropdownPosition, searchText])\n\n // Handle text change\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const newValue = e.target.value\n const cursorPos = e.target.selectionStart\n\n if (value === undefined) {\n setInternalValue(newValue)\n }\n onChange?.(newValue)\n\n // Check if we should open the mention dropdown\n checkForMention(newValue, cursorPos)\n }\n\n const checkForMention = (text: string, cursorPos: number) => {\n // Look backwards from cursor for a prefix\n let foundPrefix: string | null = null\n let foundStart: number | null = null\n\n for (const p of prefixes) {\n // Find the last occurrence of prefix before cursor\n const beforeCursor = text.substring(0, cursorPos)\n const lastPrefixIndex = beforeCursor.lastIndexOf(p)\n\n if (lastPrefixIndex !== -1) {\n // Check if prefix is at start or preceded by whitespace/split\n const charBefore = lastPrefixIndex > 0 ? text[lastPrefixIndex - 1] : split\n if (charBefore === split || charBefore === '\\n' || lastPrefixIndex === 0) {\n // Check if there's no space between prefix and cursor\n const textAfterPrefix = text.substring(lastPrefixIndex + p.length, cursorPos)\n if (!textAfterPrefix.includes(split) && !textAfterPrefix.includes('\\n')) {\n foundPrefix = p\n foundStart = lastPrefixIndex\n break\n }\n }\n }\n }\n\n if (foundPrefix !== null && foundStart !== null) {\n const search = text.substring(foundStart + foundPrefix.length, cursorPos)\n setActivePrefix(foundPrefix)\n setSearchText(search)\n setMentionStart(foundStart)\n setIsOpen(true)\n setActiveIndex(0)\n onSearch?.(search, foundPrefix)\n } else {\n setIsOpen(false)\n setActivePrefix(null)\n setSearchText('')\n setMentionStart(null)\n }\n }\n\n // Handle option selection\n const selectOption = (option: MentionOption) => {\n if (option.disabled || mentionStart === null || activePrefix === null) return\n\n const textarea = textareaRef.current\n if (!textarea) return\n\n const beforeMention = currentValue.substring(0, mentionStart)\n const afterCursor = currentValue.substring(textarea.selectionStart)\n\n const mentionText = `${activePrefix}${option.value}${split}`\n const newValue = beforeMention + mentionText + afterCursor\n\n if (value === undefined) {\n setInternalValue(newValue)\n }\n onChange?.(newValue)\n onSelect?.(option, activePrefix)\n\n setIsOpen(false)\n setActivePrefix(null)\n setSearchText('')\n setMentionStart(null)\n\n // Set cursor position after mention\n setTimeout(() => {\n const newCursorPos = beforeMention.length + mentionText.length\n textarea.focus()\n textarea.setSelectionRange(newCursorPos, newCursorPos)\n }, 0)\n }\n\n // Handle keyboard navigation\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (!isOpen) return\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n setActiveIndex((prev) => (prev + 1) % Math.max(filtered.length, 1))\n break\n case 'ArrowUp':\n e.preventDefault()\n setActiveIndex((prev) => (prev - 1 + filtered.length) % Math.max(filtered.length, 1))\n break\n case 'Enter':\n if (filtered[activeIndex]) {\n e.preventDefault()\n selectOption(filtered[activeIndex])\n }\n break\n case 'Escape':\n e.preventDefault()\n setIsOpen(false)\n break\n case 'Tab':\n if (filtered[activeIndex]) {\n e.preventDefault()\n selectOption(filtered[activeIndex])\n }\n break\n }\n }\n\n // Close dropdown on outside click\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(e.target as Node) &&\n textareaRef.current &&\n !textareaRef.current.contains(e.target as Node)\n ) {\n setIsOpen(false)\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }, [])\n\n // Scroll active item into view\n useEffect(() => {\n if (isOpen && dropdownRef.current) {\n const activeItem = dropdownRef.current.querySelector('[data-active=\"true\"]')\n activeItem?.scrollIntoView({ block: 'nearest' })\n }\n }, [activeIndex, isOpen])\n\n const dropdown = isOpen && (\n <div\n ref={dropdownRef}\n className={`fixed z-50 bg-base-100 border border-base-300 rounded-lg shadow-lg\n min-w-48 max-h-60 overflow-auto ${dropdownClassName}`}\n style={{\n top: dropdownPosition.top,\n left: dropdownPosition.left,\n }}\n >\n {loading ? (\n <div className=\"p-3 text-center text-base-content/60\">\n <span className={`${dLoading} ${dLoadingSpinner} ${dLoadingSm}`}></span>\n </div>\n ) : filtered.length === 0 ? (\n <div className=\"p-3 text-center text-base-content/60 text-sm\">\n {notFoundContent}\n </div>\n ) : (\n <ul className={`${dMenu} ${dMenuSm} p-1`}>\n {filtered.map((option, index) => (\n <li key={option.value}>\n <button\n type=\"button\"\n data-active={index === activeIndex}\n className={`flex items-center gap-2 ${\n index === activeIndex ? 'active' : ''\n } ${option.disabled ? 'disabled opacity-50 cursor-not-allowed' : ''}`}\n onClick={() => selectOption(option)}\n onMouseEnter={() => setActiveIndex(index)}\n >\n {option.avatar && (\n <div className={dAvatar}>\n <div className=\"w-6 h-6 rounded-full\">\n <img src={option.avatar} alt=\"\" />\n </div>\n </div>\n )}\n <span>{option.label || option.value}</span>\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n )\n\n return (\n <div className={`relative ${className}`} data-state={isOpen ? 'open' : 'closed'} {...rest}>\n {/* Hidden measure element for cursor position */}\n <div\n ref={measureRef}\n className=\"invisible absolute whitespace-pre-wrap break-words\"\n style={{\n font: textareaRef.current ? getComputedStyle(textareaRef.current).font : undefined,\n width: textareaRef.current?.clientWidth,\n padding: textareaRef.current ? getComputedStyle(textareaRef.current).padding : undefined,\n }}\n aria-hidden=\"true\"\n />\n\n <textarea\n ref={textareaRef}\n value={currentValue}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n rows={typeof autoSize === 'object' ? autoSize.minRows || rows : autoSize ? 1 : rows}\n className={`${dTextarea} ${dTextareaBordered} w-full resize-none`}\n />\n\n {createPortal(dropdown, document.body)}\n </div>\n )\n}\n"],"names":["dTextarea","dTextareaBordered","dMenu","dMenuSm","dLoading","dLoadingSpinner","dLoadingSm","dAvatar","Mention","value","defaultValue","onChange","onSelect","onSearch","options","loading","prefix","split","placeholder","disabled","readOnly","rows","autoSize","notFoundContent","filterOption","className","dropdownClassName","rest","internalValue","setInternalValue","useState","currentValue","isOpen","setIsOpen","activePrefix","setActivePrefix","searchText","setSearchText","activeIndex","setActiveIndex","mentionStart","setMentionStart","dropdownPosition","setDropdownPosition","textareaRef","useRef","dropdownRef","measureRef","prefixes","filtered","useCallback","filterFn","input","option","opt","updateHeight","textarea","scrollHeight","lineHeight","minHeight","maxHeight","useEffect","updateDropdownPosition","measure","textBeforeCursor","textareaRect","measureRect","handleChange","newValue","cursorPos","checkForMention","text","foundPrefix","foundStart","p","lastPrefixIndex","charBefore","textAfterPrefix","search","selectOption","beforeMention","afterCursor","mentionText","newCursorPos","handleKeyDown","prev","handleClickOutside","e","dropdown","jsx","index","jsxs","createPortal"],"mappings":"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"}
1
+ {"version":3,"file":"Mention.js","sources":["../../src/components/Mention.tsx"],"sourcesContent":["import React, { useState, useRef, useCallback, useEffect } from 'react'\nimport { createPortal } from 'react-dom'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dTextarea = 'd-textarea'\nconst dTextareaBordered = 'd-textarea-bordered'\nconst dMenu = 'd-menu'\nconst dMenuSm = 'd-menu-sm'\nconst dLoading = 'd-loading'\nconst dLoadingSpinner = 'd-loading-spinner'\nconst dLoadingSm = 'd-loading-sm'\nconst dAvatar = 'd-avatar'\n\nexport interface MentionOption {\n value: string\n label?: string\n avatar?: string\n disabled?: boolean\n}\n\nexport interface MentionProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'onSelect' | 'defaultValue' | 'prefix'> {\n value?: string\n defaultValue?: string\n onChange?: (value: string) => void\n onSelect?: (option: MentionOption, prefix: string) => void\n onSearch?: (text: string, prefix: string) => void\n options?: MentionOption[]\n loading?: boolean\n prefix?: string | string[]\n split?: string\n placeholder?: string\n disabled?: boolean\n readOnly?: boolean\n rows?: number\n autoSize?: boolean | { minRows?: number; maxRows?: number }\n notFoundContent?: React.ReactNode\n filterOption?: boolean | ((input: string, option: MentionOption) => boolean)\n dropdownClassName?: string\n}\n\nexport const Mention: React.FC<MentionProps> = ({\n value,\n defaultValue = '',\n onChange,\n onSelect,\n onSearch,\n options = [],\n loading = false,\n prefix = '@',\n split = ' ',\n placeholder,\n disabled,\n readOnly = false,\n rows = 3,\n autoSize = false,\n notFoundContent,\n filterOption = true,\n className = '',\n dropdownClassName = '',\n ...rest\n}) => {\n const { componentDisabled, renderEmpty, getPopupContainer } = useConfig()\n const effectiveDisabled = disabled ?? componentDisabled ?? false\n const effectiveNotFoundContent = notFoundContent ?? renderEmpty?.('Mention') ?? 'No matches found'\n\n const [internalValue, setInternalValue] = useState(defaultValue)\n const currentValue = value !== undefined ? value : internalValue\n\n const [isOpen, setIsOpen] = useState(false)\n const [activePrefix, setActivePrefix] = useState<string | null>(null)\n const [searchText, setSearchText] = useState('')\n const [activeIndex, setActiveIndex] = useState(0)\n const [mentionStart, setMentionStart] = useState<number | null>(null)\n const [dropdownPosition, setDropdownPosition] = useState({ top: 0, left: 0 })\n\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n const dropdownRef = useRef<HTMLDivElement>(null)\n const measureRef = useRef<HTMLDivElement>(null)\n\n const prefixes = Array.isArray(prefix) ? prefix : [prefix]\n\n // Filter options based on search text\n const filteredOptions = useCallback(() => {\n if (!filterOption) return options\n\n const filterFn =\n typeof filterOption === 'function'\n ? filterOption\n : (input: string, option: MentionOption) => {\n const label = option.label || option.value\n return label.toLowerCase().includes(input.toLowerCase())\n }\n\n return options.filter((opt) => filterFn(searchText, opt))\n }, [options, searchText, filterOption])\n\n const filtered = filteredOptions()\n\n // Update textarea height for autoSize\n const updateHeight = useCallback(() => {\n const textarea = textareaRef.current\n if (!textarea || !autoSize) return\n\n textarea.style.height = 'auto'\n const scrollHeight = textarea.scrollHeight\n\n if (typeof autoSize === 'object') {\n const lineHeight = parseInt(getComputedStyle(textarea).lineHeight) || 20\n const minHeight = autoSize.minRows ? autoSize.minRows * lineHeight : 0\n const maxHeight = autoSize.maxRows ? autoSize.maxRows * lineHeight : Infinity\n\n textarea.style.height = `${Math.min(Math.max(scrollHeight, minHeight), maxHeight)}px`\n } else {\n textarea.style.height = `${scrollHeight}px`\n }\n }, [autoSize])\n\n useEffect(() => {\n updateHeight()\n }, [currentValue, updateHeight])\n\n // Calculate dropdown position\n const updateDropdownPosition = useCallback(() => {\n const textarea = textareaRef.current\n const measure = measureRef.current\n if (!textarea || !measure || mentionStart === null) return\n\n // Get text before cursor to measure position\n const textBeforeCursor = currentValue.substring(0, mentionStart)\n\n // Create a temporary element to measure text position\n measure.textContent = textBeforeCursor\n\n const textareaRect = textarea.getBoundingClientRect()\n const measureRect = measure.getBoundingClientRect()\n\n // Calculate position relative to viewport\n const lineHeight = parseInt(getComputedStyle(textarea).lineHeight) || 20\n\n setDropdownPosition({\n top: textareaRect.top + window.scrollY + lineHeight + 4,\n left: textareaRect.left + window.scrollX + Math.min(measureRect.width % textareaRect.width, textareaRect.width - 200),\n })\n }, [currentValue, mentionStart])\n\n useEffect(() => {\n if (isOpen) {\n updateDropdownPosition()\n }\n }, [isOpen, updateDropdownPosition, searchText])\n\n // Handle text change\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const newValue = e.target.value\n const cursorPos = e.target.selectionStart\n\n if (value === undefined) {\n setInternalValue(newValue)\n }\n onChange?.(newValue)\n\n // Check if we should open the mention dropdown\n checkForMention(newValue, cursorPos)\n }\n\n const checkForMention = (text: string, cursorPos: number) => {\n // Look backwards from cursor for a prefix\n let foundPrefix: string | null = null\n let foundStart: number | null = null\n\n for (const p of prefixes) {\n // Find the last occurrence of prefix before cursor\n const beforeCursor = text.substring(0, cursorPos)\n const lastPrefixIndex = beforeCursor.lastIndexOf(p)\n\n if (lastPrefixIndex !== -1) {\n // Check if prefix is at start or preceded by whitespace/split\n const charBefore = lastPrefixIndex > 0 ? text[lastPrefixIndex - 1] : split\n if (charBefore === split || charBefore === '\\n' || lastPrefixIndex === 0) {\n // Check if there's no space between prefix and cursor\n const textAfterPrefix = text.substring(lastPrefixIndex + p.length, cursorPos)\n if (!textAfterPrefix.includes(split) && !textAfterPrefix.includes('\\n')) {\n foundPrefix = p\n foundStart = lastPrefixIndex\n break\n }\n }\n }\n }\n\n if (foundPrefix !== null && foundStart !== null) {\n const search = text.substring(foundStart + foundPrefix.length, cursorPos)\n setActivePrefix(foundPrefix)\n setSearchText(search)\n setMentionStart(foundStart)\n setIsOpen(true)\n setActiveIndex(0)\n onSearch?.(search, foundPrefix)\n } else {\n setIsOpen(false)\n setActivePrefix(null)\n setSearchText('')\n setMentionStart(null)\n }\n }\n\n // Handle option selection\n const selectOption = (option: MentionOption) => {\n if (option.disabled || mentionStart === null || activePrefix === null) return\n\n const textarea = textareaRef.current\n if (!textarea) return\n\n const beforeMention = currentValue.substring(0, mentionStart)\n const afterCursor = currentValue.substring(textarea.selectionStart)\n\n const mentionText = `${activePrefix}${option.value}${split}`\n const newValue = beforeMention + mentionText + afterCursor\n\n if (value === undefined) {\n setInternalValue(newValue)\n }\n onChange?.(newValue)\n onSelect?.(option, activePrefix)\n\n setIsOpen(false)\n setActivePrefix(null)\n setSearchText('')\n setMentionStart(null)\n\n // Set cursor position after mention\n setTimeout(() => {\n const newCursorPos = beforeMention.length + mentionText.length\n textarea.focus()\n textarea.setSelectionRange(newCursorPos, newCursorPos)\n }, 0)\n }\n\n // Handle keyboard navigation\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (!isOpen) return\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n setActiveIndex((prev) => (prev + 1) % Math.max(filtered.length, 1))\n break\n case 'ArrowUp':\n e.preventDefault()\n setActiveIndex((prev) => (prev - 1 + filtered.length) % Math.max(filtered.length, 1))\n break\n case 'Enter':\n if (filtered[activeIndex]) {\n e.preventDefault()\n selectOption(filtered[activeIndex])\n }\n break\n case 'Escape':\n e.preventDefault()\n setIsOpen(false)\n break\n case 'Tab':\n if (filtered[activeIndex]) {\n e.preventDefault()\n selectOption(filtered[activeIndex])\n }\n break\n }\n }\n\n // Close dropdown on outside click\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(e.target as Node) &&\n textareaRef.current &&\n !textareaRef.current.contains(e.target as Node)\n ) {\n setIsOpen(false)\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }, [])\n\n // Scroll active item into view\n useEffect(() => {\n if (isOpen && dropdownRef.current) {\n const activeItem = dropdownRef.current.querySelector('[data-active=\"true\"]')\n activeItem?.scrollIntoView({ block: 'nearest' })\n }\n }, [activeIndex, isOpen])\n\n const dropdown = isOpen && (\n <div\n ref={dropdownRef}\n className={`fixed z-50 bg-base-100 border border-base-300 rounded-lg shadow-lg\n min-w-48 max-h-60 overflow-auto ${dropdownClassName}`}\n style={{\n top: dropdownPosition.top,\n left: dropdownPosition.left,\n }}\n >\n {loading ? (\n <div className=\"p-3 text-center text-base-content/60\">\n <span className={`${dLoading} ${dLoadingSpinner} ${dLoadingSm}`}></span>\n </div>\n ) : filtered.length === 0 ? (\n <div className=\"p-3 text-center text-base-content/60 text-sm\">\n {effectiveNotFoundContent}\n </div>\n ) : (\n <ul className={`${dMenu} ${dMenuSm} p-1`}>\n {filtered.map((option, index) => (\n <li key={option.value}>\n <button\n type=\"button\"\n data-active={index === activeIndex}\n className={`flex items-center gap-2 ${\n index === activeIndex ? 'active' : ''\n } ${option.disabled ? 'disabled opacity-50 cursor-not-allowed' : ''}`}\n onClick={() => selectOption(option)}\n onMouseEnter={() => setActiveIndex(index)}\n >\n {option.avatar && (\n <div className={dAvatar}>\n <div className=\"w-6 h-6 rounded-full\">\n <img src={option.avatar} alt=\"\" />\n </div>\n </div>\n )}\n <span>{option.label || option.value}</span>\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n )\n\n return (\n <div className={`relative ${className}`} data-state={isOpen ? 'open' : 'closed'} {...rest}>\n {/* Hidden measure element for cursor position */}\n <div\n ref={measureRef}\n className=\"invisible absolute whitespace-pre-wrap break-words\"\n style={{\n font: textareaRef.current ? getComputedStyle(textareaRef.current).font : undefined,\n width: textareaRef.current?.clientWidth,\n padding: textareaRef.current ? getComputedStyle(textareaRef.current).padding : undefined,\n }}\n aria-hidden=\"true\"\n />\n\n <textarea\n ref={textareaRef}\n value={currentValue}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={effectiveDisabled}\n readOnly={readOnly}\n rows={typeof autoSize === 'object' ? autoSize.minRows || rows : autoSize ? 1 : rows}\n className={`${dTextarea} ${dTextareaBordered} w-full resize-none`}\n />\n\n {createPortal(dropdown, getPopupContainer ? getPopupContainer(document.body) : document.body)}\n </div>\n )\n}\n"],"names":["dTextarea","dTextareaBordered","dMenu","dMenuSm","dLoading","dLoadingSpinner","dLoadingSm","dAvatar","Mention","value","defaultValue","onChange","onSelect","onSearch","options","loading","prefix","split","placeholder","disabled","readOnly","rows","autoSize","notFoundContent","filterOption","className","dropdownClassName","rest","componentDisabled","renderEmpty","getPopupContainer","useConfig","effectiveDisabled","effectiveNotFoundContent","internalValue","setInternalValue","useState","currentValue","isOpen","setIsOpen","activePrefix","setActivePrefix","searchText","setSearchText","activeIndex","setActiveIndex","mentionStart","setMentionStart","dropdownPosition","setDropdownPosition","textareaRef","useRef","dropdownRef","measureRef","prefixes","filtered","useCallback","filterFn","input","option","opt","updateHeight","textarea","scrollHeight","lineHeight","minHeight","maxHeight","useEffect","updateDropdownPosition","measure","textBeforeCursor","textareaRect","measureRect","handleChange","newValue","cursorPos","checkForMention","text","foundPrefix","foundStart","p","lastPrefixIndex","charBefore","textAfterPrefix","search","selectOption","beforeMention","afterCursor","mentionText","newCursorPos","handleKeyDown","prev","handleClickOutside","e","dropdown","jsx","index","jsxs","createPortal"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { jsxs as f, jsx as t, Fragment as Ce } from "react/jsx-runtime";
2
2
  import B, { forwardRef as Me, useRef as k, useId as V, useImperativeHandle as Ne, useEffect as X } from "react";
3
3
  import { createRoot as Te } from "react-dom/client";
4
- import { useConfig as oe } from "./ConfigProvider.js";
4
+ import { useConfig as oe } from "../providers/ConfigProvider.js";
5
5
  const Be = "d-modal", Y = "d-modal-top", Z = "d-modal-middle", _ = "d-modal-bottom", $e = "d-modal-start", Le = "d-modal-end", Re = "d-modal-box", ee = "d-modal-action", Se = "d-modal-backdrop", x = "d-btn", W = "d-btn-primary", te = "d-btn-error", Ae = "d-alert", Ee = "d-alert-info", je = "d-alert-success", We = "d-alert-warning", Oe = "d-alert-error", ne = Me(function({
6
6
  children: s,
7
7
  title: d,
@@ -1 +1 @@
1
- {"version":3,"file":"Modal.js","sources":["../../src/components/Modal.tsx"],"sourcesContent":["import React, { useEffect, useRef, useId, forwardRef, useImperativeHandle } from 'react'\nimport { createRoot } from 'react-dom/client'\nimport { useConfig } from './ConfigProvider'\n\n// DaisyUI classes\nconst dModal = 'd-modal'\nconst dModalTop = 'd-modal-top'\nconst dModalMiddle = 'd-modal-middle'\nconst dModalBottom = 'd-modal-bottom'\nconst dModalStart = 'd-modal-start'\nconst dModalEnd = 'd-modal-end'\nconst dModalBox = 'd-modal-box'\nconst dModalAction = 'd-modal-action'\nconst dModalBackdrop = 'd-modal-backdrop'\nconst dBtn = 'd-btn'\nconst dBtnPrimary = 'd-btn-primary'\nconst dBtnError = 'd-btn-error'\nconst dAlert = 'd-alert'\nconst dAlertInfo = 'd-alert-info'\nconst dAlertSuccess = 'd-alert-success'\nconst dAlertWarning = 'd-alert-warning'\nconst dAlertError = 'd-alert-error'\n\nexport type ModalPosition = 'top' | 'middle' | 'bottom'\nexport type ModalAlign = 'start' | 'end'\nexport type Breakpoint = 'base' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'\n\nexport type ResponsivePosition = Partial<Record<Breakpoint, ModalPosition>>\n\nexport interface ModalProps extends Omit<React.HTMLAttributes<HTMLDialogElement>, 'title'> {\n children: React.ReactNode\n title?: React.ReactNode\n footer?: React.ReactNode\n open?: boolean\n onOk?: () => void | Promise<void>\n onCancel?: () => void\n okText?: string\n cancelText?: string\n maskClosable?: boolean\n closable?: boolean\n /** Modal position - can be a single value or responsive object */\n position?: ModalPosition | ResponsivePosition\n align?: ModalAlign\n /** Width of the modal box */\n width?: number | string\n /** Center the modal vertically */\n centered?: boolean\n /** Callback when modal is closed */\n onClose?: () => void\n /** Callback after modal close animation completes */\n afterClose?: () => void\n /** Where to place initial focus: 'ok', 'cancel', or 'close' button */\n initialFocus?: 'ok' | 'cancel' | 'close'\n /** Use alertdialog role for urgent messages */\n alertDialog?: boolean\n /** Show loading spinner on OK button */\n confirmLoading?: boolean\n /** Props for the OK button */\n okButtonProps?: React.ButtonHTMLAttributes<HTMLButtonElement>\n /** Props for the Cancel button */\n cancelButtonProps?: React.ButtonHTMLAttributes<HTMLButtonElement>\n /** Custom close icon */\n closeIcon?: React.ReactNode\n /** CSS z-index for the modal */\n zIndex?: number\n /** Destroy child components when modal is closed */\n destroyOnClose?: boolean\n /** Test ID prefix for child elements */\n 'data-testid'?: string\n}\n\nexport interface ModalFuncProps {\n title?: React.ReactNode\n content?: React.ReactNode\n onOk?: () => void | Promise<void>\n onCancel?: () => void\n okText?: string\n cancelText?: string\n type?: 'info' | 'success' | 'warning' | 'error'\n}\n\nconst Modal = forwardRef<HTMLDialogElement, ModalProps>(function Modal(\n {\n children,\n title,\n footer,\n open = false,\n onOk,\n onCancel,\n okText,\n cancelText,\n maskClosable = true,\n closable = true,\n position,\n align,\n width,\n centered,\n onClose,\n afterClose,\n initialFocus,\n alertDialog = false,\n confirmLoading,\n okButtonProps,\n cancelButtonProps,\n closeIcon,\n zIndex,\n destroyOnClose = false,\n 'data-testid': testId,\n className = '',\n style,\n ...rest\n },\n ref\n) {\n const { locale } = useConfig()\n const dialogRef = useRef<HTMLDialogElement>(null)\n const okButtonRef = useRef<HTMLButtonElement>(null)\n const cancelButtonRef = useRef<HTMLButtonElement>(null)\n const closeButtonRef = useRef<HTMLButtonElement>(null)\n const previousActiveElement = useRef<HTMLElement | null>(null)\n const [internalLoading, setInternalLoading] = React.useState(false)\n const [shouldRender, setShouldRender] = React.useState(open || !destroyOnClose)\n const titleId = useId()\n const contentId = useId()\n\n // Use external confirmLoading if provided, otherwise internal state\n const loading = confirmLoading ?? internalLoading\n\n // Resolve locale strings\n const resolvedOkText = okText ?? locale.Modal?.okText ?? 'OK'\n const resolvedCancelText = cancelText ?? locale.Modal?.cancelText ?? 'Cancel'\n\n // Forward ref\n useImperativeHandle(ref, () => dialogRef.current!, [])\n\n // Handle close - use onClose if provided, otherwise onCancel\n const closeHandler = onClose || onCancel\n\n useEffect(() => {\n const dialog = dialogRef.current\n if (!dialog) return\n\n if (open) {\n setShouldRender(true)\n if (!dialog.open) {\n // Save currently focused element for restoration\n previousActiveElement.current = document.activeElement as HTMLElement\n dialog.showModal()\n\n // Handle custom initial focus placement\n if (initialFocus) {\n setTimeout(() => {\n switch (initialFocus) {\n case 'ok':\n okButtonRef.current?.focus()\n break\n case 'cancel':\n cancelButtonRef.current?.focus()\n break\n case 'close':\n closeButtonRef.current?.focus()\n break\n }\n }, 0)\n }\n }\n } else {\n if (dialog.open) {\n dialog.close()\n // Restore focus to previously focused element\n previousActiveElement.current?.focus()\n // Call afterClose after animation\n if (afterClose) {\n setTimeout(afterClose, 300)\n }\n // Handle destroyOnClose\n if (destroyOnClose) {\n setTimeout(() => setShouldRender(false), 300)\n }\n }\n }\n }, [open, initialFocus, afterClose, destroyOnClose])\n\n useEffect(() => {\n const dialog = dialogRef.current\n if (!dialog) return\n\n const onDialogClose = () => {\n closeHandler?.()\n }\n\n dialog.addEventListener('close', onDialogClose)\n return () => {\n dialog.removeEventListener('close', onDialogClose)\n }\n }, [closeHandler])\n\n // Static class mappings for positions (no interpolation per qa.md)\n const positionClasses: Record<ModalPosition, string> = {\n top: dModalTop,\n middle: dModalMiddle,\n bottom: dModalBottom,\n }\n\n // Responsive position class mappings for each breakpoint\n const responsivePositionClasses: Record<Breakpoint, Record<ModalPosition, string>> = {\n base: {\n top: dModalTop,\n middle: dModalMiddle,\n bottom: dModalBottom,\n },\n sm: {\n top: 'sm:modal-top',\n middle: 'sm:modal-middle',\n bottom: 'sm:modal-bottom',\n },\n md: {\n top: 'md:modal-top',\n middle: 'md:modal-middle',\n bottom: 'md:modal-bottom',\n },\n lg: {\n top: 'lg:modal-top',\n middle: 'lg:modal-middle',\n bottom: 'lg:modal-bottom',\n },\n xl: {\n top: 'xl:modal-top',\n middle: 'xl:modal-middle',\n bottom: 'xl:modal-bottom',\n },\n '2xl': {\n top: '2xl:modal-top',\n middle: '2xl:modal-middle',\n bottom: '2xl:modal-bottom',\n },\n }\n\n const alignClasses: Record<ModalAlign, string> = {\n start: dModalStart,\n end: dModalEnd,\n }\n\n // Build position classes - handle both simple and responsive values\n const getPositionClasses = (): string[] => {\n // centered is an alias for position=\"middle\"\n if (centered) {\n return [positionClasses.middle]\n }\n\n if (!position) {\n return []\n }\n\n // Simple string position\n if (typeof position === 'string') {\n return [positionClasses[position]]\n }\n\n // Responsive object position\n const classes: string[] = []\n for (const [breakpoint, pos] of Object.entries(position) as [Breakpoint, ModalPosition][]) {\n if (pos) {\n classes.push(responsivePositionClasses[breakpoint][pos])\n }\n }\n return classes\n }\n\n const classes = [dModal, ...getPositionClasses(), align && alignClasses[align], className]\n .filter(Boolean)\n .join(' ')\n\n const handleOk = async () => {\n if (onOk) {\n if (confirmLoading === undefined) {\n setInternalLoading(true)\n }\n try {\n await onOk()\n if (confirmLoading === undefined) {\n setInternalLoading(false)\n }\n } catch (error) {\n if (confirmLoading === undefined) {\n setInternalLoading(false)\n }\n throw error\n }\n }\n }\n\n const handleBackdropClick = () => {\n if (maskClosable && closeHandler) {\n closeHandler()\n }\n }\n\n // Calculate modal-box style for custom width\n const modalBoxStyle: React.CSSProperties = width\n ? { width: typeof width === 'number' ? `${width}px` : width, maxWidth: '90vw' }\n : {}\n\n // Calculate dialog style for zIndex\n const dialogStyle: React.CSSProperties = {\n ...style,\n ...(zIndex !== undefined ? { zIndex } : {}),\n }\n\n // Render default footer if no custom footer provided and either onOk or onCancel exists\n const shouldRenderDefaultFooter = !footer && (onOk || onCancel)\n const shouldRenderCustomFooter = footer !== null && footer !== undefined\n\n // Helper for test IDs\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n\n if (!shouldRender) {\n return null\n }\n\n return (\n <dialog\n ref={dialogRef}\n role={alertDialog ? 'alertdialog' : 'dialog'}\n aria-modal=\"true\"\n className={classes}\n style={dialogStyle}\n data-state={open ? 'open' : 'closed'}\n data-testid={testId}\n aria-labelledby={title ? titleId : undefined}\n aria-describedby={contentId}\n {...rest}\n >\n <div className={dModalBox} style={modalBoxStyle}>\n {title && (\n <h3 id={titleId} className=\"text-lg font-bold mb-4\" data-testid={getTestId('title')}>\n {title}\n </h3>\n )}\n <div id={contentId} className=\"py-4\" data-testid={getTestId('content')}>\n {children}\n </div>\n {shouldRenderDefaultFooter && (\n <div className={dModalAction}>\n {onCancel && (\n <button\n ref={cancelButtonRef}\n className={dBtn}\n onClick={onCancel}\n data-testid={getTestId('cancel-button')}\n {...cancelButtonProps}\n >\n {resolvedCancelText}\n </button>\n )}\n {onOk && (\n <button\n ref={okButtonRef}\n className={`${dBtn} ${dBtnPrimary} ${loading ? 'loading' : ''}`}\n onClick={handleOk}\n disabled={loading || okButtonProps?.disabled}\n aria-busy={loading || undefined}\n data-testid={getTestId('ok-button')}\n {...okButtonProps}\n >\n {resolvedOkText}\n </button>\n )}\n </div>\n )}\n {shouldRenderCustomFooter && <div className={dModalAction}>{footer}</div>}\n </div>\n {closable && maskClosable && (\n <form method=\"dialog\" className={dModalBackdrop} data-testid={getTestId('backdrop')}>\n <button ref={closeButtonRef} onClick={handleBackdropClick} data-testid={getTestId('close-button')}>\n {closeIcon || <span className=\"sr-only\">Close modal</span>}\n </button>\n </form>\n )}\n </dialog>\n )\n})\n\nfunction createModal(config: ModalFuncProps & { showCancel?: boolean }) {\n const div = document.createElement('div')\n document.body.appendChild(div)\n const root = createRoot(div)\n\n const destroy = () => {\n root.unmount()\n if (div.parentNode) {\n div.parentNode.removeChild(div)\n }\n }\n\n const ModalContent = () => {\n const { locale } = useConfig()\n const [open, setOpen] = React.useState(true)\n const [loading, setLoading] = React.useState(false)\n\n const handleClose = () => {\n setOpen(false)\n setTimeout(destroy, 300) // Wait for animation\n }\n\n const handleOk = async () => {\n if (config.onOk) {\n setLoading(true)\n try {\n await config.onOk()\n handleClose()\n } catch (error) {\n setLoading(false)\n }\n } else {\n handleClose()\n }\n }\n\n const handleCancel = () => {\n config.onCancel?.()\n handleClose()\n }\n\n const getAlertClass = () => {\n switch (config.type) {\n case 'success':\n return dAlertSuccess\n case 'warning':\n return dAlertWarning\n case 'error':\n return dAlertError\n case 'info':\n default:\n return dAlertInfo\n }\n }\n\n const getIcon = () => {\n switch (config.type) {\n case 'success':\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n )\n case 'warning':\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n )\n case 'error':\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n )\n case 'info':\n default:\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n className=\"stroke-current shrink-0 w-6 h-6\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n ></path>\n </svg>\n )\n }\n }\n\n // Use alertdialog role for warning/error types\n const isAlert = config.type === 'warning' || config.type === 'error'\n\n // Resolve locale strings\n const resolvedOkText = config.okText ?? locale.Modal?.okText ?? 'OK'\n const resolvedCancelText = config.cancelText ?? locale.Modal?.cancelText ?? 'Cancel'\n\n return (\n <Modal\n open={open}\n onOk={config.showCancel ? undefined : handleOk}\n onCancel={handleCancel}\n alertDialog={isAlert}\n title={\n config.type ? (\n <div className={`${dAlert} ${getAlertClass()}`}>\n {getIcon()}\n <div>{config.title && <h3 className=\"font-bold\">{config.title}</h3>}</div>\n </div>\n ) : (\n config.title\n )\n }\n okText={resolvedOkText}\n cancelText={resolvedCancelText}\n footer={\n config.showCancel ? (\n <>\n <button className={dBtn} onClick={handleCancel}>\n {resolvedCancelText}\n </button>\n <button\n className={`${dBtn} ${config.type === 'error' ? dBtnError : dBtnPrimary} ${loading ? 'loading' : ''}`}\n onClick={handleOk}\n disabled={loading}\n >\n {resolvedOkText}\n </button>\n </>\n ) : (\n <button\n className={`${dBtn} ${config.type === 'error' ? dBtnError : dBtnPrimary} ${loading ? 'loading' : ''}`}\n onClick={handleOk}\n disabled={loading}\n >\n {resolvedOkText}\n </button>\n )\n }\n >\n {config.type && config.content && <div className=\"text-sm\">{config.content}</div>}\n {!config.type && config.content}\n </Modal>\n )\n }\n\n root.render(<ModalContent />)\n\n return {\n destroy,\n }\n}\n\nfunction confirm(config: ModalFuncProps) {\n return createModal({ ...config, showCancel: true })\n}\n\nfunction info(config: ModalFuncProps) {\n return createModal({ ...config, type: 'info', showCancel: false })\n}\n\nfunction success(config: ModalFuncProps) {\n return createModal({ ...config, type: 'success', showCancel: false })\n}\n\nfunction warning(config: ModalFuncProps) {\n return createModal({ ...config, type: 'warning', showCancel: false })\n}\n\nfunction error(config: ModalFuncProps) {\n return createModal({ ...config, type: 'error', showCancel: false })\n}\n\nconst ModalWithStatics = Modal as typeof Modal & {\n confirm: typeof confirm\n info: typeof info\n success: typeof success\n warning: typeof warning\n error: typeof error\n}\n\nModalWithStatics.confirm = confirm\nModalWithStatics.info = info\nModalWithStatics.success = success\nModalWithStatics.warning = warning\nModalWithStatics.error = error\n\nexport { ModalWithStatics as Modal }\n"],"names":["dModal","dModalTop","dModalMiddle","dModalBottom","dModalStart","dModalEnd","dModalBox","dModalAction","dModalBackdrop","dBtn","dBtnPrimary","dBtnError","dAlert","dAlertInfo","dAlertSuccess","dAlertWarning","dAlertError","Modal","forwardRef","children","title","footer","open","onOk","onCancel","okText","cancelText","maskClosable","closable","position","align","width","centered","onClose","afterClose","initialFocus","alertDialog","confirmLoading","okButtonProps","cancelButtonProps","closeIcon","zIndex","destroyOnClose","testId","className","style","rest","ref","locale","useConfig","dialogRef","useRef","okButtonRef","cancelButtonRef","closeButtonRef","previousActiveElement","internalLoading","setInternalLoading","React","shouldRender","setShouldRender","titleId","useId","contentId","loading","resolvedOkText","resolvedCancelText","useImperativeHandle","closeHandler","useEffect","dialog","onDialogClose","positionClasses","responsivePositionClasses","alignClasses","classes","breakpoint","pos","handleOk","error","handleBackdropClick","modalBoxStyle","dialogStyle","shouldRenderDefaultFooter","shouldRenderCustomFooter","getTestId","suffix","jsxs","jsx","createModal","config","div","root","createRoot","destroy","ModalContent","setOpen","setLoading","handleClose","handleCancel","getAlertClass","getIcon","isAlert","Fragment","confirm","info","success","warning","ModalWithStatics"],"mappings":"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"}
1
+ {"version":3,"file":"Modal.js","sources":["../../src/components/Modal.tsx"],"sourcesContent":["import React, { useEffect, useRef, useId, forwardRef, useImperativeHandle } from 'react'\nimport { createRoot } from 'react-dom/client'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dModal = 'd-modal'\nconst dModalTop = 'd-modal-top'\nconst dModalMiddle = 'd-modal-middle'\nconst dModalBottom = 'd-modal-bottom'\nconst dModalStart = 'd-modal-start'\nconst dModalEnd = 'd-modal-end'\nconst dModalBox = 'd-modal-box'\nconst dModalAction = 'd-modal-action'\nconst dModalBackdrop = 'd-modal-backdrop'\nconst dBtn = 'd-btn'\nconst dBtnPrimary = 'd-btn-primary'\nconst dBtnError = 'd-btn-error'\nconst dAlert = 'd-alert'\nconst dAlertInfo = 'd-alert-info'\nconst dAlertSuccess = 'd-alert-success'\nconst dAlertWarning = 'd-alert-warning'\nconst dAlertError = 'd-alert-error'\n\nexport type ModalPosition = 'top' | 'middle' | 'bottom'\nexport type ModalAlign = 'start' | 'end'\nexport type Breakpoint = 'base' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'\n\nexport type ResponsivePosition = Partial<Record<Breakpoint, ModalPosition>>\n\nexport interface ModalProps extends Omit<React.HTMLAttributes<HTMLDialogElement>, 'title'> {\n children: React.ReactNode\n title?: React.ReactNode\n footer?: React.ReactNode\n open?: boolean\n onOk?: () => void | Promise<void>\n onCancel?: () => void\n okText?: string\n cancelText?: string\n maskClosable?: boolean\n closable?: boolean\n /** Modal position - can be a single value or responsive object */\n position?: ModalPosition | ResponsivePosition\n align?: ModalAlign\n /** Width of the modal box */\n width?: number | string\n /** Center the modal vertically */\n centered?: boolean\n /** Callback when modal is closed */\n onClose?: () => void\n /** Callback after modal close animation completes */\n afterClose?: () => void\n /** Where to place initial focus: 'ok', 'cancel', or 'close' button */\n initialFocus?: 'ok' | 'cancel' | 'close'\n /** Use alertdialog role for urgent messages */\n alertDialog?: boolean\n /** Show loading spinner on OK button */\n confirmLoading?: boolean\n /** Props for the OK button */\n okButtonProps?: React.ButtonHTMLAttributes<HTMLButtonElement>\n /** Props for the Cancel button */\n cancelButtonProps?: React.ButtonHTMLAttributes<HTMLButtonElement>\n /** Custom close icon */\n closeIcon?: React.ReactNode\n /** CSS z-index for the modal */\n zIndex?: number\n /** Destroy child components when modal is closed */\n destroyOnClose?: boolean\n /** Test ID prefix for child elements */\n 'data-testid'?: string\n}\n\nexport interface ModalFuncProps {\n title?: React.ReactNode\n content?: React.ReactNode\n onOk?: () => void | Promise<void>\n onCancel?: () => void\n okText?: string\n cancelText?: string\n type?: 'info' | 'success' | 'warning' | 'error'\n}\n\nconst Modal = forwardRef<HTMLDialogElement, ModalProps>(function Modal(\n {\n children,\n title,\n footer,\n open = false,\n onOk,\n onCancel,\n okText,\n cancelText,\n maskClosable = true,\n closable = true,\n position,\n align,\n width,\n centered,\n onClose,\n afterClose,\n initialFocus,\n alertDialog = false,\n confirmLoading,\n okButtonProps,\n cancelButtonProps,\n closeIcon,\n zIndex,\n destroyOnClose = false,\n 'data-testid': testId,\n className = '',\n style,\n ...rest\n },\n ref\n) {\n const { locale } = useConfig()\n const dialogRef = useRef<HTMLDialogElement>(null)\n const okButtonRef = useRef<HTMLButtonElement>(null)\n const cancelButtonRef = useRef<HTMLButtonElement>(null)\n const closeButtonRef = useRef<HTMLButtonElement>(null)\n const previousActiveElement = useRef<HTMLElement | null>(null)\n const [internalLoading, setInternalLoading] = React.useState(false)\n const [shouldRender, setShouldRender] = React.useState(open || !destroyOnClose)\n const titleId = useId()\n const contentId = useId()\n\n // Use external confirmLoading if provided, otherwise internal state\n const loading = confirmLoading ?? internalLoading\n\n // Resolve locale strings\n const resolvedOkText = okText ?? locale.Modal?.okText ?? 'OK'\n const resolvedCancelText = cancelText ?? locale.Modal?.cancelText ?? 'Cancel'\n\n // Forward ref\n useImperativeHandle(ref, () => dialogRef.current!, [])\n\n // Handle close - use onClose if provided, otherwise onCancel\n const closeHandler = onClose || onCancel\n\n useEffect(() => {\n const dialog = dialogRef.current\n if (!dialog) return\n\n if (open) {\n setShouldRender(true)\n if (!dialog.open) {\n // Save currently focused element for restoration\n previousActiveElement.current = document.activeElement as HTMLElement\n dialog.showModal()\n\n // Handle custom initial focus placement\n if (initialFocus) {\n setTimeout(() => {\n switch (initialFocus) {\n case 'ok':\n okButtonRef.current?.focus()\n break\n case 'cancel':\n cancelButtonRef.current?.focus()\n break\n case 'close':\n closeButtonRef.current?.focus()\n break\n }\n }, 0)\n }\n }\n } else {\n if (dialog.open) {\n dialog.close()\n // Restore focus to previously focused element\n previousActiveElement.current?.focus()\n // Call afterClose after animation\n if (afterClose) {\n setTimeout(afterClose, 300)\n }\n // Handle destroyOnClose\n if (destroyOnClose) {\n setTimeout(() => setShouldRender(false), 300)\n }\n }\n }\n }, [open, initialFocus, afterClose, destroyOnClose])\n\n useEffect(() => {\n const dialog = dialogRef.current\n if (!dialog) return\n\n const onDialogClose = () => {\n closeHandler?.()\n }\n\n dialog.addEventListener('close', onDialogClose)\n return () => {\n dialog.removeEventListener('close', onDialogClose)\n }\n }, [closeHandler])\n\n // Static class mappings for positions (no interpolation per qa.md)\n const positionClasses: Record<ModalPosition, string> = {\n top: dModalTop,\n middle: dModalMiddle,\n bottom: dModalBottom,\n }\n\n // Responsive position class mappings for each breakpoint\n const responsivePositionClasses: Record<Breakpoint, Record<ModalPosition, string>> = {\n base: {\n top: dModalTop,\n middle: dModalMiddle,\n bottom: dModalBottom,\n },\n sm: {\n top: 'sm:modal-top',\n middle: 'sm:modal-middle',\n bottom: 'sm:modal-bottom',\n },\n md: {\n top: 'md:modal-top',\n middle: 'md:modal-middle',\n bottom: 'md:modal-bottom',\n },\n lg: {\n top: 'lg:modal-top',\n middle: 'lg:modal-middle',\n bottom: 'lg:modal-bottom',\n },\n xl: {\n top: 'xl:modal-top',\n middle: 'xl:modal-middle',\n bottom: 'xl:modal-bottom',\n },\n '2xl': {\n top: '2xl:modal-top',\n middle: '2xl:modal-middle',\n bottom: '2xl:modal-bottom',\n },\n }\n\n const alignClasses: Record<ModalAlign, string> = {\n start: dModalStart,\n end: dModalEnd,\n }\n\n // Build position classes - handle both simple and responsive values\n const getPositionClasses = (): string[] => {\n // centered is an alias for position=\"middle\"\n if (centered) {\n return [positionClasses.middle]\n }\n\n if (!position) {\n return []\n }\n\n // Simple string position\n if (typeof position === 'string') {\n return [positionClasses[position]]\n }\n\n // Responsive object position\n const classes: string[] = []\n for (const [breakpoint, pos] of Object.entries(position) as [Breakpoint, ModalPosition][]) {\n if (pos) {\n classes.push(responsivePositionClasses[breakpoint][pos])\n }\n }\n return classes\n }\n\n const classes = [dModal, ...getPositionClasses(), align && alignClasses[align], className]\n .filter(Boolean)\n .join(' ')\n\n const handleOk = async () => {\n if (onOk) {\n if (confirmLoading === undefined) {\n setInternalLoading(true)\n }\n try {\n await onOk()\n if (confirmLoading === undefined) {\n setInternalLoading(false)\n }\n } catch (error) {\n if (confirmLoading === undefined) {\n setInternalLoading(false)\n }\n throw error\n }\n }\n }\n\n const handleBackdropClick = () => {\n if (maskClosable && closeHandler) {\n closeHandler()\n }\n }\n\n // Calculate modal-box style for custom width\n const modalBoxStyle: React.CSSProperties = width\n ? { width: typeof width === 'number' ? `${width}px` : width, maxWidth: '90vw' }\n : {}\n\n // Calculate dialog style for zIndex\n const dialogStyle: React.CSSProperties = {\n ...style,\n ...(zIndex !== undefined ? { zIndex } : {}),\n }\n\n // Render default footer if no custom footer provided and either onOk or onCancel exists\n const shouldRenderDefaultFooter = !footer && (onOk || onCancel)\n const shouldRenderCustomFooter = footer !== null && footer !== undefined\n\n // Helper for test IDs\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n\n if (!shouldRender) {\n return null\n }\n\n return (\n <dialog\n ref={dialogRef}\n role={alertDialog ? 'alertdialog' : 'dialog'}\n aria-modal=\"true\"\n className={classes}\n style={dialogStyle}\n data-state={open ? 'open' : 'closed'}\n data-testid={testId}\n aria-labelledby={title ? titleId : undefined}\n aria-describedby={contentId}\n {...rest}\n >\n <div className={dModalBox} style={modalBoxStyle}>\n {title && (\n <h3 id={titleId} className=\"text-lg font-bold mb-4\" data-testid={getTestId('title')}>\n {title}\n </h3>\n )}\n <div id={contentId} className=\"py-4\" data-testid={getTestId('content')}>\n {children}\n </div>\n {shouldRenderDefaultFooter && (\n <div className={dModalAction}>\n {onCancel && (\n <button\n ref={cancelButtonRef}\n className={dBtn}\n onClick={onCancel}\n data-testid={getTestId('cancel-button')}\n {...cancelButtonProps}\n >\n {resolvedCancelText}\n </button>\n )}\n {onOk && (\n <button\n ref={okButtonRef}\n className={`${dBtn} ${dBtnPrimary} ${loading ? 'loading' : ''}`}\n onClick={handleOk}\n disabled={loading || okButtonProps?.disabled}\n aria-busy={loading || undefined}\n data-testid={getTestId('ok-button')}\n {...okButtonProps}\n >\n {resolvedOkText}\n </button>\n )}\n </div>\n )}\n {shouldRenderCustomFooter && <div className={dModalAction}>{footer}</div>}\n </div>\n {closable && maskClosable && (\n <form method=\"dialog\" className={dModalBackdrop} data-testid={getTestId('backdrop')}>\n <button ref={closeButtonRef} onClick={handleBackdropClick} data-testid={getTestId('close-button')}>\n {closeIcon || <span className=\"sr-only\">Close modal</span>}\n </button>\n </form>\n )}\n </dialog>\n )\n})\n\nfunction createModal(config: ModalFuncProps & { showCancel?: boolean }) {\n const div = document.createElement('div')\n document.body.appendChild(div)\n const root = createRoot(div)\n\n const destroy = () => {\n root.unmount()\n if (div.parentNode) {\n div.parentNode.removeChild(div)\n }\n }\n\n const ModalContent = () => {\n const { locale } = useConfig()\n const [open, setOpen] = React.useState(true)\n const [loading, setLoading] = React.useState(false)\n\n const handleClose = () => {\n setOpen(false)\n setTimeout(destroy, 300) // Wait for animation\n }\n\n const handleOk = async () => {\n if (config.onOk) {\n setLoading(true)\n try {\n await config.onOk()\n handleClose()\n } catch (error) {\n setLoading(false)\n }\n } else {\n handleClose()\n }\n }\n\n const handleCancel = () => {\n config.onCancel?.()\n handleClose()\n }\n\n const getAlertClass = () => {\n switch (config.type) {\n case 'success':\n return dAlertSuccess\n case 'warning':\n return dAlertWarning\n case 'error':\n return dAlertError\n case 'info':\n default:\n return dAlertInfo\n }\n }\n\n const getIcon = () => {\n switch (config.type) {\n case 'success':\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n )\n case 'warning':\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n )\n case 'error':\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n )\n case 'info':\n default:\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n className=\"stroke-current shrink-0 w-6 h-6\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n ></path>\n </svg>\n )\n }\n }\n\n // Use alertdialog role for warning/error types\n const isAlert = config.type === 'warning' || config.type === 'error'\n\n // Resolve locale strings\n const resolvedOkText = config.okText ?? locale.Modal?.okText ?? 'OK'\n const resolvedCancelText = config.cancelText ?? locale.Modal?.cancelText ?? 'Cancel'\n\n return (\n <Modal\n open={open}\n onOk={config.showCancel ? undefined : handleOk}\n onCancel={handleCancel}\n alertDialog={isAlert}\n title={\n config.type ? (\n <div className={`${dAlert} ${getAlertClass()}`}>\n {getIcon()}\n <div>{config.title && <h3 className=\"font-bold\">{config.title}</h3>}</div>\n </div>\n ) : (\n config.title\n )\n }\n okText={resolvedOkText}\n cancelText={resolvedCancelText}\n footer={\n config.showCancel ? (\n <>\n <button className={dBtn} onClick={handleCancel}>\n {resolvedCancelText}\n </button>\n <button\n className={`${dBtn} ${config.type === 'error' ? dBtnError : dBtnPrimary} ${loading ? 'loading' : ''}`}\n onClick={handleOk}\n disabled={loading}\n >\n {resolvedOkText}\n </button>\n </>\n ) : (\n <button\n className={`${dBtn} ${config.type === 'error' ? dBtnError : dBtnPrimary} ${loading ? 'loading' : ''}`}\n onClick={handleOk}\n disabled={loading}\n >\n {resolvedOkText}\n </button>\n )\n }\n >\n {config.type && config.content && <div className=\"text-sm\">{config.content}</div>}\n {!config.type && config.content}\n </Modal>\n )\n }\n\n root.render(<ModalContent />)\n\n return {\n destroy,\n }\n}\n\nfunction confirm(config: ModalFuncProps) {\n return createModal({ ...config, showCancel: true })\n}\n\nfunction info(config: ModalFuncProps) {\n return createModal({ ...config, type: 'info', showCancel: false })\n}\n\nfunction success(config: ModalFuncProps) {\n return createModal({ ...config, type: 'success', showCancel: false })\n}\n\nfunction warning(config: ModalFuncProps) {\n return createModal({ ...config, type: 'warning', showCancel: false })\n}\n\nfunction error(config: ModalFuncProps) {\n return createModal({ ...config, type: 'error', showCancel: false })\n}\n\nconst ModalWithStatics = Modal as typeof Modal & {\n confirm: typeof confirm\n info: typeof info\n success: typeof success\n warning: typeof warning\n error: typeof error\n}\n\nModalWithStatics.confirm = confirm\nModalWithStatics.info = info\nModalWithStatics.success = success\nModalWithStatics.warning = warning\nModalWithStatics.error = error\n\nexport { ModalWithStatics as Modal }\n"],"names":["dModal","dModalTop","dModalMiddle","dModalBottom","dModalStart","dModalEnd","dModalBox","dModalAction","dModalBackdrop","dBtn","dBtnPrimary","dBtnError","dAlert","dAlertInfo","dAlertSuccess","dAlertWarning","dAlertError","Modal","forwardRef","children","title","footer","open","onOk","onCancel","okText","cancelText","maskClosable","closable","position","align","width","centered","onClose","afterClose","initialFocus","alertDialog","confirmLoading","okButtonProps","cancelButtonProps","closeIcon","zIndex","destroyOnClose","testId","className","style","rest","ref","locale","useConfig","dialogRef","useRef","okButtonRef","cancelButtonRef","closeButtonRef","previousActiveElement","internalLoading","setInternalLoading","React","shouldRender","setShouldRender","titleId","useId","contentId","loading","resolvedOkText","resolvedCancelText","useImperativeHandle","closeHandler","useEffect","dialog","onDialogClose","positionClasses","responsivePositionClasses","alignClasses","classes","breakpoint","pos","handleOk","error","handleBackdropClick","modalBoxStyle","dialogStyle","shouldRenderDefaultFooter","shouldRenderCustomFooter","getTestId","suffix","jsxs","jsx","createModal","config","div","root","createRoot","destroy","ModalContent","setOpen","setLoading","handleClose","handleCancel","getAlertClass","getIcon","isAlert","Fragment","confirm","info","success","warning","ModalWithStatics"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { jsx as A } from "react/jsx-runtime";
2
2
  import { forwardRef as M, useState as V, useRef as Z, useImperativeHandle as B, useEffect as O, useCallback as l } from "react";
3
- import { useConfig as F } from "./ConfigProvider.js";
3
+ import { useConfig as F } from "../providers/ConfigProvider.js";
4
4
  const H = "d-input", X = "d-input-xs", q = "d-input-sm", G = "d-input-lg", J = "d-input-error", Q = "d-input-disabled", U = M(
5
5
  ({
6
6
  length: r = 6,
@@ -1 +1 @@
1
- {"version":3,"file":"OTPInput.js","sources":["../../src/components/OTPInput.tsx"],"sourcesContent":["import React, { useRef, useState, useEffect, useCallback, forwardRef, useImperativeHandle } from 'react'\nimport { useConfig } from './ConfigProvider'\n\n// DaisyUI classes\nconst dInput = 'd-input'\nconst dInputXs = 'd-input-xs'\nconst dInputSm = 'd-input-sm'\nconst dInputLg = 'd-input-lg'\nconst dInputError = 'd-input-error'\nconst dInputDisabled = 'd-input-disabled'\n\nexport interface OTPInputProps {\n /** Number of input fields */\n length?: number\n /** Current value */\n value?: string\n /** Callback when value changes */\n onChange?: (value: string) => void\n /** Callback when all fields are filled */\n onComplete?: (value: string) => void\n /** Input size */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n /** Input type - number only or alphanumeric */\n type?: 'number' | 'text'\n /** Mask input (show dots instead of characters) */\n mask?: boolean\n /** Disabled state */\n disabled?: boolean\n /** Error state */\n error?: boolean\n /** Auto focus first input on mount */\n autoFocus?: boolean\n /** Placeholder character */\n placeholder?: string\n /** Additional CSS classes */\n className?: string\n /** Test ID prefix for child elements */\n 'data-testid'?: string\n}\n\nexport interface OTPInputRef {\n focus: () => void\n clear: () => void\n}\n\nexport const OTPInput = forwardRef<OTPInputRef, OTPInputProps>(\n (\n {\n length = 6,\n value = '',\n onChange,\n onComplete,\n size,\n type = 'number',\n mask = false,\n disabled = false,\n error = false,\n autoFocus = false,\n placeholder = '',\n className = '',\n 'data-testid': testId,\n },\n ref\n ) => {\n const { componentSize } = useConfig()\n\n // Helper for test IDs\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n const effectiveSize = size ?? componentSize ?? 'md'\n const [otp, setOtp] = useState<string[]>(() => {\n const initial = value.split('').slice(0, length)\n return [...initial, ...Array(length - initial.length).fill('')]\n })\n\n const inputRefs = useRef<(HTMLInputElement | null)[]>([])\n\n const sizeClasses = {\n xs: `${dInputXs} w-8 h-8 text-sm`,\n sm: `${dInputSm} w-10 h-10 text-base`,\n md: 'w-12 h-12 text-lg',\n lg: `${dInputLg} w-14 h-14 text-xl`,\n xl: 'w-16 h-16 text-2xl',\n }\n\n useImperativeHandle(ref, () => ({\n focus: () => {\n inputRefs.current[0]?.focus()\n },\n clear: () => {\n setOtp(Array(length).fill(''))\n inputRefs.current[0]?.focus()\n },\n }))\n\n useEffect(() => {\n if (autoFocus) {\n inputRefs.current[0]?.focus()\n }\n }, [autoFocus])\n\n useEffect(() => {\n const newOtp = value.split('').slice(0, length)\n setOtp([...newOtp, ...Array(length - newOtp.length).fill('')])\n }, [value, length])\n\n const handleChange = useCallback(\n (index: number, char: string) => {\n if (disabled) return\n\n // Validate input\n if (type === 'number' && !/^\\d*$/.test(char)) return\n if (type === 'text' && !/^[a-zA-Z0-9]*$/.test(char)) return\n\n const newOtp = [...otp]\n\n // Handle paste of multiple characters\n if (char.length > 1) {\n const chars = char.slice(0, length - index).split('')\n chars.forEach((c, i) => {\n if (index + i < length) {\n newOtp[index + i] = c\n }\n })\n setOtp(newOtp)\n\n const newValue = newOtp.join('')\n onChange?.(newValue)\n\n // Focus appropriate field\n const nextIndex = Math.min(index + chars.length, length - 1)\n inputRefs.current[nextIndex]?.focus()\n\n if (newValue.length === length) {\n onComplete?.(newValue)\n }\n return\n }\n\n // Single character\n newOtp[index] = char\n setOtp(newOtp)\n\n const newValue = newOtp.join('')\n onChange?.(newValue)\n\n // Move to next input\n if (char && index < length - 1) {\n inputRefs.current[index + 1]?.focus()\n }\n\n if (newValue.length === length && !newValue.includes('')) {\n onComplete?.(newValue)\n }\n },\n [otp, length, type, disabled, onChange, onComplete]\n )\n\n const handleKeyDown = useCallback(\n (index: number, e: React.KeyboardEvent<HTMLInputElement>) => {\n if (disabled) return\n\n if (e.key === 'Backspace') {\n e.preventDefault()\n const newOtp = [...otp]\n\n if (otp[index]) {\n // Clear current field\n newOtp[index] = ''\n setOtp(newOtp)\n onChange?.(newOtp.join(''))\n } else if (index > 0) {\n // Move to previous field and clear it\n newOtp[index - 1] = ''\n setOtp(newOtp)\n onChange?.(newOtp.join(''))\n inputRefs.current[index - 1]?.focus()\n }\n } else if (e.key === 'ArrowLeft' && index > 0) {\n e.preventDefault()\n inputRefs.current[index - 1]?.focus()\n } else if (e.key === 'ArrowRight' && index < length - 1) {\n e.preventDefault()\n inputRefs.current[index + 1]?.focus()\n }\n },\n [otp, length, disabled, onChange]\n )\n\n const handlePaste = useCallback(\n (e: React.ClipboardEvent) => {\n e.preventDefault()\n if (disabled) return\n\n const pastedData = e.clipboardData.getData('text')\n const filteredData =\n type === 'number'\n ? pastedData.replace(/\\D/g, '')\n : pastedData.replace(/[^a-zA-Z0-9]/g, '')\n\n if (filteredData) {\n handleChange(0, filteredData)\n }\n },\n [type, disabled, handleChange]\n )\n\n const handleFocus = useCallback((e: React.FocusEvent<HTMLInputElement>) => {\n e.target.select()\n }, [])\n\n return (\n <div className={`flex gap-2 ${className}`} data-testid={testId}>\n {otp.map((digit, index) => (\n <input\n key={index}\n ref={(el) => {\n inputRefs.current[index] = el\n }}\n data-testid={getTestId(`input-${index}`)}\n type={mask ? 'password' : type === 'number' ? 'tel' : 'text'}\n inputMode={type === 'number' ? 'numeric' : 'text'}\n maxLength={1}\n value={digit}\n placeholder={placeholder}\n disabled={disabled}\n onChange={(e) => handleChange(index, e.target.value)}\n onKeyDown={(e) => handleKeyDown(index, e)}\n onPaste={handlePaste}\n onFocus={handleFocus}\n className={`\n ${dInput} text-center font-mono\n ${sizeClasses[effectiveSize]}\n ${error ? dInputError : ''}\n ${disabled ? `${dInputDisabled} opacity-50` : ''}\n `}\n aria-label={`OTP digit ${index + 1}`}\n />\n ))}\n </div>\n )\n }\n)\n\nOTPInput.displayName = 'OTPInput'\n"],"names":["dInput","dInputXs","dInputSm","dInputLg","dInputError","dInputDisabled","OTPInput","forwardRef","length","value","onChange","onComplete","size","type","mask","disabled","error","autoFocus","placeholder","className","testId","ref","componentSize","useConfig","getTestId","suffix","effectiveSize","otp","setOtp","useState","initial","inputRefs","useRef","sizeClasses","useImperativeHandle","useEffect","newOtp","handleChange","useCallback","index","char","chars","c","i","newValue","nextIndex","handleKeyDown","handlePaste","e","pastedData","filteredData","handleFocus","jsx","digit","el"],"mappings":"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"}
1
+ {"version":3,"file":"OTPInput.js","sources":["../../src/components/OTPInput.tsx"],"sourcesContent":["import React, { useRef, useState, useEffect, useCallback, forwardRef, useImperativeHandle } from 'react'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dInput = 'd-input'\nconst dInputXs = 'd-input-xs'\nconst dInputSm = 'd-input-sm'\nconst dInputLg = 'd-input-lg'\nconst dInputError = 'd-input-error'\nconst dInputDisabled = 'd-input-disabled'\n\nexport interface OTPInputProps {\n /** Number of input fields */\n length?: number\n /** Current value */\n value?: string\n /** Callback when value changes */\n onChange?: (value: string) => void\n /** Callback when all fields are filled */\n onComplete?: (value: string) => void\n /** Input size */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n /** Input type - number only or alphanumeric */\n type?: 'number' | 'text'\n /** Mask input (show dots instead of characters) */\n mask?: boolean\n /** Disabled state */\n disabled?: boolean\n /** Error state */\n error?: boolean\n /** Auto focus first input on mount */\n autoFocus?: boolean\n /** Placeholder character */\n placeholder?: string\n /** Additional CSS classes */\n className?: string\n /** Test ID prefix for child elements */\n 'data-testid'?: string\n}\n\nexport interface OTPInputRef {\n focus: () => void\n clear: () => void\n}\n\nexport const OTPInput = forwardRef<OTPInputRef, OTPInputProps>(\n (\n {\n length = 6,\n value = '',\n onChange,\n onComplete,\n size,\n type = 'number',\n mask = false,\n disabled = false,\n error = false,\n autoFocus = false,\n placeholder = '',\n className = '',\n 'data-testid': testId,\n },\n ref\n ) => {\n const { componentSize } = useConfig()\n\n // Helper for test IDs\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n const effectiveSize = size ?? componentSize ?? 'md'\n const [otp, setOtp] = useState<string[]>(() => {\n const initial = value.split('').slice(0, length)\n return [...initial, ...Array(length - initial.length).fill('')]\n })\n\n const inputRefs = useRef<(HTMLInputElement | null)[]>([])\n\n const sizeClasses = {\n xs: `${dInputXs} w-8 h-8 text-sm`,\n sm: `${dInputSm} w-10 h-10 text-base`,\n md: 'w-12 h-12 text-lg',\n lg: `${dInputLg} w-14 h-14 text-xl`,\n xl: 'w-16 h-16 text-2xl',\n }\n\n useImperativeHandle(ref, () => ({\n focus: () => {\n inputRefs.current[0]?.focus()\n },\n clear: () => {\n setOtp(Array(length).fill(''))\n inputRefs.current[0]?.focus()\n },\n }))\n\n useEffect(() => {\n if (autoFocus) {\n inputRefs.current[0]?.focus()\n }\n }, [autoFocus])\n\n useEffect(() => {\n const newOtp = value.split('').slice(0, length)\n setOtp([...newOtp, ...Array(length - newOtp.length).fill('')])\n }, [value, length])\n\n const handleChange = useCallback(\n (index: number, char: string) => {\n if (disabled) return\n\n // Validate input\n if (type === 'number' && !/^\\d*$/.test(char)) return\n if (type === 'text' && !/^[a-zA-Z0-9]*$/.test(char)) return\n\n const newOtp = [...otp]\n\n // Handle paste of multiple characters\n if (char.length > 1) {\n const chars = char.slice(0, length - index).split('')\n chars.forEach((c, i) => {\n if (index + i < length) {\n newOtp[index + i] = c\n }\n })\n setOtp(newOtp)\n\n const newValue = newOtp.join('')\n onChange?.(newValue)\n\n // Focus appropriate field\n const nextIndex = Math.min(index + chars.length, length - 1)\n inputRefs.current[nextIndex]?.focus()\n\n if (newValue.length === length) {\n onComplete?.(newValue)\n }\n return\n }\n\n // Single character\n newOtp[index] = char\n setOtp(newOtp)\n\n const newValue = newOtp.join('')\n onChange?.(newValue)\n\n // Move to next input\n if (char && index < length - 1) {\n inputRefs.current[index + 1]?.focus()\n }\n\n if (newValue.length === length && !newValue.includes('')) {\n onComplete?.(newValue)\n }\n },\n [otp, length, type, disabled, onChange, onComplete]\n )\n\n const handleKeyDown = useCallback(\n (index: number, e: React.KeyboardEvent<HTMLInputElement>) => {\n if (disabled) return\n\n if (e.key === 'Backspace') {\n e.preventDefault()\n const newOtp = [...otp]\n\n if (otp[index]) {\n // Clear current field\n newOtp[index] = ''\n setOtp(newOtp)\n onChange?.(newOtp.join(''))\n } else if (index > 0) {\n // Move to previous field and clear it\n newOtp[index - 1] = ''\n setOtp(newOtp)\n onChange?.(newOtp.join(''))\n inputRefs.current[index - 1]?.focus()\n }\n } else if (e.key === 'ArrowLeft' && index > 0) {\n e.preventDefault()\n inputRefs.current[index - 1]?.focus()\n } else if (e.key === 'ArrowRight' && index < length - 1) {\n e.preventDefault()\n inputRefs.current[index + 1]?.focus()\n }\n },\n [otp, length, disabled, onChange]\n )\n\n const handlePaste = useCallback(\n (e: React.ClipboardEvent) => {\n e.preventDefault()\n if (disabled) return\n\n const pastedData = e.clipboardData.getData('text')\n const filteredData =\n type === 'number'\n ? pastedData.replace(/\\D/g, '')\n : pastedData.replace(/[^a-zA-Z0-9]/g, '')\n\n if (filteredData) {\n handleChange(0, filteredData)\n }\n },\n [type, disabled, handleChange]\n )\n\n const handleFocus = useCallback((e: React.FocusEvent<HTMLInputElement>) => {\n e.target.select()\n }, [])\n\n return (\n <div className={`flex gap-2 ${className}`} data-testid={testId}>\n {otp.map((digit, index) => (\n <input\n key={index}\n ref={(el) => {\n inputRefs.current[index] = el\n }}\n data-testid={getTestId(`input-${index}`)}\n type={mask ? 'password' : type === 'number' ? 'tel' : 'text'}\n inputMode={type === 'number' ? 'numeric' : 'text'}\n maxLength={1}\n value={digit}\n placeholder={placeholder}\n disabled={disabled}\n onChange={(e) => handleChange(index, e.target.value)}\n onKeyDown={(e) => handleKeyDown(index, e)}\n onPaste={handlePaste}\n onFocus={handleFocus}\n className={`\n ${dInput} text-center font-mono\n ${sizeClasses[effectiveSize]}\n ${error ? dInputError : ''}\n ${disabled ? `${dInputDisabled} opacity-50` : ''}\n `}\n aria-label={`OTP digit ${index + 1}`}\n />\n ))}\n </div>\n )\n }\n)\n\nOTPInput.displayName = 'OTPInput'\n"],"names":["dInput","dInputXs","dInputSm","dInputLg","dInputError","dInputDisabled","OTPInput","forwardRef","length","value","onChange","onComplete","size","type","mask","disabled","error","autoFocus","placeholder","className","testId","ref","componentSize","useConfig","getTestId","suffix","effectiveSize","otp","setOtp","useState","initial","inputRefs","useRef","sizeClasses","useImperativeHandle","useEffect","newOtp","handleChange","useCallback","index","char","chars","c","i","newValue","nextIndex","handleKeyDown","handlePaste","e","pastedData","filteredData","handleFocus","jsx","digit","el"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { jsxs as u, jsx as a } from "react/jsx-runtime";
2
2
  import x, { forwardRef as V } from "react";
3
- import { useConfig as W } from "./ConfigProvider.js";
3
+ import { useConfig as W } from "../providers/ConfigProvider.js";
4
4
  const r = "d-btn", T = "d-btn-ghost", Y = "d-btn-active", Z = "d-btn-disabled", _ = "d-btn-xs", ee = "d-btn-sm", te = "d-btn-lg", se = "d-btn-xl", ne = "d-select", ae = "d-select-bordered", ie = "d-join", p = "d-join-item", le = "d-input", me = V(function({
5
5
  current: f,
6
6
  defaultCurrent: y = 1,
@@ -1 +1 @@
1
- {"version":3,"file":"Pagination.js","sources":["../../src/components/Pagination.tsx"],"sourcesContent":["import React, { forwardRef } from 'react'\nimport { useConfig } from './ConfigProvider'\n\n// DaisyUI classes\nconst dBtn = 'd-btn'\nconst dBtnGhost = 'd-btn-ghost'\nconst dBtnActive = 'd-btn-active'\nconst dBtnDisabled = 'd-btn-disabled'\nconst dBtnXs = 'd-btn-xs'\nconst dBtnSm = 'd-btn-sm'\nconst dBtnLg = 'd-btn-lg'\nconst dBtnXl = 'd-btn-xl'\nconst dSelect = 'd-select'\nconst dSelectBordered = 'd-select-bordered'\nconst dJoin = 'd-join'\nconst dJoinItem = 'd-join-item'\nconst dInput = 'd-input'\n\nexport interface PaginationProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n current?: number\n defaultCurrent?: number\n total: number\n pageSize?: number\n defaultPageSize?: number\n pageSizeOptions?: number[]\n onChange?: (page: number, pageSize: number) => void\n onShowSizeChange?: (current: number, size: number) => void\n showSizeChanger?: boolean\n showQuickJumper?: boolean\n showTotal?: boolean | ((total: number, range: [number, number]) => React.ReactNode)\n simple?: boolean\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n disabled?: boolean\n /** Test ID prefix for child elements */\n 'data-testid'?: string\n}\n\nexport const Pagination = forwardRef<HTMLDivElement, PaginationProps>(function Pagination(\n {\n current: controlledCurrent,\n defaultCurrent = 1,\n total,\n pageSize: controlledPageSize,\n defaultPageSize = 10,\n pageSizeOptions = [10, 20, 50, 100],\n onChange,\n onShowSizeChange,\n showSizeChanger = false,\n showQuickJumper = false,\n showTotal = false,\n simple = false,\n size,\n disabled = false,\n 'data-testid': testId,\n className = '',\n ...rest\n },\n ref\n) {\n const { componentSize, locale } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n\n // Helper for test IDs\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n\n // Locale strings with fallbacks\n const l = locale.Pagination ?? {}\n const itemsPerPageText = l.itemsPerPage ?? '/ page'\n const goToText = l.goTo ?? 'Go to'\n const [internalCurrent, setInternalCurrent] = React.useState(defaultCurrent)\n const [internalPageSize, setInternalPageSize] = React.useState(defaultPageSize)\n const [jumpPage, setJumpPage] = React.useState('')\n\n const current = controlledCurrent !== undefined ? controlledCurrent : internalCurrent\n const pageSize = controlledPageSize !== undefined ? controlledPageSize : internalPageSize\n const totalPages = Math.ceil(total / pageSize)\n\n const handlePageChange = (page: number) => {\n if (page < 1 || page > totalPages || disabled) return\n\n if (controlledCurrent === undefined) {\n setInternalCurrent(page)\n }\n onChange?.(page, pageSize)\n }\n\n const handlePageSizeChange = (newSize: number) => {\n const newTotalPages = Math.ceil(total / newSize)\n const newCurrent = current > newTotalPages ? newTotalPages : current\n\n if (controlledPageSize === undefined) {\n setInternalPageSize(newSize)\n }\n if (controlledCurrent === undefined && newCurrent !== current) {\n setInternalCurrent(newCurrent)\n }\n\n onShowSizeChange?.(newCurrent, newSize)\n onChange?.(newCurrent, newSize)\n }\n\n const handleJumpPage = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n const page = parseInt(jumpPage)\n if (!isNaN(page) && page >= 1 && page <= totalPages) {\n handlePageChange(page)\n setJumpPage('')\n }\n }\n }\n\n const getPageNumbers = (): (number | 'ellipsis')[] => {\n const pages: (number | 'ellipsis')[] = []\n const showPages = 7\n\n if (totalPages <= showPages) {\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i)\n }\n } else {\n if (current <= 3) {\n for (let i = 1; i <= 5; i++) {\n pages.push(i)\n }\n pages.push('ellipsis')\n pages.push(totalPages)\n } else if (current >= totalPages - 2) {\n pages.push(1)\n pages.push('ellipsis')\n for (let i = totalPages - 4; i <= totalPages; i++) {\n pages.push(i)\n }\n } else {\n pages.push(1)\n pages.push('ellipsis')\n for (let i = current - 1; i <= current + 1; i++) {\n pages.push(i)\n }\n pages.push('ellipsis')\n pages.push(totalPages)\n }\n }\n\n return pages\n }\n\n const sizeClass = {\n xs: dBtnXs,\n sm: dBtnSm,\n md: '',\n lg: dBtnLg,\n xl: dBtnXl,\n }[effectiveSize]\n\n const range: [number, number] = [\n (current - 1) * pageSize + 1,\n Math.min(current * pageSize, total),\n ]\n\n if (simple) {\n return (\n <div ref={ref} className={`flex items-center gap-2 ${className}`} data-testid={testId} {...rest}>\n <button\n className={`${dBtn} ${dBtnGhost} ${sizeClass}`}\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n data-testid={getTestId('prev')}\n aria-label={l.prev ?? 'Previous'}\n >\n ‹\n </button>\n <span className=\"text-sm\">\n {current} / {totalPages}\n </span>\n <button\n className={`${dBtn} ${dBtnGhost} ${sizeClass}`}\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n data-testid={getTestId('next')}\n aria-label={l.next ?? 'Next'}\n >\n ›\n </button>\n </div>\n )\n }\n\n return (\n <div ref={ref} className={`flex flex-wrap items-center gap-4 ${className}`} data-testid={testId} {...rest}>\n {/* Total */}\n {showTotal && (\n <div className=\"text-sm text-base-content/70\" data-testid={getTestId('total')}>\n {typeof showTotal === 'function'\n ? showTotal(total, range)\n : `Total ${total} ${l.items ?? 'items'}`}\n </div>\n )}\n\n {/* Page Size Changer */}\n {showSizeChanger && (\n <select\n className={`${dSelect} ${dSelectBordered} ${sizeClass}`}\n value={pageSize}\n onChange={(e) => handlePageSizeChange(Number(e.target.value))}\n disabled={disabled}\n data-testid={getTestId('size-changer')}\n >\n {pageSizeOptions.map((sz) => (\n <option key={sz} value={sz}>\n {sz} {itemsPerPageText}\n </option>\n ))}\n </select>\n )}\n\n {/* Pagination Controls */}\n <div className={dJoin} data-testid={getTestId('controls')}>\n {/* First */}\n <button\n className={`${dJoinItem} ${dBtn} ${sizeClass}`}\n onClick={() => handlePageChange(1)}\n disabled={disabled || current === 1}\n aria-label=\"First page\"\n data-testid={getTestId('first')}\n >\n «\n </button>\n\n {/* Previous */}\n <button\n className={`${dJoinItem} ${dBtn} ${sizeClass}`}\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n aria-label={l.prev ?? 'Previous'}\n data-testid={getTestId('prev')}\n >\n ‹\n </button>\n\n {/* Page Numbers */}\n {getPageNumbers().map((page, index) => {\n if (page === 'ellipsis') {\n return (\n <button key={`ellipsis-${index}`} className={`${dJoinItem} ${dBtn} ${dBtnDisabled} ${sizeClass}`}>\n ...\n </button>\n )\n }\n\n return (\n <button\n key={page}\n className={`${dJoinItem} ${dBtn} ${sizeClass} ${current === page ? dBtnActive : ''}`}\n onClick={() => handlePageChange(page)}\n disabled={disabled}\n data-testid={getTestId(`page-${page}`)}\n aria-current={current === page ? 'page' : undefined}\n >\n {page}\n </button>\n )\n })}\n\n {/* Next */}\n <button\n className={`${dJoinItem} ${dBtn} ${sizeClass}`}\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n aria-label={l.next ?? 'Next'}\n data-testid={getTestId('next')}\n >\n ›\n </button>\n\n {/* Last */}\n <button\n className={`${dJoinItem} ${dBtn} ${sizeClass}`}\n onClick={() => handlePageChange(totalPages)}\n disabled={disabled || current === totalPages}\n aria-label=\"Last page\"\n data-testid={getTestId('last')}\n >\n »\n </button>\n </div>\n\n {/* Quick Jumper */}\n {showQuickJumper && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm\">{goToText}</span>\n <input\n type=\"number\"\n className={`${dInput} w-16 ${sizeClass}`}\n min={1}\n max={totalPages}\n value={jumpPage}\n onChange={(e) => setJumpPage(e.target.value)}\n onKeyDown={handleJumpPage}\n disabled={disabled}\n placeholder={String(current)}\n data-testid={getTestId('jumper')}\n />\n </div>\n )}\n </div>\n )\n})\n"],"names":["dBtn","dBtnGhost","dBtnActive","dBtnDisabled","dBtnXs","dBtnSm","dBtnLg","dBtnXl","dSelect","dSelectBordered","dJoin","dJoinItem","dInput","Pagination","forwardRef","controlledCurrent","defaultCurrent","total","controlledPageSize","defaultPageSize","pageSizeOptions","onChange","onShowSizeChange","showSizeChanger","showQuickJumper","showTotal","simple","size","disabled","testId","className","rest","ref","componentSize","locale","useConfig","effectiveSize","getTestId","suffix","l","itemsPerPageText","goToText","internalCurrent","setInternalCurrent","React","internalPageSize","setInternalPageSize","jumpPage","setJumpPage","current","pageSize","totalPages","handlePageChange","page","handlePageSizeChange","newSize","newTotalPages","newCurrent","handleJumpPage","getPageNumbers","pages","i","sizeClass","range","jsxs","jsx","sz","index"],"mappings":"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"}
1
+ {"version":3,"file":"Pagination.js","sources":["../../src/components/Pagination.tsx"],"sourcesContent":["import React, { forwardRef } from 'react'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dBtn = 'd-btn'\nconst dBtnGhost = 'd-btn-ghost'\nconst dBtnActive = 'd-btn-active'\nconst dBtnDisabled = 'd-btn-disabled'\nconst dBtnXs = 'd-btn-xs'\nconst dBtnSm = 'd-btn-sm'\nconst dBtnLg = 'd-btn-lg'\nconst dBtnXl = 'd-btn-xl'\nconst dSelect = 'd-select'\nconst dSelectBordered = 'd-select-bordered'\nconst dJoin = 'd-join'\nconst dJoinItem = 'd-join-item'\nconst dInput = 'd-input'\n\nexport interface PaginationProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n current?: number\n defaultCurrent?: number\n total: number\n pageSize?: number\n defaultPageSize?: number\n pageSizeOptions?: number[]\n onChange?: (page: number, pageSize: number) => void\n onShowSizeChange?: (current: number, size: number) => void\n showSizeChanger?: boolean\n showQuickJumper?: boolean\n showTotal?: boolean | ((total: number, range: [number, number]) => React.ReactNode)\n simple?: boolean\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n disabled?: boolean\n /** Test ID prefix for child elements */\n 'data-testid'?: string\n}\n\nexport const Pagination = forwardRef<HTMLDivElement, PaginationProps>(function Pagination(\n {\n current: controlledCurrent,\n defaultCurrent = 1,\n total,\n pageSize: controlledPageSize,\n defaultPageSize = 10,\n pageSizeOptions = [10, 20, 50, 100],\n onChange,\n onShowSizeChange,\n showSizeChanger = false,\n showQuickJumper = false,\n showTotal = false,\n simple = false,\n size,\n disabled = false,\n 'data-testid': testId,\n className = '',\n ...rest\n },\n ref\n) {\n const { componentSize, locale } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n\n // Helper for test IDs\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n\n // Locale strings with fallbacks\n const l = locale.Pagination ?? {}\n const itemsPerPageText = l.itemsPerPage ?? '/ page'\n const goToText = l.goTo ?? 'Go to'\n const [internalCurrent, setInternalCurrent] = React.useState(defaultCurrent)\n const [internalPageSize, setInternalPageSize] = React.useState(defaultPageSize)\n const [jumpPage, setJumpPage] = React.useState('')\n\n const current = controlledCurrent !== undefined ? controlledCurrent : internalCurrent\n const pageSize = controlledPageSize !== undefined ? controlledPageSize : internalPageSize\n const totalPages = Math.ceil(total / pageSize)\n\n const handlePageChange = (page: number) => {\n if (page < 1 || page > totalPages || disabled) return\n\n if (controlledCurrent === undefined) {\n setInternalCurrent(page)\n }\n onChange?.(page, pageSize)\n }\n\n const handlePageSizeChange = (newSize: number) => {\n const newTotalPages = Math.ceil(total / newSize)\n const newCurrent = current > newTotalPages ? newTotalPages : current\n\n if (controlledPageSize === undefined) {\n setInternalPageSize(newSize)\n }\n if (controlledCurrent === undefined && newCurrent !== current) {\n setInternalCurrent(newCurrent)\n }\n\n onShowSizeChange?.(newCurrent, newSize)\n onChange?.(newCurrent, newSize)\n }\n\n const handleJumpPage = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n const page = parseInt(jumpPage)\n if (!isNaN(page) && page >= 1 && page <= totalPages) {\n handlePageChange(page)\n setJumpPage('')\n }\n }\n }\n\n const getPageNumbers = (): (number | 'ellipsis')[] => {\n const pages: (number | 'ellipsis')[] = []\n const showPages = 7\n\n if (totalPages <= showPages) {\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i)\n }\n } else {\n if (current <= 3) {\n for (let i = 1; i <= 5; i++) {\n pages.push(i)\n }\n pages.push('ellipsis')\n pages.push(totalPages)\n } else if (current >= totalPages - 2) {\n pages.push(1)\n pages.push('ellipsis')\n for (let i = totalPages - 4; i <= totalPages; i++) {\n pages.push(i)\n }\n } else {\n pages.push(1)\n pages.push('ellipsis')\n for (let i = current - 1; i <= current + 1; i++) {\n pages.push(i)\n }\n pages.push('ellipsis')\n pages.push(totalPages)\n }\n }\n\n return pages\n }\n\n const sizeClass = {\n xs: dBtnXs,\n sm: dBtnSm,\n md: '',\n lg: dBtnLg,\n xl: dBtnXl,\n }[effectiveSize]\n\n const range: [number, number] = [\n (current - 1) * pageSize + 1,\n Math.min(current * pageSize, total),\n ]\n\n if (simple) {\n return (\n <div ref={ref} className={`flex items-center gap-2 ${className}`} data-testid={testId} {...rest}>\n <button\n className={`${dBtn} ${dBtnGhost} ${sizeClass}`}\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n data-testid={getTestId('prev')}\n aria-label={l.prev ?? 'Previous'}\n >\n ‹\n </button>\n <span className=\"text-sm\">\n {current} / {totalPages}\n </span>\n <button\n className={`${dBtn} ${dBtnGhost} ${sizeClass}`}\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n data-testid={getTestId('next')}\n aria-label={l.next ?? 'Next'}\n >\n ›\n </button>\n </div>\n )\n }\n\n return (\n <div ref={ref} className={`flex flex-wrap items-center gap-4 ${className}`} data-testid={testId} {...rest}>\n {/* Total */}\n {showTotal && (\n <div className=\"text-sm text-base-content/70\" data-testid={getTestId('total')}>\n {typeof showTotal === 'function'\n ? showTotal(total, range)\n : `Total ${total} ${l.items ?? 'items'}`}\n </div>\n )}\n\n {/* Page Size Changer */}\n {showSizeChanger && (\n <select\n className={`${dSelect} ${dSelectBordered} ${sizeClass}`}\n value={pageSize}\n onChange={(e) => handlePageSizeChange(Number(e.target.value))}\n disabled={disabled}\n data-testid={getTestId('size-changer')}\n >\n {pageSizeOptions.map((sz) => (\n <option key={sz} value={sz}>\n {sz} {itemsPerPageText}\n </option>\n ))}\n </select>\n )}\n\n {/* Pagination Controls */}\n <div className={dJoin} data-testid={getTestId('controls')}>\n {/* First */}\n <button\n className={`${dJoinItem} ${dBtn} ${sizeClass}`}\n onClick={() => handlePageChange(1)}\n disabled={disabled || current === 1}\n aria-label=\"First page\"\n data-testid={getTestId('first')}\n >\n «\n </button>\n\n {/* Previous */}\n <button\n className={`${dJoinItem} ${dBtn} ${sizeClass}`}\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n aria-label={l.prev ?? 'Previous'}\n data-testid={getTestId('prev')}\n >\n ‹\n </button>\n\n {/* Page Numbers */}\n {getPageNumbers().map((page, index) => {\n if (page === 'ellipsis') {\n return (\n <button key={`ellipsis-${index}`} className={`${dJoinItem} ${dBtn} ${dBtnDisabled} ${sizeClass}`}>\n ...\n </button>\n )\n }\n\n return (\n <button\n key={page}\n className={`${dJoinItem} ${dBtn} ${sizeClass} ${current === page ? dBtnActive : ''}`}\n onClick={() => handlePageChange(page)}\n disabled={disabled}\n data-testid={getTestId(`page-${page}`)}\n aria-current={current === page ? 'page' : undefined}\n >\n {page}\n </button>\n )\n })}\n\n {/* Next */}\n <button\n className={`${dJoinItem} ${dBtn} ${sizeClass}`}\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n aria-label={l.next ?? 'Next'}\n data-testid={getTestId('next')}\n >\n ›\n </button>\n\n {/* Last */}\n <button\n className={`${dJoinItem} ${dBtn} ${sizeClass}`}\n onClick={() => handlePageChange(totalPages)}\n disabled={disabled || current === totalPages}\n aria-label=\"Last page\"\n data-testid={getTestId('last')}\n >\n »\n </button>\n </div>\n\n {/* Quick Jumper */}\n {showQuickJumper && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm\">{goToText}</span>\n <input\n type=\"number\"\n className={`${dInput} w-16 ${sizeClass}`}\n min={1}\n max={totalPages}\n value={jumpPage}\n onChange={(e) => setJumpPage(e.target.value)}\n onKeyDown={handleJumpPage}\n disabled={disabled}\n placeholder={String(current)}\n data-testid={getTestId('jumper')}\n />\n </div>\n )}\n </div>\n )\n})\n"],"names":["dBtn","dBtnGhost","dBtnActive","dBtnDisabled","dBtnXs","dBtnSm","dBtnLg","dBtnXl","dSelect","dSelectBordered","dJoin","dJoinItem","dInput","Pagination","forwardRef","controlledCurrent","defaultCurrent","total","controlledPageSize","defaultPageSize","pageSizeOptions","onChange","onShowSizeChange","showSizeChanger","showQuickJumper","showTotal","simple","size","disabled","testId","className","rest","ref","componentSize","locale","useConfig","effectiveSize","getTestId","suffix","l","itemsPerPageText","goToText","internalCurrent","setInternalCurrent","React","internalPageSize","setInternalPageSize","jumpPage","setJumpPage","current","pageSize","totalPages","handlePageChange","page","handlePageSizeChange","newSize","newTotalPages","newCurrent","handleJumpPage","getPageNumbers","pages","i","sizeClass","range","jsxs","jsx","sz","index"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { jsxs as s, jsx as n } from "react/jsx-runtime";
2
2
  import D, { forwardRef as F, useState as v, useRef as C, useEffect as H } from "react";
3
- import { useConfig as J } from "./ConfigProvider.js";
3
+ import { useConfig as J } from "../providers/ConfigProvider.js";
4
4
  const k = "d-btn", w = "d-btn-sm", Q = "d-btn-primary", U = "d-btn-secondary", V = "d-btn-accent", Y = "d-btn-success", Z = "d-btn-warning", _ = "d-btn-error", tt = "d-btn-info", nt = "d-btn-ghost", et = "d-loading", st = "d-loading-spinner", ot = "d-loading-xs", it = F(function({
5
5
  children: f,
6
6
  title: y,
@@ -1 +1 @@
1
- {"version":3,"file":"Popconfirm.js","sources":["../../src/components/Popconfirm.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, forwardRef } from 'react'\nimport { useConfig } from './ConfigProvider'\n\n// DaisyUI classes\nconst dBtn = 'd-btn'\nconst dBtnSm = 'd-btn-sm'\nconst dBtnPrimary = 'd-btn-primary'\nconst dBtnSecondary = 'd-btn-secondary'\nconst dBtnAccent = 'd-btn-accent'\nconst dBtnSuccess = 'd-btn-success'\nconst dBtnWarning = 'd-btn-warning'\nconst dBtnError = 'd-btn-error'\nconst dBtnInfo = 'd-btn-info'\nconst dBtnGhost = 'd-btn-ghost'\nconst dLoading = 'd-loading'\nconst dLoadingSpinner = 'd-loading-spinner'\nconst dLoadingXs = 'd-loading-xs'\n\nexport interface PopconfirmProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n children: React.ReactElement\n title: React.ReactNode\n description?: React.ReactNode\n onConfirm?: () => void | Promise<void>\n onCancel?: () => void\n okText?: string\n cancelText?: string\n okType?: 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'error' | 'info'\n cancelType?: 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'error' | 'info' | 'ghost'\n placement?: 'top' | 'bottom' | 'left' | 'right'\n disabled?: boolean\n icon?: React.ReactNode\n showCancel?: boolean\n /** Test ID prefix for child elements */\n 'data-testid'?: string\n}\n\nexport const Popconfirm = forwardRef<HTMLDivElement, PopconfirmProps>(function Popconfirm(\n {\n children,\n title,\n description,\n onConfirm,\n onCancel,\n okText,\n cancelText,\n okType = 'primary',\n cancelType = 'ghost',\n placement = 'top',\n disabled = false,\n icon,\n showCancel = true,\n 'data-testid': testId,\n className,\n ...rest\n },\n ref\n) {\n const { locale } = useConfig()\n const [isOpen, setIsOpen] = useState(false)\n const [loading, setLoading] = useState(false)\n const containerRef = useRef<HTMLDivElement>(null)\n\n // Resolve locale strings\n const resolvedOkText = okText ?? locale.Popconfirm?.okText ?? 'OK'\n const resolvedCancelText = cancelText ?? locale.Popconfirm?.cancelText ?? 'Cancel'\n\n // Helper for test IDs\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n const popupRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target as Node) &&\n popupRef.current &&\n !popupRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false)\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [isOpen])\n\n const handleTriggerClick = (e: React.MouseEvent) => {\n if (disabled) return\n e.stopPropagation()\n setIsOpen(!isOpen)\n }\n\n const handleConfirm = async () => {\n if (onConfirm) {\n setLoading(true)\n try {\n await onConfirm()\n setIsOpen(false)\n } finally {\n setLoading(false)\n }\n } else {\n setIsOpen(false)\n }\n }\n\n const handleCancel = () => {\n onCancel?.()\n setIsOpen(false)\n }\n\n const getPopupContainerClasses = () => {\n const positions = {\n top: 'bottom-full left-1/2 -translate-x-1/2 mb-3',\n bottom: 'top-full left-1/2 -translate-x-1/2 mt-3',\n left: 'right-full top-1/2 -translate-y-1/2 mr-3',\n right: 'left-full top-1/2 -translate-y-1/2 ml-3',\n }\n\n return `absolute z-50 ${positions[placement]}`\n }\n\n const getPopupClasses = () => {\n return 'bg-base-100 rounded-lg p-4 min-w-[200px] max-w-[300px] shadow-lg'\n }\n\n const getArrowClasses = () => {\n const base = 'absolute w-2.5 h-2.5 bg-base-100 rotate-45 shadow-lg'\n\n const positions = {\n top: 'bottom-[-5px] left-1/2 -translate-x-1/2',\n bottom: 'top-[-5px] left-1/2 -translate-x-1/2',\n left: 'right-[-5px] top-1/2 -translate-y-1/2',\n right: 'left-[-5px] top-1/2 -translate-y-1/2',\n }\n\n return `${base} ${positions[placement]}`\n }\n\n const buttonClasses = {\n primary: dBtnPrimary,\n secondary: dBtnSecondary,\n accent: dBtnAccent,\n success: dBtnSuccess,\n warning: dBtnWarning,\n error: dBtnError,\n info: dBtnInfo,\n ghost: dBtnGhost,\n } as const\n\n const getButtonClass = (type: keyof typeof buttonClasses) => {\n return buttonClasses[type]\n }\n\n const defaultIcon = (\n <svg\n className=\"w-5 h-5 text-warning\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n )\n\n return (\n <div ref={ref || containerRef} className={`relative inline-block ${className || ''}`} data-state={isOpen ? 'open' : 'closed'} data-testid={testId} {...rest}>\n {React.cloneElement(children, {\n onClick: (e: React.MouseEvent) => {\n handleTriggerClick(e)\n const originalOnClick = (children.props as any)?.onClick\n if (originalOnClick) {\n originalOnClick(e)\n }\n },\n } as any)}\n\n {isOpen && (\n <div className={getPopupContainerClasses()} data-testid={getTestId('popup')}>\n <div ref={popupRef} className={getPopupClasses()}>\n <div className=\"flex gap-3 relative z-10\">\n <div className=\"flex-shrink-0 mt-0.5\">\n {icon !== undefined ? icon : defaultIcon}\n </div>\n <div className=\"flex-1\">\n <div className=\"font-semibold text-base-content mb-1\" data-testid={getTestId('title')}>{title}</div>\n {description && (\n <div className=\"text-sm text-base-content/70 mb-3\" data-testid={getTestId('description')}>{description}</div>\n )}\n <div className=\"flex justify-end gap-2 mt-3\">\n {showCancel && (\n <button\n className={`${dBtn} ${dBtnSm} ${getButtonClass(cancelType)}`}\n onClick={handleCancel}\n disabled={loading}\n data-testid={getTestId('cancel-button')}\n >\n {resolvedCancelText}\n </button>\n )}\n <button\n className={`${dBtn} ${dBtnSm} ${getButtonClass(okType)}`}\n onClick={handleConfirm}\n disabled={loading}\n data-testid={getTestId('ok-button')}\n >\n {loading && <span className={`${dLoading} ${dLoadingSpinner} ${dLoadingXs}`}></span>}\n {resolvedOkText}\n </button>\n </div>\n </div>\n </div>\n <div className={getArrowClasses()} />\n </div>\n </div>\n )}\n </div>\n )\n})\n"],"names":["dBtn","dBtnSm","dBtnPrimary","dBtnSecondary","dBtnAccent","dBtnSuccess","dBtnWarning","dBtnError","dBtnInfo","dBtnGhost","dLoading","dLoadingSpinner","dLoadingXs","Popconfirm","forwardRef","children","title","description","onConfirm","onCancel","okText","cancelText","okType","cancelType","placement","disabled","icon","showCancel","testId","className","rest","ref","locale","useConfig","isOpen","setIsOpen","useState","loading","setLoading","containerRef","useRef","resolvedOkText","resolvedCancelText","getTestId","suffix","popupRef","useEffect","handleClickOutside","event","handleTriggerClick","e","handleConfirm","handleCancel","getPopupContainerClasses","getPopupClasses","getArrowClasses","buttonClasses","getButtonClass","type","defaultIcon","jsx","React","originalOnClick","jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"Popconfirm.js","sources":["../../src/components/Popconfirm.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, forwardRef } from 'react'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dBtn = 'd-btn'\nconst dBtnSm = 'd-btn-sm'\nconst dBtnPrimary = 'd-btn-primary'\nconst dBtnSecondary = 'd-btn-secondary'\nconst dBtnAccent = 'd-btn-accent'\nconst dBtnSuccess = 'd-btn-success'\nconst dBtnWarning = 'd-btn-warning'\nconst dBtnError = 'd-btn-error'\nconst dBtnInfo = 'd-btn-info'\nconst dBtnGhost = 'd-btn-ghost'\nconst dLoading = 'd-loading'\nconst dLoadingSpinner = 'd-loading-spinner'\nconst dLoadingXs = 'd-loading-xs'\n\nexport interface PopconfirmProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n children: React.ReactElement\n title: React.ReactNode\n description?: React.ReactNode\n onConfirm?: () => void | Promise<void>\n onCancel?: () => void\n okText?: string\n cancelText?: string\n okType?: 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'error' | 'info'\n cancelType?: 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'error' | 'info' | 'ghost'\n placement?: 'top' | 'bottom' | 'left' | 'right'\n disabled?: boolean\n icon?: React.ReactNode\n showCancel?: boolean\n /** Test ID prefix for child elements */\n 'data-testid'?: string\n}\n\nexport const Popconfirm = forwardRef<HTMLDivElement, PopconfirmProps>(function Popconfirm(\n {\n children,\n title,\n description,\n onConfirm,\n onCancel,\n okText,\n cancelText,\n okType = 'primary',\n cancelType = 'ghost',\n placement = 'top',\n disabled = false,\n icon,\n showCancel = true,\n 'data-testid': testId,\n className,\n ...rest\n },\n ref\n) {\n const { locale } = useConfig()\n const [isOpen, setIsOpen] = useState(false)\n const [loading, setLoading] = useState(false)\n const containerRef = useRef<HTMLDivElement>(null)\n\n // Resolve locale strings\n const resolvedOkText = okText ?? locale.Popconfirm?.okText ?? 'OK'\n const resolvedCancelText = cancelText ?? locale.Popconfirm?.cancelText ?? 'Cancel'\n\n // Helper for test IDs\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n const popupRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target as Node) &&\n popupRef.current &&\n !popupRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false)\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [isOpen])\n\n const handleTriggerClick = (e: React.MouseEvent) => {\n if (disabled) return\n e.stopPropagation()\n setIsOpen(!isOpen)\n }\n\n const handleConfirm = async () => {\n if (onConfirm) {\n setLoading(true)\n try {\n await onConfirm()\n setIsOpen(false)\n } finally {\n setLoading(false)\n }\n } else {\n setIsOpen(false)\n }\n }\n\n const handleCancel = () => {\n onCancel?.()\n setIsOpen(false)\n }\n\n const getPopupContainerClasses = () => {\n const positions = {\n top: 'bottom-full left-1/2 -translate-x-1/2 mb-3',\n bottom: 'top-full left-1/2 -translate-x-1/2 mt-3',\n left: 'right-full top-1/2 -translate-y-1/2 mr-3',\n right: 'left-full top-1/2 -translate-y-1/2 ml-3',\n }\n\n return `absolute z-50 ${positions[placement]}`\n }\n\n const getPopupClasses = () => {\n return 'bg-base-100 rounded-lg p-4 min-w-[200px] max-w-[300px] shadow-lg'\n }\n\n const getArrowClasses = () => {\n const base = 'absolute w-2.5 h-2.5 bg-base-100 rotate-45 shadow-lg'\n\n const positions = {\n top: 'bottom-[-5px] left-1/2 -translate-x-1/2',\n bottom: 'top-[-5px] left-1/2 -translate-x-1/2',\n left: 'right-[-5px] top-1/2 -translate-y-1/2',\n right: 'left-[-5px] top-1/2 -translate-y-1/2',\n }\n\n return `${base} ${positions[placement]}`\n }\n\n const buttonClasses = {\n primary: dBtnPrimary,\n secondary: dBtnSecondary,\n accent: dBtnAccent,\n success: dBtnSuccess,\n warning: dBtnWarning,\n error: dBtnError,\n info: dBtnInfo,\n ghost: dBtnGhost,\n } as const\n\n const getButtonClass = (type: keyof typeof buttonClasses) => {\n return buttonClasses[type]\n }\n\n const defaultIcon = (\n <svg\n className=\"w-5 h-5 text-warning\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n )\n\n return (\n <div ref={ref || containerRef} className={`relative inline-block ${className || ''}`} data-state={isOpen ? 'open' : 'closed'} data-testid={testId} {...rest}>\n {React.cloneElement(children, {\n onClick: (e: React.MouseEvent) => {\n handleTriggerClick(e)\n const originalOnClick = (children.props as any)?.onClick\n if (originalOnClick) {\n originalOnClick(e)\n }\n },\n } as any)}\n\n {isOpen && (\n <div className={getPopupContainerClasses()} data-testid={getTestId('popup')}>\n <div ref={popupRef} className={getPopupClasses()}>\n <div className=\"flex gap-3 relative z-10\">\n <div className=\"flex-shrink-0 mt-0.5\">\n {icon !== undefined ? icon : defaultIcon}\n </div>\n <div className=\"flex-1\">\n <div className=\"font-semibold text-base-content mb-1\" data-testid={getTestId('title')}>{title}</div>\n {description && (\n <div className=\"text-sm text-base-content/70 mb-3\" data-testid={getTestId('description')}>{description}</div>\n )}\n <div className=\"flex justify-end gap-2 mt-3\">\n {showCancel && (\n <button\n className={`${dBtn} ${dBtnSm} ${getButtonClass(cancelType)}`}\n onClick={handleCancel}\n disabled={loading}\n data-testid={getTestId('cancel-button')}\n >\n {resolvedCancelText}\n </button>\n )}\n <button\n className={`${dBtn} ${dBtnSm} ${getButtonClass(okType)}`}\n onClick={handleConfirm}\n disabled={loading}\n data-testid={getTestId('ok-button')}\n >\n {loading && <span className={`${dLoading} ${dLoadingSpinner} ${dLoadingXs}`}></span>}\n {resolvedOkText}\n </button>\n </div>\n </div>\n </div>\n <div className={getArrowClasses()} />\n </div>\n </div>\n )}\n </div>\n )\n})\n"],"names":["dBtn","dBtnSm","dBtnPrimary","dBtnSecondary","dBtnAccent","dBtnSuccess","dBtnWarning","dBtnError","dBtnInfo","dBtnGhost","dLoading","dLoadingSpinner","dLoadingXs","Popconfirm","forwardRef","children","title","description","onConfirm","onCancel","okText","cancelText","okType","cancelType","placement","disabled","icon","showCancel","testId","className","rest","ref","locale","useConfig","isOpen","setIsOpen","useState","loading","setLoading","containerRef","useRef","resolvedOkText","resolvedCancelText","getTestId","suffix","popupRef","useEffect","handleClickOutside","event","handleTriggerClick","e","handleConfirm","handleCancel","getPopupContainerClasses","getPopupClasses","getArrowClasses","buttonClasses","getButtonClass","type","defaultIcon","jsx","React","originalOnClick","jsxs"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { jsx as d, jsxs as z } from "react/jsx-runtime";
2
2
  import b, { forwardRef as G, useContext as V, createContext as v } from "react";
3
- import { useConfig as w } from "./ConfigProvider.js";
3
+ import { useConfig as w } from "../providers/ConfigProvider.js";
4
4
  const I = "d-radio", P = "d-radio-xs", X = "d-radio-sm", A = "d-radio-md", B = "d-radio-lg", E = "d-radio-xl", L = "d-radio-neutral", M = "d-radio-primary", O = "d-radio-secondary", W = "d-radio-accent", $ = "d-radio-info", q = "d-radio-success", D = "d-radio-warning", F = "d-radio-error", g = v(null);
5
5
  function H({ children: s, value: n, defaultValue: i, onChange: o, name: t, className: c = "" }) {
6
6
  const [l, e] = b.useState(i), m = n !== void 0 ? n : l, u = (r) => {
@@ -1 +1 @@
1
- {"version":3,"file":"Radio.js","sources":["../../src/components/Radio.tsx"],"sourcesContent":["import React, { forwardRef, createContext, useContext } from 'react'\nimport { useConfig } from './ConfigProvider'\n\n// DaisyUI classes\nconst dRadio = 'd-radio'\nconst dRadioXs = 'd-radio-xs'\nconst dRadioSm = 'd-radio-sm'\nconst dRadioMd = 'd-radio-md'\nconst dRadioLg = 'd-radio-lg'\nconst dRadioXl = 'd-radio-xl'\nconst dRadioNeutral = 'd-radio-neutral'\nconst dRadioPrimary = 'd-radio-primary'\nconst dRadioSecondary = 'd-radio-secondary'\nconst dRadioAccent = 'd-radio-accent'\nconst dRadioInfo = 'd-radio-info'\nconst dRadioSuccess = 'd-radio-success'\nconst dRadioWarning = 'd-radio-warning'\nconst dRadioError = 'd-radio-error'\n\nexport interface RadioProps 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 className?: string\n children?: React.ReactNode\n}\n\nexport interface RadioGroupChangeEvent {\n target: {\n value: string | number\n name?: string\n }\n}\n\nexport interface RadioGroupProps {\n children: React.ReactNode\n value?: string | number\n defaultValue?: string | number\n onChange?: (e: RadioGroupChangeEvent) => void\n name?: string\n className?: string\n}\n\ninterface RadioGroupContextValue {\n value?: string | number\n onChange?: (value: string | number) => void\n name?: string\n}\n\nconst RadioGroupContext = createContext<RadioGroupContextValue | null>(null)\n\nfunction RadioGroup({ children, value, defaultValue, onChange, name, className = '' }: RadioGroupProps) {\n const [internalValue, setInternalValue] = React.useState(defaultValue)\n const currentValue = value !== undefined ? value : internalValue\n\n const handleChange = (newValue: string | number) => {\n if (value === undefined) {\n setInternalValue(newValue)\n }\n onChange?.({ target: { value: newValue, name } })\n }\n\n return (\n <RadioGroupContext.Provider value={{ value: currentValue, onChange: handleChange, name }}>\n <div role=\"radiogroup\" className={className}>{children}</div>\n </RadioGroupContext.Provider>\n )\n}\n\nconst RadioRoot = forwardRef<HTMLInputElement, RadioProps>(\n ({ size, color, className = '', value, checked, onChange, name: nameProp, children, ...props }, ref) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n const groupContext = useContext(RadioGroupContext)\n\n const sizeClasses = {\n xs: dRadioXs,\n sm: dRadioSm,\n md: dRadioMd,\n lg: dRadioLg,\n xl: dRadioXl,\n }\n\n const colorClasses = {\n neutral: dRadioNeutral,\n primary: dRadioPrimary,\n secondary: dRadioSecondary,\n accent: dRadioAccent,\n info: dRadioInfo,\n success: dRadioSuccess,\n warning: dRadioWarning,\n error: dRadioError,\n }\n\n const radioClasses = [dRadio, effectiveSize && sizeClasses[effectiveSize], color && colorClasses[color]]\n .filter(Boolean)\n .join(' ')\n\n // If in a group, use group's value and onChange\n const isChecked = groupContext ? groupContext.value === value : checked\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (groupContext && value !== undefined) {\n const normalizedValue = typeof value === 'string' || typeof value === 'number' ? value : String(value)\n groupContext.onChange?.(normalizedValue)\n }\n onChange?.(e)\n }\n const name = groupContext?.name || nameProp\n\n const dataState = isChecked ? 'checked' : 'unchecked'\n\n const input = (\n <input\n ref={ref}\n type=\"radio\"\n className={radioClasses}\n value={value}\n checked={isChecked}\n onChange={handleChange}\n name={name}\n data-state={dataState}\n {...props}\n />\n )\n\n // If children are provided, wrap in a label\n if (children) {\n return (\n <label className={`flex items-center gap-2 cursor-pointer ${className}`}>\n <span className=\"flex-shrink-0\">{input}</span>\n <span>{children}</span>\n </label>\n )\n }\n\n return input\n }\n)\n\nRadioRoot.displayName = 'Radio'\n\nexport const Radio = Object.assign(RadioRoot, {\n Group: RadioGroup,\n})\n"],"names":["dRadio","dRadioXs","dRadioSm","dRadioMd","dRadioLg","dRadioXl","dRadioNeutral","dRadioPrimary","dRadioSecondary","dRadioAccent","dRadioInfo","dRadioSuccess","dRadioWarning","dRadioError","RadioGroupContext","createContext","RadioGroup","children","value","defaultValue","onChange","name","className","internalValue","setInternalValue","React","currentValue","handleChange","newValue","jsx","RadioRoot","forwardRef","size","color","checked","nameProp","props","ref","componentSize","useConfig","effectiveSize","groupContext","useContext","sizeClasses","colorClasses","radioClasses","isChecked","e","normalizedValue","input","jsxs","Radio"],"mappings":"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"}
1
+ {"version":3,"file":"Radio.js","sources":["../../src/components/Radio.tsx"],"sourcesContent":["import React, { forwardRef, createContext, useContext } from 'react'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dRadio = 'd-radio'\nconst dRadioXs = 'd-radio-xs'\nconst dRadioSm = 'd-radio-sm'\nconst dRadioMd = 'd-radio-md'\nconst dRadioLg = 'd-radio-lg'\nconst dRadioXl = 'd-radio-xl'\nconst dRadioNeutral = 'd-radio-neutral'\nconst dRadioPrimary = 'd-radio-primary'\nconst dRadioSecondary = 'd-radio-secondary'\nconst dRadioAccent = 'd-radio-accent'\nconst dRadioInfo = 'd-radio-info'\nconst dRadioSuccess = 'd-radio-success'\nconst dRadioWarning = 'd-radio-warning'\nconst dRadioError = 'd-radio-error'\n\nexport interface RadioProps 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 className?: string\n children?: React.ReactNode\n}\n\nexport interface RadioGroupChangeEvent {\n target: {\n value: string | number\n name?: string\n }\n}\n\nexport interface RadioGroupProps {\n children: React.ReactNode\n value?: string | number\n defaultValue?: string | number\n onChange?: (e: RadioGroupChangeEvent) => void\n name?: string\n className?: string\n}\n\ninterface RadioGroupContextValue {\n value?: string | number\n onChange?: (value: string | number) => void\n name?: string\n}\n\nconst RadioGroupContext = createContext<RadioGroupContextValue | null>(null)\n\nfunction RadioGroup({ children, value, defaultValue, onChange, name, className = '' }: RadioGroupProps) {\n const [internalValue, setInternalValue] = React.useState(defaultValue)\n const currentValue = value !== undefined ? value : internalValue\n\n const handleChange = (newValue: string | number) => {\n if (value === undefined) {\n setInternalValue(newValue)\n }\n onChange?.({ target: { value: newValue, name } })\n }\n\n return (\n <RadioGroupContext.Provider value={{ value: currentValue, onChange: handleChange, name }}>\n <div role=\"radiogroup\" className={className}>{children}</div>\n </RadioGroupContext.Provider>\n )\n}\n\nconst RadioRoot = forwardRef<HTMLInputElement, RadioProps>(\n ({ size, color, className = '', value, checked, onChange, name: nameProp, children, ...props }, ref) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n const groupContext = useContext(RadioGroupContext)\n\n const sizeClasses = {\n xs: dRadioXs,\n sm: dRadioSm,\n md: dRadioMd,\n lg: dRadioLg,\n xl: dRadioXl,\n }\n\n const colorClasses = {\n neutral: dRadioNeutral,\n primary: dRadioPrimary,\n secondary: dRadioSecondary,\n accent: dRadioAccent,\n info: dRadioInfo,\n success: dRadioSuccess,\n warning: dRadioWarning,\n error: dRadioError,\n }\n\n const radioClasses = [dRadio, effectiveSize && sizeClasses[effectiveSize], color && colorClasses[color]]\n .filter(Boolean)\n .join(' ')\n\n // If in a group, use group's value and onChange\n const isChecked = groupContext ? groupContext.value === value : checked\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (groupContext && value !== undefined) {\n const normalizedValue = typeof value === 'string' || typeof value === 'number' ? value : String(value)\n groupContext.onChange?.(normalizedValue)\n }\n onChange?.(e)\n }\n const name = groupContext?.name || nameProp\n\n const dataState = isChecked ? 'checked' : 'unchecked'\n\n const input = (\n <input\n ref={ref}\n type=\"radio\"\n className={radioClasses}\n value={value}\n checked={isChecked}\n onChange={handleChange}\n name={name}\n data-state={dataState}\n {...props}\n />\n )\n\n // If children are provided, wrap in a label\n if (children) {\n return (\n <label className={`flex items-center gap-2 cursor-pointer ${className}`}>\n <span className=\"flex-shrink-0\">{input}</span>\n <span>{children}</span>\n </label>\n )\n }\n\n return input\n }\n)\n\nRadioRoot.displayName = 'Radio'\n\nexport const Radio = Object.assign(RadioRoot, {\n Group: RadioGroup,\n})\n"],"names":["dRadio","dRadioXs","dRadioSm","dRadioMd","dRadioLg","dRadioXl","dRadioNeutral","dRadioPrimary","dRadioSecondary","dRadioAccent","dRadioInfo","dRadioSuccess","dRadioWarning","dRadioError","RadioGroupContext","createContext","RadioGroup","children","value","defaultValue","onChange","name","className","internalValue","setInternalValue","React","currentValue","handleChange","newValue","jsx","RadioRoot","forwardRef","size","color","checked","nameProp","props","ref","componentSize","useConfig","effectiveSize","groupContext","useContext","sizeClasses","colorClasses","radioClasses","isChecked","e","normalizedValue","input","jsxs","Radio"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { jsxs as V, jsx as s } from "react/jsx-runtime";
2
2
  import { useState as b } from "react";
3
- import { useConfig as j } from "./ConfigProvider.js";
3
+ import { useConfig as j } from "../providers/ConfigProvider.js";
4
4
  const $ = "d-range", A = "d-range-xs", I = "d-range-sm", M = "d-range-md", X = "d-range-lg", E = "d-range-xl", F = "d-range-primary", L = "d-range-secondary", P = "d-range-accent", W = "d-range-success", _ = "d-range-warning", k = "d-range-info", q = "d-range-error", H = ({
5
5
  value: a,
6
6
  defaultValue: i = 50,