asterui 0.12.49 → 0.12.51

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 (196) hide show
  1. package/dist/components/Alert.js +18 -18
  2. package/dist/components/Alert.js.map +1 -1
  3. package/dist/components/Autocomplete.js +115 -114
  4. package/dist/components/Autocomplete.js.map +1 -1
  5. package/dist/components/Avatar.js +33 -32
  6. package/dist/components/Avatar.js.map +1 -1
  7. package/dist/components/Badge.js +99 -99
  8. package/dist/components/Badge.js.map +1 -1
  9. package/dist/components/Breadcrumb.js +12 -11
  10. package/dist/components/Breadcrumb.js.map +1 -1
  11. package/dist/components/Browser.js +10 -10
  12. package/dist/components/Browser.js.map +1 -1
  13. package/dist/components/Button.js +80 -79
  14. package/dist/components/Button.js.map +1 -1
  15. package/dist/components/Card.d.ts +2 -0
  16. package/dist/components/Card.js +111 -110
  17. package/dist/components/Card.js.map +1 -1
  18. package/dist/components/Carousel.js +59 -59
  19. package/dist/components/Carousel.js.map +1 -1
  20. package/dist/components/Cascader.js +175 -174
  21. package/dist/components/Cascader.js.map +1 -1
  22. package/dist/components/Chat.js +27 -27
  23. package/dist/components/Chat.js.map +1 -1
  24. package/dist/components/Checkbox.js +98 -97
  25. package/dist/components/Checkbox.js.map +1 -1
  26. package/dist/components/Code.js +11 -11
  27. package/dist/components/Code.js.map +1 -1
  28. package/dist/components/Collapse.js +46 -46
  29. package/dist/components/Collapse.js.map +1 -1
  30. package/dist/components/ColorPicker.d.ts +1 -1
  31. package/dist/components/ColorPicker.js +93 -91
  32. package/dist/components/ColorPicker.js.map +1 -1
  33. package/dist/components/Command.js +120 -120
  34. package/dist/components/Command.js.map +1 -1
  35. package/dist/components/ConfigProvider.d.ts +1 -1
  36. package/dist/components/ConfigProvider.js +9 -9
  37. package/dist/components/ConfigProvider.js.map +1 -1
  38. package/dist/components/ContextMenu.js +33 -33
  39. package/dist/components/ContextMenu.js.map +1 -1
  40. package/dist/components/CopyButton.js +74 -73
  41. package/dist/components/CopyButton.js.map +1 -1
  42. package/dist/components/Countdown.js +60 -59
  43. package/dist/components/Countdown.js.map +1 -1
  44. package/dist/components/DatePicker.d.ts +1 -1
  45. package/dist/components/DatePicker.js +54 -53
  46. package/dist/components/DatePicker.js.map +1 -1
  47. package/dist/components/Diff.js +10 -10
  48. package/dist/components/Diff.js.map +1 -1
  49. package/dist/components/Divider.js +21 -20
  50. package/dist/components/Divider.js.map +1 -1
  51. package/dist/components/Dock.js +28 -27
  52. package/dist/components/Dock.js.map +1 -1
  53. package/dist/components/Drawer.js +43 -43
  54. package/dist/components/Drawer.js.map +1 -1
  55. package/dist/components/Dropdown.js +127 -127
  56. package/dist/components/Dropdown.js.map +1 -1
  57. package/dist/components/Empty.js +16 -15
  58. package/dist/components/Empty.js.map +1 -1
  59. package/dist/components/Fieldset.js +11 -10
  60. package/dist/components/Fieldset.js.map +1 -1
  61. package/dist/components/FileInput.js +30 -29
  62. package/dist/components/FileInput.js.map +1 -1
  63. package/dist/components/Filter.d.ts +1 -1
  64. package/dist/components/Filter.js +32 -30
  65. package/dist/components/Filter.js.map +1 -1
  66. package/dist/components/FloatButton.js +83 -83
  67. package/dist/components/FloatButton.js.map +1 -1
  68. package/dist/components/Footer.js +14 -13
  69. package/dist/components/Footer.js.map +1 -1
  70. package/dist/components/Form.js +133 -132
  71. package/dist/components/Form.js.map +1 -1
  72. package/dist/components/Hero.js +12 -11
  73. package/dist/components/Hero.js.map +1 -1
  74. package/dist/components/HoverGallery.js +7 -7
  75. package/dist/components/HoverGallery.js.map +1 -1
  76. package/dist/components/Image.js +40 -40
  77. package/dist/components/Image.js.map +1 -1
  78. package/dist/components/Input.js +171 -169
  79. package/dist/components/Input.js.map +1 -1
  80. package/dist/components/InputNumber.js +84 -83
  81. package/dist/components/InputNumber.js.map +1 -1
  82. package/dist/components/Join.js +11 -10
  83. package/dist/components/Join.js.map +1 -1
  84. package/dist/components/Kbd.js +15 -15
  85. package/dist/components/Kbd.js.map +1 -1
  86. package/dist/components/List.d.ts +1 -1
  87. package/dist/components/List.js +75 -72
  88. package/dist/components/List.js.map +1 -1
  89. package/dist/components/Loading.d.ts +1 -1
  90. package/dist/components/Loading.js +31 -29
  91. package/dist/components/Loading.js.map +1 -1
  92. package/dist/components/Mask.js +31 -31
  93. package/dist/components/Mask.js.map +1 -1
  94. package/dist/components/Mention.js +61 -61
  95. package/dist/components/Mention.js.map +1 -1
  96. package/dist/components/Menu.js +84 -84
  97. package/dist/components/Menu.js.map +1 -1
  98. package/dist/components/Message.js +30 -29
  99. package/dist/components/Message.js.map +1 -1
  100. package/dist/components/Modal.js +117 -116
  101. package/dist/components/Modal.js.map +1 -1
  102. package/dist/components/MonthCalendar.d.ts +31 -0
  103. package/dist/components/MonthCalendar.js +205 -0
  104. package/dist/components/MonthCalendar.js.map +1 -0
  105. package/dist/components/Navbar.js +25 -25
  106. package/dist/components/Navbar.js.map +1 -1
  107. package/dist/components/Notification.js +56 -55
  108. package/dist/components/Notification.js.map +1 -1
  109. package/dist/components/OTPInput.js +69 -68
  110. package/dist/components/OTPInput.js.map +1 -1
  111. package/dist/components/Pagination.d.ts +1 -1
  112. package/dist/components/Pagination.js +60 -58
  113. package/dist/components/Pagination.js.map +1 -1
  114. package/dist/components/Phone.js +10 -10
  115. package/dist/components/Phone.js.map +1 -1
  116. package/dist/components/Popconfirm.js +60 -60
  117. package/dist/components/Popconfirm.js.map +1 -1
  118. package/dist/components/Progress.js +17 -17
  119. package/dist/components/Progress.js.map +1 -1
  120. package/dist/components/QRCode.js +23 -23
  121. package/dist/components/QRCode.js.map +1 -1
  122. package/dist/components/RadialProgress.js +17 -17
  123. package/dist/components/RadialProgress.js.map +1 -1
  124. package/dist/components/Radio.js +41 -40
  125. package/dist/components/Radio.js.map +1 -1
  126. package/dist/components/Range.d.ts +1 -1
  127. package/dist/components/Range.js +39 -37
  128. package/dist/components/Range.js.map +1 -1
  129. package/dist/components/Rating.js +79 -78
  130. package/dist/components/Rating.js.map +1 -1
  131. package/dist/components/ResponsiveDrawer.js +27 -27
  132. package/dist/components/ResponsiveDrawer.js.map +1 -1
  133. package/dist/components/RichTextEditor.d.ts +32 -0
  134. package/dist/components/RichTextEditor.js +335 -0
  135. package/dist/components/RichTextEditor.js.map +1 -0
  136. package/dist/components/Segmented.d.ts +1 -1
  137. package/dist/components/Segmented.js +48 -46
  138. package/dist/components/Segmented.js.map +1 -1
  139. package/dist/components/Select.js +55 -54
  140. package/dist/components/Select.js.map +1 -1
  141. package/dist/components/Skeleton.js +9 -9
  142. package/dist/components/Skeleton.js.map +1 -1
  143. package/dist/components/Splitter.js +1 -3
  144. package/dist/components/Splitter.js.map +1 -1
  145. package/dist/components/Stat.js +17 -16
  146. package/dist/components/Stat.js.map +1 -1
  147. package/dist/components/Status.js +29 -29
  148. package/dist/components/Status.js.map +1 -1
  149. package/dist/components/Steps.js +61 -61
  150. package/dist/components/Steps.js.map +1 -1
  151. package/dist/components/Table.js +256 -256
  152. package/dist/components/Table.js.map +1 -1
  153. package/dist/components/Tabs.js +65 -65
  154. package/dist/components/Tabs.js.map +1 -1
  155. package/dist/components/Tag.js +147 -147
  156. package/dist/components/Tag.js.map +1 -1
  157. package/dist/components/TextRotate.js +6 -6
  158. package/dist/components/TextRotate.js.map +1 -1
  159. package/dist/components/Textarea.js +35 -34
  160. package/dist/components/Textarea.js.map +1 -1
  161. package/dist/components/ThemeController.d.ts +1 -1
  162. package/dist/components/ThemeController.js +71 -68
  163. package/dist/components/ThemeController.js.map +1 -1
  164. package/dist/components/TimePicker.d.ts +1 -1
  165. package/dist/components/TimePicker.js +133 -129
  166. package/dist/components/TimePicker.js.map +1 -1
  167. package/dist/components/Timeline.js +79 -79
  168. package/dist/components/Timeline.js.map +1 -1
  169. package/dist/components/Toggle.js +33 -32
  170. package/dist/components/Toggle.js.map +1 -1
  171. package/dist/components/Tooltip.js +25 -25
  172. package/dist/components/Tooltip.js.map +1 -1
  173. package/dist/components/Tour.js +126 -126
  174. package/dist/components/Tour.js.map +1 -1
  175. package/dist/components/Transfer.js +93 -92
  176. package/dist/components/Transfer.js.map +1 -1
  177. package/dist/components/Tree.js +200 -200
  178. package/dist/components/Tree.js.map +1 -1
  179. package/dist/components/TreeSelect.js +255 -254
  180. package/dist/components/TreeSelect.js.map +1 -1
  181. package/dist/components/Typography.js +71 -70
  182. package/dist/components/Typography.js.map +1 -1
  183. package/dist/components/Upload.js +81 -81
  184. package/dist/components/Upload.js.map +1 -1
  185. package/dist/components/WeekCalendar.d.ts +35 -0
  186. package/dist/components/WeekCalendar.js +204 -0
  187. package/dist/components/WeekCalendar.js.map +1 -0
  188. package/dist/components/Window.js +7 -7
  189. package/dist/components/Window.js.map +1 -1
  190. package/dist/editor.d.ts +1 -0
  191. package/dist/editor.js +5 -0
  192. package/dist/editor.js.map +1 -0
  193. package/dist/index.d.ts +4 -0
  194. package/dist/index.js +211 -207
  195. package/dist/index.js.map +1 -1
  196. package/package.json +30 -1
