asterui 0.12.49 → 0.12.50

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 (200) hide show
  1. package/dist/components/Alert.js +18 -18
  2. package/dist/components/Alert.js.map +1 -1
  3. package/dist/components/Anchor.js +53 -53
  4. package/dist/components/Anchor.js.map +1 -1
  5. package/dist/components/Autocomplete.js +115 -114
  6. package/dist/components/Autocomplete.js.map +1 -1
  7. package/dist/components/Avatar.js +33 -32
  8. package/dist/components/Avatar.js.map +1 -1
  9. package/dist/components/Badge.js +99 -99
  10. package/dist/components/Badge.js.map +1 -1
  11. package/dist/components/Breadcrumb.js +12 -11
  12. package/dist/components/Breadcrumb.js.map +1 -1
  13. package/dist/components/Browser.js +10 -10
  14. package/dist/components/Browser.js.map +1 -1
  15. package/dist/components/Button.js +80 -79
  16. package/dist/components/Button.js.map +1 -1
  17. package/dist/components/Card.d.ts +2 -0
  18. package/dist/components/Card.js +111 -110
  19. package/dist/components/Card.js.map +1 -1
  20. package/dist/components/Carousel.js +59 -59
  21. package/dist/components/Carousel.js.map +1 -1
  22. package/dist/components/Cascader.js +175 -174
  23. package/dist/components/Cascader.js.map +1 -1
  24. package/dist/components/Chat.js +27 -27
  25. package/dist/components/Chat.js.map +1 -1
  26. package/dist/components/Checkbox.js +98 -97
  27. package/dist/components/Checkbox.js.map +1 -1
  28. package/dist/components/Code.js +11 -11
  29. package/dist/components/Code.js.map +1 -1
  30. package/dist/components/Collapse.js +46 -46
  31. package/dist/components/Collapse.js.map +1 -1
  32. package/dist/components/ColorPicker.d.ts +1 -1
  33. package/dist/components/ColorPicker.js +93 -91
  34. package/dist/components/ColorPicker.js.map +1 -1
  35. package/dist/components/Command.js +120 -120
  36. package/dist/components/Command.js.map +1 -1
  37. package/dist/components/ConfigProvider.d.ts +1 -1
  38. package/dist/components/ConfigProvider.js +9 -9
  39. package/dist/components/ConfigProvider.js.map +1 -1
  40. package/dist/components/ContextMenu.js +33 -33
  41. package/dist/components/ContextMenu.js.map +1 -1
  42. package/dist/components/CopyButton.js +74 -73
  43. package/dist/components/CopyButton.js.map +1 -1
  44. package/dist/components/Countdown.js +60 -59
  45. package/dist/components/Countdown.js.map +1 -1
  46. package/dist/components/DatePicker.d.ts +1 -1
  47. package/dist/components/DatePicker.js +54 -53
  48. package/dist/components/DatePicker.js.map +1 -1
  49. package/dist/components/Diff.js +10 -10
  50. package/dist/components/Diff.js.map +1 -1
  51. package/dist/components/Divider.js +21 -20
  52. package/dist/components/Divider.js.map +1 -1
  53. package/dist/components/Dock.js +28 -27
  54. package/dist/components/Dock.js.map +1 -1
  55. package/dist/components/Drawer.js +43 -43
  56. package/dist/components/Drawer.js.map +1 -1
  57. package/dist/components/Dropdown.js +127 -127
  58. package/dist/components/Dropdown.js.map +1 -1
  59. package/dist/components/Empty.js +16 -15
  60. package/dist/components/Empty.js.map +1 -1
  61. package/dist/components/Fieldset.js +11 -10
  62. package/dist/components/Fieldset.js.map +1 -1
  63. package/dist/components/FileInput.js +30 -29
  64. package/dist/components/FileInput.js.map +1 -1
  65. package/dist/components/Filter.d.ts +1 -1
  66. package/dist/components/Filter.js +32 -30
  67. package/dist/components/Filter.js.map +1 -1
  68. package/dist/components/FloatButton.js +83 -83
  69. package/dist/components/FloatButton.js.map +1 -1
  70. package/dist/components/Footer.js +14 -13
  71. package/dist/components/Footer.js.map +1 -1
  72. package/dist/components/Form.js +133 -132
  73. package/dist/components/Form.js.map +1 -1
  74. package/dist/components/Hero.js +12 -11
  75. package/dist/components/Hero.js.map +1 -1
  76. package/dist/components/HoverGallery.js +7 -7
  77. package/dist/components/HoverGallery.js.map +1 -1
  78. package/dist/components/Image.js +40 -40
  79. package/dist/components/Image.js.map +1 -1
  80. package/dist/components/Input.js +171 -169
  81. package/dist/components/Input.js.map +1 -1
  82. package/dist/components/InputNumber.js +84 -83
  83. package/dist/components/InputNumber.js.map +1 -1
  84. package/dist/components/Join.js +11 -10
  85. package/dist/components/Join.js.map +1 -1
  86. package/dist/components/Kbd.js +15 -15
  87. package/dist/components/Kbd.js.map +1 -1
  88. package/dist/components/Layout.js +66 -66
  89. package/dist/components/Layout.js.map +1 -1
  90. package/dist/components/List.d.ts +1 -1
  91. package/dist/components/List.js +75 -72
  92. package/dist/components/List.js.map +1 -1
  93. package/dist/components/Loading.d.ts +1 -1
  94. package/dist/components/Loading.js +31 -29
  95. package/dist/components/Loading.js.map +1 -1
  96. package/dist/components/Mask.js +31 -31
  97. package/dist/components/Mask.js.map +1 -1
  98. package/dist/components/Mention.js +61 -61
  99. package/dist/components/Mention.js.map +1 -1
  100. package/dist/components/Menu.js +84 -84
  101. package/dist/components/Menu.js.map +1 -1
  102. package/dist/components/Message.js +30 -29
  103. package/dist/components/Message.js.map +1 -1
  104. package/dist/components/Modal.js +117 -116
  105. package/dist/components/Modal.js.map +1 -1
  106. package/dist/components/MonthCalendar.d.ts +31 -0
  107. package/dist/components/MonthCalendar.js +205 -0
  108. package/dist/components/MonthCalendar.js.map +1 -0
  109. package/dist/components/Navbar.js +25 -25
  110. package/dist/components/Navbar.js.map +1 -1
  111. package/dist/components/Notification.js +56 -55
  112. package/dist/components/Notification.js.map +1 -1
  113. package/dist/components/OTPInput.js +69 -68
  114. package/dist/components/OTPInput.js.map +1 -1
  115. package/dist/components/Pagination.d.ts +1 -1
  116. package/dist/components/Pagination.js +60 -58
  117. package/dist/components/Pagination.js.map +1 -1
  118. package/dist/components/Phone.js +10 -10
  119. package/dist/components/Phone.js.map +1 -1
  120. package/dist/components/Popconfirm.js +60 -60
  121. package/dist/components/Popconfirm.js.map +1 -1
  122. package/dist/components/Progress.js +17 -17
  123. package/dist/components/Progress.js.map +1 -1
  124. package/dist/components/QRCode.js +23 -23
  125. package/dist/components/QRCode.js.map +1 -1
  126. package/dist/components/RadialProgress.js +17 -17
  127. package/dist/components/RadialProgress.js.map +1 -1
  128. package/dist/components/Radio.js +41 -40
  129. package/dist/components/Radio.js.map +1 -1
  130. package/dist/components/Range.d.ts +1 -1
  131. package/dist/components/Range.js +39 -37
  132. package/dist/components/Range.js.map +1 -1
  133. package/dist/components/Rating.js +79 -78
  134. package/dist/components/Rating.js.map +1 -1
  135. package/dist/components/ResponsiveDrawer.js +27 -27
  136. package/dist/components/ResponsiveDrawer.js.map +1 -1
  137. package/dist/components/RichTextEditor.d.ts +32 -0
  138. package/dist/components/RichTextEditor.js +335 -0
  139. package/dist/components/RichTextEditor.js.map +1 -0
  140. package/dist/components/Segmented.d.ts +1 -1
  141. package/dist/components/Segmented.js +48 -46
  142. package/dist/components/Segmented.js.map +1 -1
  143. package/dist/components/Select.js +55 -54
  144. package/dist/components/Select.js.map +1 -1
  145. package/dist/components/Skeleton.js +9 -9
  146. package/dist/components/Skeleton.js.map +1 -1
  147. package/dist/components/Splitter.js +93 -93
  148. package/dist/components/Splitter.js.map +1 -1
  149. package/dist/components/Stat.js +17 -16
  150. package/dist/components/Stat.js.map +1 -1
  151. package/dist/components/Status.js +29 -29
  152. package/dist/components/Status.js.map +1 -1
  153. package/dist/components/Steps.js +61 -61
  154. package/dist/components/Steps.js.map +1 -1
  155. package/dist/components/Table.js +256 -256
  156. package/dist/components/Table.js.map +1 -1
  157. package/dist/components/Tabs.js +65 -65
  158. package/dist/components/Tabs.js.map +1 -1
  159. package/dist/components/Tag.js +147 -147
  160. package/dist/components/Tag.js.map +1 -1
  161. package/dist/components/TextRotate.js +6 -6
  162. package/dist/components/TextRotate.js.map +1 -1
  163. package/dist/components/Textarea.js +35 -34
  164. package/dist/components/Textarea.js.map +1 -1
  165. package/dist/components/ThemeController.d.ts +1 -1
  166. package/dist/components/ThemeController.js +71 -68
  167. package/dist/components/ThemeController.js.map +1 -1
  168. package/dist/components/TimePicker.d.ts +1 -1
  169. package/dist/components/TimePicker.js +133 -129
  170. package/dist/components/TimePicker.js.map +1 -1
  171. package/dist/components/Timeline.js +79 -79
  172. package/dist/components/Timeline.js.map +1 -1
  173. package/dist/components/Toggle.js +33 -32
  174. package/dist/components/Toggle.js.map +1 -1
  175. package/dist/components/Tooltip.js +25 -25
  176. package/dist/components/Tooltip.js.map +1 -1
  177. package/dist/components/Tour.js +126 -126
  178. package/dist/components/Tour.js.map +1 -1
  179. package/dist/components/Transfer.js +93 -92
  180. package/dist/components/Transfer.js.map +1 -1
  181. package/dist/components/Tree.js +200 -200
  182. package/dist/components/Tree.js.map +1 -1
  183. package/dist/components/TreeSelect.js +255 -254
  184. package/dist/components/TreeSelect.js.map +1 -1
  185. package/dist/components/Typography.js +71 -70
  186. package/dist/components/Typography.js.map +1 -1
  187. package/dist/components/Upload.js +81 -81
  188. package/dist/components/Upload.js.map +1 -1
  189. package/dist/components/WeekCalendar.d.ts +35 -0
  190. package/dist/components/WeekCalendar.js +204 -0
  191. package/dist/components/WeekCalendar.js.map +1 -0
  192. package/dist/components/Window.js +7 -7
  193. package/dist/components/Window.js.map +1 -1
  194. package/dist/editor.d.ts +1 -0
  195. package/dist/editor.js +5 -0
  196. package/dist/editor.js.map +1 -0
  197. package/dist/index.d.ts +4 -0
  198. package/dist/index.js +211 -207
  199. package/dist/index.js.map +1 -1
  200. package/package.json +30 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Autocomplete.js","sources":["../../src/components/Autocomplete.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useId } from 'react'\n\nexport interface AutocompleteOption {\n value: string\n label: string\n disabled?: boolean\n}\n\nexport interface AutocompleteProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'onSelect'> {\n value?: string\n defaultValue?: string\n onChange?: (value: string) => void\n onSelect?: (value: string, option: AutocompleteOption) => void\n onSearch?: (value: string) => void\n options: AutocompleteOption[] | string[]\n placeholder?: string\n disabled?: boolean\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n color?: 'neutral' | 'primary' | 'secondary' | 'accent' | 'info' | 'success' | 'warning' | 'error'\n /** Validation status */\n status?: 'error' | 'warning'\n allowCustomValue?: boolean\n filterOption?: (option: AutocompleteOption, inputValue: string) => boolean\n notFoundContent?: React.ReactNode\n /** Show clear button when input has value */\n allowClear?: boolean | { clearIcon?: React.ReactNode }\n /** Callback when clear button is clicked */\n onClear?: () => void\n /** Controlled open state */\n open?: boolean\n /** Default open state */\n defaultOpen?: boolean\n /** Callback when open state changes */\n onOpenChange?: (open: boolean) => void\n /** Activate first option by default */\n defaultActiveFirstOption?: boolean\n}\n\n// Clear icon component\nconst ClearIcon: React.FC<{ onClick: (e: React.MouseEvent) => void; className?: string }> = ({ onClick, className }) => (\n <button\n type=\"button\"\n onClick={onClick}\n className={`flex items-center justify-center opacity-50 hover:opacity-100 transition-opacity ${className || ''}`}\n aria-label=\"Clear input\"\n tabIndex={-1}\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n)\n\nexport const Autocomplete: React.FC<AutocompleteProps> = ({\n value,\n defaultValue = '',\n onChange,\n onSelect,\n onSearch,\n options: rawOptions,\n placeholder = 'Type to search...',\n disabled = false,\n size = 'md',\n color,\n status,\n className = '',\n allowCustomValue = true,\n filterOption,\n notFoundContent = 'No results found',\n allowClear,\n onClear,\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n defaultActiveFirstOption = true,\n ...rest\n}) => {\n // Generate unique IDs for ARIA\n const baseId = useId()\n const inputId = `${baseId}-input`\n const listboxId = `${baseId}-listbox`\n\n // Normalize options to AutocompleteOption[]\n const options: AutocompleteOption[] = rawOptions.map((opt) =>\n typeof opt === 'string' ? { value: opt, label: opt } : opt\n )\n\n const [inputValue, setInputValue] = useState(defaultValue)\n const [internalOpen, setInternalOpen] = useState(defaultOpen)\n const [highlightedIndex, setHighlightedIndex] = useState(-1)\n const inputRef = useRef<HTMLInputElement>(null)\n const dropdownRef = useRef<HTMLUListElement>(null)\n\n // Determine if open state is controlled\n const isOpenControlled = controlledOpen !== undefined\n const isOpen = isOpenControlled ? controlledOpen : internalOpen\n\n const setIsOpen = (newOpen: boolean) => {\n if (!isOpenControlled) {\n setInternalOpen(newOpen)\n }\n onOpenChange?.(newOpen)\n }\n\n // Update input value when controlled value changes\n useEffect(() => {\n if (value !== undefined) {\n const selectedOption = options.find((opt) => opt.value === value)\n setInputValue(selectedOption?.label || value)\n }\n }, [value, options])\n\n // Filter options based on input\n const defaultFilter = (option: AutocompleteOption, input: string) =>\n option.label.toLowerCase().includes(input.toLowerCase())\n\n const filteredOptions = options.filter((option) =>\n filterOption ? filterOption(option, inputValue) : defaultFilter(option, inputValue)\n )\n\n // Get only enabled options for keyboard navigation\n const enabledOptions = filteredOptions.filter(opt => !opt.disabled)\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newInputValue = e.target.value\n setInputValue(newInputValue)\n setIsOpen(true)\n\n if (defaultActiveFirstOption && enabledOptions.length > 0) {\n setHighlightedIndex(0)\n } else {\n setHighlightedIndex(-1)\n }\n\n onSearch?.(newInputValue)\n\n if (allowCustomValue) {\n onChange?.(newInputValue)\n }\n }\n\n const handleOptionClick = (option: AutocompleteOption) => {\n if (option.disabled) return\n\n setInputValue(option.label)\n setIsOpen(false)\n setHighlightedIndex(-1)\n\n onChange?.(option.value)\n onSelect?.(option.value, option)\n inputRef.current?.focus()\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (!isOpen && (e.key === 'ArrowDown' || e.key === 'ArrowUp')) {\n setIsOpen(true)\n if (defaultActiveFirstOption && enabledOptions.length > 0) {\n setHighlightedIndex(0)\n }\n return\n }\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n setHighlightedIndex((prev) => {\n // Find next enabled option\n for (let i = prev + 1; i < filteredOptions.length; i++) {\n if (!filteredOptions[i].disabled) return i\n }\n return prev\n })\n break\n case 'ArrowUp':\n e.preventDefault()\n setHighlightedIndex((prev) => {\n // Find previous enabled option\n for (let i = prev - 1; i >= 0; i--) {\n if (!filteredOptions[i].disabled) return i\n }\n return prev\n })\n break\n case 'Enter':\n e.preventDefault()\n if (highlightedIndex >= 0 && filteredOptions[highlightedIndex] && !filteredOptions[highlightedIndex].disabled) {\n handleOptionClick(filteredOptions[highlightedIndex])\n } else if (!allowCustomValue && enabledOptions.length > 0) {\n handleOptionClick(enabledOptions[0])\n }\n break\n case 'Escape':\n setIsOpen(false)\n setHighlightedIndex(-1)\n inputRef.current?.blur()\n break\n }\n }\n\n const handleFocus = () => {\n setIsOpen(true)\n if (defaultActiveFirstOption && enabledOptions.length > 0) {\n setHighlightedIndex(0)\n }\n }\n\n const handleBlur = (e: React.FocusEvent) => {\n // Don't close if clicking inside dropdown\n if (dropdownRef.current && dropdownRef.current.contains(e.relatedTarget as Node)) {\n return\n }\n setTimeout(() => setIsOpen(false), 200)\n }\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation()\n setInputValue('')\n onChange?.('')\n onClear?.()\n inputRef.current?.focus()\n }\n\n const sizeClasses = {\n xs: 'input-xs',\n sm: 'input-sm',\n md: 'input-md',\n lg: 'input-lg',\n xl: 'input-xl',\n }\n\n const colorClasses = {\n neutral: 'input-neutral',\n primary: 'input-primary',\n secondary: 'input-secondary',\n accent: 'input-accent',\n info: 'input-info',\n success: 'input-success',\n warning: 'input-warning',\n error: 'input-error',\n }\n\n const statusClasses = {\n error: 'input-error',\n warning: 'input-warning',\n }\n\n // Status takes precedence over color for validation feedback\n const effectiveColorClass = status ? statusClasses[status] : (color ? colorClasses[color] : '')\n\n // Scroll highlighted option into view\n useEffect(() => {\n if (highlightedIndex >= 0 && dropdownRef.current) {\n const highlightedElement = dropdownRef.current.children[highlightedIndex] as HTMLElement\n highlightedElement?.scrollIntoView({ block: 'nearest' })\n }\n }, [highlightedIndex])\n\n // Determine if we should show clear button\n const showClear = allowClear && inputValue && !disabled\n\n // Get custom clear icon if provided\n const clearIcon = typeof allowClear === 'object' && allowClear.clearIcon\n ? allowClear.clearIcon\n : null\n\n // Get option ID for ARIA\n const getOptionId = (index: number) => `${baseId}-option-${index}`\n\n const inputClasses = [\n 'input w-full',\n sizeClasses[size],\n effectiveColorClass,\n showClear && 'pr-10',\n ].filter(Boolean).join(' ')\n\n return (\n <div\n className={`dropdown dropdown-bottom w-full ${isOpen && !disabled ? 'dropdown-open' : ''} ${className}`}\n data-state={isOpen ? 'open' : 'closed'}\n {...rest}\n >\n <div className=\"relative w-full\">\n <input\n ref={inputRef}\n id={inputId}\n type=\"text\"\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n aria-controls={listboxId}\n aria-autocomplete=\"list\"\n aria-activedescendant={highlightedIndex >= 0 ? getOptionId(highlightedIndex) : undefined}\n aria-invalid={status === 'error' ? true : undefined}\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n placeholder={placeholder}\n disabled={disabled}\n className={inputClasses}\n />\n {showClear && (\n <span className=\"absolute right-3 top-1/2 -translate-y-1/2 z-10\">\n {clearIcon || <ClearIcon onClick={handleClear} />}\n </span>\n )}\n </div>\n\n {isOpen && !disabled && (\n <ul\n ref={dropdownRef}\n id={listboxId}\n role=\"listbox\"\n aria-label=\"Suggestions\"\n tabIndex={-1}\n className=\"dropdown-content menu bg-base-100 rounded-box z-50 w-full shadow-lg border border-base-300 max-h-60 overflow-auto flex-nowrap\"\n >\n {filteredOptions.length > 0 ? (\n filteredOptions.map((option, index) => (\n <li key={option.value}>\n <a\n id={getOptionId(index)}\n role=\"option\"\n aria-selected={highlightedIndex === index}\n aria-disabled={option.disabled}\n onMouseDown={(e) => {\n e.preventDefault()\n handleOptionClick(option)\n }}\n onMouseEnter={() => !option.disabled && setHighlightedIndex(index)}\n className={[\n index === highlightedIndex && !option.disabled && 'active',\n option.disabled && 'disabled text-base-content/40 cursor-not-allowed',\n ].filter(Boolean).join(' ')}\n >\n {option.label}\n </a>\n </li>\n ))\n ) : (\n <li className=\"disabled\">\n <span className=\"text-base-content/60 text-center cursor-default\">{notFoundContent}</span>\n </li>\n )}\n </ul>\n )}\n </div>\n )\n}\n"],"names":["ClearIcon","onClick","className","jsx","Autocomplete","value","defaultValue","onChange","onSelect","onSearch","rawOptions","placeholder","disabled","size","color","status","allowCustomValue","filterOption","notFoundContent","allowClear","onClear","controlledOpen","defaultOpen","onOpenChange","defaultActiveFirstOption","rest","baseId","useId","inputId","listboxId","options","opt","inputValue","setInputValue","useState","internalOpen","setInternalOpen","highlightedIndex","setHighlightedIndex","inputRef","useRef","dropdownRef","isOpenControlled","isOpen","setIsOpen","newOpen","useEffect","selectedOption","defaultFilter","option","input","filteredOptions","enabledOptions","handleInputChange","newInputValue","handleOptionClick","handleKeyDown","prev","i","handleFocus","handleBlur","handleClear","sizeClasses","effectiveColorClass","showClear","clearIcon","getOptionId","index","inputClasses","jsxs","e"],"mappings":"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"}
1
+ {"version":3,"file":"Autocomplete.js","sources":["../../src/components/Autocomplete.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useId } from 'react'\nimport { useConfig } from './ConfigProvider'\n\n// DaisyUI classes\nconst dDropdown = 'dropdown'\nconst dDropdownBottom = 'dropdown-bottom'\nconst dDropdownOpen = 'dropdown-open'\nconst dDropdownContent = 'dropdown-content'\nconst dMenu = 'menu'\nconst dInput = 'input'\nconst dInputXs = 'input-xs'\nconst dInputSm = 'input-sm'\nconst dInputMd = 'input-md'\nconst dInputLg = 'input-lg'\nconst dInputXl = 'input-xl'\nconst dInputNeutral = 'input-neutral'\nconst dInputPrimary = 'input-primary'\nconst dInputSecondary = 'input-secondary'\nconst dInputAccent = 'input-accent'\nconst dInputInfo = 'input-info'\nconst dInputSuccess = 'input-success'\nconst dInputWarning = 'input-warning'\nconst dInputError = 'input-error'\n\nexport interface AutocompleteOption {\n value: string\n label: string\n disabled?: boolean\n}\n\nexport interface AutocompleteProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'onSelect'> {\n value?: string\n defaultValue?: string\n onChange?: (value: string) => void\n onSelect?: (value: string, option: AutocompleteOption) => void\n onSearch?: (value: string) => void\n options: AutocompleteOption[] | string[]\n placeholder?: string\n disabled?: boolean\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n color?: 'neutral' | 'primary' | 'secondary' | 'accent' | 'info' | 'success' | 'warning' | 'error'\n /** Validation status */\n status?: 'error' | 'warning'\n allowCustomValue?: boolean\n filterOption?: (option: AutocompleteOption, inputValue: string) => boolean\n notFoundContent?: React.ReactNode\n /** Show clear button when input has value */\n allowClear?: boolean | { clearIcon?: React.ReactNode }\n /** Callback when clear button is clicked */\n onClear?: () => void\n /** Controlled open state */\n open?: boolean\n /** Default open state */\n defaultOpen?: boolean\n /** Callback when open state changes */\n onOpenChange?: (open: boolean) => void\n /** Activate first option by default */\n defaultActiveFirstOption?: boolean\n}\n\n// Clear icon component\nconst ClearIcon: React.FC<{ onClick: (e: React.MouseEvent) => void; className?: string }> = ({ onClick, className }) => (\n <button\n type=\"button\"\n onClick={onClick}\n className={`flex items-center justify-center opacity-50 hover:opacity-100 transition-opacity ${className || ''}`}\n aria-label=\"Clear input\"\n tabIndex={-1}\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n)\n\nexport const Autocomplete: React.FC<AutocompleteProps> = ({\n value,\n defaultValue = '',\n onChange,\n onSelect,\n onSearch,\n options: rawOptions,\n placeholder = 'Type to search...',\n disabled = false,\n size,\n color,\n status,\n className = '',\n allowCustomValue = true,\n filterOption,\n notFoundContent = 'No results found',\n allowClear,\n onClear,\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n defaultActiveFirstOption = true,\n ...rest\n}) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n // Generate unique IDs for ARIA\n const baseId = useId()\n const inputId = `${baseId}-input`\n const listboxId = `${baseId}-listbox`\n\n // Normalize options to AutocompleteOption[]\n const options: AutocompleteOption[] = rawOptions.map((opt) =>\n typeof opt === 'string' ? { value: opt, label: opt } : opt\n )\n\n const [inputValue, setInputValue] = useState(defaultValue)\n const [internalOpen, setInternalOpen] = useState(defaultOpen)\n const [highlightedIndex, setHighlightedIndex] = useState(-1)\n const inputRef = useRef<HTMLInputElement>(null)\n const dropdownRef = useRef<HTMLUListElement>(null)\n\n // Determine if open state is controlled\n const isOpenControlled = controlledOpen !== undefined\n const isOpen = isOpenControlled ? controlledOpen : internalOpen\n\n const setIsOpen = (newOpen: boolean) => {\n if (!isOpenControlled) {\n setInternalOpen(newOpen)\n }\n onOpenChange?.(newOpen)\n }\n\n // Update input value when controlled value changes\n useEffect(() => {\n if (value !== undefined) {\n const selectedOption = options.find((opt) => opt.value === value)\n setInputValue(selectedOption?.label || value)\n }\n }, [value, options])\n\n // Filter options based on input\n const defaultFilter = (option: AutocompleteOption, input: string) =>\n option.label.toLowerCase().includes(input.toLowerCase())\n\n const filteredOptions = options.filter((option) =>\n filterOption ? filterOption(option, inputValue) : defaultFilter(option, inputValue)\n )\n\n // Get only enabled options for keyboard navigation\n const enabledOptions = filteredOptions.filter(opt => !opt.disabled)\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newInputValue = e.target.value\n setInputValue(newInputValue)\n setIsOpen(true)\n\n if (defaultActiveFirstOption && enabledOptions.length > 0) {\n setHighlightedIndex(0)\n } else {\n setHighlightedIndex(-1)\n }\n\n onSearch?.(newInputValue)\n\n if (allowCustomValue) {\n onChange?.(newInputValue)\n }\n }\n\n const handleOptionClick = (option: AutocompleteOption) => {\n if (option.disabled) return\n\n setInputValue(option.label)\n setIsOpen(false)\n setHighlightedIndex(-1)\n\n onChange?.(option.value)\n onSelect?.(option.value, option)\n inputRef.current?.focus()\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (!isOpen && (e.key === 'ArrowDown' || e.key === 'ArrowUp')) {\n setIsOpen(true)\n if (defaultActiveFirstOption && enabledOptions.length > 0) {\n setHighlightedIndex(0)\n }\n return\n }\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n setHighlightedIndex((prev) => {\n // Find next enabled option\n for (let i = prev + 1; i < filteredOptions.length; i++) {\n if (!filteredOptions[i].disabled) return i\n }\n return prev\n })\n break\n case 'ArrowUp':\n e.preventDefault()\n setHighlightedIndex((prev) => {\n // Find previous enabled option\n for (let i = prev - 1; i >= 0; i--) {\n if (!filteredOptions[i].disabled) return i\n }\n return prev\n })\n break\n case 'Enter':\n e.preventDefault()\n if (highlightedIndex >= 0 && filteredOptions[highlightedIndex] && !filteredOptions[highlightedIndex].disabled) {\n handleOptionClick(filteredOptions[highlightedIndex])\n } else if (!allowCustomValue && enabledOptions.length > 0) {\n handleOptionClick(enabledOptions[0])\n }\n break\n case 'Escape':\n setIsOpen(false)\n setHighlightedIndex(-1)\n inputRef.current?.blur()\n break\n }\n }\n\n const handleFocus = () => {\n setIsOpen(true)\n if (defaultActiveFirstOption && enabledOptions.length > 0) {\n setHighlightedIndex(0)\n }\n }\n\n const handleBlur = (e: React.FocusEvent) => {\n // Don't close if clicking inside dropdown\n if (dropdownRef.current && dropdownRef.current.contains(e.relatedTarget as Node)) {\n return\n }\n setTimeout(() => setIsOpen(false), 200)\n }\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation()\n setInputValue('')\n onChange?.('')\n onClear?.()\n inputRef.current?.focus()\n }\n\n const sizeClasses = {\n xs: dInputXs,\n sm: dInputSm,\n md: dInputMd,\n lg: dInputLg,\n xl: dInputXl,\n }\n\n const colorClasses = {\n neutral: dInputNeutral,\n primary: dInputPrimary,\n secondary: dInputSecondary,\n accent: dInputAccent,\n info: dInputInfo,\n success: dInputSuccess,\n warning: dInputWarning,\n error: dInputError,\n }\n\n const statusClasses = {\n error: dInputError,\n warning: dInputWarning,\n }\n\n // Status takes precedence over color for validation feedback\n const effectiveColorClass = status ? statusClasses[status] : (color ? colorClasses[color] : '')\n\n // Scroll highlighted option into view\n useEffect(() => {\n if (highlightedIndex >= 0 && dropdownRef.current) {\n const highlightedElement = dropdownRef.current.children[highlightedIndex] as HTMLElement\n highlightedElement?.scrollIntoView({ block: 'nearest' })\n }\n }, [highlightedIndex])\n\n // Determine if we should show clear button\n const showClear = allowClear && inputValue && !disabled\n\n // Get custom clear icon if provided\n const clearIcon = typeof allowClear === 'object' && allowClear.clearIcon\n ? allowClear.clearIcon\n : null\n\n // Get option ID for ARIA\n const getOptionId = (index: number) => `${baseId}-option-${index}`\n\n const inputClasses = [\n `${dInput} w-full`,\n sizeClasses[effectiveSize],\n effectiveColorClass,\n showClear && 'pr-10',\n ].filter(Boolean).join(' ')\n\n return (\n <div\n className={`${dDropdown} ${dDropdownBottom} w-full ${isOpen && !disabled ? dDropdownOpen : ''} ${className}`}\n data-state={isOpen ? 'open' : 'closed'}\n {...rest}\n >\n <div className=\"relative w-full\">\n <input\n ref={inputRef}\n id={inputId}\n type=\"text\"\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n aria-controls={listboxId}\n aria-autocomplete=\"list\"\n aria-activedescendant={highlightedIndex >= 0 ? getOptionId(highlightedIndex) : undefined}\n aria-invalid={status === 'error' ? true : undefined}\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n placeholder={placeholder}\n disabled={disabled}\n className={inputClasses}\n />\n {showClear && (\n <span className=\"absolute right-3 top-1/2 -translate-y-1/2 z-10\">\n {clearIcon || <ClearIcon onClick={handleClear} />}\n </span>\n )}\n </div>\n\n {isOpen && !disabled && (\n <ul\n ref={dropdownRef}\n id={listboxId}\n role=\"listbox\"\n aria-label=\"Suggestions\"\n tabIndex={-1}\n className={`${dDropdownContent} ${dMenu} bg-base-100 rounded-box z-50 w-full shadow-lg border border-base-300 max-h-60 overflow-auto flex-nowrap`}\n >\n {filteredOptions.length > 0 ? (\n filteredOptions.map((option, index) => (\n <li key={option.value}>\n <a\n id={getOptionId(index)}\n role=\"option\"\n aria-selected={highlightedIndex === index}\n aria-disabled={option.disabled}\n onMouseDown={(e) => {\n e.preventDefault()\n handleOptionClick(option)\n }}\n onMouseEnter={() => !option.disabled && setHighlightedIndex(index)}\n className={[\n index === highlightedIndex && !option.disabled && 'active',\n option.disabled && 'disabled text-base-content/40 cursor-not-allowed',\n ].filter(Boolean).join(' ')}\n >\n {option.label}\n </a>\n </li>\n ))\n ) : (\n <li className=\"disabled\">\n <span className=\"text-base-content/60 text-center cursor-default\">{notFoundContent}</span>\n </li>\n )}\n </ul>\n )}\n </div>\n )\n}\n"],"names":["dDropdown","dDropdownBottom","dDropdownOpen","dDropdownContent","dMenu","dInput","dInputXs","dInputSm","dInputMd","dInputLg","dInputXl","dInputNeutral","dInputPrimary","dInputSecondary","dInputAccent","dInputInfo","dInputSuccess","dInputWarning","dInputError","ClearIcon","onClick","className","jsx","Autocomplete","value","defaultValue","onChange","onSelect","onSearch","rawOptions","placeholder","disabled","size","color","status","allowCustomValue","filterOption","notFoundContent","allowClear","onClear","controlledOpen","defaultOpen","onOpenChange","defaultActiveFirstOption","rest","componentSize","useConfig","effectiveSize","baseId","useId","inputId","listboxId","options","opt","inputValue","setInputValue","useState","internalOpen","setInternalOpen","highlightedIndex","setHighlightedIndex","inputRef","useRef","dropdownRef","isOpenControlled","isOpen","setIsOpen","newOpen","useEffect","selectedOption","defaultFilter","option","input","filteredOptions","enabledOptions","handleInputChange","newInputValue","handleOptionClick","handleKeyDown","prev","i","handleFocus","handleBlur","handleClear","sizeClasses","effectiveColorClass","showClear","clearIcon","getOptionId","index","inputClasses","jsxs","e"],"mappings":"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"}
@@ -1,64 +1,65 @@
1
- import { jsxs as p, jsx as e } from "react/jsx-runtime";
2
- import C from "react";
3
- function j({
1
+ import { jsxs as p, jsx as a } from "react/jsx-runtime";
2
+ import j from "react";
3
+ const w = "avatar", $ = "avatar-online", b = "avatar-offline", g = "avatar-placeholder", G = "avatar-group";
4
+ function O({
4
5
  src: s,
5
- alt: a = "avatar",
6
+ alt: e = "avatar",
6
7
  icon: t,
7
8
  children: r,
8
9
  size: c = "md",
9
- shape: i = "circle",
10
- status: l,
11
- className: o = "",
12
- style: n,
10
+ shape: o = "circle",
11
+ status: n,
12
+ className: i = "",
13
+ style: l,
13
14
  // Legacy props
14
15
  online: d,
15
- offline: w,
16
- placeholder: g,
16
+ offline: N,
17
+ placeholder: A,
17
18
  ...u
18
19
  }) {
19
- const N = {
20
+ const x = {
20
21
  xs: "w-8",
21
22
  sm: "w-12",
22
23
  md: "w-16",
23
24
  lg: "w-20",
24
25
  xl: "w-24"
25
- }, x = {
26
+ }, C = {
26
27
  circle: "rounded-full",
27
28
  square: "rounded"
28
- }, h = l || (d ? "online" : w ? "offline" : void 0), v = [
29
- "avatar",
30
- h === "online" && "avatar-online",
31
- h === "offline" && "avatar-offline",
32
- (g || !s && (t || r)) && "avatar-placeholder",
33
- o
34
- ].filter(Boolean).join(" "), f = [N[c], x[i]].filter(Boolean).join(" ");
29
+ }, h = n || (d ? "online" : N ? "offline" : void 0), v = [
30
+ w,
31
+ h === "online" && $,
32
+ h === "offline" && b,
33
+ (A || !s && (t || r)) && g,
34
+ i
35
+ ].filter(Boolean).join(" "), f = [x[c], C[o]].filter(Boolean).join(" ");
35
36
  if (s)
36
- return /* @__PURE__ */ e("div", { className: v, style: n, ...u, children: /* @__PURE__ */ e("div", { className: f, children: /* @__PURE__ */ e("img", { src: s, alt: a }) }) });
37
+ return /* @__PURE__ */ a("div", { className: v, style: l, ...u, children: /* @__PURE__ */ a("div", { className: f, children: /* @__PURE__ */ a("img", { src: s, alt: e }) }) });
37
38
  const m = t || r;
38
- return m ? /* @__PURE__ */ e("div", { className: v, style: n, ...u, children: /* @__PURE__ */ e("div", { className: f, children: /* @__PURE__ */ e("div", { className: "bg-neutral text-neutral-content flex items-center justify-center w-full h-full", children: m }) }) }) : /* @__PURE__ */ e("div", { className: v, style: n, ...u, children: /* @__PURE__ */ e("div", { className: f, children: /* @__PURE__ */ e("div", { className: "bg-neutral-focus text-neutral-content w-full h-full" }) }) });
39
+ return m ? /* @__PURE__ */ a("div", { className: v, style: l, ...u, children: /* @__PURE__ */ a("div", { className: f, children: /* @__PURE__ */ a("div", { className: "bg-neutral text-neutral-content flex items-center justify-center w-full h-full", children: m }) }) }) : /* @__PURE__ */ a("div", { className: v, style: l, ...u, children: /* @__PURE__ */ a("div", { className: f, children: /* @__PURE__ */ a("div", { className: "bg-neutral-focus text-neutral-content w-full h-full" }) }) });
39
40
  }
40
- function A({ children: s, max: a, size: t, className: r = "", style: c, ...i }) {
41
- const l = C.Children.toArray(s), o = a ? l.slice(0, a) : l, n = a && l.length > a ? l.length - a : 0, d = {
41
+ function P({ children: s, max: e, size: t, className: r = "", style: c, ...o }) {
42
+ const n = j.Children.toArray(s), i = e ? n.slice(0, e) : n, l = e && n.length > e ? n.length - e : 0, d = {
42
43
  xs: "w-8",
43
44
  sm: "w-12",
44
45
  md: "w-16",
45
46
  lg: "w-20",
46
47
  xl: "w-24"
47
48
  };
48
- return /* @__PURE__ */ p("div", { className: `avatar-group -space-x-6 rtl:space-x-reverse ${r}`, style: c, ...i, children: [
49
- o,
50
- n > 0 && /* @__PURE__ */ e("div", { className: "avatar placeholder", children: /* @__PURE__ */ e("div", { className: `bg-neutral text-neutral-content rounded-full ${t ? d[t] : "w-12"}`, children: /* @__PURE__ */ p("span", { children: [
49
+ return /* @__PURE__ */ p("div", { className: `${G} -space-x-6 rtl:space-x-reverse ${r}`, style: c, ...o, children: [
50
+ i,
51
+ l > 0 && /* @__PURE__ */ a("div", { className: `${w} ${g}`, children: /* @__PURE__ */ a("div", { className: `bg-neutral text-neutral-content rounded-full ${t ? d[t] : "w-12"}`, children: /* @__PURE__ */ p("span", { children: [
51
52
  "+",
52
- n
53
+ l
53
54
  ] }) }) })
54
55
  ] });
55
56
  }
56
- const P = Object.assign(j, {
57
- Group: A
57
+ const y = Object.assign(O, {
58
+ Group: P
58
59
  });
59
60
  export {
60
- P as Avatar,
61
- A as AvatarGroup,
62
- P as default
61
+ y as Avatar,
62
+ P as AvatarGroup,
63
+ y as default
63
64
  };
64
65
  //# sourceMappingURL=Avatar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Avatar.js","sources":["../../src/components/Avatar.tsx"],"sourcesContent":["import React from 'react'\n\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\nexport type AvatarShape = 'circle' | 'square'\nexport type AvatarStatus = 'online' | 'offline'\n\nexport interface AvatarProps extends React.HTMLAttributes<HTMLDivElement> {\n src?: string\n alt?: string\n icon?: React.ReactNode\n children?: React.ReactNode\n size?: AvatarSize\n shape?: AvatarShape\n status?: AvatarStatus\n // Legacy props for backwards compatibility\n online?: boolean\n offline?: boolean\n placeholder?: boolean\n}\n\nexport interface AvatarGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n max?: number\n size?: AvatarSize\n}\n\nfunction AvatarRoot({\n src,\n alt = 'avatar',\n icon,\n children,\n size = 'md',\n shape = 'circle',\n status,\n className = '',\n style,\n // Legacy props\n online,\n offline,\n placeholder,\n ...rest\n}: AvatarProps) {\n const sizeClasses: Record<AvatarSize, string> = {\n xs: 'w-8',\n sm: 'w-12',\n md: 'w-16',\n lg: 'w-20',\n xl: 'w-24',\n }\n\n const shapeClasses: Record<AvatarShape, string> = {\n circle: 'rounded-full',\n square: 'rounded',\n }\n\n // Handle legacy boolean props\n const resolvedStatus = status || (online ? 'online' : offline ? 'offline' : undefined)\n const isPlaceholder = placeholder || (!src && (icon || children))\n\n const avatarClasses = [\n 'avatar',\n resolvedStatus === 'online' && 'avatar-online',\n resolvedStatus === 'offline' && 'avatar-offline',\n isPlaceholder && 'avatar-placeholder',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const innerClasses = [sizeClasses[size], shapeClasses[shape]].filter(Boolean).join(' ')\n\n // Image avatar\n if (src) {\n return (\n <div className={avatarClasses} style={style} {...rest}>\n <div className={innerClasses}>\n <img src={src} alt={alt} />\n </div>\n </div>\n )\n }\n\n // Icon or text avatar (placeholder)\n const content = icon || children\n\n if (content) {\n return (\n <div className={avatarClasses} style={style} {...rest}>\n <div className={innerClasses}>\n <div className=\"bg-neutral text-neutral-content flex items-center justify-center w-full h-full\">\n {content}\n </div>\n </div>\n </div>\n )\n }\n\n // Empty avatar\n return (\n <div className={avatarClasses} style={style} {...rest}>\n <div className={innerClasses}>\n <div className=\"bg-neutral-focus text-neutral-content w-full h-full\" />\n </div>\n </div>\n )\n}\n\nfunction AvatarGroup({ children, max, size, className = '', style, ...rest }: AvatarGroupProps) {\n const avatars = React.Children.toArray(children)\n const displayAvatars = max ? avatars.slice(0, max) : avatars\n const remainingCount = max && avatars.length > max ? avatars.length - max : 0\n\n const sizeClasses: Record<AvatarSize, string> = {\n xs: 'w-8',\n sm: 'w-12',\n md: 'w-16',\n lg: 'w-20',\n xl: 'w-24',\n }\n\n return (\n <div className={`avatar-group -space-x-6 rtl:space-x-reverse ${className}`} style={style} {...rest}>\n {displayAvatars}\n {remainingCount > 0 && (\n <div className=\"avatar placeholder\">\n <div className={`bg-neutral text-neutral-content rounded-full ${size ? sizeClasses[size] : 'w-12'}`}>\n <span>+{remainingCount}</span>\n </div>\n </div>\n )}\n </div>\n )\n}\n\nexport const Avatar = Object.assign(AvatarRoot, {\n Group: AvatarGroup,\n})\n\nexport { AvatarGroup }\n\nexport default Avatar\n"],"names":["AvatarRoot","src","alt","icon","children","size","shape","status","className","style","online","offline","placeholder","rest","sizeClasses","shapeClasses","resolvedStatus","avatarClasses","innerClasses","jsx","content","AvatarGroup","max","avatars","React","displayAvatars","remainingCount","jsxs","Avatar"],"mappings":";;AA0BA,SAASA,EAAW;AAAA,EAClB,KAAAC;AAAA,EACA,KAAAC,IAAM;AAAA,EACN,MAAAC;AAAA,EACA,UAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,OAAAC,IAAQ;AAAA,EACR,QAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,OAAAC;AAAA;AAAA,EAEA,QAAAC;AAAA,EACA,SAAAC;AAAA,EACA,aAAAC;AAAA,EACA,GAAGC;AACL,GAAgB;AACd,QAAMC,IAA0C;AAAA,IAC9C,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EAAA,GAGAC,IAA4C;AAAA,IAChD,QAAQ;AAAA,IACR,QAAQ;AAAA,EAAA,GAIJC,IAAiBT,MAAWG,IAAS,WAAWC,IAAU,YAAY,SAGtEM,IAAgB;AAAA,IACpB;AAAA,IACAD,MAAmB,YAAY;AAAA,IAC/BA,MAAmB,aAAa;AAAA,KALZJ,KAAgB,CAACX,MAAQE,KAAQC,OAMpC;AAAA,IACjBI;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG,GAELU,IAAe,CAACJ,EAAYT,CAAI,GAAGU,EAAaT,CAAK,CAAC,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAGtF,MAAIL;AACF,6BACG,OAAA,EAAI,WAAWgB,GAAe,OAAAR,GAAe,GAAGI,GAC/C,UAAA,gBAAAM,EAAC,OAAA,EAAI,WAAWD,GACd,UAAA,gBAAAC,EAAC,OAAA,EAAI,KAAAlB,GAAU,KAAAC,EAAA,CAAU,GAC3B,GACF;AAKJ,QAAMkB,IAAUjB,KAAQC;AAExB,SAAIgB,sBAEC,OAAA,EAAI,WAAWH,GAAe,OAAAR,GAAe,GAAGI,GAC/C,UAAA,gBAAAM,EAAC,OAAA,EAAI,WAAWD,GACd,UAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,kFACZ,UAAAC,GACH,GACF,EAAA,CACF,sBAMD,OAAA,EAAI,WAAWH,GAAe,OAAAR,GAAe,GAAGI,GAC/C,UAAA,gBAAAM,EAAC,OAAA,EAAI,WAAWD,GACd,UAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,sDAAA,CAAsD,GACvE,GACF;AAEJ;AAEA,SAASE,EAAY,EAAE,UAAAjB,GAAU,KAAAkB,GAAK,MAAAjB,GAAM,WAAAG,IAAY,IAAI,OAAAC,GAAO,GAAGI,KAA0B;AAC9F,QAAMU,IAAUC,EAAM,SAAS,QAAQpB,CAAQ,GACzCqB,IAAiBH,IAAMC,EAAQ,MAAM,GAAGD,CAAG,IAAIC,GAC/CG,IAAiBJ,KAAOC,EAAQ,SAASD,IAAMC,EAAQ,SAASD,IAAM,GAEtER,IAA0C;AAAA,IAC9C,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EAAA;AAGN,SACE,gBAAAa,EAAC,SAAI,WAAW,+CAA+CnB,CAAS,IAAI,OAAAC,GAAe,GAAGI,GAC3F,UAAA;AAAA,IAAAY;AAAA,IACAC,IAAiB,KAChB,gBAAAP,EAAC,OAAA,EAAI,WAAU,sBACb,UAAA,gBAAAA,EAAC,OAAA,EAAI,WAAW,gDAAgDd,IAAOS,EAAYT,CAAI,IAAI,MAAM,IAC/F,4BAAC,QAAA,EAAK,UAAA;AAAA,MAAA;AAAA,MAAEqB;AAAA,IAAA,EAAA,CAAe,GACzB,EAAA,CACF;AAAA,EAAA,GAEJ;AAEJ;AAEO,MAAME,IAAS,OAAO,OAAO5B,GAAY;AAAA,EAC9C,OAAOqB;AACT,CAAC;"}
1
+ {"version":3,"file":"Avatar.js","sources":["../../src/components/Avatar.tsx"],"sourcesContent":["import React from 'react'\n\n// DaisyUI classes\nconst dAvatar = 'avatar'\nconst dAvatarOnline = 'avatar-online'\nconst dAvatarOffline = 'avatar-offline'\nconst dAvatarPlaceholder = 'avatar-placeholder'\nconst dAvatarGroup = 'avatar-group'\n\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\nexport type AvatarShape = 'circle' | 'square'\nexport type AvatarStatus = 'online' | 'offline'\n\nexport interface AvatarProps extends React.HTMLAttributes<HTMLDivElement> {\n src?: string\n alt?: string\n icon?: React.ReactNode\n children?: React.ReactNode\n size?: AvatarSize\n shape?: AvatarShape\n status?: AvatarStatus\n // Legacy props for backwards compatibility\n online?: boolean\n offline?: boolean\n placeholder?: boolean\n}\n\nexport interface AvatarGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n max?: number\n size?: AvatarSize\n}\n\nfunction AvatarRoot({\n src,\n alt = 'avatar',\n icon,\n children,\n size = 'md',\n shape = 'circle',\n status,\n className = '',\n style,\n // Legacy props\n online,\n offline,\n placeholder,\n ...rest\n}: AvatarProps) {\n const sizeClasses: Record<AvatarSize, string> = {\n xs: 'w-8',\n sm: 'w-12',\n md: 'w-16',\n lg: 'w-20',\n xl: 'w-24',\n }\n\n const shapeClasses: Record<AvatarShape, string> = {\n circle: 'rounded-full',\n square: 'rounded',\n }\n\n // Handle legacy boolean props\n const resolvedStatus = status || (online ? 'online' : offline ? 'offline' : undefined)\n const isPlaceholder = placeholder || (!src && (icon || children))\n\n const avatarClasses = [\n dAvatar,\n resolvedStatus === 'online' && dAvatarOnline,\n resolvedStatus === 'offline' && dAvatarOffline,\n isPlaceholder && dAvatarPlaceholder,\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const innerClasses = [sizeClasses[size], shapeClasses[shape]].filter(Boolean).join(' ')\n\n // Image avatar\n if (src) {\n return (\n <div className={avatarClasses} style={style} {...rest}>\n <div className={innerClasses}>\n <img src={src} alt={alt} />\n </div>\n </div>\n )\n }\n\n // Icon or text avatar (placeholder)\n const content = icon || children\n\n if (content) {\n return (\n <div className={avatarClasses} style={style} {...rest}>\n <div className={innerClasses}>\n <div className=\"bg-neutral text-neutral-content flex items-center justify-center w-full h-full\">\n {content}\n </div>\n </div>\n </div>\n )\n }\n\n // Empty avatar\n return (\n <div className={avatarClasses} style={style} {...rest}>\n <div className={innerClasses}>\n <div className=\"bg-neutral-focus text-neutral-content w-full h-full\" />\n </div>\n </div>\n )\n}\n\nfunction AvatarGroup({ children, max, size, className = '', style, ...rest }: AvatarGroupProps) {\n const avatars = React.Children.toArray(children)\n const displayAvatars = max ? avatars.slice(0, max) : avatars\n const remainingCount = max && avatars.length > max ? avatars.length - max : 0\n\n const sizeClasses: Record<AvatarSize, string> = {\n xs: 'w-8',\n sm: 'w-12',\n md: 'w-16',\n lg: 'w-20',\n xl: 'w-24',\n }\n\n return (\n <div className={`${dAvatarGroup} -space-x-6 rtl:space-x-reverse ${className}`} style={style} {...rest}>\n {displayAvatars}\n {remainingCount > 0 && (\n <div className={`${dAvatar} ${dAvatarPlaceholder}`}>\n <div className={`bg-neutral text-neutral-content rounded-full ${size ? sizeClasses[size] : 'w-12'}`}>\n <span>+{remainingCount}</span>\n </div>\n </div>\n )}\n </div>\n )\n}\n\nexport const Avatar = Object.assign(AvatarRoot, {\n Group: AvatarGroup,\n})\n\nexport { AvatarGroup }\n\nexport default Avatar\n"],"names":["dAvatar","dAvatarOnline","dAvatarOffline","dAvatarPlaceholder","dAvatarGroup","AvatarRoot","src","alt","icon","children","size","shape","status","className","style","online","offline","placeholder","rest","sizeClasses","shapeClasses","resolvedStatus","avatarClasses","innerClasses","jsx","content","AvatarGroup","max","avatars","React","displayAvatars","remainingCount","jsxs","Avatar"],"mappings":"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"}
@@ -1,89 +1,89 @@
1
- import { jsxs as C, jsx as l } from "react/jsx-runtime";
2
- import { forwardRef as j } from "react";
3
- const w = {
1
+ import { jsxs as w, jsx as l } from "react/jsx-runtime";
2
+ import { forwardRef as T } from "react";
3
+ const v = "badge", X = "badge-primary", z = "badge-secondary", A = "badge-accent", G = "badge-neutral", O = "badge-info", V = "badge-success", W = "badge-warning", q = "badge-error", C = "badge-xs", F = "badge-sm", H = "badge-md", J = "badge-lg", K = "badge-xl", Q = "badge-outline", U = "badge-dash", Y = "badge-soft", Z = "badge-ghost", _ = "indicator", aa = "indicator-item", ea = "indicator-top", ta = "indicator-middle", na = "indicator-bottom", sa = "indicator-start", oa = "indicator-center", da = "indicator-end", $ = {
4
4
  default: "",
5
- primary: "badge-primary",
6
- secondary: "badge-secondary",
7
- accent: "badge-accent",
8
- neutral: "badge-neutral",
9
- info: "badge-info",
10
- success: "badge-success",
11
- warning: "badge-warning",
12
- error: "badge-error"
13
- }, $ = {
14
- xs: "badge-xs",
15
- sm: "badge-sm",
16
- md: "badge-md",
17
- lg: "badge-lg",
18
- xl: "badge-xl"
19
- }, N = {
5
+ primary: X,
6
+ secondary: z,
7
+ accent: A,
8
+ neutral: G,
9
+ info: O,
10
+ success: V,
11
+ warning: W,
12
+ error: q
13
+ }, S = {
14
+ xs: C,
15
+ sm: F,
16
+ md: H,
17
+ lg: J,
18
+ xl: K
19
+ }, j = {
20
20
  solid: "",
21
- outline: "badge-outline",
22
- dash: "badge-dash",
23
- soft: "badge-soft",
24
- ghost: "badge-ghost"
25
- }, P = {
21
+ outline: Q,
22
+ dash: U,
23
+ soft: Y,
24
+ ghost: Z
25
+ }, ra = {
26
26
  success: "success",
27
27
  processing: "info",
28
28
  error: "error",
29
29
  warning: "warning",
30
30
  default: "neutral"
31
- }, V = (s) => {
32
- const [a, o] = s.split("-"), e = [];
33
- switch (a) {
31
+ }, ia = (n) => {
32
+ const [e, o] = n.split("-"), a = [];
33
+ switch (e) {
34
34
  case "top":
35
- e.push("indicator-top");
35
+ a.push(ea);
36
36
  break;
37
37
  case "middle":
38
- e.push("indicator-middle");
38
+ a.push(ta);
39
39
  break;
40
40
  case "bottom":
41
- e.push("indicator-bottom");
41
+ a.push(na);
42
42
  break;
43
43
  }
44
44
  switch (o) {
45
45
  case "start":
46
- e.push("indicator-start");
46
+ a.push(sa);
47
47
  break;
48
48
  case "center":
49
- e.push("indicator-center");
49
+ a.push(oa);
50
50
  break;
51
51
  case "end":
52
- e.push("indicator-end");
52
+ a.push(da);
53
53
  break;
54
54
  }
55
- return e.join(" ");
56
- }, R = j(
55
+ return a.join(" ");
56
+ }, R = T(
57
57
  ({
58
- children: s,
59
- count: a,
58
+ children: n,
59
+ count: e,
60
60
  showZero: o = !1,
61
- overflowCount: e = 99,
62
- position: g = "top-end",
61
+ overflowCount: a = 99,
62
+ position: b = "top-end",
63
63
  offset: r,
64
64
  status: t,
65
- text: d,
66
- type: b = "error",
65
+ text: i,
66
+ type: g = "error",
67
67
  size: p = "md",
68
68
  variant: u = "solid",
69
- color: i,
69
+ color: d,
70
70
  dot: c = !1,
71
- outline: T = !1,
71
+ outline: M = !1,
72
72
  className: m = "",
73
- "data-testid": n,
73
+ "data-testid": s,
74
74
  ...f
75
75
  }, y) => {
76
- const k = T ? "outline" : u, B = () => a === void 0 ? null : a > e ? `${e}+` : a, z = a !== void 0 && (a > 0 || o) || c, h = i ? { backgroundColor: i } : void 0;
77
- if (t && !s) {
78
- const x = P[t];
79
- return /* @__PURE__ */ C(
76
+ const k = M ? "outline" : u, N = () => e === void 0 ? null : e > a ? `${a}+` : e, D = e !== void 0 && (e > 0 || o) || c, B = d ? { backgroundColor: d } : void 0;
77
+ if (t && !n) {
78
+ const h = ra[t];
79
+ return /* @__PURE__ */ w(
80
80
  "span",
81
81
  {
82
82
  ref: y,
83
83
  role: "status",
84
- "aria-label": d || t,
84
+ "aria-label": i || t,
85
85
  className: `inline-flex items-center gap-2 ${m}`,
86
- "data-testid": n,
86
+ "data-testid": s,
87
87
  "data-status": t,
88
88
  ...f,
89
89
  children: [
@@ -91,66 +91,66 @@ const w = {
91
91
  "span",
92
92
  {
93
93
  className: [
94
- "badge badge-xs w-2 h-2 p-0",
95
- w[x],
94
+ `${v} ${C} w-2 h-2 p-0`,
95
+ $[h],
96
96
  t === "processing" && "animate-pulse"
97
97
  ].filter(Boolean).join(" "),
98
- "data-testid": n ? `${n}-dot` : void 0
98
+ "data-testid": s ? `${s}-dot` : void 0
99
99
  }
100
100
  ),
101
- d && /* @__PURE__ */ l("span", { className: "text-sm", children: d })
101
+ i && /* @__PURE__ */ l("span", { className: "text-sm", children: i })
102
102
  ]
103
103
  }
104
104
  );
105
105
  }
106
- if (s) {
107
- const x = r ? { transform: `translate(${r[0]}px, ${r[1]}px)`, ...h } : h, v = B(), M = c ? "New notification" : v !== null ? `${v} notifications` : void 0;
108
- return /* @__PURE__ */ C(
106
+ if (n) {
107
+ const h = r ? { transform: `translate(${r[0]}px, ${r[1]}px)`, ...B } : B, x = N(), P = c ? "New notification" : x !== null ? `${x} notifications` : void 0;
108
+ return /* @__PURE__ */ w(
109
109
  "div",
110
110
  {
111
111
  ref: y,
112
- className: `indicator inline-block ${m}`,
113
- "data-testid": n,
112
+ className: `${_} inline-block ${m}`,
113
+ "data-testid": s,
114
114
  ...f,
115
115
  children: [
116
- z && /* @__PURE__ */ l(
116
+ D && /* @__PURE__ */ l(
117
117
  "span",
118
118
  {
119
119
  role: "status",
120
- "aria-label": M,
120
+ "aria-label": P,
121
121
  className: [
122
- "indicator-item badge",
123
- V(g),
124
- !i && w[b],
125
- c ? "badge-xs p-0 w-2 h-2" : $[p],
126
- N[k]
122
+ `${aa} ${v}`,
123
+ ia(b),
124
+ !d && $[g],
125
+ c ? `${C} p-0 w-2 h-2` : S[p],
126
+ j[k]
127
127
  ].filter(Boolean).join(" "),
128
- style: x,
129
- "data-testid": n ? `${n}-indicator` : void 0,
130
- "data-count": a,
128
+ style: h,
129
+ "data-testid": s ? `${s}-indicator` : void 0,
130
+ "data-count": e,
131
131
  "data-dot": c || void 0,
132
- children: !c && v
132
+ children: !c && x
133
133
  }
134
134
  ),
135
- s
135
+ n
136
136
  ]
137
137
  }
138
138
  );
139
139
  }
140
- const D = [
141
- "badge",
142
- !i && w[b],
143
- $[p],
144
- N[k],
140
+ const E = [
141
+ v,
142
+ !d && $[g],
143
+ S[p],
144
+ j[k],
145
145
  m
146
- ].filter(Boolean).join(" "), L = B();
146
+ ].filter(Boolean).join(" "), L = N();
147
147
  return /* @__PURE__ */ l(
148
148
  "span",
149
149
  {
150
150
  ref: y,
151
- className: D,
152
- style: h,
153
- "data-testid": n,
151
+ className: E,
152
+ style: B,
153
+ "data-testid": s,
154
154
  ...f,
155
155
  children: L
156
156
  }
@@ -158,23 +158,23 @@ const w = {
158
158
  }
159
159
  );
160
160
  R.displayName = "Badge";
161
- const S = j(
161
+ const I = T(
162
162
  ({
163
- children: s,
164
- text: a,
163
+ children: n,
164
+ text: e,
165
165
  placement: o = "end",
166
- color: e,
167
- type: g = "primary",
166
+ color: a,
167
+ type: b = "primary",
168
168
  className: r = "",
169
169
  "data-testid": t,
170
- ...d
171
- }, b) => {
170
+ ...i
171
+ }, g) => {
172
172
  const u = [
173
173
  "absolute",
174
174
  o === "start" ? "-left-1 top-2" : "-right-1 top-2",
175
175
  "px-2 py-0.5",
176
176
  "text-xs font-semibold",
177
- !e && {
177
+ !a && {
178
178
  default: "bg-base-300 text-base-content",
179
179
  primary: "bg-primary text-primary-content",
180
180
  secondary: "bg-secondary text-secondary-content",
@@ -184,26 +184,26 @@ const S = j(
184
184
  success: "bg-success text-success-content",
185
185
  warning: "bg-warning text-warning-content",
186
186
  error: "bg-error text-error-content"
187
- }[g],
187
+ }[b],
188
188
  "shadow-sm",
189
189
  o === "start" ? "rounded-r" : "rounded-l"
190
- ].filter(Boolean).join(" "), i = e ? { backgroundColor: e } : void 0;
191
- return /* @__PURE__ */ C(
190
+ ].filter(Boolean).join(" "), d = a ? { backgroundColor: a } : void 0;
191
+ return /* @__PURE__ */ w(
192
192
  "div",
193
193
  {
194
- ref: b,
194
+ ref: g,
195
195
  className: `relative inline-block overflow-visible ${r}`,
196
196
  "data-testid": t,
197
- ...d,
197
+ ...i,
198
198
  children: [
199
- s,
199
+ n,
200
200
  /* @__PURE__ */ l(
201
201
  "div",
202
202
  {
203
203
  className: u,
204
- style: i,
204
+ style: d,
205
205
  "data-testid": t ? `${t}-ribbon` : void 0,
206
- children: a
206
+ children: e
207
207
  }
208
208
  )
209
209
  ]
@@ -211,10 +211,10 @@ const S = j(
211
211
  );
212
212
  }
213
213
  );
214
- S.displayName = "Badge.Ribbon";
215
- const q = R;
216
- q.Ribbon = S;
214
+ I.displayName = "Badge.Ribbon";
215
+ const ca = R;
216
+ ca.Ribbon = I;
217
217
  export {
218
- q as Badge
218
+ ca as Badge
219
219
  };
220
220
  //# sourceMappingURL=Badge.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Badge.js","sources":["../../src/components/Badge.tsx"],"sourcesContent":["import React, { forwardRef } from 'react'\n\nexport type BadgePosition =\n | 'top-start'\n | 'top-center'\n | 'top-end'\n | 'middle-start'\n | 'middle-center'\n | 'middle-end'\n | 'bottom-start'\n | 'bottom-center'\n | 'bottom-end'\n\nexport type BadgeStatus = 'success' | 'processing' | 'error' | 'default' | 'warning'\n\nexport type BadgeType =\n | 'default'\n | 'primary'\n | 'secondary'\n | 'accent'\n | 'neutral'\n | 'info'\n | 'success'\n | 'warning'\n | 'error'\n\nexport type BadgeVariant = 'solid' | 'outline' | 'dash' | 'soft' | 'ghost'\n\nexport type BadgeSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n // Count mode\n count?: number\n showZero?: boolean\n overflowCount?: number\n\n // Positioning (when wrapping children)\n position?: BadgePosition\n offset?: [number, number]\n\n // Status mode\n status?: BadgeStatus\n text?: string\n\n // Visual\n type?: BadgeType\n size?: BadgeSize\n variant?: BadgeVariant\n color?: string\n dot?: boolean\n /** @deprecated Use variant=\"outline\" instead */\n outline?: boolean\n\n // Testing\n 'data-testid'?: string\n\n // Content\n children?: React.ReactNode\n}\n\nconst typeClasses: Record<BadgeType, string> = {\n default: '',\n primary: 'badge-primary',\n secondary: 'badge-secondary',\n accent: 'badge-accent',\n neutral: 'badge-neutral',\n info: 'badge-info',\n success: 'badge-success',\n warning: 'badge-warning',\n error: 'badge-error',\n}\n\nconst sizeClasses: Record<BadgeSize, string> = {\n xs: 'badge-xs',\n sm: 'badge-sm',\n md: 'badge-md',\n lg: 'badge-lg',\n xl: 'badge-xl',\n}\n\nconst variantClasses: Record<BadgeVariant, string> = {\n solid: '',\n outline: 'badge-outline',\n dash: 'badge-dash',\n soft: 'badge-soft',\n ghost: 'badge-ghost',\n}\n\nconst statusTypeMap: Record<BadgeStatus, BadgeType> = {\n success: 'success',\n processing: 'info',\n error: 'error',\n warning: 'warning',\n default: 'neutral',\n}\n\n// Get position classes for indicator\nconst getPositionClasses = (pos: BadgePosition): string => {\n const [vertical, horizontal] = pos.split('-')\n const classes: string[] = []\n\n switch (vertical) {\n case 'top':\n classes.push('indicator-top')\n break\n case 'middle':\n classes.push('indicator-middle')\n break\n case 'bottom':\n classes.push('indicator-bottom')\n break\n }\n\n switch (horizontal) {\n case 'start':\n classes.push('indicator-start')\n break\n case 'center':\n classes.push('indicator-center')\n break\n case 'end':\n classes.push('indicator-end')\n break\n }\n\n return classes.join(' ')\n}\n\nconst BadgeInner = forwardRef<HTMLSpanElement, BadgeProps>(\n (\n {\n children,\n count,\n showZero = false,\n overflowCount = 99,\n position = 'top-end',\n offset,\n status,\n text,\n type = 'error',\n size = 'md',\n variant = 'solid',\n color,\n dot = false,\n outline = false,\n className = '',\n 'data-testid': testId,\n ...rest\n },\n ref\n ) => {\n // Resolve variant (support deprecated outline prop)\n const resolvedVariant = outline ? 'outline' : variant\n\n // Calculate display count with overflow\n const getDisplayCount = () => {\n if (count === undefined) return null\n if (count > overflowCount) return `${overflowCount}+`\n return count\n }\n\n const shouldShowBadge = (count !== undefined && (count > 0 || showZero)) || dot\n\n // Custom color style\n const colorStyle = color ? { backgroundColor: color } : undefined\n\n // Status badge mode (standalone with status indicator)\n if (status && !children) {\n const statusType = statusTypeMap[status]\n return (\n <span\n ref={ref}\n role=\"status\"\n aria-label={text || status}\n className={`inline-flex items-center gap-2 ${className}`}\n data-testid={testId}\n data-status={status}\n {...rest}\n >\n <span\n className={[\n 'badge badge-xs w-2 h-2 p-0',\n typeClasses[statusType],\n status === 'processing' && 'animate-pulse',\n ]\n .filter(Boolean)\n .join(' ')}\n data-testid={testId ? `${testId}-dot` : undefined}\n />\n {text && <span className=\"text-sm\">{text}</span>}\n </span>\n )\n }\n\n // Notification badge mode (wrapping children)\n if (children) {\n const offsetStyle = offset\n ? { transform: `translate(${offset[0]}px, ${offset[1]}px)`, ...colorStyle }\n : colorStyle\n\n const displayCount = getDisplayCount()\n const ariaLabel =\n dot ? 'New notification' : displayCount !== null ? `${displayCount} notifications` : undefined\n\n return (\n <div\n ref={ref as React.Ref<HTMLDivElement>}\n className={`indicator inline-block ${className}`}\n data-testid={testId}\n {...rest}\n >\n {shouldShowBadge && (\n <span\n role=\"status\"\n aria-label={ariaLabel}\n className={[\n 'indicator-item badge',\n getPositionClasses(position),\n !color && typeClasses[type],\n dot ? 'badge-xs p-0 w-2 h-2' : sizeClasses[size],\n variantClasses[resolvedVariant],\n ]\n .filter(Boolean)\n .join(' ')}\n style={offsetStyle}\n data-testid={testId ? `${testId}-indicator` : undefined}\n data-count={count}\n data-dot={dot || undefined}\n >\n {!dot && displayCount}\n </span>\n )}\n {children}\n </div>\n )\n }\n\n // Standalone badge mode (like a label)\n const badgeClasses = [\n 'badge',\n !color && typeClasses[type],\n sizeClasses[size],\n variantClasses[resolvedVariant],\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const displayContent = getDisplayCount()\n\n return (\n <span\n ref={ref}\n className={badgeClasses}\n style={colorStyle}\n data-testid={testId}\n {...rest}\n >\n {displayContent}\n </span>\n )\n }\n)\n\nBadgeInner.displayName = 'Badge'\n\n// Badge.Ribbon compound component\nexport interface BadgeRibbonProps extends React.HTMLAttributes<HTMLDivElement> {\n text: string\n placement?: 'start' | 'end'\n color?: string\n type?: BadgeType\n 'data-testid'?: string\n children: React.ReactNode\n}\n\nconst BadgeRibbon = forwardRef<HTMLDivElement, BadgeRibbonProps>(\n (\n {\n children,\n text,\n placement = 'end',\n color,\n type = 'primary',\n className = '',\n 'data-testid': testId,\n ...rest\n },\n ref\n ) => {\n const ribbonTypeClasses: Record<BadgeType, string> = {\n default: 'bg-base-300 text-base-content',\n primary: 'bg-primary text-primary-content',\n secondary: 'bg-secondary text-secondary-content',\n accent: 'bg-accent text-accent-content',\n neutral: 'bg-neutral text-neutral-content',\n info: 'bg-info text-info-content',\n success: 'bg-success text-success-content',\n warning: 'bg-warning text-warning-content',\n error: 'bg-error text-error-content',\n }\n\n const ribbonClasses = [\n 'absolute',\n placement === 'start' ? '-left-1 top-2' : '-right-1 top-2',\n 'px-2 py-0.5',\n 'text-xs font-semibold',\n !color && ribbonTypeClasses[type],\n 'shadow-sm',\n placement === 'start' ? 'rounded-r' : 'rounded-l',\n ]\n .filter(Boolean)\n .join(' ')\n\n const colorStyle = color ? { backgroundColor: color } : undefined\n\n return (\n <div\n ref={ref}\n className={`relative inline-block overflow-visible ${className}`}\n data-testid={testId}\n {...rest}\n >\n {children}\n <div\n className={ribbonClasses}\n style={colorStyle}\n data-testid={testId ? `${testId}-ribbon` : undefined}\n >\n {text}\n </div>\n </div>\n )\n }\n)\n\nBadgeRibbon.displayName = 'Badge.Ribbon'\n\n// Compound component type\ntype BadgeComponent = typeof BadgeInner & {\n Ribbon: typeof BadgeRibbon\n}\n\nexport const Badge = BadgeInner as BadgeComponent\nBadge.Ribbon = BadgeRibbon\n"],"names":["typeClasses","sizeClasses","variantClasses","statusTypeMap","getPositionClasses","pos","vertical","horizontal","classes","BadgeInner","forwardRef","children","count","showZero","overflowCount","position","offset","status","text","type","size","variant","color","dot","outline","className","testId","rest","ref","resolvedVariant","getDisplayCount","shouldShowBadge","colorStyle","statusType","jsxs","jsx","offsetStyle","displayCount","ariaLabel","badgeClasses","displayContent","BadgeRibbon","placement","ribbonClasses","Badge"],"mappings":"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"}
1
+ {"version":3,"file":"Badge.js","sources":["../../src/components/Badge.tsx"],"sourcesContent":["import React, { forwardRef } from 'react'\n\n// DaisyUI classes\nconst dBadge = 'badge'\nconst dBadgePrimary = 'badge-primary'\nconst dBadgeSecondary = 'badge-secondary'\nconst dBadgeAccent = 'badge-accent'\nconst dBadgeNeutral = 'badge-neutral'\nconst dBadgeInfo = 'badge-info'\nconst dBadgeSuccess = 'badge-success'\nconst dBadgeWarning = 'badge-warning'\nconst dBadgeError = 'badge-error'\nconst dBadgeXs = 'badge-xs'\nconst dBadgeSm = 'badge-sm'\nconst dBadgeMd = 'badge-md'\nconst dBadgeLg = 'badge-lg'\nconst dBadgeXl = 'badge-xl'\nconst dBadgeOutline = 'badge-outline'\nconst dBadgeDash = 'badge-dash'\nconst dBadgeSoft = 'badge-soft'\nconst dBadgeGhost = 'badge-ghost'\nconst dIndicator = 'indicator'\nconst dIndicatorItem = 'indicator-item'\nconst dIndicatorTop = 'indicator-top'\nconst dIndicatorMiddle = 'indicator-middle'\nconst dIndicatorBottom = 'indicator-bottom'\nconst dIndicatorStart = 'indicator-start'\nconst dIndicatorCenter = 'indicator-center'\nconst dIndicatorEnd = 'indicator-end'\n\nexport type BadgePosition =\n | 'top-start'\n | 'top-center'\n | 'top-end'\n | 'middle-start'\n | 'middle-center'\n | 'middle-end'\n | 'bottom-start'\n | 'bottom-center'\n | 'bottom-end'\n\nexport type BadgeStatus = 'success' | 'processing' | 'error' | 'default' | 'warning'\n\nexport type BadgeType =\n | 'default'\n | 'primary'\n | 'secondary'\n | 'accent'\n | 'neutral'\n | 'info'\n | 'success'\n | 'warning'\n | 'error'\n\nexport type BadgeVariant = 'solid' | 'outline' | 'dash' | 'soft' | 'ghost'\n\nexport type BadgeSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n // Count mode\n count?: number\n showZero?: boolean\n overflowCount?: number\n\n // Positioning (when wrapping children)\n position?: BadgePosition\n offset?: [number, number]\n\n // Status mode\n status?: BadgeStatus\n text?: string\n\n // Visual\n type?: BadgeType\n size?: BadgeSize\n variant?: BadgeVariant\n color?: string\n dot?: boolean\n /** @deprecated Use variant=\"outline\" instead */\n outline?: boolean\n\n // Testing\n 'data-testid'?: string\n\n // Content\n children?: React.ReactNode\n}\n\nconst typeClasses: Record<BadgeType, string> = {\n default: '',\n primary: dBadgePrimary,\n secondary: dBadgeSecondary,\n accent: dBadgeAccent,\n neutral: dBadgeNeutral,\n info: dBadgeInfo,\n success: dBadgeSuccess,\n warning: dBadgeWarning,\n error: dBadgeError,\n}\n\nconst sizeClasses: Record<BadgeSize, string> = {\n xs: dBadgeXs,\n sm: dBadgeSm,\n md: dBadgeMd,\n lg: dBadgeLg,\n xl: dBadgeXl,\n}\n\nconst variantClasses: Record<BadgeVariant, string> = {\n solid: '',\n outline: dBadgeOutline,\n dash: dBadgeDash,\n soft: dBadgeSoft,\n ghost: dBadgeGhost,\n}\n\nconst statusTypeMap: Record<BadgeStatus, BadgeType> = {\n success: 'success',\n processing: 'info',\n error: 'error',\n warning: 'warning',\n default: 'neutral',\n}\n\n// Get position classes for indicator\nconst getPositionClasses = (pos: BadgePosition): string => {\n const [vertical, horizontal] = pos.split('-')\n const classes: string[] = []\n\n switch (vertical) {\n case 'top':\n classes.push(dIndicatorTop)\n break\n case 'middle':\n classes.push(dIndicatorMiddle)\n break\n case 'bottom':\n classes.push(dIndicatorBottom)\n break\n }\n\n switch (horizontal) {\n case 'start':\n classes.push(dIndicatorStart)\n break\n case 'center':\n classes.push(dIndicatorCenter)\n break\n case 'end':\n classes.push(dIndicatorEnd)\n break\n }\n\n return classes.join(' ')\n}\n\nconst BadgeInner = forwardRef<HTMLSpanElement, BadgeProps>(\n (\n {\n children,\n count,\n showZero = false,\n overflowCount = 99,\n position = 'top-end',\n offset,\n status,\n text,\n type = 'error',\n size = 'md',\n variant = 'solid',\n color,\n dot = false,\n outline = false,\n className = '',\n 'data-testid': testId,\n ...rest\n },\n ref\n ) => {\n // Resolve variant (support deprecated outline prop)\n const resolvedVariant = outline ? 'outline' : variant\n\n // Calculate display count with overflow\n const getDisplayCount = () => {\n if (count === undefined) return null\n if (count > overflowCount) return `${overflowCount}+`\n return count\n }\n\n const shouldShowBadge = (count !== undefined && (count > 0 || showZero)) || dot\n\n // Custom color style\n const colorStyle = color ? { backgroundColor: color } : undefined\n\n // Status badge mode (standalone with status indicator)\n if (status && !children) {\n const statusType = statusTypeMap[status]\n return (\n <span\n ref={ref}\n role=\"status\"\n aria-label={text || status}\n className={`inline-flex items-center gap-2 ${className}`}\n data-testid={testId}\n data-status={status}\n {...rest}\n >\n <span\n className={[\n `${dBadge} ${dBadgeXs} w-2 h-2 p-0`,\n typeClasses[statusType],\n status === 'processing' && 'animate-pulse',\n ]\n .filter(Boolean)\n .join(' ')}\n data-testid={testId ? `${testId}-dot` : undefined}\n />\n {text && <span className=\"text-sm\">{text}</span>}\n </span>\n )\n }\n\n // Notification badge mode (wrapping children)\n if (children) {\n const offsetStyle = offset\n ? { transform: `translate(${offset[0]}px, ${offset[1]}px)`, ...colorStyle }\n : colorStyle\n\n const displayCount = getDisplayCount()\n const ariaLabel =\n dot ? 'New notification' : displayCount !== null ? `${displayCount} notifications` : undefined\n\n return (\n <div\n ref={ref as React.Ref<HTMLDivElement>}\n className={`${dIndicator} inline-block ${className}`}\n data-testid={testId}\n {...rest}\n >\n {shouldShowBadge && (\n <span\n role=\"status\"\n aria-label={ariaLabel}\n className={[\n `${dIndicatorItem} ${dBadge}`,\n getPositionClasses(position),\n !color && typeClasses[type],\n dot ? `${dBadgeXs} p-0 w-2 h-2` : sizeClasses[size],\n variantClasses[resolvedVariant],\n ]\n .filter(Boolean)\n .join(' ')}\n style={offsetStyle}\n data-testid={testId ? `${testId}-indicator` : undefined}\n data-count={count}\n data-dot={dot || undefined}\n >\n {!dot && displayCount}\n </span>\n )}\n {children}\n </div>\n )\n }\n\n // Standalone badge mode (like a label)\n const badgeClasses = [\n dBadge,\n !color && typeClasses[type],\n sizeClasses[size],\n variantClasses[resolvedVariant],\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const displayContent = getDisplayCount()\n\n return (\n <span\n ref={ref}\n className={badgeClasses}\n style={colorStyle}\n data-testid={testId}\n {...rest}\n >\n {displayContent}\n </span>\n )\n }\n)\n\nBadgeInner.displayName = 'Badge'\n\n// Badge.Ribbon compound component\nexport interface BadgeRibbonProps extends React.HTMLAttributes<HTMLDivElement> {\n text: string\n placement?: 'start' | 'end'\n color?: string\n type?: BadgeType\n 'data-testid'?: string\n children: React.ReactNode\n}\n\nconst BadgeRibbon = forwardRef<HTMLDivElement, BadgeRibbonProps>(\n (\n {\n children,\n text,\n placement = 'end',\n color,\n type = 'primary',\n className = '',\n 'data-testid': testId,\n ...rest\n },\n ref\n ) => {\n const ribbonTypeClasses: Record<BadgeType, string> = {\n default: 'bg-base-300 text-base-content',\n primary: 'bg-primary text-primary-content',\n secondary: 'bg-secondary text-secondary-content',\n accent: 'bg-accent text-accent-content',\n neutral: 'bg-neutral text-neutral-content',\n info: 'bg-info text-info-content',\n success: 'bg-success text-success-content',\n warning: 'bg-warning text-warning-content',\n error: 'bg-error text-error-content',\n }\n\n const ribbonClasses = [\n 'absolute',\n placement === 'start' ? '-left-1 top-2' : '-right-1 top-2',\n 'px-2 py-0.5',\n 'text-xs font-semibold',\n !color && ribbonTypeClasses[type],\n 'shadow-sm',\n placement === 'start' ? 'rounded-r' : 'rounded-l',\n ]\n .filter(Boolean)\n .join(' ')\n\n const colorStyle = color ? { backgroundColor: color } : undefined\n\n return (\n <div\n ref={ref}\n className={`relative inline-block overflow-visible ${className}`}\n data-testid={testId}\n {...rest}\n >\n {children}\n <div\n className={ribbonClasses}\n style={colorStyle}\n data-testid={testId ? `${testId}-ribbon` : undefined}\n >\n {text}\n </div>\n </div>\n )\n }\n)\n\nBadgeRibbon.displayName = 'Badge.Ribbon'\n\n// Compound component type\ntype BadgeComponent = typeof BadgeInner & {\n Ribbon: typeof BadgeRibbon\n}\n\nexport const Badge = BadgeInner as BadgeComponent\nBadge.Ribbon = BadgeRibbon\n"],"names":["dBadge","dBadgePrimary","dBadgeSecondary","dBadgeAccent","dBadgeNeutral","dBadgeInfo","dBadgeSuccess","dBadgeWarning","dBadgeError","dBadgeXs","dBadgeSm","dBadgeMd","dBadgeLg","dBadgeXl","dBadgeOutline","dBadgeDash","dBadgeSoft","dBadgeGhost","dIndicator","dIndicatorItem","dIndicatorTop","dIndicatorMiddle","dIndicatorBottom","dIndicatorStart","dIndicatorCenter","dIndicatorEnd","typeClasses","sizeClasses","variantClasses","statusTypeMap","getPositionClasses","pos","vertical","horizontal","classes","BadgeInner","forwardRef","children","count","showZero","overflowCount","position","offset","status","text","type","size","variant","color","dot","outline","className","testId","rest","ref","resolvedVariant","getDisplayCount","shouldShowBadge","colorStyle","statusType","jsxs","jsx","offsetStyle","displayCount","ariaLabel","badgeClasses","displayContent","BadgeRibbon","placement","ribbonClasses","Badge"],"mappings":";;AAGA,MAAMA,IAAS,SACTC,IAAgB,iBAChBC,IAAkB,mBAClBC,IAAe,gBACfC,IAAgB,iBAChBC,IAAa,cACbC,IAAgB,iBAChBC,IAAgB,iBAChBC,IAAc,eACdC,IAAW,YACXC,IAAW,YACXC,IAAW,YACXC,IAAW,YACXC,IAAW,YACXC,IAAgB,iBAChBC,IAAa,cACbC,IAAa,cACbC,IAAc,eACdC,IAAa,aACbC,KAAiB,kBACjBC,KAAgB,iBAChBC,KAAmB,oBACnBC,KAAmB,oBACnBC,KAAkB,mBAClBC,KAAmB,oBACnBC,KAAgB,iBA4DhBC,IAAyC;AAAA,EAC7C,SAAS;AAAA,EACT,SAASzB;AAAA,EACT,WAAWC;AAAA,EACX,QAAQC;AAAA,EACR,SAASC;AAAA,EACT,MAAMC;AAAA,EACN,SAASC;AAAA,EACT,SAASC;AAAA,EACT,OAAOC;AACT,GAEMmB,IAAyC;AAAA,EAC7C,IAAIlB;AAAA,EACJ,IAAIC;AAAA,EACJ,IAAIC;AAAA,EACJ,IAAIC;AAAA,EACJ,IAAIC;AACN,GAEMe,IAA+C;AAAA,EACnD,OAAO;AAAA,EACP,SAASd;AAAA,EACT,MAAMC;AAAA,EACN,MAAMC;AAAA,EACN,OAAOC;AACT,GAEMY,KAAgD;AAAA,EACpD,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS;AACX,GAGMC,KAAqB,CAACC,MAA+B;AACzD,QAAM,CAACC,GAAUC,CAAU,IAAIF,EAAI,MAAM,GAAG,GACtCG,IAAoB,CAAA;AAE1B,UAAQF,GAAA;AAAA,IACN,KAAK;AACH,MAAAE,EAAQ,KAAKd,EAAa;AAC1B;AAAA,IACF,KAAK;AACH,MAAAc,EAAQ,KAAKb,EAAgB;AAC7B;AAAA,IACF,KAAK;AACH,MAAAa,EAAQ,KAAKZ,EAAgB;AAC7B;AAAA,EAAA;AAGJ,UAAQW,GAAA;AAAA,IACN,KAAK;AACH,MAAAC,EAAQ,KAAKX,EAAe;AAC5B;AAAA,IACF,KAAK;AACH,MAAAW,EAAQ,KAAKV,EAAgB;AAC7B;AAAA,IACF,KAAK;AACH,MAAAU,EAAQ,KAAKT,EAAa;AAC1B;AAAA,EAAA;AAGJ,SAAOS,EAAQ,KAAK,GAAG;AACzB,GAEMC,IAAaC;AAAA,EACjB,CACE;AAAA,IACE,UAAAC;AAAA,IACA,OAAAC;AAAA,IACA,UAAAC,IAAW;AAAA,IACX,eAAAC,IAAgB;AAAA,IAChB,UAAAC,IAAW;AAAA,IACX,QAAAC;AAAA,IACA,QAAAC;AAAA,IACA,MAAAC;AAAA,IACA,MAAAC,IAAO;AAAA,IACP,MAAAC,IAAO;AAAA,IACP,SAAAC,IAAU;AAAA,IACV,OAAAC;AAAA,IACA,KAAAC,IAAM;AAAA,IACN,SAAAC,IAAU;AAAA,IACV,WAAAC,IAAY;AAAA,IACZ,eAAeC;AAAA,IACf,GAAGC;AAAA,EAAA,GAELC,MACG;AAEH,UAAMC,IAAkBL,IAAU,YAAYH,GAGxCS,IAAkB,MAClBlB,MAAU,SAAkB,OAC5BA,IAAQE,IAAsB,GAAGA,CAAa,MAC3CF,GAGHmB,IAAmBnB,MAAU,WAAcA,IAAQ,KAAKC,MAAcU,GAGtES,IAAaV,IAAQ,EAAE,iBAAiBA,MAAU;AAGxD,QAAIL,KAAU,CAACN,GAAU;AACvB,YAAMsB,IAAa9B,GAAcc,CAAM;AACvC,aACE,gBAAAiB;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,KAAAN;AAAA,UACA,MAAK;AAAA,UACL,cAAYV,KAAQD;AAAA,UACpB,WAAW,kCAAkCQ,CAAS;AAAA,UACtD,eAAaC;AAAA,UACb,eAAaT;AAAA,UACZ,GAAGU;AAAA,UAEJ,UAAA;AAAA,YAAA,gBAAAQ;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAW;AAAA,kBACT,GAAG7D,CAAM,IAAIS,CAAQ;AAAA,kBACrBiB,EAAYiC,CAAU;AAAA,kBACtBhB,MAAW,gBAAgB;AAAA,gBAAA,EAE1B,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,gBACX,eAAaS,IAAS,GAAGA,CAAM,SAAS;AAAA,cAAA;AAAA,YAAA;AAAA,YAEzCR,KAAQ,gBAAAiB,EAAC,QAAA,EAAK,WAAU,WAAW,UAAAjB,EAAA,CAAK;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAG/C;AAGA,QAAIP,GAAU;AACZ,YAAMyB,IAAcpB,IAChB,EAAE,WAAW,aAAaA,EAAO,CAAC,CAAC,OAAOA,EAAO,CAAC,CAAC,OAAO,GAAGgB,MAC7DA,GAEEK,IAAeP,EAAA,GACfQ,IACJf,IAAM,qBAAqBc,MAAiB,OAAO,GAAGA,CAAY,mBAAmB;AAEvF,aACE,gBAAAH;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,KAAAN;AAAA,UACA,WAAW,GAAGpC,CAAU,iBAAiBiC,CAAS;AAAA,UAClD,eAAaC;AAAA,UACZ,GAAGC;AAAA,UAEH,UAAA;AAAA,YAAAI,KACC,gBAAAI;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,cAAYG;AAAA,gBACZ,WAAW;AAAA,kBACT,GAAG7C,EAAc,IAAInB,CAAM;AAAA,kBAC3B8B,GAAmBW,CAAQ;AAAA,kBAC3B,CAACO,KAAStB,EAAYmB,CAAI;AAAA,kBAC1BI,IAAM,GAAGxC,CAAQ,iBAAiBkB,EAAYmB,CAAI;AAAA,kBAClDlB,EAAe2B,CAAe;AAAA,gBAAA,EAE7B,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,gBACX,OAAOO;AAAA,gBACP,eAAaV,IAAS,GAAGA,CAAM,eAAe;AAAA,gBAC9C,cAAYd;AAAA,gBACZ,YAAUW,KAAO;AAAA,gBAEhB,WAACA,KAAOc;AAAA,cAAA;AAAA,YAAA;AAAA,YAGZ1B;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAGP;AAGA,UAAM4B,IAAe;AAAA,MACnBjE;AAAA,MACA,CAACgD,KAAStB,EAAYmB,CAAI;AAAA,MAC1BlB,EAAYmB,CAAI;AAAA,MAChBlB,EAAe2B,CAAe;AAAA,MAC9BJ;AAAA,IAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG,GAELe,IAAiBV,EAAA;AAEvB,WACE,gBAAAK;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAP;AAAA,QACA,WAAWW;AAAA,QACX,OAAOP;AAAA,QACP,eAAaN;AAAA,QACZ,GAAGC;AAAA,QAEH,UAAAa;AAAA,MAAA;AAAA,IAAA;AAAA,EAGP;AACF;AAEA/B,EAAW,cAAc;AAYzB,MAAMgC,IAAc/B;AAAA,EAClB,CACE;AAAA,IACE,UAAAC;AAAA,IACA,MAAAO;AAAA,IACA,WAAAwB,IAAY;AAAA,IACZ,OAAApB;AAAA,IACA,MAAAH,IAAO;AAAA,IACP,WAAAM,IAAY;AAAA,IACZ,eAAeC;AAAA,IACf,GAAGC;AAAA,EAAA,GAELC,MACG;AAaH,UAAMe,IAAgB;AAAA,MACpB;AAAA,MACAD,MAAc,UAAU,kBAAkB;AAAA,MAC1C;AAAA,MACA;AAAA,MACA,CAACpB,KAjBkD;AAAA,QACnD,SAAS;AAAA,QACT,SAAS;AAAA,QACT,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS;AAAA,QACT,OAAO;AAAA,MAAA,EAQqBH,CAAI;AAAA,MAChC;AAAA,MACAuB,MAAc,UAAU,cAAc;AAAA,IAAA,EAErC,OAAO,OAAO,EACd,KAAK,GAAG,GAELV,IAAaV,IAAQ,EAAE,iBAAiBA,MAAU;AAExD,WACE,gBAAAY;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAN;AAAA,QACA,WAAW,0CAA0CH,CAAS;AAAA,QAC9D,eAAaC;AAAA,QACZ,GAAGC;AAAA,QAEH,UAAA;AAAA,UAAAhB;AAAA,UACD,gBAAAwB;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAWQ;AAAA,cACX,OAAOX;AAAA,cACP,eAAaN,IAAS,GAAGA,CAAM,YAAY;AAAA,cAE1C,UAAAR;AAAA,YAAA;AAAA,UAAA;AAAA,QACH;AAAA,MAAA;AAAA,IAAA;AAAA,EAGN;AACF;AAEAuB,EAAY,cAAc;AAOnB,MAAMG,KAAQnC;AACrBmC,GAAM,SAASH;"}