@@ -1 +1 @@
1
- {"version":3,"file":"List.js","sources":["../../src/components/List.tsx"],"sourcesContent":["import React, { forwardRef } from 'react'\nimport { Pagination } from './Pagination'\nimport { Loading } from './Loading'\n\nexport interface ListPaginationConfig {\n current?: number\n pageSize?: number\n total?: number\n onChange?: (page: number, pageSize: number) => void\n}\n\nexport interface ListGridConfig {\n gutter?: number\n column?: number\n xs?: number\n sm?: number\n md?: number\n lg?: number\n xl?: number\n}\n\nexport interface ListProps<T = unknown> extends Omit<React.HTMLAttributes<HTMLUListElement>, 'children'> {\n /** Data source array */\n dataSource?: T[]\n /** Function to render each item */\n renderItem?: (item: T, index: number) => React.ReactNode\n /** List header content */\n header?: React.ReactNode\n /** List footer content */\n footer?: React.ReactNode\n /** Show loading state */\n loading?: boolean\n /** Pagination configuration or false to disable */\n pagination?: ListPaginationConfig | false\n /** Grid layout configuration */\n grid?: ListGridConfig\n /** Show border around list */\n bordered?: boolean\n /** Show divider between items */\n split?: boolean\n /** Size variant */\n size?: 'sm' | 'md' | 'lg'\n /** Layout direction */\n itemLayout?: 'horizontal' | 'vertical'\n /** Empty state text */\n locale?: { emptyText?: React.ReactNode }\n /** Load more content (e.g., button) */\n loadMore?: React.ReactNode\n /** Custom key extraction function */\n rowKey?: keyof T | ((item: T) => React.Key)\n /** Compound pattern children */\n children?: React.ReactNode\n /** Accessible label for the list */\n 'aria-label'?: string\n /** Test ID for the component */\n 'data-testid'?: string\n}\n\nexport interface ListItemProps extends React.LiHTMLAttributes<HTMLLIElement> {\n /** Item content */\n children: React.ReactNode\n /** Action buttons */\n actions?: React.ReactNode[]\n /** Extra content on the right */\n extra?: React.ReactNode\n /** Test ID for this item */\n 'data-testid'?: string\n}\n\nexport interface ListItemMetaProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Avatar or icon */\n avatar?: React.ReactNode\n /** Title content */\n title?: React.ReactNode\n /** Description content */\n description?: React.ReactNode\n}\n\n// Also export as ListRowProps for backwards compatibility with DaisyUI pattern\nexport type ListRowProps = ListItemProps\n\nconst sizeClasses = {\n sm: 'py-2',\n md: 'py-3',\n lg: 'py-4',\n}\n\nconst ListItem = forwardRef<HTMLLIElement, ListItemProps>(\n ({ children, actions, extra, className = '', 'data-testid': testId, ...rest }, ref) => {\n const classes = ['list-row', className].filter(Boolean).join(' ')\n\n return (\n <li ref={ref} className={classes} data-testid={testId} {...rest}>\n <div className=\"flex-1\">{children}</div>\n {extra && <div className=\"flex-shrink-0\">{extra}</div>}\n {actions && actions.length > 0 && (\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n {actions.map((action, index) => (\n <span key={index}>{action}</span>\n ))}\n </div>\n )}\n </li>\n )\n }\n)\n\nListItem.displayName = 'List.Item'\n\nconst ListItemMeta: React.FC<ListItemMetaProps> = ({\n avatar,\n title,\n description,\n className = '',\n ...rest\n}) => {\n return (\n <div className={`flex items-center gap-3 ${className}`} {...rest}>\n {avatar && <div className=\"flex-shrink-0\">{avatar}</div>}\n <div className=\"flex-1 min-w-0\">\n {title && <div className=\"font-medium truncate\">{title}</div>}\n {description && (\n <div className=\"text-sm text-base-content/70 truncate\">{description}</div>\n )}\n </div>\n </div>\n )\n}\n\nListItemMeta.displayName = 'List.Item.Meta'\n\nconst ListRoot = forwardRef<HTMLUListElement, ListProps>(\n (\n {\n dataSource,\n renderItem,\n header,\n footer,\n loading = false,\n pagination = false,\n grid,\n bordered = true,\n split = true,\n size = 'md',\n itemLayout = 'horizontal',\n locale,\n loadMore,\n rowKey,\n children,\n className = '',\n 'aria-label': ariaLabel,\n 'data-testid': testId = 'list',\n ...rest\n },\n ref\n ) => {\n const listClasses = [\n 'list bg-base-100 rounded-box',\n bordered && 'border border-base-300',\n split && '[&_.list-row]:border-b [&_.list-row]:border-base-200 [&_.list-row:last-child]:border-b-0',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const itemClasses = sizeClasses[size]\n\n // Grid styles\n const gridStyles: React.CSSProperties = grid\n ? {\n display: 'grid',\n gridTemplateColumns: `repeat(${grid.column || 1}, minmax(0, 1fr))`,\n gap: grid.gutter ? `${grid.gutter}px` : undefined,\n }\n : {}\n\n // Get key for item\n const getItemKey = (item: unknown, index: number): React.Key => {\n if (!rowKey) return index\n if (typeof rowKey === 'function') return rowKey(item as Parameters<typeof rowKey>[0])\n return String((item as Record<string, unknown>)[rowKey as string] ?? index)\n }\n\n // Layout class for vertical items\n const layoutClass = itemLayout === 'vertical' ? 'flex-col items-start' : ''\n\n // Render items from dataSource or children\n const renderContent = () => {\n if (loading) {\n return (\n <div className=\"flex justify-center py-8\" data-testid={`${testId}-loading`} role=\"status\">\n <Loading size=\"md\" aria-label=\"Loading list\" />\n </div>\n )\n }\n\n // Use dataSource + renderItem if provided\n if (dataSource && renderItem) {\n if (dataSource.length === 0) {\n return (\n <div className=\"text-center py-8 text-base-content/50\" data-testid={`${testId}-empty`}>\n {locale?.emptyText ?? 'No data'}\n </div>\n )\n }\n\n return dataSource.map((item, index) => {\n const rendered = renderItem(item, index)\n const key = getItemKey(item, index)\n // Inject size and layout classes into list items\n if (React.isValidElement(rendered)) {\n const existingClassName = (rendered.props as { className?: string }).className || ''\n return React.cloneElement(rendered, {\n key,\n className: `${existingClassName} ${itemClasses} ${layoutClass}`.trim(),\n 'data-testid': `${testId}-item-${index}`,\n } as React.Attributes & { className?: string; 'data-testid'?: string })\n }\n return rendered\n })\n }\n\n // Use compound children pattern\n if (children) {\n return React.Children.map(children, (child, index) => {\n if (React.isValidElement(child)) {\n const existingClassName = (child.props as { className?: string }).className || ''\n return React.cloneElement(child, {\n className: `${existingClassName} ${itemClasses} ${layoutClass}`.trim(),\n 'data-testid': `${testId}-item-${index}`,\n } as React.Attributes & { className?: string; 'data-testid'?: string })\n }\n return child\n })\n }\n\n return (\n <div className=\"text-center py-8 text-base-content/50\" data-testid={`${testId}-empty`}>\n {locale?.emptyText ?? 'No data'}\n </div>\n )\n }\n\n return (\n <div data-testid={testId} aria-busy={loading}>\n {header && (\n <div className=\"px-4 py-3 border-b border-base-200 font-medium\" data-testid={`${testId}-header`}>\n {header}\n </div>\n )}\n\n <ul\n ref={ref}\n role=\"list\"\n aria-label={ariaLabel}\n className={listClasses}\n style={gridStyles}\n {...rest}\n >\n {renderContent()}\n </ul>\n\n {footer && (\n <div className=\"px-4 py-3 border-t border-base-200\" data-testid={`${testId}-footer`}>\n {footer}\n </div>\n )}\n\n {loadMore && (\n <div className=\"py-4 text-center\" data-testid={`${testId}-load-more`}>\n {loadMore}\n </div>\n )}\n\n {pagination && pagination.total !== undefined && (\n <div className=\"flex justify-end pt-4\" data-testid={`${testId}-pagination`}>\n <Pagination\n current={pagination.current}\n pageSize={pagination.pageSize}\n total={pagination.total}\n onChange={pagination.onChange}\n />\n </div>\n )}\n </div>\n )\n }\n)\n\nListRoot.displayName = 'List'\n\n// Compound component with Item and Item.Meta\nconst ItemWithMeta = Object.assign(ListItem, {\n Meta: ListItemMeta,\n})\n\nexport const List = Object.assign(ListRoot, {\n Item: ItemWithMeta,\n Row: ListItem, // Backwards compatibility with DaisyUI pattern\n})\n"],"names":["sizeClasses","ListItem","forwardRef","children","actions","extra","className","testId","rest","ref","classes","jsxs","jsx","action","index","ListItemMeta","avatar","title","description","ListRoot","dataSource","renderItem","header","footer","loading","pagination","grid","bordered","split","size","itemLayout","locale","loadMore","rowKey","ariaLabel","listClasses","itemClasses","gridStyles","getItemKey","item","layoutClass","renderContent","Loading","rendered","key","React","existingClassName","child","Pagination","ItemWithMeta","List"],"mappings":"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"}
1
+ {"version":3,"file":"List.js","sources":["../../src/components/List.tsx"],"sourcesContent":["import React, { forwardRef } from 'react'\nimport { Pagination } from './Pagination'\nimport { Loading } from './Loading'\nimport { useConfig } from './ConfigProvider'\n\n// DaisyUI classes\nconst dList = 'list'\nconst dListRow = 'list-row'\n\nexport interface ListPaginationConfig {\n current?: number\n pageSize?: number\n total?: number\n onChange?: (page: number, pageSize: number) => void\n}\n\nexport interface ListGridConfig {\n gutter?: number\n column?: number\n xs?: number\n sm?: number\n md?: number\n lg?: number\n xl?: number\n}\n\nexport interface ListProps<T = unknown> extends Omit<React.HTMLAttributes<HTMLUListElement>, 'children'> {\n /** Data source array */\n dataSource?: T[]\n /** Function to render each item */\n renderItem?: (item: T, index: number) => React.ReactNode\n /** List header content */\n header?: React.ReactNode\n /** List footer content */\n footer?: React.ReactNode\n /** Show loading state */\n loading?: boolean\n /** Pagination configuration or false to disable */\n pagination?: ListPaginationConfig | false\n /** Grid layout configuration */\n grid?: ListGridConfig\n /** Show border around list */\n bordered?: boolean\n /** Show divider between items */\n split?: boolean\n /** Size variant */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n /** Layout direction */\n itemLayout?: 'horizontal' | 'vertical'\n /** Empty state text */\n locale?: { emptyText?: React.ReactNode }\n /** Load more content (e.g., button) */\n loadMore?: React.ReactNode\n /** Custom key extraction function */\n rowKey?: keyof T | ((item: T) => React.Key)\n /** Compound pattern children */\n children?: React.ReactNode\n /** Accessible label for the list */\n 'aria-label'?: string\n /** Test ID for the component */\n 'data-testid'?: string\n}\n\nexport interface ListItemProps extends React.LiHTMLAttributes<HTMLLIElement> {\n /** Item content */\n children: React.ReactNode\n /** Action buttons */\n actions?: React.ReactNode[]\n /** Extra content on the right */\n extra?: React.ReactNode\n /** Test ID for this item */\n 'data-testid'?: string\n}\n\nexport interface ListItemMetaProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Avatar or icon */\n avatar?: React.ReactNode\n /** Title content */\n title?: React.ReactNode\n /** Description content */\n description?: React.ReactNode\n}\n\n// Also export as ListRowProps for backwards compatibility with DaisyUI pattern\nexport type ListRowProps = ListItemProps\n\nconst sizeClasses = {\n xs: 'py-1',\n sm: 'py-2',\n md: 'py-3',\n lg: 'py-4',\n xl: 'py-5',\n}\n\nconst ListItem = forwardRef<HTMLLIElement, ListItemProps>(\n ({ children, actions, extra, className = '', 'data-testid': testId, ...rest }, ref) => {\n const classes = [dListRow, className].filter(Boolean).join(' ')\n\n return (\n <li ref={ref} className={classes} data-testid={testId} {...rest}>\n <div className=\"flex-1\">{children}</div>\n {extra && <div className=\"flex-shrink-0\">{extra}</div>}\n {actions && actions.length > 0 && (\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n {actions.map((action, index) => (\n <span key={index}>{action}</span>\n ))}\n </div>\n )}\n </li>\n )\n }\n)\n\nListItem.displayName = 'List.Item'\n\nconst ListItemMeta: React.FC<ListItemMetaProps> = ({\n avatar,\n title,\n description,\n className = '',\n ...rest\n}) => {\n return (\n <div className={`flex items-center gap-3 ${className}`} {...rest}>\n {avatar && <div className=\"flex-shrink-0\">{avatar}</div>}\n <div className=\"flex-1 min-w-0\">\n {title && <div className=\"font-medium truncate\">{title}</div>}\n {description && (\n <div className=\"text-sm text-base-content/70 truncate\">{description}</div>\n )}\n </div>\n </div>\n )\n}\n\nListItemMeta.displayName = 'List.Item.Meta'\n\nconst ListRoot = forwardRef<HTMLUListElement, ListProps>(\n (\n {\n dataSource,\n renderItem,\n header,\n footer,\n loading = false,\n pagination = false,\n grid,\n bordered = true,\n split = true,\n size,\n itemLayout = 'horizontal',\n locale,\n loadMore,\n rowKey,\n children,\n className = '',\n 'aria-label': ariaLabel,\n 'data-testid': testId = 'list',\n ...rest\n },\n ref\n ) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n\n const listClasses = [\n `${dList} bg-base-100 rounded-box`,\n bordered && 'border border-base-300',\n split && `[&_.${dListRow}]:border-b [&_.${dListRow}]:border-base-200 [&_.${dListRow}:last-child]:border-b-0`,\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const itemClasses = sizeClasses[effectiveSize]\n\n // Grid styles\n const gridStyles: React.CSSProperties = grid\n ? {\n display: 'grid',\n gridTemplateColumns: `repeat(${grid.column || 1}, minmax(0, 1fr))`,\n gap: grid.gutter ? `${grid.gutter}px` : undefined,\n }\n : {}\n\n // Get key for item\n const getItemKey = (item: unknown, index: number): React.Key => {\n if (!rowKey) return index\n if (typeof rowKey === 'function') return rowKey(item as Parameters<typeof rowKey>[0])\n return String((item as Record<string, unknown>)[rowKey as string] ?? index)\n }\n\n // Layout class for vertical items\n const layoutClass = itemLayout === 'vertical' ? 'flex-col items-start' : ''\n\n // Render items from dataSource or children\n const renderContent = () => {\n if (loading) {\n return (\n <div className=\"flex justify-center py-8\" data-testid={`${testId}-loading`} role=\"status\">\n <Loading size=\"md\" aria-label=\"Loading list\" />\n </div>\n )\n }\n\n // Use dataSource + renderItem if provided\n if (dataSource && renderItem) {\n if (dataSource.length === 0) {\n return (\n <div className=\"text-center py-8 text-base-content/50\" data-testid={`${testId}-empty`}>\n {locale?.emptyText ?? 'No data'}\n </div>\n )\n }\n\n return dataSource.map((item, index) => {\n const rendered = renderItem(item, index)\n const key = getItemKey(item, index)\n // Inject size and layout classes into list items\n if (React.isValidElement(rendered)) {\n const existingClassName = (rendered.props as { className?: string }).className || ''\n return React.cloneElement(rendered, {\n key,\n className: `${existingClassName} ${itemClasses} ${layoutClass}`.trim(),\n 'data-testid': `${testId}-item-${index}`,\n } as React.Attributes & { className?: string; 'data-testid'?: string })\n }\n return rendered\n })\n }\n\n // Use compound children pattern\n if (children) {\n return React.Children.map(children, (child, index) => {\n if (React.isValidElement(child)) {\n const existingClassName = (child.props as { className?: string }).className || ''\n return React.cloneElement(child, {\n className: `${existingClassName} ${itemClasses} ${layoutClass}`.trim(),\n 'data-testid': `${testId}-item-${index}`,\n } as React.Attributes & { className?: string; 'data-testid'?: string })\n }\n return child\n })\n }\n\n return (\n <div className=\"text-center py-8 text-base-content/50\" data-testid={`${testId}-empty`}>\n {locale?.emptyText ?? 'No data'}\n </div>\n )\n }\n\n return (\n <div data-testid={testId} aria-busy={loading}>\n {header && (\n <div className=\"px-4 py-3 border-b border-base-200 font-medium\" data-testid={`${testId}-header`}>\n {header}\n </div>\n )}\n\n <ul\n ref={ref}\n role=\"list\"\n aria-label={ariaLabel}\n className={listClasses}\n style={gridStyles}\n {...rest}\n >\n {renderContent()}\n </ul>\n\n {footer && (\n <div className=\"px-4 py-3 border-t border-base-200\" data-testid={`${testId}-footer`}>\n {footer}\n </div>\n )}\n\n {loadMore && (\n <div className=\"py-4 text-center\" data-testid={`${testId}-load-more`}>\n {loadMore}\n </div>\n )}\n\n {pagination && pagination.total !== undefined && (\n <div className=\"flex justify-end pt-4\" data-testid={`${testId}-pagination`}>\n <Pagination\n current={pagination.current}\n pageSize={pagination.pageSize}\n total={pagination.total}\n onChange={pagination.onChange}\n />\n </div>\n )}\n </div>\n )\n }\n)\n\nListRoot.displayName = 'List'\n\n// Compound component with Item and Item.Meta\nconst ItemWithMeta = Object.assign(ListItem, {\n Meta: ListItemMeta,\n})\n\nexport const List = Object.assign(ListRoot, {\n Item: ItemWithMeta,\n Row: ListItem, // Backwards compatibility with DaisyUI pattern\n})\n"],"names":["dList","dListRow","sizeClasses","ListItem","forwardRef","children","actions","extra","className","testId","rest","ref","classes","jsxs","jsx","action","index","ListItemMeta","avatar","title","description","ListRoot","dataSource","renderItem","header","footer","loading","pagination","grid","bordered","split","size","itemLayout","locale","loadMore","rowKey","ariaLabel","componentSize","useConfig","effectiveSize","listClasses","itemClasses","gridStyles","getItemKey","item","layoutClass","renderContent","Loading","rendered","key","React","existingClassName","child","Pagination","ItemWithMeta","List"],"mappings":";;;;;AAMA,MAAMA,IAAQ,QACRC,IAAW,YA+EXC,IAAc;AAAA,EAClB,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN,GAEMC,IAAWC;AAAA,EACf,CAAC,EAAE,UAAAC,GAAU,SAAAC,GAAS,OAAAC,GAAO,WAAAC,IAAY,IAAI,eAAeC,GAAQ,GAAGC,EAAA,GAAQC,MAAQ;AACrF,UAAMC,IAAU,CAACX,GAAUO,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE9D,WACE,gBAAAK,EAAC,QAAG,KAAAF,GAAU,WAAWC,GAAS,eAAaH,GAAS,GAAGC,GACzD,UAAA;AAAA,MAAA,gBAAAI,EAAC,OAAA,EAAI,WAAU,UAAU,UAAAT,EAAA,CAAS;AAAA,MACjCE,KAAS,gBAAAO,EAAC,OAAA,EAAI,WAAU,iBAAiB,UAAAP,GAAM;AAAA,MAC/CD,KAAWA,EAAQ,SAAS,KAC3B,gBAAAQ,EAAC,OAAA,EAAI,WAAU,yCACZ,UAAAR,EAAQ,IAAI,CAACS,GAAQC,MACpB,gBAAAF,EAAC,UAAkB,UAAAC,EAAA,GAARC,CAAe,CAC3B,EAAA,CACH;AAAA,IAAA,GAEJ;AAAA,EAEJ;AACF;AAEAb,EAAS,cAAc;AAEvB,MAAMc,IAA4C,CAAC;AAAA,EACjD,QAAAC;AAAA,EACA,OAAAC;AAAA,EACA,aAAAC;AAAA,EACA,WAAAZ,IAAY;AAAA,EACZ,GAAGE;AACL,wBAEK,OAAA,EAAI,WAAW,2BAA2BF,CAAS,IAAK,GAAGE,GACzD,UAAA;AAAA,EAAAQ,KAAU,gBAAAJ,EAAC,OAAA,EAAI,WAAU,iBAAiB,UAAAI,GAAO;AAAA,EAClD,gBAAAL,EAAC,OAAA,EAAI,WAAU,kBACZ,UAAA;AAAA,IAAAM,KAAS,gBAAAL,EAAC,OAAA,EAAI,WAAU,wBAAwB,UAAAK,GAAM;AAAA,IACtDC,KACC,gBAAAN,EAAC,OAAA,EAAI,WAAU,yCAAyC,UAAAM,EAAA,CAAY;AAAA,EAAA,EAAA,CAExE;AAAA,GACF;AAIJH,EAAa,cAAc;AAE3B,MAAMI,IAAWjB;AAAA,EACf,CACE;AAAA,IACE,YAAAkB;AAAA,IACA,YAAAC;AAAA,IACA,QAAAC;AAAA,IACA,QAAAC;AAAA,IACA,SAAAC,IAAU;AAAA,IACV,YAAAC,IAAa;AAAA,IACb,MAAAC;AAAA,IACA,UAAAC,IAAW;AAAA,IACX,OAAAC,IAAQ;AAAA,IACR,MAAAC;AAAA,IACA,YAAAC,IAAa;AAAA,IACb,QAAAC;AAAA,IACA,UAAAC;AAAA,IACA,QAAAC;AAAA,IACA,UAAA9B;AAAA,IACA,WAAAG,IAAY;AAAA,IACZ,cAAc4B;AAAA,IACd,eAAe3B,IAAS;AAAA,IACxB,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAM,EAAE,eAAA0B,EAAA,IAAkBC,EAAA,GACpBC,IAAgBR,KAAQM,KAAiB,MAEzCG,IAAc;AAAA,MAClB,GAAGxC,CAAK;AAAA,MACR6B,KAAY;AAAA,MACZC,KAAS,OAAO7B,CAAQ,kBAAkBA,CAAQ,yBAAyBA,CAAQ;AAAA,MACnFO;AAAA,IAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG,GAELiC,IAAcvC,EAAYqC,CAAa,GAGvCG,IAAkCd,IACpC;AAAA,MACE,SAAS;AAAA,MACT,qBAAqB,UAAUA,EAAK,UAAU,CAAC;AAAA,MAC/C,KAAKA,EAAK,SAAS,GAAGA,EAAK,MAAM,OAAO;AAAA,IAAA,IAE1C,CAAA,GAGEe,IAAa,CAACC,GAAe5B,MAC5BmB,IACD,OAAOA,KAAW,aAAmBA,EAAOS,CAAoC,IAC7E,OAAQA,EAAiCT,CAAgB,KAAKnB,CAAK,IAFtDA,GAMhB6B,IAAcb,MAAe,aAAa,yBAAyB,IAGnEc,IAAgB,MAChBpB,sBAEC,OAAA,EAAI,WAAU,4BAA2B,eAAa,GAAGjB,CAAM,YAAY,MAAK,UAC/E,4BAACsC,GAAA,EAAQ,MAAK,MAAK,cAAW,gBAAe,GAC/C,IAKAzB,KAAcC,IACZD,EAAW,WAAW,IAEtB,gBAAAR,EAAC,OAAA,EAAI,WAAU,yCAAwC,eAAa,GAAGL,CAAM,UAC1E,UAAAwB,GAAQ,aAAa,UAAA,CACxB,IAIGX,EAAW,IAAI,CAACsB,GAAM5B,MAAU;AACrC,YAAMgC,IAAWzB,EAAWqB,GAAM5B,CAAK,GACjCiC,IAAMN,EAAWC,GAAM5B,CAAK;AAElC,UAAIkC,EAAM,eAAeF,CAAQ,GAAG;AAClC,cAAMG,IAAqBH,EAAS,MAAiC,aAAa;AAClF,eAAOE,EAAM,aAAaF,GAAU;AAAA,UAClC,KAAAC;AAAA,UACA,WAAW,GAAGE,CAAiB,IAAIV,CAAW,IAAII,CAAW,GAAG,KAAA;AAAA,UAChE,eAAe,GAAGpC,CAAM,SAASO,CAAK;AAAA,QAAA,CAC8B;AAAA,MACxE;AACA,aAAOgC;AAAA,IACT,CAAC,IAIC3C,IACK6C,EAAM,SAAS,IAAI7C,GAAU,CAAC+C,GAAOpC,MAAU;AACpD,UAAIkC,EAAM,eAAeE,CAAK,GAAG;AAC/B,cAAMD,IAAqBC,EAAM,MAAiC,aAAa;AAC/E,eAAOF,EAAM,aAAaE,GAAO;AAAA,UAC/B,WAAW,GAAGD,CAAiB,IAAIV,CAAW,IAAII,CAAW,GAAG,KAAA;AAAA,UAChE,eAAe,GAAGpC,CAAM,SAASO,CAAK;AAAA,QAAA,CAC8B;AAAA,MACxE;AACA,aAAOoC;AAAA,IACT,CAAC,IAID,gBAAAtC,EAAC,OAAA,EAAI,WAAU,yCAAwC,eAAa,GAAGL,CAAM,UAC1E,UAAAwB,GAAQ,aAAa,UAAA,CACxB;AAIJ,WACE,gBAAApB,EAAC,OAAA,EAAI,eAAaJ,GAAQ,aAAWiB,GAClC,UAAA;AAAA,MAAAF,KACC,gBAAAV,EAAC,SAAI,WAAU,kDAAiD,eAAa,GAAGL,CAAM,WACnF,UAAAe,EAAA,CACH;AAAA,MAGF,gBAAAV;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,KAAAH;AAAA,UACA,MAAK;AAAA,UACL,cAAYyB;AAAA,UACZ,WAAWI;AAAA,UACX,OAAOE;AAAA,UACN,GAAGhC;AAAA,UAEH,UAAAoC,EAAA;AAAA,QAAc;AAAA,MAAA;AAAA,MAGhBrB,uBACE,OAAA,EAAI,WAAU,sCAAqC,eAAa,GAAGhB,CAAM,WACvE,UAAAgB,EAAA,CACH;AAAA,MAGDS,uBACE,OAAA,EAAI,WAAU,oBAAmB,eAAa,GAAGzB,CAAM,cACrD,UAAAyB,EAAA,CACH;AAAA,MAGDP,KAAcA,EAAW,UAAU,UAClC,gBAAAb,EAAC,OAAA,EAAI,WAAU,yBAAwB,eAAa,GAAGL,CAAM,eAC3D,UAAA,gBAAAK;AAAA,QAACuC;AAAA,QAAA;AAAA,UACC,SAAS1B,EAAW;AAAA,UACpB,UAAUA,EAAW;AAAA,UACrB,OAAOA,EAAW;AAAA,UAClB,UAAUA,EAAW;AAAA,QAAA;AAAA,MAAA,EACvB,CACF;AAAA,IAAA,GAEJ;AAAA,EAEJ;AACF;AAEAN,EAAS,cAAc;AAGvB,MAAMiC,IAAe,OAAO,OAAOnD,GAAU;AAAA,EAC3C,MAAMc;AACR,CAAC,GAEYsC,IAAO,OAAO,OAAOlC,GAAU;AAAA,EAC1C,MAAMiC;AAAA,EACN,KAAKnD;AAAA;AACP,CAAC;"}
@@ -1,6 +1,6 @@
1
1
  import { default as React } from 'react';
2
2
  export interface LoadingProps extends React.HTMLAttributes<HTMLDivElement> {
3
- size?: 'xs' | 'sm' | 'md' | 'lg';
3
+ size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
4
4
  type?: 'spinner' | 'dots' | 'ring' | 'ball' | 'bars' | 'infinity';
5
5
  spinning?: boolean;
6
6
  children?: React.ReactNode;
@@ -1,38 +1,40 @@
1
- import { jsxs as a, jsx as s } from "react/jsx-runtime";
2
- const f = ({
3
- size: r = "md",
1
+ import { jsxs as e, jsx as n } from "react/jsx-runtime";
2
+ import { useConfig as f } from "./ConfigProvider.js";
3
+ const L = "loading", p = "loading-xs", x = "loading-sm", b = "loading-md", u = "loading-lg", N = "loading-xl", v = "loading-spinner", y = "loading-dots", C = "loading-ring", h = "loading-ball", j = "loading-bars", z = "loading-infinity", k = ({
4
+ size: l,
4
5
  type: t = "spinner",
5
- className: d = "",
6
- spinning: l = !0,
7
- children: n,
8
- tip: e,
6
+ className: c = "",
7
+ spinning: o = !0,
8
+ children: a,
9
+ tip: s,
9
10
  ...i
10
11
  }) => {
11
- const c = {
12
- xs: "loading-xs",
13
- sm: "loading-sm",
14
- md: "loading-md",
15
- lg: "loading-lg"
16
- }, o = ["loading", {
17
- spinner: "loading-spinner",
18
- dots: "loading-dots",
19
- ring: "loading-ring",
20
- ball: "loading-ball",
21
- bars: "loading-bars",
22
- infinity: "loading-infinity"
23
- }[t], c[r], d].filter(Boolean).join(" ");
24
- return n ? /* @__PURE__ */ a("div", { className: "relative", ...i, children: [
25
- l && /* @__PURE__ */ a("div", { className: "absolute inset-0 flex flex-col items-center justify-center bg-base-100/50 backdrop-blur-sm z-10", children: [
26
- /* @__PURE__ */ s("span", { className: o }),
27
- e && /* @__PURE__ */ s("p", { className: "mt-2 text-sm", children: e })
12
+ const { componentSize: r } = f(), g = l ?? r ?? "md", m = {
13
+ xs: p,
14
+ sm: x,
15
+ md: b,
16
+ lg: u,
17
+ xl: N
18
+ }, d = [L, {
19
+ spinner: v,
20
+ dots: y,
21
+ ring: C,
22
+ ball: h,
23
+ bars: j,
24
+ infinity: z
25
+ }[t], m[g], c].filter(Boolean).join(" ");
26
+ return a ? /* @__PURE__ */ e("div", { className: "relative", ...i, children: [
27
+ o && /* @__PURE__ */ e("div", { className: "absolute inset-0 flex flex-col items-center justify-center bg-base-100/50 backdrop-blur-sm z-10", children: [
28
+ /* @__PURE__ */ n("span", { className: d }),
29
+ s && /* @__PURE__ */ n("p", { className: "mt-2 text-sm", children: s })
28
30
  ] }),
29
- /* @__PURE__ */ s("div", { className: l ? "pointer-events-none" : "", children: n })
30
- ] }) : l ? /* @__PURE__ */ a("div", { className: "flex flex-col items-center gap-2", ...i, children: [
31
- /* @__PURE__ */ s("span", { className: o }),
32
- e && /* @__PURE__ */ s("p", { className: "text-sm", children: e })
31
+ /* @__PURE__ */ n("div", { className: o ? "pointer-events-none" : "", children: a })
32
+ ] }) : o ? /* @__PURE__ */ e("div", { className: "flex flex-col items-center gap-2", ...i, children: [
33
+ /* @__PURE__ */ n("span", { className: d }),
34
+ s && /* @__PURE__ */ n("p", { className: "text-sm", children: s })
33
35
  ] }) : null;
34
36
  };
35
37
  export {
36
- f as Loading
38
+ k as Loading
37
39
  };
38
40
  //# sourceMappingURL=Loading.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Loading.js","sources":["../../src/components/Loading.tsx"],"sourcesContent":["import React from 'react'\n\nexport interface LoadingProps extends React.HTMLAttributes<HTMLDivElement> {\n size?: 'xs' | 'sm' | 'md' | 'lg'\n type?: 'spinner' | 'dots' | 'ring' | 'ball' | 'bars' | 'infinity'\n spinning?: boolean\n children?: React.ReactNode\n tip?: string\n}\n\nexport const Loading: React.FC<LoadingProps> = ({\n size = 'md',\n type = 'spinner',\n className = '',\n spinning = true,\n children,\n tip,\n ...rest\n}) => {\n const sizeClasses = {\n xs: 'loading-xs',\n sm: 'loading-sm',\n md: 'loading-md',\n lg: 'loading-lg',\n }\n\n const typeClasses = {\n spinner: 'loading-spinner',\n dots: 'loading-dots',\n ring: 'loading-ring',\n ball: 'loading-ball',\n bars: 'loading-bars',\n infinity: 'loading-infinity',\n }\n\n const spinnerClasses = ['loading', typeClasses[type], sizeClasses[size], className]\n .filter(Boolean)\n .join(' ')\n\n if (children) {\n return (\n <div className=\"relative\" {...rest}>\n {spinning && (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-base-100/50 backdrop-blur-sm z-10\">\n <span className={spinnerClasses}></span>\n {tip && <p className=\"mt-2 text-sm\">{tip}</p>}\n </div>\n )}\n <div className={spinning ? 'pointer-events-none' : ''}>{children}</div>\n </div>\n )\n }\n\n if (!spinning) {\n return null\n }\n\n return (\n <div className=\"flex flex-col items-center gap-2\" {...rest}>\n <span className={spinnerClasses}></span>\n {tip && <p className=\"text-sm\">{tip}</p>}\n </div>\n )\n}\n"],"names":["Loading","size","type","className","spinning","children","tip","rest","sizeClasses","spinnerClasses","jsxs","jsx"],"mappings":";AAUO,MAAMA,IAAkC,CAAC;AAAA,EAC9C,MAAAC,IAAO;AAAA,EACP,MAAAC,IAAO;AAAA,EACP,WAAAC,IAAY;AAAA,EACZ,UAAAC,IAAW;AAAA,EACX,UAAAC;AAAA,EACA,KAAAC;AAAA,EACA,GAAGC;AACL,MAAM;AACJ,QAAMC,IAAc;AAAA,IAClB,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EAAA,GAYAC,IAAiB,CAAC,WATJ;AAAA,IAClB,SAAS;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,EAAA,EAGmCP,CAAI,GAAGM,EAAYP,CAAI,GAAGE,CAAS,EAC/E,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,SAAIE,IAEA,gBAAAK,EAAC,OAAA,EAAI,WAAU,YAAY,GAAGH,GAC3B,UAAA;AAAA,IAAAH,KACC,gBAAAM,EAAC,OAAA,EAAI,WAAU,mGACb,UAAA;AAAA,MAAA,gBAAAC,EAAC,QAAA,EAAK,WAAWF,EAAA,CAAgB;AAAA,MAChCH,KAAO,gBAAAK,EAAC,KAAA,EAAE,WAAU,gBAAgB,UAAAL,EAAA,CAAI;AAAA,IAAA,GAC3C;AAAA,sBAED,OAAA,EAAI,WAAWF,IAAW,wBAAwB,IAAK,UAAAC,EAAA,CAAS;AAAA,EAAA,GACnE,IAICD,IAKH,gBAAAM,EAAC,OAAA,EAAI,WAAU,oCAAoC,GAAGH,GACpD,UAAA;AAAA,IAAA,gBAAAI,EAAC,QAAA,EAAK,WAAWF,EAAA,CAAgB;AAAA,IAChCH,KAAO,gBAAAK,EAAC,KAAA,EAAE,WAAU,WAAW,UAAAL,EAAA,CAAI;AAAA,EAAA,GACtC,IAPO;AASX;"}
1
+ {"version":3,"file":"Loading.js","sources":["../../src/components/Loading.tsx"],"sourcesContent":["import React from 'react'\nimport { useConfig } from './ConfigProvider'\n\n// DaisyUI classes\nconst dLoading = 'loading'\nconst dLoadingXs = 'loading-xs'\nconst dLoadingSm = 'loading-sm'\nconst dLoadingMd = 'loading-md'\nconst dLoadingLg = 'loading-lg'\nconst dLoadingXl = 'loading-xl'\nconst dLoadingSpinner = 'loading-spinner'\nconst dLoadingDots = 'loading-dots'\nconst dLoadingRing = 'loading-ring'\nconst dLoadingBall = 'loading-ball'\nconst dLoadingBars = 'loading-bars'\nconst dLoadingInfinity = 'loading-infinity'\n\nexport interface LoadingProps extends React.HTMLAttributes<HTMLDivElement> {\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n type?: 'spinner' | 'dots' | 'ring' | 'ball' | 'bars' | 'infinity'\n spinning?: boolean\n children?: React.ReactNode\n tip?: string\n}\n\nexport const Loading: React.FC<LoadingProps> = ({\n size,\n type = 'spinner',\n className = '',\n spinning = true,\n children,\n tip,\n ...rest\n}) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n\n const sizeClasses = {\n xs: dLoadingXs,\n sm: dLoadingSm,\n md: dLoadingMd,\n lg: dLoadingLg,\n xl: dLoadingXl,\n }\n\n const typeClasses = {\n spinner: dLoadingSpinner,\n dots: dLoadingDots,\n ring: dLoadingRing,\n ball: dLoadingBall,\n bars: dLoadingBars,\n infinity: dLoadingInfinity,\n }\n\n const spinnerClasses = [dLoading, typeClasses[type], sizeClasses[effectiveSize], className]\n .filter(Boolean)\n .join(' ')\n\n if (children) {\n return (\n <div className=\"relative\" {...rest}>\n {spinning && (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-base-100/50 backdrop-blur-sm z-10\">\n <span className={spinnerClasses}></span>\n {tip && <p className=\"mt-2 text-sm\">{tip}</p>}\n </div>\n )}\n <div className={spinning ? 'pointer-events-none' : ''}>{children}</div>\n </div>\n )\n }\n\n if (!spinning) {\n return null\n }\n\n return (\n <div className=\"flex flex-col items-center gap-2\" {...rest}>\n <span className={spinnerClasses}></span>\n {tip && <p className=\"text-sm\">{tip}</p>}\n </div>\n )\n}\n"],"names":["dLoading","dLoadingXs","dLoadingSm","dLoadingMd","dLoadingLg","dLoadingXl","dLoadingSpinner","dLoadingDots","dLoadingRing","dLoadingBall","dLoadingBars","dLoadingInfinity","Loading","size","type","className","spinning","children","tip","rest","componentSize","useConfig","effectiveSize","sizeClasses","spinnerClasses","jsxs","jsx"],"mappings":";;AAIA,MAAMA,IAAW,WACXC,IAAa,cACbC,IAAa,cACbC,IAAa,cACbC,IAAa,cACbC,IAAa,cACbC,IAAkB,mBAClBC,IAAe,gBACfC,IAAe,gBACfC,IAAe,gBACfC,IAAe,gBACfC,IAAmB,oBAUZC,IAAkC,CAAC;AAAA,EAC9C,MAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,WAAAC,IAAY;AAAA,EACZ,UAAAC,IAAW;AAAA,EACX,UAAAC;AAAA,EACA,KAAAC;AAAA,EACA,GAAGC;AACL,MAAM;AACJ,QAAM,EAAE,eAAAC,EAAA,IAAkBC,EAAA,GACpBC,IAAgBT,KAAQO,KAAiB,MAEzCG,IAAc;AAAA,IAClB,IAAItB;AAAA,IACJ,IAAIC;AAAA,IACJ,IAAIC;AAAA,IACJ,IAAIC;AAAA,IACJ,IAAIC;AAAA,EAAA,GAYAmB,IAAiB,CAACxB,GATJ;AAAA,IAClB,SAASM;AAAA,IACT,MAAMC;AAAA,IACN,MAAMC;AAAA,IACN,MAAMC;AAAA,IACN,MAAMC;AAAA,IACN,UAAUC;AAAA,EAAA,EAGkCG,CAAI,GAAGS,EAAYD,CAAa,GAAGP,CAAS,EACvF,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,SAAIE,IAEA,gBAAAQ,EAAC,OAAA,EAAI,WAAU,YAAY,GAAGN,GAC3B,UAAA;AAAA,IAAAH,KACC,gBAAAS,EAAC,OAAA,EAAI,WAAU,mGACb,UAAA;AAAA,MAAA,gBAAAC,EAAC,QAAA,EAAK,WAAWF,EAAA,CAAgB;AAAA,MAChCN,KAAO,gBAAAQ,EAAC,KAAA,EAAE,WAAU,gBAAgB,UAAAR,EAAA,CAAI;AAAA,IAAA,GAC3C;AAAA,sBAED,OAAA,EAAI,WAAWF,IAAW,wBAAwB,IAAK,UAAAC,EAAA,CAAS;AAAA,EAAA,GACnE,IAICD,IAKH,gBAAAS,EAAC,OAAA,EAAI,WAAU,oCAAoC,GAAGN,GACpD,UAAA;AAAA,IAAA,gBAAAO,EAAC,QAAA,EAAK,WAAWF,EAAA,CAAgB;AAAA,IAChCN,KAAO,gBAAAQ,EAAC,KAAA,EAAE,WAAU,WAAW,UAAAR,EAAA,CAAI;AAAA,EAAA,GACtC,IAPO;AASX;"}
@@ -1,37 +1,37 @@
1
- import { jsx as l } from "react/jsx-runtime";
2
- import { forwardRef as o } from "react";
3
- const i = {
4
- squircle: "mask-squircle",
5
- heart: "mask-heart",
6
- hexagon: "mask-hexagon",
7
- "hexagon-2": "mask-hexagon-2",
8
- decagon: "mask-decagon",
9
- pentagon: "mask-pentagon",
10
- diamond: "mask-diamond",
11
- square: "mask-square",
12
- circle: "mask-circle",
13
- star: "mask-star",
14
- "star-2": "mask-star-2",
15
- triangle: "mask-triangle",
16
- "triangle-2": "mask-triangle-2",
17
- "triangle-3": "mask-triangle-3",
18
- "triangle-4": "mask-triangle-4"
19
- }, k = {
20
- "half-1": "mask-half-1",
21
- "half-2": "mask-half-2"
22
- }, g = o(
23
- ({ shape: s, half: a, children: e, className: r = "", ...n }, m) => {
24
- const t = [
25
- "mask",
26
- i[s],
27
- a ? k[a] : "",
28
- r
1
+ import { jsx as k } from "react/jsx-runtime";
2
+ import { forwardRef as c } from "react";
3
+ const l = "mask", d = "mask-squircle", i = "mask-heart", m = "mask-hexagon", g = "mask-hexagon-2", M = "mask-decagon", f = "mask-pentagon", h = "mask-diamond", x = "mask-square", p = "mask-circle", u = "mask-star", q = "mask-star-2", H = "mask-triangle", S = "mask-triangle-2", T = "mask-triangle-3", C = "mask-triangle-4", j = "mask-half-1", D = "mask-half-2", N = {
4
+ squircle: d,
5
+ heart: i,
6
+ hexagon: m,
7
+ "hexagon-2": g,
8
+ decagon: M,
9
+ pentagon: f,
10
+ diamond: h,
11
+ square: x,
12
+ circle: p,
13
+ star: u,
14
+ "star-2": q,
15
+ triangle: H,
16
+ "triangle-2": S,
17
+ "triangle-3": T,
18
+ "triangle-4": C
19
+ }, v = {
20
+ "half-1": j,
21
+ "half-2": D
22
+ }, w = c(
23
+ ({ shape: s, half: a, children: n, className: e = "", ...t }, o) => {
24
+ const r = [
25
+ l,
26
+ N[s],
27
+ a ? v[a] : "",
28
+ e
29
29
  ].filter(Boolean).join(" ");
30
- return /* @__PURE__ */ l("div", { ref: m, className: t, ...n, children: e });
30
+ return /* @__PURE__ */ k("div", { ref: o, className: r, ...t, children: n });
31
31
  }
32
32
  );
33
- g.displayName = "Mask";
33
+ w.displayName = "Mask";
34
34
  export {
35
- g as Mask
35
+ w as Mask
36
36
  };
37
37
  //# sourceMappingURL=Mask.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Mask.js","sources":["../../src/components/Mask.tsx"],"sourcesContent":["import React, { forwardRef } from 'react'\n\nexport type MaskShape =\n | 'squircle'\n | 'heart'\n | 'hexagon'\n | 'hexagon-2'\n | 'decagon'\n | 'pentagon'\n | 'diamond'\n | 'square'\n | 'circle'\n | 'star'\n | 'star-2'\n | 'triangle'\n | 'triangle-2'\n | 'triangle-3'\n | 'triangle-4'\n\nexport type MaskHalf = 'half-1' | 'half-2'\n\nexport interface MaskProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Shape of the mask */\n shape: MaskShape\n /** Show only half of the mask */\n half?: MaskHalf\n /** Content to mask (typically an image) */\n children: React.ReactNode\n /** Additional CSS classes */\n className?: string\n}\n\nconst shapeClasses: Record<MaskShape, string> = {\n squircle: 'mask-squircle',\n heart: 'mask-heart',\n hexagon: 'mask-hexagon',\n 'hexagon-2': 'mask-hexagon-2',\n decagon: 'mask-decagon',\n pentagon: 'mask-pentagon',\n diamond: 'mask-diamond',\n square: 'mask-square',\n circle: 'mask-circle',\n star: 'mask-star',\n 'star-2': 'mask-star-2',\n triangle: 'mask-triangle',\n 'triangle-2': 'mask-triangle-2',\n 'triangle-3': 'mask-triangle-3',\n 'triangle-4': 'mask-triangle-4',\n}\n\nconst halfClasses: Record<MaskHalf, string> = {\n 'half-1': 'mask-half-1',\n 'half-2': 'mask-half-2',\n}\n\nexport const Mask = forwardRef<HTMLDivElement, MaskProps>(\n ({ shape, half, children, className = '', ...props }, ref) => {\n const classes = [\n 'mask',\n shapeClasses[shape],\n half ? halfClasses[half] : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <div ref={ref} className={classes} {...props}>\n {children}\n </div>\n )\n }\n)\n\nMask.displayName = 'Mask'\n"],"names":["shapeClasses","halfClasses","Mask","forwardRef","shape","half","children","className","props","ref","classes"],"mappings":";;AAgCA,MAAMA,IAA0C;AAAA,EAC9C,UAAU;AAAA,EACV,OAAO;AAAA,EACP,SAAS;AAAA,EACT,aAAa;AAAA,EACb,SAAS;AAAA,EACT,UAAU;AAAA,EACV,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,UAAU;AAAA,EACV,UAAU;AAAA,EACV,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAChB,GAEMC,IAAwC;AAAA,EAC5C,UAAU;AAAA,EACV,UAAU;AACZ,GAEaC,IAAOC;AAAA,EAClB,CAAC,EAAE,OAAAC,GAAO,MAAAC,GAAM,UAAAC,GAAU,WAAAC,IAAY,IAAI,GAAGC,EAAA,GAASC,MAAQ;AAC5D,UAAMC,IAAU;AAAA,MACd;AAAA,MACAV,EAAaI,CAAK;AAAA,MAClBC,IAAOJ,EAAYI,CAAI,IAAI;AAAA,MAC3BE;AAAA,IAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,6BACG,OAAA,EAAI,KAAAE,GAAU,WAAWC,GAAU,GAAGF,GACpC,UAAAF,GACH;AAAA,EAEJ;AACF;AAEAJ,EAAK,cAAc;"}
1
+ {"version":3,"file":"Mask.js","sources":["../../src/components/Mask.tsx"],"sourcesContent":["import React, { forwardRef } from 'react'\n\n// DaisyUI classes\nconst dMask = 'mask'\nconst dMaskSquircle = 'mask-squircle'\nconst dMaskHeart = 'mask-heart'\nconst dMaskHexagon = 'mask-hexagon'\nconst dMaskHexagon2 = 'mask-hexagon-2'\nconst dMaskDecagon = 'mask-decagon'\nconst dMaskPentagon = 'mask-pentagon'\nconst dMaskDiamond = 'mask-diamond'\nconst dMaskSquare = 'mask-square'\nconst dMaskCircle = 'mask-circle'\nconst dMaskStar = 'mask-star'\nconst dMaskStar2 = 'mask-star-2'\nconst dMaskTriangle = 'mask-triangle'\nconst dMaskTriangle2 = 'mask-triangle-2'\nconst dMaskTriangle3 = 'mask-triangle-3'\nconst dMaskTriangle4 = 'mask-triangle-4'\nconst dMaskHalf1 = 'mask-half-1'\nconst dMaskHalf2 = 'mask-half-2'\n\nexport type MaskShape =\n | 'squircle'\n | 'heart'\n | 'hexagon'\n | 'hexagon-2'\n | 'decagon'\n | 'pentagon'\n | 'diamond'\n | 'square'\n | 'circle'\n | 'star'\n | 'star-2'\n | 'triangle'\n | 'triangle-2'\n | 'triangle-3'\n | 'triangle-4'\n\nexport type MaskHalf = 'half-1' | 'half-2'\n\nexport interface MaskProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Shape of the mask */\n shape: MaskShape\n /** Show only half of the mask */\n half?: MaskHalf\n /** Content to mask (typically an image) */\n children: React.ReactNode\n /** Additional CSS classes */\n className?: string\n}\n\nconst shapeClasses: Record<MaskShape, string> = {\n squircle: dMaskSquircle,\n heart: dMaskHeart,\n hexagon: dMaskHexagon,\n 'hexagon-2': dMaskHexagon2,\n decagon: dMaskDecagon,\n pentagon: dMaskPentagon,\n diamond: dMaskDiamond,\n square: dMaskSquare,\n circle: dMaskCircle,\n star: dMaskStar,\n 'star-2': dMaskStar2,\n triangle: dMaskTriangle,\n 'triangle-2': dMaskTriangle2,\n 'triangle-3': dMaskTriangle3,\n 'triangle-4': dMaskTriangle4,\n}\n\nconst halfClasses: Record<MaskHalf, string> = {\n 'half-1': dMaskHalf1,\n 'half-2': dMaskHalf2,\n}\n\nexport const Mask = forwardRef<HTMLDivElement, MaskProps>(\n ({ shape, half, children, className = '', ...props }, ref) => {\n const classes = [\n dMask,\n shapeClasses[shape],\n half ? halfClasses[half] : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <div ref={ref} className={classes} {...props}>\n {children}\n </div>\n )\n }\n)\n\nMask.displayName = 'Mask'\n"],"names":["dMask","dMaskSquircle","dMaskHeart","dMaskHexagon","dMaskHexagon2","dMaskDecagon","dMaskPentagon","dMaskDiamond","dMaskSquare","dMaskCircle","dMaskStar","dMaskStar2","dMaskTriangle","dMaskTriangle2","dMaskTriangle3","dMaskTriangle4","dMaskHalf1","dMaskHalf2","shapeClasses","halfClasses","Mask","forwardRef","shape","half","children","className","props","ref","classes"],"mappings":";;AAGA,MAAMA,IAAQ,QACRC,IAAgB,iBAChBC,IAAa,cACbC,IAAe,gBACfC,IAAgB,kBAChBC,IAAe,gBACfC,IAAgB,iBAChBC,IAAe,gBACfC,IAAc,eACdC,IAAc,eACdC,IAAY,aACZC,IAAa,eACbC,IAAgB,iBAChBC,IAAiB,mBACjBC,IAAiB,mBACjBC,IAAiB,mBACjBC,IAAa,eACbC,IAAa,eAgCbC,IAA0C;AAAA,EAC9C,UAAUjB;AAAA,EACV,OAAOC;AAAA,EACP,SAASC;AAAA,EACT,aAAaC;AAAA,EACb,SAASC;AAAA,EACT,UAAUC;AAAA,EACV,SAASC;AAAA,EACT,QAAQC;AAAA,EACR,QAAQC;AAAA,EACR,MAAMC;AAAA,EACN,UAAUC;AAAA,EACV,UAAUC;AAAA,EACV,cAAcC;AAAA,EACd,cAAcC;AAAA,EACd,cAAcC;AAChB,GAEMI,IAAwC;AAAA,EAC5C,UAAUH;AAAA,EACV,UAAUC;AACZ,GAEaG,IAAOC;AAAA,EAClB,CAAC,EAAE,OAAAC,GAAO,MAAAC,GAAM,UAAAC,GAAU,WAAAC,IAAY,IAAI,GAAGC,EAAA,GAASC,MAAQ;AAC5D,UAAMC,IAAU;AAAA,MACd5B;AAAA,MACAkB,EAAaI,CAAK;AAAA,MAClBC,IAAOJ,EAAYI,CAAI,IAAI;AAAA,MAC3BE;AAAA,IAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,6BACG,OAAA,EAAI,KAAAE,GAAU,WAAWC,GAAU,GAAGF,GACpC,UAAAF,GACH;AAAA,EAEJ;AACF;AAEAJ,EAAK,cAAc;"}
@@ -1,69 +1,69 @@
1
1
  import { jsx as a, jsxs as K } from "react/jsx-runtime";
2
- import { useState as f, useRef as $, useCallback as A, useEffect as C } from "react";
3
- import { createPortal as oe } from "react-dom";
4
- const fe = ({
2
+ import { useState as f, useRef as P, useCallback as A, useEffect as C } from "react";
3
+ import { createPortal as le } from "react-dom";
4
+ const ce = "textarea", ie = "textarea-bordered", de = "menu", ue = "menu-sm", fe = "loading", me = "loading-spinner", he = "loading-sm", ge = "avatar", xe = ({
5
5
  value: p,
6
6
  defaultValue: q = "",
7
- onChange: E,
7
+ onChange: L,
8
8
  onSelect: U,
9
9
  onSearch: W,
10
- options: R = [],
10
+ options: $ = [],
11
11
  loading: X = !1,
12
- prefix: k = "@",
12
+ prefix: R = "@",
13
13
  split: v = " ",
14
14
  placeholder: Y,
15
15
  disabled: G = !1,
16
16
  readOnly: J = !1,
17
- rows: V = 3,
18
- autoSize: o = !1,
17
+ rows: S = 3,
18
+ autoSize: l = !1,
19
19
  notFoundContent: Q = "No matches found",
20
20
  filterOption: x = !0,
21
21
  className: Z = "",
22
22
  dropdownClassName: _ = "",
23
23
  ...z
24
24
  }) => {
25
- const [ee, T] = f(q), h = p !== void 0 ? p : ee, [u, m] = f(!1), [I, N] = f(null), [D, M] = f(""), [d, y] = f(0), [g, H] = f(null), [j, te] = f({ top: 0, left: 0 }), l = $(null), b = $(null), B = $(null), ne = Array.isArray(k) ? k : [k], c = A(() => {
26
- if (!x) return R;
25
+ const [ee, T] = f(q), m = p !== void 0 ? p : ee, [d, h] = f(!1), [k, I] = f(null), [M, N] = f(""), [u, y] = f(0), [g, D] = f(null), [E, te] = f({ top: 0, left: 0 }), o = P(null), b = P(null), V = P(null), ne = Array.isArray(R) ? R : [R], c = A(() => {
26
+ if (!x) return $;
27
27
  const e = typeof x == "function" ? x : (t, n) => (n.label || n.value).toLowerCase().includes(t.toLowerCase());
28
- return R.filter((t) => e(D, t));
29
- }, [R, D, x])(), L = A(() => {
30
- const e = l.current;
31
- if (!e || !o) return;
28
+ return $.filter((t) => e(M, t));
29
+ }, [$, M, x])(), B = A(() => {
30
+ const e = o.current;
31
+ if (!e || !l) return;
32
32
  e.style.height = "auto";
33
33
  const t = e.scrollHeight;
34
- if (typeof o == "object") {
35
- const n = parseInt(getComputedStyle(e).lineHeight) || 20, r = o.minRows ? o.minRows * n : 0, s = o.maxRows ? o.maxRows * n : 1 / 0;
34
+ if (typeof l == "object") {
35
+ const n = parseInt(getComputedStyle(e).lineHeight) || 20, r = l.minRows ? l.minRows * n : 0, s = l.maxRows ? l.maxRows * n : 1 / 0;
36
36
  e.style.height = `${Math.min(Math.max(t, r), s)}px`;
37
37
  } else
38
38
  e.style.height = `${t}px`;
39
- }, [o]);
39
+ }, [l]);
40
40
  C(() => {
41
- L();
42
- }, [h, L]);
43
- const O = A(() => {
44
- const e = l.current, t = B.current;
41
+ B();
42
+ }, [m, B]);
43
+ const j = A(() => {
44
+ const e = o.current, t = V.current;
45
45
  if (!e || !t || g === null) return;
46
- const n = h.substring(0, g);
46
+ const n = m.substring(0, g);
47
47
  t.textContent = n;
48
48
  const r = e.getBoundingClientRect(), s = t.getBoundingClientRect(), w = parseInt(getComputedStyle(e).lineHeight) || 20;
49
49
  te({
50
50
  top: r.top + window.scrollY + w + 4,
51
51
  left: r.left + window.scrollX + Math.min(s.width % r.width, r.width - 200)
52
52
  });
53
- }, [h, g]);
53
+ }, [m, g]);
54
54
  C(() => {
55
- u && O();
56
- }, [u, O, D]);
55
+ d && j();
56
+ }, [d, j, M]);
57
57
  const re = (e) => {
58
58
  const t = e.target.value, n = e.target.selectionStart;
59
- p === void 0 && T(t), E?.(t), se(t, n);
59
+ p === void 0 && T(t), L?.(t), se(t, n);
60
60
  }, se = (e, t) => {
61
61
  let n = null, r = null;
62
62
  for (const s of ne) {
63
63
  const i = e.substring(0, t).lastIndexOf(s);
64
64
  if (i !== -1) {
65
- const S = i > 0 ? e[i - 1] : v;
66
- if (S === v || S === `
65
+ const O = i > 0 ? e[i - 1] : v;
66
+ if (O === v || O === `
67
67
  ` || i === 0) {
68
68
  const F = e.substring(i + s.length, t);
69
69
  if (!F.includes(v) && !F.includes(`
@@ -76,20 +76,20 @@ const fe = ({
76
76
  }
77
77
  if (n !== null && r !== null) {
78
78
  const s = e.substring(r + n.length, t);
79
- N(n), M(s), H(r), m(!0), y(0), W?.(s, n);
79
+ I(n), N(s), D(r), h(!0), y(0), W?.(s, n);
80
80
  } else
81
- m(!1), N(null), M(""), H(null);
82
- }, P = (e) => {
83
- if (e.disabled || g === null || I === null) return;
84
- const t = l.current;
81
+ h(!1), I(null), N(""), D(null);
82
+ }, H = (e) => {
83
+ if (e.disabled || g === null || k === null) return;
84
+ const t = o.current;
85
85
  if (!t) return;
86
- const n = h.substring(0, g), r = h.substring(t.selectionStart), s = `${I}${e.value}${v}`, w = n + s + r;
87
- p === void 0 && T(w), E?.(w), U?.(e, I), m(!1), N(null), M(""), H(null), setTimeout(() => {
86
+ const n = m.substring(0, g), r = m.substring(t.selectionStart), s = `${k}${e.value}${v}`, w = n + s + r;
87
+ p === void 0 && T(w), L?.(w), U?.(e, k), h(!1), I(null), N(""), D(null), setTimeout(() => {
88
88
  const i = n.length + s.length;
89
89
  t.focus(), t.setSelectionRange(i, i);
90
90
  }, 0);
91
91
  }, ae = (e) => {
92
- if (u)
92
+ if (d)
93
93
  switch (e.key) {
94
94
  case "ArrowDown":
95
95
  e.preventDefault(), y((t) => (t + 1) % Math.max(c.length, 1));
@@ -98,60 +98,60 @@ const fe = ({
98
98
  e.preventDefault(), y((t) => (t - 1 + c.length) % Math.max(c.length, 1));
99
99
  break;
100
100
  case "Enter":
101
- c[d] && (e.preventDefault(), P(c[d]));
101
+ c[u] && (e.preventDefault(), H(c[u]));
102
102
  break;
103
103
  case "Escape":
104
- e.preventDefault(), m(!1);
104
+ e.preventDefault(), h(!1);
105
105
  break;
106
106
  case "Tab":
107
- c[d] && (e.preventDefault(), P(c[d]));
107
+ c[u] && (e.preventDefault(), H(c[u]));
108
108
  break;
109
109
  }
110
110
  };
111
111
  C(() => {
112
112
  const e = (t) => {
113
- b.current && !b.current.contains(t.target) && l.current && !l.current.contains(t.target) && m(!1);
113
+ b.current && !b.current.contains(t.target) && o.current && !o.current.contains(t.target) && h(!1);
114
114
  };
115
115
  return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
116
116
  }, []), C(() => {
117
- u && b.current && b.current.querySelector('[data-active="true"]')?.scrollIntoView({ block: "nearest" });
118
- }, [d, u]);
119
- const le = u && /* @__PURE__ */ a(
117
+ d && b.current && b.current.querySelector('[data-active="true"]')?.scrollIntoView({ block: "nearest" });
118
+ }, [u, d]);
119
+ const oe = d && /* @__PURE__ */ a(
120
120
  "div",
121
121
  {
122
122
  ref: b,
123
123
  className: `fixed z-50 bg-base-100 border border-base-300 rounded-lg shadow-lg
124
124
  min-w-48 max-h-60 overflow-auto ${_}`,
125
125
  style: {
126
- top: j.top,
127
- left: j.left
126
+ top: E.top,
127
+ left: E.left
128
128
  },
129
- children: X ? /* @__PURE__ */ a("div", { className: "p-3 text-center text-base-content/60", children: /* @__PURE__ */ a("span", { className: "loading loading-spinner loading-sm" }) }) : c.length === 0 ? /* @__PURE__ */ a("div", { className: "p-3 text-center text-base-content/60 text-sm", children: Q }) : /* @__PURE__ */ a("ul", { className: "menu menu-sm p-1", children: c.map((e, t) => /* @__PURE__ */ a("li", { children: /* @__PURE__ */ K(
129
+ children: X ? /* @__PURE__ */ a("div", { className: "p-3 text-center text-base-content/60", children: /* @__PURE__ */ a("span", { className: `${fe} ${me} ${he}` }) }) : c.length === 0 ? /* @__PURE__ */ a("div", { className: "p-3 text-center text-base-content/60 text-sm", children: Q }) : /* @__PURE__ */ a("ul", { className: `${de} ${ue} p-1`, children: c.map((e, t) => /* @__PURE__ */ a("li", { children: /* @__PURE__ */ K(
130
130
  "button",
131
131
  {
132
132
  type: "button",
133
- "data-active": t === d,
134
- className: `flex items-center gap-2 ${t === d ? "active" : ""} ${e.disabled ? "disabled opacity-50 cursor-not-allowed" : ""}`,
135
- onClick: () => P(e),
133
+ "data-active": t === u,
134
+ className: `flex items-center gap-2 ${t === u ? "active" : ""} ${e.disabled ? "disabled opacity-50 cursor-not-allowed" : ""}`,
135
+ onClick: () => H(e),
136
136
  onMouseEnter: () => y(t),
137
137
  children: [
138
- e.avatar && /* @__PURE__ */ a("div", { className: "avatar", children: /* @__PURE__ */ a("div", { className: "w-6 h-6 rounded-full", children: /* @__PURE__ */ a("img", { src: e.avatar, alt: "" }) }) }),
138
+ e.avatar && /* @__PURE__ */ a("div", { className: ge, children: /* @__PURE__ */ a("div", { className: "w-6 h-6 rounded-full", children: /* @__PURE__ */ a("img", { src: e.avatar, alt: "" }) }) }),
139
139
  /* @__PURE__ */ a("span", { children: e.label || e.value })
140
140
  ]
141
141
  }
142
142
  ) }, e.value)) })
143
143
  }
144
144
  );
145
- return /* @__PURE__ */ K("div", { className: `relative ${Z}`, "data-state": u ? "open" : "closed", ...z, children: [
145
+ return /* @__PURE__ */ K("div", { className: `relative ${Z}`, "data-state": d ? "open" : "closed", ...z, children: [
146
146
  /* @__PURE__ */ a(
147
147
  "div",
148
148
  {
149
- ref: B,
149
+ ref: V,
150
150
  className: "invisible absolute whitespace-pre-wrap break-words",
151
151
  style: {
152
- font: l.current ? getComputedStyle(l.current).font : void 0,
153
- width: l.current?.clientWidth,
154
- padding: l.current ? getComputedStyle(l.current).padding : void 0
152
+ font: o.current ? getComputedStyle(o.current).font : void 0,
153
+ width: o.current?.clientWidth,
154
+ padding: o.current ? getComputedStyle(o.current).padding : void 0
155
155
  },
156
156
  "aria-hidden": "true"
157
157
  }
@@ -159,21 +159,21 @@ const fe = ({
159
159
  /* @__PURE__ */ a(
160
160
  "textarea",
161
161
  {
162
- ref: l,
163
- value: h,
162
+ ref: o,
163
+ value: m,
164
164
  onChange: re,
165
165
  onKeyDown: ae,
166
166
  placeholder: Y,
167
167
  disabled: G,
168
168
  readOnly: J,
169
- rows: typeof o == "object" ? o.minRows || V : o ? 1 : V,
170
- className: "textarea textarea-bordered w-full resize-none"
169
+ rows: typeof l == "object" ? l.minRows || S : l ? 1 : S,
170
+ className: `${ce} ${ie} w-full resize-none`
171
171
  }
172
172
  ),
173
- oe(le, document.body)
173
+ le(oe, document.body)
174
174
  ] });
175
175
  };
176
176
  export {
177
- fe as Mention
177
+ xe as Mention
178
178
  };
179
179
  //# sourceMappingURL=Mention.js.map
@@ -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\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=\"loading loading-spinner loading-sm\"></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=\"menu menu-sm 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=\"avatar\">\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=\"textarea textarea-bordered w-full resize-none\"\n />\n\n {createPortal(dropdown, document.body)}\n </div>\n )\n}\n"],"names":["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'\n\n// DaisyUI classes\nconst dTextarea = 'textarea'\nconst dTextareaBordered = 'textarea-bordered'\nconst dMenu = 'menu'\nconst dMenuSm = 'menu-sm'\nconst dLoading = 'loading'\nconst dLoadingSpinner = 'loading-spinner'\nconst dLoadingSm = 'loading-sm'\nconst dAvatar = '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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"}