@nuvia/components 0.1.0

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 (243) hide show
  1. package/README.md +96 -0
  2. package/dist/hooks/use-mobile.cjs +44 -0
  3. package/dist/hooks/use-mobile.cjs.map +1 -0
  4. package/dist/hooks/use-mobile.js +22 -0
  5. package/dist/hooks/use-mobile.js.map +1 -0
  6. package/dist/hooks/use-toast.cjs +146 -0
  7. package/dist/hooks/use-toast.cjs.map +1 -0
  8. package/dist/hooks/use-toast.js +122 -0
  9. package/dist/hooks/use-toast.js.map +1 -0
  10. package/dist/index.cjs +4117 -0
  11. package/dist/index.cjs.map +1 -0
  12. package/dist/index.js +3800 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/lib/fonts.cjs +15 -0
  15. package/dist/lib/fonts.cjs.map +1 -0
  16. package/dist/lib/fonts.js +13 -0
  17. package/dist/lib/fonts.js.map +1 -0
  18. package/dist/lib/utils.cjs +18 -0
  19. package/dist/lib/utils.cjs.map +1 -0
  20. package/dist/lib/utils.js +14 -0
  21. package/dist/lib/utils.js.map +1 -0
  22. package/dist/providers/theme.cjs +24 -0
  23. package/dist/providers/theme.cjs.map +1 -0
  24. package/dist/providers/theme.js +22 -0
  25. package/dist/providers/theme.js.map +1 -0
  26. package/dist/ui/accordion.cjs +75 -0
  27. package/dist/ui/accordion.cjs.map +1 -0
  28. package/dist/ui/accordion.js +49 -0
  29. package/dist/ui/accordion.js.map +1 -0
  30. package/dist/ui/alert-dialog.cjs +189 -0
  31. package/dist/ui/alert-dialog.cjs.map +1 -0
  32. package/dist/ui/alert-dialog.js +156 -0
  33. package/dist/ui/alert-dialog.js.map +1 -0
  34. package/dist/ui/alert.cjs +81 -0
  35. package/dist/ui/alert.cjs.map +1 -0
  36. package/dist/ui/alert.js +57 -0
  37. package/dist/ui/alert.js.map +1 -0
  38. package/dist/ui/aspect-ratio.cjs +29 -0
  39. package/dist/ui/aspect-ratio.cjs.map +1 -0
  40. package/dist/ui/aspect-ratio.js +7 -0
  41. package/dist/ui/aspect-ratio.js.map +1 -0
  42. package/dist/ui/auto-complete.cjs +284 -0
  43. package/dist/ui/auto-complete.cjs.map +1 -0
  44. package/dist/ui/auto-complete.js +262 -0
  45. package/dist/ui/auto-complete.js.map +1 -0
  46. package/dist/ui/avatar.cjs +70 -0
  47. package/dist/ui/avatar.cjs.map +1 -0
  48. package/dist/ui/avatar.js +45 -0
  49. package/dist/ui/avatar.js.map +1 -0
  50. package/dist/ui/badge.cjs +34 -0
  51. package/dist/ui/badge.cjs.map +1 -0
  52. package/dist/ui/badge.js +31 -0
  53. package/dist/ui/badge.js.map +1 -0
  54. package/dist/ui/breadcrumb.cjs +120 -0
  55. package/dist/ui/breadcrumb.cjs.map +1 -0
  56. package/dist/ui/breadcrumb.js +92 -0
  57. package/dist/ui/breadcrumb.js.map +1 -0
  58. package/dist/ui/button.cjs +80 -0
  59. package/dist/ui/button.cjs.map +1 -0
  60. package/dist/ui/button.js +57 -0
  61. package/dist/ui/button.js.map +1 -0
  62. package/dist/ui/calendar.cjs +135 -0
  63. package/dist/ui/calendar.cjs.map +1 -0
  64. package/dist/ui/calendar.js +113 -0
  65. package/dist/ui/calendar.js.map +1 -0
  66. package/dist/ui/card.cjs +89 -0
  67. package/dist/ui/card.cjs.map +1 -0
  68. package/dist/ui/card.js +62 -0
  69. package/dist/ui/card.js.map +1 -0
  70. package/dist/ui/carousel.cjs +269 -0
  71. package/dist/ui/carousel.cjs.map +1 -0
  72. package/dist/ui/carousel.js +240 -0
  73. package/dist/ui/carousel.js.map +1 -0
  74. package/dist/ui/chart.cjs +267 -0
  75. package/dist/ui/chart.cjs.map +1 -0
  76. package/dist/ui/chart.js +239 -0
  77. package/dist/ui/chart.js.map +1 -0
  78. package/dist/ui/checkbox.cjs +55 -0
  79. package/dist/ui/checkbox.cjs.map +1 -0
  80. package/dist/ui/checkbox.js +32 -0
  81. package/dist/ui/checkbox.js.map +1 -0
  82. package/dist/ui/chip.cjs +79 -0
  83. package/dist/ui/chip.cjs.map +1 -0
  84. package/dist/ui/chip.js +55 -0
  85. package/dist/ui/chip.js.map +1 -0
  86. package/dist/ui/collapsible.cjs +33 -0
  87. package/dist/ui/collapsible.cjs.map +1 -0
  88. package/dist/ui/collapsible.js +9 -0
  89. package/dist/ui/collapsible.js.map +1 -0
  90. package/dist/ui/combobox.cjs +254 -0
  91. package/dist/ui/combobox.cjs.map +1 -0
  92. package/dist/ui/combobox.js +232 -0
  93. package/dist/ui/combobox.js.map +1 -0
  94. package/dist/ui/command.cjs +199 -0
  95. package/dist/ui/command.cjs.map +1 -0
  96. package/dist/ui/command.js +168 -0
  97. package/dist/ui/command.js.map +1 -0
  98. package/dist/ui/context-menu.cjs +181 -0
  99. package/dist/ui/context-menu.cjs.map +1 -0
  100. package/dist/ui/context-menu.js +144 -0
  101. package/dist/ui/context-menu.js.map +1 -0
  102. package/dist/ui/dialog.cjs +132 -0
  103. package/dist/ui/dialog.cjs.map +1 -0
  104. package/dist/ui/dialog.js +100 -0
  105. package/dist/ui/dialog.js.map +1 -0
  106. package/dist/ui/drawer.cjs +128 -0
  107. package/dist/ui/drawer.cjs.map +1 -0
  108. package/dist/ui/drawer.js +97 -0
  109. package/dist/ui/drawer.js.map +1 -0
  110. package/dist/ui/dropdown-menu.cjs +194 -0
  111. package/dist/ui/dropdown-menu.cjs.map +1 -0
  112. package/dist/ui/dropdown-menu.js +157 -0
  113. package/dist/ui/dropdown-menu.js.map +1 -0
  114. package/dist/ui/form.cjs +179 -0
  115. package/dist/ui/form.cjs.map +1 -0
  116. package/dist/ui/form.js +149 -0
  117. package/dist/ui/form.js.map +1 -0
  118. package/dist/ui/hover-card.cjs +53 -0
  119. package/dist/ui/hover-card.cjs.map +1 -0
  120. package/dist/ui/hover-card.js +28 -0
  121. package/dist/ui/hover-card.js.map +1 -0
  122. package/dist/ui/input-otp.cjs +76 -0
  123. package/dist/ui/input-otp.cjs.map +1 -0
  124. package/dist/ui/input-otp.js +51 -0
  125. package/dist/ui/input-otp.js.map +1 -0
  126. package/dist/ui/input.cjs +51 -0
  127. package/dist/ui/input.cjs.map +1 -0
  128. package/dist/ui/input.js +29 -0
  129. package/dist/ui/input.js.map +1 -0
  130. package/dist/ui/label.cjs +55 -0
  131. package/dist/ui/label.cjs.map +1 -0
  132. package/dist/ui/label.js +32 -0
  133. package/dist/ui/label.js.map +1 -0
  134. package/dist/ui/lottie-animation.cjs +85 -0
  135. package/dist/ui/lottie-animation.cjs.map +1 -0
  136. package/dist/ui/lottie-animation.js +79 -0
  137. package/dist/ui/lottie-animation.js.map +1 -0
  138. package/dist/ui/menubar.cjs +210 -0
  139. package/dist/ui/menubar.cjs.map +1 -0
  140. package/dist/ui/menubar.js +172 -0
  141. package/dist/ui/menubar.js.map +1 -0
  142. package/dist/ui/multi-combobox.cjs +319 -0
  143. package/dist/ui/multi-combobox.cjs.map +1 -0
  144. package/dist/ui/multi-combobox.js +297 -0
  145. package/dist/ui/multi-combobox.js.map +1 -0
  146. package/dist/ui/navigation-menu.cjs +136 -0
  147. package/dist/ui/navigation-menu.cjs.map +1 -0
  148. package/dist/ui/navigation-menu.js +105 -0
  149. package/dist/ui/navigation-menu.js.map +1 -0
  150. package/dist/ui/pagination.cjs +172 -0
  151. package/dist/ui/pagination.cjs.map +1 -0
  152. package/dist/ui/pagination.js +144 -0
  153. package/dist/ui/pagination.js.map +1 -0
  154. package/dist/ui/popover.cjs +55 -0
  155. package/dist/ui/popover.cjs.map +1 -0
  156. package/dist/ui/popover.js +29 -0
  157. package/dist/ui/popover.js.map +1 -0
  158. package/dist/ui/progress.cjs +54 -0
  159. package/dist/ui/progress.cjs.map +1 -0
  160. package/dist/ui/progress.js +31 -0
  161. package/dist/ui/progress.js.map +1 -0
  162. package/dist/ui/radio-group.cjs +62 -0
  163. package/dist/ui/radio-group.cjs.map +1 -0
  164. package/dist/ui/radio-group.js +38 -0
  165. package/dist/ui/radio-group.js.map +1 -0
  166. package/dist/ui/resizable.cjs +65 -0
  167. package/dist/ui/resizable.cjs.map +1 -0
  168. package/dist/ui/resizable.js +41 -0
  169. package/dist/ui/resizable.js.map +1 -0
  170. package/dist/ui/scroll-area.cjs +66 -0
  171. package/dist/ui/scroll-area.cjs.map +1 -0
  172. package/dist/ui/scroll-area.js +42 -0
  173. package/dist/ui/scroll-area.js.map +1 -0
  174. package/dist/ui/select.cjs +152 -0
  175. package/dist/ui/select.cjs.map +1 -0
  176. package/dist/ui/select.js +120 -0
  177. package/dist/ui/select.js.map +1 -0
  178. package/dist/ui/separator.cjs +52 -0
  179. package/dist/ui/separator.cjs.map +1 -0
  180. package/dist/ui/separator.js +29 -0
  181. package/dist/ui/separator.js.map +1 -0
  182. package/dist/ui/sheet.cjs +143 -0
  183. package/dist/ui/sheet.cjs.map +1 -0
  184. package/dist/ui/sheet.js +111 -0
  185. package/dist/ui/sheet.js.map +1 -0
  186. package/dist/ui/sidebar.cjs +816 -0
  187. package/dist/ui/sidebar.cjs.map +1 -0
  188. package/dist/ui/sidebar.js +768 -0
  189. package/dist/ui/sidebar.js.map +1 -0
  190. package/dist/ui/skeleton.cjs +25 -0
  191. package/dist/ui/skeleton.cjs.map +1 -0
  192. package/dist/ui/skeleton.js +23 -0
  193. package/dist/ui/skeleton.js.map +1 -0
  194. package/dist/ui/slider.cjs +51 -0
  195. package/dist/ui/slider.cjs.map +1 -0
  196. package/dist/ui/slider.js +28 -0
  197. package/dist/ui/slider.js.map +1 -0
  198. package/dist/ui/sonner.cjs +46 -0
  199. package/dist/ui/sonner.cjs.map +1 -0
  200. package/dist/ui/sonner.js +41 -0
  201. package/dist/ui/sonner.js.map +1 -0
  202. package/dist/ui/spinner.cjs +83 -0
  203. package/dist/ui/spinner.cjs.map +1 -0
  204. package/dist/ui/spinner.js +81 -0
  205. package/dist/ui/spinner.js.map +1 -0
  206. package/dist/ui/switch.cjs +67 -0
  207. package/dist/ui/switch.cjs.map +1 -0
  208. package/dist/ui/switch.js +44 -0
  209. package/dist/ui/switch.js.map +1 -0
  210. package/dist/ui/table.cjs +118 -0
  211. package/dist/ui/table.cjs.map +1 -0
  212. package/dist/ui/table.js +89 -0
  213. package/dist/ui/table.js.map +1 -0
  214. package/dist/ui/tabs.cjs +79 -0
  215. package/dist/ui/tabs.cjs.map +1 -0
  216. package/dist/ui/tabs.js +53 -0
  217. package/dist/ui/tabs.js.map +1 -0
  218. package/dist/ui/textarea.cjs +48 -0
  219. package/dist/ui/textarea.cjs.map +1 -0
  220. package/dist/ui/textarea.js +26 -0
  221. package/dist/ui/textarea.js.map +1 -0
  222. package/dist/ui/toast.cjs +125 -0
  223. package/dist/ui/toast.cjs.map +1 -0
  224. package/dist/ui/toast.js +96 -0
  225. package/dist/ui/toast.js.map +1 -0
  226. package/dist/ui/toaster.cjs +251 -0
  227. package/dist/ui/toaster.cjs.map +1 -0
  228. package/dist/ui/toaster.js +228 -0
  229. package/dist/ui/toaster.js.map +1 -0
  230. package/dist/ui/toggle-group.cjs +101 -0
  231. package/dist/ui/toggle-group.cjs.map +1 -0
  232. package/dist/ui/toggle-group.js +76 -0
  233. package/dist/ui/toggle-group.js.map +1 -0
  234. package/dist/ui/toggle.cjs +66 -0
  235. package/dist/ui/toggle.cjs.map +1 -0
  236. package/dist/ui/toggle.js +42 -0
  237. package/dist/ui/toggle.js.map +1 -0
  238. package/dist/ui/tooltip.cjs +54 -0
  239. package/dist/ui/tooltip.cjs.map +1 -0
  240. package/dist/ui/tooltip.js +28 -0
  241. package/dist/ui/tooltip.js.map +1 -0
  242. package/package.json +116 -0
  243. package/src/styles/globals.css +529 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/utils.ts","../../src/ui/input.tsx","../../src/ui/auto-complete.tsx"],"names":["twMerge","clsx","React","jsx","React2","useTranslations","jsxs","CheckIcon"],"mappings":"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","file":"auto-complete.cjs","sourcesContent":["import { clsx } from \"clsx\";\nimport type { ClassValue } from \"clsx\";\nimport { toast } from \"sonner\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport const cn = (...inputs: ClassValue[]): string => twMerge(clsx(inputs));\n\nexport const capitalize = (str: string) =>\n str?.charAt(0)?.toUpperCase() + str?.slice(1);\n\nexport const handleError = (error: { message: string }): void => {\n toast.error(error.message);\n};\n","import * as React from \"react\"\n\nimport { cn } from \"../lib/utils\"\n\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<\"input\">>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-10 w-full rounded-xl border border-border bg-transparent px-3 py-1 text-base transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm group-aria-[invalid=true]:border-danger-foreground aria-[invalid=true]:border-danger-foreground\",\n className\n )}\n ref={ref}\n {...props}\n />\n )\n }\n)\nInput.displayName = \"Input\"\n\nexport { Input }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"../lib/utils\"\nimport { CheckIcon } from \"@radix-ui/react-icons\"\nimport { useTranslations } from 'next-intl';\nimport { Input } from \"./input\";\nimport { Skeleton } from \"./skeleton\";\n\nexport interface AutoCompleteOption {\n value: string\n label: string\n}\n\n/**\n * A AutoComplete that uses direct DOM manipulation, with debounce,\n * and a focus guard to prevent focus loss on mobile devices during typing.\n */\n\ninterface AutoCompleteProps {\n id?: string;\n options: AutoCompleteOption[]\n placeholder?: string\n searchPlaceholder?: string\n emptyMessage?: string\n inputClassName?: string\n listClassName?: string\n allowNewOption?: boolean\n value?: AutoCompleteOption[] // Always array of option objects\n onValueChange?: (value: AutoCompleteOption[]) => void // Always returns option array\n onSelect?: (value: AutoCompleteOption[]) => void // Always returns option array\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void\n characterSenstiveCount?: number\n isLoading?: boolean\n showSuggestions?: boolean\n disabled?: boolean\n closeOptionsOnSelect?: boolean\n initialSuggestions?: { label: string; value: string }[]\n}\n\n/**\n * A completely reworked AutoComplete that uses direct DOM manipulation\n * to prevent focus loss on mobile devices during typing.\n */\nconst AutoComplete = React.forwardRef<HTMLDivElement, AutoCompleteProps>(({\n id,\n options,\n placeholder,\n emptyMessage,\n inputClassName,\n listClassName,\n allowNewOption,\n disabled,\n value: controlledValue,\n onValueChange, \n onSelect,\n onChange,\n showSuggestions = true,\n characterSenstiveCount = 2,\n isLoading = false, // Default to not loading\n closeOptionsOnSelect = true,\n initialSuggestions,\n}, ref) => {\n const t = useTranslations('auto-complete');\n // Use refs instead of state where possible to avoid re-renders during typing\n const valueRef = React.useRef<AutoCompleteOption[]>(controlledValue || []);\n const searchValueRef = React.useRef<string>(\"\");\n const [showOptions, setShowOptions] = React.useState(false);\n const [isHoveringOptions, setIsHoveringOptions] = React.useState(false);\n const [optionsToShow, setOptionsToShow] = React.useState<AutoCompleteOption[]>([]);\n const [showAbove, setShowAbove] = React.useState(false);\n const inputRef = React.useRef<HTMLInputElement>(null);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const optionsContainerRef = React.useRef<HTMLDivElement>(null);\n const mobileDetected = React.useRef(\n typeof window !== 'undefined' &&\n /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n navigator.userAgent\n )\n );\n \n // Default values using translations\n const defaultPlaceholder = isLoading \n ? 'Loading suggestions...' \n : (placeholder || t('select-option'));\n const defaultEmptyMessage = emptyMessage || t('no-option-found');\n \n // Check if there's enough space below the input\n const checkPosition = React.useCallback(() => {\n if (!inputRef.current || !containerRef.current) return;\n \n const inputRect = inputRef.current.getBoundingClientRect();\n const windowHeight = window.innerHeight;\n const bottomSpace = windowHeight - inputRect.bottom;\n const optionsHeight = 320; // Approximate max height for options (max-h-60 = 15rem = 240px + padding)\n \n // If there's not enough space below, show above\n setShowAbove(bottomSpace < optionsHeight);\n }, []);\n \n // Initialize options when component mounts or options change\n React.useEffect(() => {\n // Only set initial options if we have options and we're not loading\n if (options?.length && !isLoading) {\n if(!searchValueRef.current) {\n setOptionsToShow(initialSuggestions || options.slice(0, 20));\n } else {\n setOptionsToShow(options.slice(0, 20));\n }\n }\n }, [options, isLoading]);\n \n // Handle window resize and scroll to recalculate position\n React.useEffect(() => {\n if (!showOptions) return;\n \n // Initial position check\n checkPosition();\n \n // Add event listeners for resize and scroll\n window.addEventListener('resize', checkPosition);\n window.addEventListener('scroll', checkPosition);\n \n return () => {\n window.removeEventListener('resize', checkPosition);\n window.removeEventListener('scroll', checkPosition);\n };\n }, [showOptions, checkPosition]);\n \n // Handle forwarded ref\n React.useImperativeHandle(ref, () => ({\n querySelector: (selector: string) => {\n if (selector === 'input') return inputRef.current;\n return containerRef.current?.querySelector(selector);\n }\n } as unknown as HTMLDivElement));\n \n // Handle input value updates without state changes\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const inputValue = e.target.value;\n searchValueRef.current = inputValue;\n \n // Call parent onChange without triggering re-render\n if (onChange) {\n onChange(e);\n }\n \n // Filter options without state updates during typing\n if (mobileDetected.current) {\n // For mobile, delay showing options to prevent keyboard flicker\n setTimeout(() => {\n const filtered = inputValue \n ? options.filter(option => \n option.label.toLowerCase().includes(inputValue.toLowerCase()))\n : options;\n setOptionsToShow(filtered.slice(0, 20));\n setShowOptions(true);\n }, 50);\n } else {\n // For desktop, update immediately\n const filtered = inputValue \n ? options.filter(option => \n option.label.toLowerCase().includes(inputValue.toLowerCase()))\n : options;\n setOptionsToShow(filtered.slice(0, 20));\n setShowOptions(!!inputValue || filtered.length > 0);\n }\n };\n \n // Handle selection with minimal state updates\n const handleSelect = (selectedValue: string, selectedLabel: string) => {\n const currentValue = valueRef.current;\n const newOptionItem: AutoCompleteOption = { value: selectedValue, label: selectedLabel };\n \n // Check if the option is already selected\n const isSelected = currentValue.some(item => item.value === selectedValue);\n \n // Toggle selection\n let newValue: AutoCompleteOption[];\n if (isSelected) {\n newValue = currentValue.filter(item => item.value !== selectedValue);\n } else {\n newValue = [...currentValue, newOptionItem];\n }\n \n valueRef.current = newValue;\n \n // Only trigger state updates after selection is complete\n if (inputRef.current) {\n inputRef.current.value = \"\";\n searchValueRef.current = \"\";\n }\n \n // Hide options\n if (closeOptionsOnSelect) {\n setShowOptions(false);\n }\n \n // Notify parent components\n if (onValueChange) onValueChange(newValue);\n if (onSelect) onSelect(newValue);\n \n // Ensure the input keeps focus on mobile\n if (mobileDetected.current && inputRef.current) {\n // Use a longer timeout to ensure the keyboard stays up\n setTimeout(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n }\n }, 100);\n }\n };\n \n // Handle outside clicks\n React.useEffect(() => {\n const handleOutsideClick = (e: MouseEvent) => {\n if (\n containerRef.current && \n !containerRef.current.contains(e.target as Node) &&\n optionsContainerRef.current &&\n !optionsContainerRef.current.contains(e.target as Node)\n ) {\n setShowOptions(false);\n }\n };\n \n document.addEventListener('mousedown', handleOutsideClick);\n return () => {\n document.removeEventListener('mousedown', handleOutsideClick);\n };\n }, []);\n \n // Update ref when controlled value changes\n React.useEffect(() => {\n if (controlledValue !== undefined) {\n valueRef.current = controlledValue;\n }\n }, [controlledValue]);\n \n // Get array of selected values for checking\n const selectedValueKeys = valueRef.current.map(item => item.value);\n \n\n return (\n <div ref={containerRef} className={cn(\"relative\", inputClassName)}>\n {/* Input field that maintains focus */}\n <Input\n disabled={disabled}\n ref={inputRef}\n type=\"text\"\n id={id || Math.random().toString(36).substring(2, 15)}\n placeholder={defaultPlaceholder}\n className=\"w-full rounded-xl placeholder:text-sm placeholder:truncate\"\n onChange={handleInputChange}\n onBlur={() => {\n if(allowNewOption && searchValueRef.current && !isHoveringOptions) {\n handleSelect(searchValueRef.current, searchValueRef.current);\n setShowOptions(false);\n }\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n if(optionsToShow.length > 0) {\n handleSelect(optionsToShow[0].value, optionsToShow[0].label);\n setShowOptions(false);\n inputRef.current?.blur();\n } else {\n if(allowNewOption) {\n handleSelect(searchValueRef.current, searchValueRef.current);\n setShowOptions(false);\n inputRef.current?.blur();\n }\n }\n }\n }}\n onFocus={() => {\n // Show options when input is focused with initial list\n if (mobileDetected.current) {\n setTimeout(() => {\n // Make sure we have initial options set\n if (optionsToShow.length === 0 && options.length > 0) {\n setOptionsToShow(options.slice(0, 20));\n }\n setShowOptions(true);\n checkPosition(); // Check position when showing options\n }, 50);\n } else {\n // For desktop, just show the options\n if (optionsToShow.length === 0 && options.length > 0) {\n setOptionsToShow(options.slice(0, 20));\n }\n setShowOptions(true);\n checkPosition(); // Check position when showing options\n }\n }}\n />\n {/* Options dropdown */}\n {showOptions && showSuggestions && (\n <div \n onMouseEnter={() => setIsHoveringOptions(true)}\n onMouseLeave={() => setIsHoveringOptions(false)}\n ref={optionsContainerRef}\n className={cn(\n \"absolute z-50 max-h-60 w-full overflow-auto rounded-xl bg-background border py-1 shadow-lg\",\n showAbove \n ? \"bottom-full mb-1\" // Position above with margin bottom\n : \"top-full mt-1\", // Position below with margin top\n listClassName\n )}\n > \n\n {searchValueRef.current === '' && !isLoading && <span className=\"text-xs text-foreground/75 px-4 py-1 opacity-75\">{t('suggestions')}</span>}\n\n {isLoading ? (\n <div className=\"w-full px-2 py-2 text-center text-foreground/75 text-sm\">\n <div className=\"animate-pulse rounded-xl bg-secondary py-2 dark:bg-secondary/25\">\n {t('loading-suggestions')}\n </div>\n </div>\n ) : optionsToShow.length === 0 ? (\n <div className=\"px-2 py-1 text-center flex items-center justify-center h-[35px] text-sm text-foreground/75\">\n {defaultEmptyMessage}\n </div>\n ) : (\n <div className=\"w-full px-1 flex flex-col gap-1\">\n {optionsToShow.map((option) => {\n const isSelected = selectedValueKeys.includes(option.value);\n return (\n <div\n key={option.label}\n className={cn(\n \"relative cursor-pointer select-none px-3 py-2 hover:bg-secondary/50 dark:hover:bg-secondary/25 rounded-lg\",\n isSelected && \"bg-secondary/50 dark:bg-secondary/25\"\n )}\n onClick={() => handleSelect(option.value, option.label)}\n >\n <span>{option.label}</span>\n {isSelected && (\n <CheckIcon className=\"absolute right-3 top-1/2 h-4 w-4 -translate-y-1/2\" />\n )}\n </div>\n );\n })}\n \n {/* Allow adding new option */}\n {allowNewOption && \n searchValueRef.current && \n !optionsToShow.some(option => option.value === searchValueRef.current) && (\n <div\n className=\"cursor-pointer select-none px-3 py-2 hover:bg-gray-100\"\n onClick={() => handleSelect(searchValueRef.current, searchValueRef.current)}\n >\n {searchValueRef.current}\n </div>\n )}\n </div>\n )}\n </div>\n )}\n\n </div>\n );\n});\n\nAutoComplete.displayName = \"AutoComplete\";\n\nexport { AutoComplete };\n"]}
@@ -0,0 +1,262 @@
1
+ import * as React2 from 'react';
2
+ import { clsx } from 'clsx';
3
+ import 'sonner';
4
+ import { twMerge } from 'tailwind-merge';
5
+ import { CheckIcon } from '@radix-ui/react-icons';
6
+ import { useTranslations } from 'next-intl';
7
+ import { jsx, jsxs } from 'react/jsx-runtime';
8
+
9
+ var cn = (...inputs) => twMerge(clsx(inputs));
10
+ var Input = React2.forwardRef(
11
+ ({ className, type, ...props }, ref) => {
12
+ return /* @__PURE__ */ jsx(
13
+ "input",
14
+ {
15
+ type,
16
+ className: cn(
17
+ "flex h-10 w-full rounded-xl border border-border bg-transparent px-3 py-1 text-base transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm group-aria-[invalid=true]:border-danger-foreground aria-[invalid=true]:border-danger-foreground",
18
+ className
19
+ ),
20
+ ref,
21
+ ...props
22
+ }
23
+ );
24
+ }
25
+ );
26
+ Input.displayName = "Input";
27
+ var AutoComplete = React2.forwardRef(({
28
+ id,
29
+ options,
30
+ placeholder,
31
+ emptyMessage,
32
+ inputClassName,
33
+ listClassName,
34
+ allowNewOption,
35
+ disabled,
36
+ value: controlledValue,
37
+ onValueChange,
38
+ onSelect,
39
+ onChange,
40
+ showSuggestions = true,
41
+ characterSenstiveCount = 2,
42
+ isLoading = false,
43
+ // Default to not loading
44
+ closeOptionsOnSelect = true,
45
+ initialSuggestions
46
+ }, ref) => {
47
+ const t = useTranslations("auto-complete");
48
+ const valueRef = React2.useRef(controlledValue || []);
49
+ const searchValueRef = React2.useRef("");
50
+ const [showOptions, setShowOptions] = React2.useState(false);
51
+ const [isHoveringOptions, setIsHoveringOptions] = React2.useState(false);
52
+ const [optionsToShow, setOptionsToShow] = React2.useState([]);
53
+ const [showAbove, setShowAbove] = React2.useState(false);
54
+ const inputRef = React2.useRef(null);
55
+ const containerRef = React2.useRef(null);
56
+ const optionsContainerRef = React2.useRef(null);
57
+ const mobileDetected = React2.useRef(
58
+ typeof window !== "undefined" && /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(
59
+ navigator.userAgent
60
+ )
61
+ );
62
+ const defaultPlaceholder = isLoading ? "Loading suggestions..." : placeholder || t("select-option");
63
+ const defaultEmptyMessage = emptyMessage || t("no-option-found");
64
+ const checkPosition = React2.useCallback(() => {
65
+ if (!inputRef.current || !containerRef.current) return;
66
+ const inputRect = inputRef.current.getBoundingClientRect();
67
+ const windowHeight = window.innerHeight;
68
+ const bottomSpace = windowHeight - inputRect.bottom;
69
+ const optionsHeight = 320;
70
+ setShowAbove(bottomSpace < optionsHeight);
71
+ }, []);
72
+ React2.useEffect(() => {
73
+ if (options?.length && !isLoading) {
74
+ if (!searchValueRef.current) {
75
+ setOptionsToShow(initialSuggestions || options.slice(0, 20));
76
+ } else {
77
+ setOptionsToShow(options.slice(0, 20));
78
+ }
79
+ }
80
+ }, [options, isLoading]);
81
+ React2.useEffect(() => {
82
+ if (!showOptions) return;
83
+ checkPosition();
84
+ window.addEventListener("resize", checkPosition);
85
+ window.addEventListener("scroll", checkPosition);
86
+ return () => {
87
+ window.removeEventListener("resize", checkPosition);
88
+ window.removeEventListener("scroll", checkPosition);
89
+ };
90
+ }, [showOptions, checkPosition]);
91
+ React2.useImperativeHandle(ref, () => ({
92
+ querySelector: (selector) => {
93
+ if (selector === "input") return inputRef.current;
94
+ return containerRef.current?.querySelector(selector);
95
+ }
96
+ }));
97
+ const handleInputChange = (e) => {
98
+ const inputValue = e.target.value;
99
+ searchValueRef.current = inputValue;
100
+ if (onChange) {
101
+ onChange(e);
102
+ }
103
+ if (mobileDetected.current) {
104
+ setTimeout(() => {
105
+ const filtered = inputValue ? options.filter((option) => option.label.toLowerCase().includes(inputValue.toLowerCase())) : options;
106
+ setOptionsToShow(filtered.slice(0, 20));
107
+ setShowOptions(true);
108
+ }, 50);
109
+ } else {
110
+ const filtered = inputValue ? options.filter((option) => option.label.toLowerCase().includes(inputValue.toLowerCase())) : options;
111
+ setOptionsToShow(filtered.slice(0, 20));
112
+ setShowOptions(!!inputValue || filtered.length > 0);
113
+ }
114
+ };
115
+ const handleSelect = (selectedValue, selectedLabel) => {
116
+ const currentValue = valueRef.current;
117
+ const newOptionItem = { value: selectedValue, label: selectedLabel };
118
+ const isSelected = currentValue.some((item) => item.value === selectedValue);
119
+ let newValue;
120
+ if (isSelected) {
121
+ newValue = currentValue.filter((item) => item.value !== selectedValue);
122
+ } else {
123
+ newValue = [...currentValue, newOptionItem];
124
+ }
125
+ valueRef.current = newValue;
126
+ if (inputRef.current) {
127
+ inputRef.current.value = "";
128
+ searchValueRef.current = "";
129
+ }
130
+ if (closeOptionsOnSelect) {
131
+ setShowOptions(false);
132
+ }
133
+ if (onValueChange) onValueChange(newValue);
134
+ if (onSelect) onSelect(newValue);
135
+ if (mobileDetected.current && inputRef.current) {
136
+ setTimeout(() => {
137
+ if (inputRef.current) {
138
+ inputRef.current.focus();
139
+ }
140
+ }, 100);
141
+ }
142
+ };
143
+ React2.useEffect(() => {
144
+ const handleOutsideClick = (e) => {
145
+ if (containerRef.current && !containerRef.current.contains(e.target) && optionsContainerRef.current && !optionsContainerRef.current.contains(e.target)) {
146
+ setShowOptions(false);
147
+ }
148
+ };
149
+ document.addEventListener("mousedown", handleOutsideClick);
150
+ return () => {
151
+ document.removeEventListener("mousedown", handleOutsideClick);
152
+ };
153
+ }, []);
154
+ React2.useEffect(() => {
155
+ if (controlledValue !== void 0) {
156
+ valueRef.current = controlledValue;
157
+ }
158
+ }, [controlledValue]);
159
+ const selectedValueKeys = valueRef.current.map((item) => item.value);
160
+ return /* @__PURE__ */ jsxs("div", { ref: containerRef, className: cn("relative", inputClassName), children: [
161
+ /* @__PURE__ */ jsx(
162
+ Input,
163
+ {
164
+ disabled,
165
+ ref: inputRef,
166
+ type: "text",
167
+ id: id || Math.random().toString(36).substring(2, 15),
168
+ placeholder: defaultPlaceholder,
169
+ className: "w-full rounded-xl placeholder:text-sm placeholder:truncate",
170
+ onChange: handleInputChange,
171
+ onBlur: () => {
172
+ if (allowNewOption && searchValueRef.current && !isHoveringOptions) {
173
+ handleSelect(searchValueRef.current, searchValueRef.current);
174
+ setShowOptions(false);
175
+ }
176
+ },
177
+ onKeyDown: (e) => {
178
+ if (e.key === "Enter") {
179
+ if (optionsToShow.length > 0) {
180
+ handleSelect(optionsToShow[0].value, optionsToShow[0].label);
181
+ setShowOptions(false);
182
+ inputRef.current?.blur();
183
+ } else {
184
+ if (allowNewOption) {
185
+ handleSelect(searchValueRef.current, searchValueRef.current);
186
+ setShowOptions(false);
187
+ inputRef.current?.blur();
188
+ }
189
+ }
190
+ }
191
+ },
192
+ onFocus: () => {
193
+ if (mobileDetected.current) {
194
+ setTimeout(() => {
195
+ if (optionsToShow.length === 0 && options.length > 0) {
196
+ setOptionsToShow(options.slice(0, 20));
197
+ }
198
+ setShowOptions(true);
199
+ checkPosition();
200
+ }, 50);
201
+ } else {
202
+ if (optionsToShow.length === 0 && options.length > 0) {
203
+ setOptionsToShow(options.slice(0, 20));
204
+ }
205
+ setShowOptions(true);
206
+ checkPosition();
207
+ }
208
+ }
209
+ }
210
+ ),
211
+ showOptions && showSuggestions && /* @__PURE__ */ jsxs(
212
+ "div",
213
+ {
214
+ onMouseEnter: () => setIsHoveringOptions(true),
215
+ onMouseLeave: () => setIsHoveringOptions(false),
216
+ ref: optionsContainerRef,
217
+ className: cn(
218
+ "absolute z-50 max-h-60 w-full overflow-auto rounded-xl bg-background border py-1 shadow-lg",
219
+ showAbove ? "bottom-full mb-1" : "top-full mt-1",
220
+ // Position below with margin top
221
+ listClassName
222
+ ),
223
+ children: [
224
+ searchValueRef.current === "" && !isLoading && /* @__PURE__ */ jsx("span", { className: "text-xs text-foreground/75 px-4 py-1 opacity-75", children: t("suggestions") }),
225
+ isLoading ? /* @__PURE__ */ jsx("div", { className: "w-full px-2 py-2 text-center text-foreground/75 text-sm", children: /* @__PURE__ */ jsx("div", { className: "animate-pulse rounded-xl bg-secondary py-2 dark:bg-secondary/25", children: t("loading-suggestions") }) }) : optionsToShow.length === 0 ? /* @__PURE__ */ jsx("div", { className: "px-2 py-1 text-center flex items-center justify-center h-[35px] text-sm text-foreground/75", children: defaultEmptyMessage }) : /* @__PURE__ */ jsxs("div", { className: "w-full px-1 flex flex-col gap-1", children: [
226
+ optionsToShow.map((option) => {
227
+ const isSelected = selectedValueKeys.includes(option.value);
228
+ return /* @__PURE__ */ jsxs(
229
+ "div",
230
+ {
231
+ className: cn(
232
+ "relative cursor-pointer select-none px-3 py-2 hover:bg-secondary/50 dark:hover:bg-secondary/25 rounded-lg",
233
+ isSelected && "bg-secondary/50 dark:bg-secondary/25"
234
+ ),
235
+ onClick: () => handleSelect(option.value, option.label),
236
+ children: [
237
+ /* @__PURE__ */ jsx("span", { children: option.label }),
238
+ isSelected && /* @__PURE__ */ jsx(CheckIcon, { className: "absolute right-3 top-1/2 h-4 w-4 -translate-y-1/2" })
239
+ ]
240
+ },
241
+ option.label
242
+ );
243
+ }),
244
+ allowNewOption && searchValueRef.current && !optionsToShow.some((option) => option.value === searchValueRef.current) && /* @__PURE__ */ jsx(
245
+ "div",
246
+ {
247
+ className: "cursor-pointer select-none px-3 py-2 hover:bg-gray-100",
248
+ onClick: () => handleSelect(searchValueRef.current, searchValueRef.current),
249
+ children: searchValueRef.current
250
+ }
251
+ )
252
+ ] })
253
+ ]
254
+ }
255
+ )
256
+ ] });
257
+ });
258
+ AutoComplete.displayName = "AutoComplete";
259
+
260
+ export { AutoComplete };
261
+ //# sourceMappingURL=auto-complete.js.map
262
+ //# sourceMappingURL=auto-complete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/utils.ts","../../src/ui/input.tsx","../../src/ui/auto-complete.tsx"],"names":["React","jsx"],"mappings":";;;;;;;;AAKO,IAAM,KAAK,CAAA,GAAI,MAAA,KAAiC,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;ACD3E,IAAM,KAAA,GAAcA,MAAA,CAAA,UAAA;AAAA,EAClB,CAAC,EAAE,SAAA,EAAW,MAAM,GAAG,KAAA,IAAS,GAAA,KAAQ;AACtC,IAAA,uBACE,GAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,kcAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,GAAA;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF,CAAA;AACA,KAAA,CAAM,WAAA,GAAc,OAAA;ACyBpB,IAAM,YAAA,GAAqB,kBAA8C,CAAC;AAAA,EACxE,EAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA,EAAO,eAAA;AAAA,EACP,aAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA,GAAkB,IAAA;AAAA,EAClB,sBAAA,GAAyB,CAAA;AAAA,EACzB,SAAA,GAAY,KAAA;AAAA;AAAA,EACZ,oBAAA,GAAuB,IAAA;AAAA,EACvB;AACF,CAAA,EAAG,GAAA,KAAQ;AACT,EAAA,MAAM,CAAA,GAAI,gBAAgB,eAAe,CAAA;AAEzC,EAAA,MAAM,QAAA,GAAiB,MAAA,CAAA,MAAA,CAA6B,eAAA,IAAmB,EAAE,CAAA;AACzE,EAAA,MAAM,cAAA,GAAuB,cAAe,EAAE,CAAA;AAC9C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAU,gBAAS,KAAK,CAAA;AAC1D,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAU,gBAAS,KAAK,CAAA;AACtE,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAU,MAAA,CAAA,QAAA,CAA+B,EAAE,CAAA;AACjF,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAU,gBAAS,KAAK,CAAA;AACtD,EAAA,MAAM,QAAA,GAAiB,cAAyB,IAAI,CAAA;AACpD,EAAA,MAAM,YAAA,GAAqB,cAAuB,IAAI,CAAA;AACtD,EAAA,MAAM,mBAAA,GAA4B,cAAuB,IAAI,CAAA;AAC7D,EAAA,MAAM,cAAA,GAAuB,MAAA,CAAA,MAAA;AAAA,IAC3B,OAAO,MAAA,KAAW,WAAA,IAClB,gEAAA,CAAiE,IAAA;AAAA,MAC/D,SAAA,CAAU;AAAA;AACZ,GACF;AAGA,EAAA,MAAM,kBAAA,GAAqB,SAAA,GACvB,wBAAA,GACC,WAAA,IAAe,EAAE,eAAe,CAAA;AACrC,EAAA,MAAM,mBAAA,GAAsB,YAAA,IAAgB,CAAA,CAAE,iBAAiB,CAAA;AAG/D,EAAA,MAAM,aAAA,GAAsB,mBAAY,MAAM;AAC5C,IAAA,IAAI,CAAC,QAAA,CAAS,OAAA,IAAW,CAAC,aAAa,OAAA,EAAS;AAEhD,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,OAAA,CAAQ,qBAAA,EAAsB;AACzD,IAAA,MAAM,eAAe,MAAA,CAAO,WAAA;AAC5B,IAAA,MAAM,WAAA,GAAc,eAAe,SAAA,CAAU,MAAA;AAC7C,IAAA,MAAM,aAAA,GAAgB,GAAA;AAGtB,IAAA,YAAA,CAAa,cAAc,aAAa,CAAA;AAAA,EAC1C,CAAA,EAAG,EAAE,CAAA;AAGL,EAAM,iBAAU,MAAM;AAEpB,IAAA,IAAI,OAAA,EAAS,MAAA,IAAU,CAAC,SAAA,EAAW;AACjC,MAAA,IAAG,CAAC,eAAe,OAAA,EAAS;AAC1B,QAAA,gBAAA,CAAiB,kBAAA,IAAsB,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,MAC7D,CAAA,MAAO;AACL,QAAA,gBAAA,CAAiB,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,MACvC;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,SAAS,CAAC,CAAA;AAGvB,EAAM,iBAAU,MAAM;AACpB,IAAA,IAAI,CAAC,WAAA,EAAa;AAGlB,IAAA,aAAA,EAAc;AAGd,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,aAAa,CAAA;AAC/C,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,aAAa,CAAA;AAE/C,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,aAAa,CAAA;AAClD,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,aAAa,CAAA;AAAA,IACpD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,aAAa,CAAC,CAAA;AAG/B,EAAM,MAAA,CAAA,mBAAA,CAAoB,KAAK,OAAO;AAAA,IACpC,aAAA,EAAe,CAAC,QAAA,KAAqB;AACnC,MAAA,IAAI,QAAA,KAAa,OAAA,EAAS,OAAO,QAAA,CAAS,OAAA;AAC1C,MAAA,OAAO,YAAA,CAAa,OAAA,EAAS,aAAA,CAAc,QAAQ,CAAA;AAAA,IACrD;AAAA,GACF,CAA+B,CAAA;AAG/B,EAAA,MAAM,iBAAA,GAAoB,CAAC,CAAA,KAA2C;AACpE,IAAA,MAAM,UAAA,GAAa,EAAE,MAAA,CAAO,KAAA;AAC5B,IAAA,cAAA,CAAe,OAAA,GAAU,UAAA;AAGzB,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAA,CAAS,CAAC,CAAA;AAAA,IACZ;AAGA,IAAA,IAAI,eAAe,OAAA,EAAS;AAE1B,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,MAAM,QAAA,GAAW,UAAA,GACb,OAAA,CAAQ,MAAA,CAAO,YACb,MAAA,CAAO,KAAA,CAAM,WAAA,EAAY,CAAE,QAAA,CAAS,UAAA,CAAW,WAAA,EAAa,CAAC,CAAA,GAC/D,OAAA;AACJ,QAAA,gBAAA,CAAiB,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AACtC,QAAA,cAAA,CAAe,IAAI,CAAA;AAAA,MACrB,GAAG,EAAE,CAAA;AAAA,IACP,CAAA,MAAO;AAEL,MAAA,MAAM,QAAA,GAAW,UAAA,GACb,OAAA,CAAQ,MAAA,CAAO,YACb,MAAA,CAAO,KAAA,CAAM,WAAA,EAAY,CAAE,QAAA,CAAS,UAAA,CAAW,WAAA,EAAa,CAAC,CAAA,GAC/D,OAAA;AACJ,MAAA,gBAAA,CAAiB,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AACtC,MAAA,cAAA,CAAe,CAAC,CAAC,UAAA,IAAc,QAAA,CAAS,SAAS,CAAC,CAAA;AAAA,IACpD;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,YAAA,GAAe,CAAC,aAAA,EAAuB,aAAA,KAA0B;AACrE,IAAA,MAAM,eAAe,QAAA,CAAS,OAAA;AAC9B,IAAA,MAAM,aAAA,GAAoC,EAAE,KAAA,EAAO,aAAA,EAAe,OAAO,aAAA,EAAc;AAGvF,IAAA,MAAM,aAAa,YAAA,CAAa,IAAA,CAAK,CAAA,IAAA,KAAQ,IAAA,CAAK,UAAU,aAAa,CAAA;AAGzE,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,QAAA,GAAW,YAAA,CAAa,MAAA,CAAO,CAAA,IAAA,KAAQ,IAAA,CAAK,UAAU,aAAa,CAAA;AAAA,IACrE,CAAA,MAAO;AACL,MAAA,QAAA,GAAW,CAAC,GAAG,YAAA,EAAc,aAAa,CAAA;AAAA,IAC5C;AAEA,IAAA,QAAA,CAAS,OAAA,GAAU,QAAA;AAGnB,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,QAAA,CAAS,QAAQ,KAAA,GAAQ,EAAA;AACzB,MAAA,cAAA,CAAe,OAAA,GAAU,EAAA;AAAA,IAC3B;AAGA,IAAA,IAAI,oBAAA,EAAsB;AACxB,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA,IACtB;AAGA,IAAA,IAAI,aAAA,gBAA6B,QAAQ,CAAA;AACzC,IAAA,IAAI,QAAA,WAAmB,QAAQ,CAAA;AAG/B,IAAA,IAAI,cAAA,CAAe,OAAA,IAAW,QAAA,CAAS,OAAA,EAAS;AAE9C,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,IAAI,SAAS,OAAA,EAAS;AACpB,UAAA,QAAA,CAAS,QAAQ,KAAA,EAAM;AAAA,QACzB;AAAA,MACF,GAAG,GAAG,CAAA;AAAA,IACR;AAAA,EACF,CAAA;AAGA,EAAM,iBAAU,MAAM;AACpB,IAAA,MAAM,kBAAA,GAAqB,CAAC,CAAA,KAAkB;AAC5C,MAAA,IACE,aAAa,OAAA,IACb,CAAC,YAAA,CAAa,OAAA,CAAQ,SAAS,CAAA,CAAE,MAAc,CAAA,IAC/C,mBAAA,CAAoB,WACpB,CAAC,mBAAA,CAAoB,QAAQ,QAAA,CAAS,CAAA,CAAE,MAAc,CAAA,EACtD;AACA,QAAA,cAAA,CAAe,KAAK,CAAA;AAAA,MACtB;AAAA,IACF,CAAA;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,kBAAkB,CAAA;AACzD,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,kBAAkB,CAAA;AAAA,IAC9D,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAM,iBAAU,MAAM;AACpB,IAAA,IAAI,oBAAoB,MAAA,EAAW;AACjC,MAAA,QAAA,CAAS,OAAA,GAAU,eAAA;AAAA,IACrB;AAAA,EACF,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AAGpB,EAAA,MAAM,oBAAoB,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,CAAA,IAAA,KAAQ,KAAK,KAAK,CAAA;AAGjE,EAAA,uBACE,IAAA,CAAC,SAAI,GAAA,EAAK,YAAA,EAAc,WAAW,EAAA,CAAG,UAAA,EAAY,cAAc,CAAA,EAE9D,QAAA,EAAA;AAAA,oBAAAC,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,QAAA;AAAA,QACA,GAAA,EAAK,QAAA;AAAA,QACL,IAAA,EAAK,MAAA;AAAA,QACL,EAAA,EAAI,EAAA,IAAM,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,EAAE,CAAA;AAAA,QACpD,WAAA,EAAa,kBAAA;AAAA,QACb,SAAA,EAAU,4DAAA;AAAA,QACV,QAAA,EAAU,iBAAA;AAAA,QACV,QAAQ,MAAM;AACZ,UAAA,IAAG,cAAA,IAAkB,cAAA,CAAe,OAAA,IAAW,CAAC,iBAAA,EAAmB;AAC/D,YAAA,YAAA,CAAa,cAAA,CAAe,OAAA,EAAS,cAAA,CAAe,OAAO,CAAA;AAC3D,YAAA,cAAA,CAAe,KAAK,CAAA;AAAA,UACtB;AAAA,QACJ,CAAA;AAAA,QACA,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,UAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACrB,YAAA,IAAG,aAAA,CAAc,SAAS,CAAA,EAAG;AAC3B,cAAA,YAAA,CAAa,cAAc,CAAC,CAAA,CAAE,OAAO,aAAA,CAAc,CAAC,EAAE,KAAK,CAAA;AAC3D,cAAA,cAAA,CAAe,KAAK,CAAA;AACpB,cAAA,QAAA,CAAS,SAAS,IAAA,EAAK;AAAA,YACzB,CAAA,MAAO;AACL,cAAA,IAAG,cAAA,EAAgB;AACnB,gBAAA,YAAA,CAAa,cAAA,CAAe,OAAA,EAAS,cAAA,CAAe,OAAO,CAAA;AACzD,gBAAA,cAAA,CAAe,KAAK,CAAA;AACpB,gBAAA,QAAA,CAAS,SAAS,IAAA,EAAK;AAAA,cACzB;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAA;AAAA,QACA,SAAS,MAAM;AAEb,UAAA,IAAI,eAAe,OAAA,EAAS;AAC1B,YAAA,UAAA,CAAW,MAAM;AAEf,cAAA,IAAI,aAAA,CAAc,MAAA,KAAW,CAAA,IAAK,OAAA,CAAQ,SAAS,CAAA,EAAG;AACpD,gBAAA,gBAAA,CAAiB,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,cACvC;AACA,cAAA,cAAA,CAAe,IAAI,CAAA;AACnB,cAAA,aAAA,EAAc;AAAA,YAChB,GAAG,EAAE,CAAA;AAAA,UACP,CAAA,MAAO;AAEL,YAAA,IAAI,aAAA,CAAc,MAAA,KAAW,CAAA,IAAK,OAAA,CAAQ,SAAS,CAAA,EAAG;AACpD,cAAA,gBAAA,CAAiB,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,YACvC;AACA,YAAA,cAAA,CAAe,IAAI,CAAA;AACnB,YAAA,aAAA,EAAc;AAAA,UAChB;AAAA,QACF;AAAA;AAAA,KACF;AAAA,IAEC,eAAe,eAAA,oBACd,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,YAAA,EAAc,MAAM,oBAAA,CAAqB,IAAI,CAAA;AAAA,QAC7C,YAAA,EAAc,MAAM,oBAAA,CAAqB,KAAK,CAAA;AAAA,QAC9C,GAAA,EAAK,mBAAA;AAAA,QACL,SAAA,EAAW,EAAA;AAAA,UACT,4FAAA;AAAA,UACA,YACI,kBAAA,GACA,eAAA;AAAA;AAAA,UACJ;AAAA,SACF;AAAA,QAGD,QAAA,EAAA;AAAA,UAAA,cAAA,CAAe,OAAA,KAAY,EAAA,IAAM,CAAC,SAAA,oBAAaA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iDAAA,EAAmD,QAAA,EAAA,CAAA,CAAE,aAAa,CAAA,EAAE,CAAA;AAAA,UAEjI,SAAA,mBACGA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yDAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iEAAA,EACZ,QAAA,EAAA,CAAA,CAAE,qBAAqB,CAAA,EAC1B,CAAA,EACF,CAAA,GACA,aAAA,CAAc,MAAA,KAAW,CAAA,mBAC3BA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4FAAA,EACZ,QAAA,EAAA,mBAAA,EACH,CAAA,mBAEA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iCAAA,EACZ,QAAA,EAAA;AAAA,YAAA,aAAA,CAAc,GAAA,CAAI,CAAC,MAAA,KAAW;AAC7B,cAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,QAAA,CAAS,MAAA,CAAO,KAAK,CAAA;AAC1D,cAAA,uBACE,IAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBAEC,SAAA,EAAW,EAAA;AAAA,oBACT,2GAAA;AAAA,oBACA,UAAA,IAAc;AAAA,mBAChB;AAAA,kBACA,SAAS,MAAM,YAAA,CAAa,MAAA,CAAO,KAAA,EAAO,OAAO,KAAK,CAAA;AAAA,kBAEtD,QAAA,EAAA;AAAA,oCAAAA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,MAAA,CAAO,KAAA,EAAM,CAAA;AAAA,oBACnB,UAAA,oBACCA,GAAAA,CAAC,SAAA,EAAA,EAAU,WAAU,mDAAA,EAAoD;AAAA;AAAA,iBAAA;AAAA,gBATtE,MAAA,CAAO;AAAA,eAWd;AAAA,YAEJ,CAAC,CAAA;AAAA,YAGA,cAAA,IACC,cAAA,CAAe,OAAA,IACf,CAAC,aAAA,CAAc,IAAA,CAAK,CAAA,MAAA,KAAU,MAAA,CAAO,KAAA,KAAU,cAAA,CAAe,OAAO,CAAA,oBACrEA,GAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,wDAAA;AAAA,gBACV,SAAS,MAAM,YAAA,CAAa,cAAA,CAAe,OAAA,EAAS,eAAe,OAAO,CAAA;AAAA,gBAEzE,QAAA,EAAA,cAAA,CAAe;AAAA;AAAA;AAClB,WAAA,EAEJ;AAAA;AAAA;AAAA;AAEJ,GAAA,EAGJ,CAAA;AAEJ,CAAC;AAED,YAAA,CAAa,WAAA,GAAc,cAAA","file":"auto-complete.js","sourcesContent":["import { clsx } from \"clsx\";\nimport type { ClassValue } from \"clsx\";\nimport { toast } from \"sonner\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport const cn = (...inputs: ClassValue[]): string => twMerge(clsx(inputs));\n\nexport const capitalize = (str: string) =>\n str?.charAt(0)?.toUpperCase() + str?.slice(1);\n\nexport const handleError = (error: { message: string }): void => {\n toast.error(error.message);\n};\n","import * as React from \"react\"\n\nimport { cn } from \"../lib/utils\"\n\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<\"input\">>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-10 w-full rounded-xl border border-border bg-transparent px-3 py-1 text-base transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm group-aria-[invalid=true]:border-danger-foreground aria-[invalid=true]:border-danger-foreground\",\n className\n )}\n ref={ref}\n {...props}\n />\n )\n }\n)\nInput.displayName = \"Input\"\n\nexport { Input }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"../lib/utils\"\nimport { CheckIcon } from \"@radix-ui/react-icons\"\nimport { useTranslations } from 'next-intl';\nimport { Input } from \"./input\";\nimport { Skeleton } from \"./skeleton\";\n\nexport interface AutoCompleteOption {\n value: string\n label: string\n}\n\n/**\n * A AutoComplete that uses direct DOM manipulation, with debounce,\n * and a focus guard to prevent focus loss on mobile devices during typing.\n */\n\ninterface AutoCompleteProps {\n id?: string;\n options: AutoCompleteOption[]\n placeholder?: string\n searchPlaceholder?: string\n emptyMessage?: string\n inputClassName?: string\n listClassName?: string\n allowNewOption?: boolean\n value?: AutoCompleteOption[] // Always array of option objects\n onValueChange?: (value: AutoCompleteOption[]) => void // Always returns option array\n onSelect?: (value: AutoCompleteOption[]) => void // Always returns option array\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void\n characterSenstiveCount?: number\n isLoading?: boolean\n showSuggestions?: boolean\n disabled?: boolean\n closeOptionsOnSelect?: boolean\n initialSuggestions?: { label: string; value: string }[]\n}\n\n/**\n * A completely reworked AutoComplete that uses direct DOM manipulation\n * to prevent focus loss on mobile devices during typing.\n */\nconst AutoComplete = React.forwardRef<HTMLDivElement, AutoCompleteProps>(({\n id,\n options,\n placeholder,\n emptyMessage,\n inputClassName,\n listClassName,\n allowNewOption,\n disabled,\n value: controlledValue,\n onValueChange, \n onSelect,\n onChange,\n showSuggestions = true,\n characterSenstiveCount = 2,\n isLoading = false, // Default to not loading\n closeOptionsOnSelect = true,\n initialSuggestions,\n}, ref) => {\n const t = useTranslations('auto-complete');\n // Use refs instead of state where possible to avoid re-renders during typing\n const valueRef = React.useRef<AutoCompleteOption[]>(controlledValue || []);\n const searchValueRef = React.useRef<string>(\"\");\n const [showOptions, setShowOptions] = React.useState(false);\n const [isHoveringOptions, setIsHoveringOptions] = React.useState(false);\n const [optionsToShow, setOptionsToShow] = React.useState<AutoCompleteOption[]>([]);\n const [showAbove, setShowAbove] = React.useState(false);\n const inputRef = React.useRef<HTMLInputElement>(null);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const optionsContainerRef = React.useRef<HTMLDivElement>(null);\n const mobileDetected = React.useRef(\n typeof window !== 'undefined' &&\n /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n navigator.userAgent\n )\n );\n \n // Default values using translations\n const defaultPlaceholder = isLoading \n ? 'Loading suggestions...' \n : (placeholder || t('select-option'));\n const defaultEmptyMessage = emptyMessage || t('no-option-found');\n \n // Check if there's enough space below the input\n const checkPosition = React.useCallback(() => {\n if (!inputRef.current || !containerRef.current) return;\n \n const inputRect = inputRef.current.getBoundingClientRect();\n const windowHeight = window.innerHeight;\n const bottomSpace = windowHeight - inputRect.bottom;\n const optionsHeight = 320; // Approximate max height for options (max-h-60 = 15rem = 240px + padding)\n \n // If there's not enough space below, show above\n setShowAbove(bottomSpace < optionsHeight);\n }, []);\n \n // Initialize options when component mounts or options change\n React.useEffect(() => {\n // Only set initial options if we have options and we're not loading\n if (options?.length && !isLoading) {\n if(!searchValueRef.current) {\n setOptionsToShow(initialSuggestions || options.slice(0, 20));\n } else {\n setOptionsToShow(options.slice(0, 20));\n }\n }\n }, [options, isLoading]);\n \n // Handle window resize and scroll to recalculate position\n React.useEffect(() => {\n if (!showOptions) return;\n \n // Initial position check\n checkPosition();\n \n // Add event listeners for resize and scroll\n window.addEventListener('resize', checkPosition);\n window.addEventListener('scroll', checkPosition);\n \n return () => {\n window.removeEventListener('resize', checkPosition);\n window.removeEventListener('scroll', checkPosition);\n };\n }, [showOptions, checkPosition]);\n \n // Handle forwarded ref\n React.useImperativeHandle(ref, () => ({\n querySelector: (selector: string) => {\n if (selector === 'input') return inputRef.current;\n return containerRef.current?.querySelector(selector);\n }\n } as unknown as HTMLDivElement));\n \n // Handle input value updates without state changes\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const inputValue = e.target.value;\n searchValueRef.current = inputValue;\n \n // Call parent onChange without triggering re-render\n if (onChange) {\n onChange(e);\n }\n \n // Filter options without state updates during typing\n if (mobileDetected.current) {\n // For mobile, delay showing options to prevent keyboard flicker\n setTimeout(() => {\n const filtered = inputValue \n ? options.filter(option => \n option.label.toLowerCase().includes(inputValue.toLowerCase()))\n : options;\n setOptionsToShow(filtered.slice(0, 20));\n setShowOptions(true);\n }, 50);\n } else {\n // For desktop, update immediately\n const filtered = inputValue \n ? options.filter(option => \n option.label.toLowerCase().includes(inputValue.toLowerCase()))\n : options;\n setOptionsToShow(filtered.slice(0, 20));\n setShowOptions(!!inputValue || filtered.length > 0);\n }\n };\n \n // Handle selection with minimal state updates\n const handleSelect = (selectedValue: string, selectedLabel: string) => {\n const currentValue = valueRef.current;\n const newOptionItem: AutoCompleteOption = { value: selectedValue, label: selectedLabel };\n \n // Check if the option is already selected\n const isSelected = currentValue.some(item => item.value === selectedValue);\n \n // Toggle selection\n let newValue: AutoCompleteOption[];\n if (isSelected) {\n newValue = currentValue.filter(item => item.value !== selectedValue);\n } else {\n newValue = [...currentValue, newOptionItem];\n }\n \n valueRef.current = newValue;\n \n // Only trigger state updates after selection is complete\n if (inputRef.current) {\n inputRef.current.value = \"\";\n searchValueRef.current = \"\";\n }\n \n // Hide options\n if (closeOptionsOnSelect) {\n setShowOptions(false);\n }\n \n // Notify parent components\n if (onValueChange) onValueChange(newValue);\n if (onSelect) onSelect(newValue);\n \n // Ensure the input keeps focus on mobile\n if (mobileDetected.current && inputRef.current) {\n // Use a longer timeout to ensure the keyboard stays up\n setTimeout(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n }\n }, 100);\n }\n };\n \n // Handle outside clicks\n React.useEffect(() => {\n const handleOutsideClick = (e: MouseEvent) => {\n if (\n containerRef.current && \n !containerRef.current.contains(e.target as Node) &&\n optionsContainerRef.current &&\n !optionsContainerRef.current.contains(e.target as Node)\n ) {\n setShowOptions(false);\n }\n };\n \n document.addEventListener('mousedown', handleOutsideClick);\n return () => {\n document.removeEventListener('mousedown', handleOutsideClick);\n };\n }, []);\n \n // Update ref when controlled value changes\n React.useEffect(() => {\n if (controlledValue !== undefined) {\n valueRef.current = controlledValue;\n }\n }, [controlledValue]);\n \n // Get array of selected values for checking\n const selectedValueKeys = valueRef.current.map(item => item.value);\n \n\n return (\n <div ref={containerRef} className={cn(\"relative\", inputClassName)}>\n {/* Input field that maintains focus */}\n <Input\n disabled={disabled}\n ref={inputRef}\n type=\"text\"\n id={id || Math.random().toString(36).substring(2, 15)}\n placeholder={defaultPlaceholder}\n className=\"w-full rounded-xl placeholder:text-sm placeholder:truncate\"\n onChange={handleInputChange}\n onBlur={() => {\n if(allowNewOption && searchValueRef.current && !isHoveringOptions) {\n handleSelect(searchValueRef.current, searchValueRef.current);\n setShowOptions(false);\n }\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n if(optionsToShow.length > 0) {\n handleSelect(optionsToShow[0].value, optionsToShow[0].label);\n setShowOptions(false);\n inputRef.current?.blur();\n } else {\n if(allowNewOption) {\n handleSelect(searchValueRef.current, searchValueRef.current);\n setShowOptions(false);\n inputRef.current?.blur();\n }\n }\n }\n }}\n onFocus={() => {\n // Show options when input is focused with initial list\n if (mobileDetected.current) {\n setTimeout(() => {\n // Make sure we have initial options set\n if (optionsToShow.length === 0 && options.length > 0) {\n setOptionsToShow(options.slice(0, 20));\n }\n setShowOptions(true);\n checkPosition(); // Check position when showing options\n }, 50);\n } else {\n // For desktop, just show the options\n if (optionsToShow.length === 0 && options.length > 0) {\n setOptionsToShow(options.slice(0, 20));\n }\n setShowOptions(true);\n checkPosition(); // Check position when showing options\n }\n }}\n />\n {/* Options dropdown */}\n {showOptions && showSuggestions && (\n <div \n onMouseEnter={() => setIsHoveringOptions(true)}\n onMouseLeave={() => setIsHoveringOptions(false)}\n ref={optionsContainerRef}\n className={cn(\n \"absolute z-50 max-h-60 w-full overflow-auto rounded-xl bg-background border py-1 shadow-lg\",\n showAbove \n ? \"bottom-full mb-1\" // Position above with margin bottom\n : \"top-full mt-1\", // Position below with margin top\n listClassName\n )}\n > \n\n {searchValueRef.current === '' && !isLoading && <span className=\"text-xs text-foreground/75 px-4 py-1 opacity-75\">{t('suggestions')}</span>}\n\n {isLoading ? (\n <div className=\"w-full px-2 py-2 text-center text-foreground/75 text-sm\">\n <div className=\"animate-pulse rounded-xl bg-secondary py-2 dark:bg-secondary/25\">\n {t('loading-suggestions')}\n </div>\n </div>\n ) : optionsToShow.length === 0 ? (\n <div className=\"px-2 py-1 text-center flex items-center justify-center h-[35px] text-sm text-foreground/75\">\n {defaultEmptyMessage}\n </div>\n ) : (\n <div className=\"w-full px-1 flex flex-col gap-1\">\n {optionsToShow.map((option) => {\n const isSelected = selectedValueKeys.includes(option.value);\n return (\n <div\n key={option.label}\n className={cn(\n \"relative cursor-pointer select-none px-3 py-2 hover:bg-secondary/50 dark:hover:bg-secondary/25 rounded-lg\",\n isSelected && \"bg-secondary/50 dark:bg-secondary/25\"\n )}\n onClick={() => handleSelect(option.value, option.label)}\n >\n <span>{option.label}</span>\n {isSelected && (\n <CheckIcon className=\"absolute right-3 top-1/2 h-4 w-4 -translate-y-1/2\" />\n )}\n </div>\n );\n })}\n \n {/* Allow adding new option */}\n {allowNewOption && \n searchValueRef.current && \n !optionsToShow.some(option => option.value === searchValueRef.current) && (\n <div\n className=\"cursor-pointer select-none px-3 py-2 hover:bg-gray-100\"\n onClick={() => handleSelect(searchValueRef.current, searchValueRef.current)}\n >\n {searchValueRef.current}\n </div>\n )}\n </div>\n )}\n </div>\n )}\n\n </div>\n );\n});\n\nAutoComplete.displayName = \"AutoComplete\";\n\nexport { AutoComplete };\n"]}
@@ -0,0 +1,70 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var AvatarPrimitive = require('@radix-ui/react-avatar');
5
+ var clsx = require('clsx');
6
+ require('sonner');
7
+ var tailwindMerge = require('tailwind-merge');
8
+ var jsxRuntime = require('react/jsx-runtime');
9
+
10
+ function _interopNamespace(e) {
11
+ if (e && e.__esModule) return e;
12
+ var n = Object.create(null);
13
+ if (e) {
14
+ Object.keys(e).forEach(function (k) {
15
+ if (k !== 'default') {
16
+ var d = Object.getOwnPropertyDescriptor(e, k);
17
+ Object.defineProperty(n, k, d.get ? d : {
18
+ enumerable: true,
19
+ get: function () { return e[k]; }
20
+ });
21
+ }
22
+ });
23
+ }
24
+ n.default = e;
25
+ return Object.freeze(n);
26
+ }
27
+
28
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
29
+ var AvatarPrimitive__namespace = /*#__PURE__*/_interopNamespace(AvatarPrimitive);
30
+
31
+ var cn = (...inputs) => tailwindMerge.twMerge(clsx.clsx(inputs));
32
+ var Avatar = React__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
33
+ AvatarPrimitive__namespace.Root,
34
+ {
35
+ ref,
36
+ className: cn(
37
+ "relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full",
38
+ className
39
+ ),
40
+ ...props
41
+ }
42
+ ));
43
+ Avatar.displayName = AvatarPrimitive__namespace.Root.displayName;
44
+ var AvatarImage = React__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
45
+ AvatarPrimitive__namespace.Image,
46
+ {
47
+ ref,
48
+ className: cn("aspect-square h-full w-full", className),
49
+ ...props
50
+ }
51
+ ));
52
+ AvatarImage.displayName = AvatarPrimitive__namespace.Image.displayName;
53
+ var AvatarFallback = React__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
54
+ AvatarPrimitive__namespace.Fallback,
55
+ {
56
+ ref,
57
+ className: cn(
58
+ "flex h-full w-full items-center justify-center rounded-full bg-secondary dark:bg-secondary/20",
59
+ className
60
+ ),
61
+ ...props
62
+ }
63
+ ));
64
+ AvatarFallback.displayName = AvatarPrimitive__namespace.Fallback.displayName;
65
+
66
+ exports.Avatar = Avatar;
67
+ exports.AvatarFallback = AvatarFallback;
68
+ exports.AvatarImage = AvatarImage;
69
+ //# sourceMappingURL=avatar.cjs.map
70
+ //# sourceMappingURL=avatar.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/utils.ts","../../src/ui/avatar.tsx"],"names":["twMerge","clsx","React","jsx","AvatarPrimitive"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKO,IAAM,KAAK,CAAA,GAAI,MAAA,KAAiCA,qBAAA,CAAQC,SAAA,CAAK,MAAM,CAAC,CAAA;ACC3E,IAAM,MAAA,GAAeC,4BAGnB,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,qBAC1BC,cAAA;AAAA,EAAiBC,0BAAA,CAAA,IAAA;AAAA,EAAhB;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,EAAA;AAAA,MACT,+DAAA;AAAA,MACA;AAAA,KACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,MAAA,CAAO,cAA8BA,0BAAA,CAAA,IAAA,CAAK,WAAA;AAE1C,IAAM,WAAA,GAAoBF,4BAGxB,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,qBAC1BC,cAAA;AAAA,EAAiBC,0BAAA,CAAA,KAAA;AAAA,EAAhB;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,EAAA,CAAG,6BAAA,EAA+B,SAAS,CAAA;AAAA,IACrD,GAAG;AAAA;AACN,CACD;AACD,WAAA,CAAY,cAA8BA,0BAAA,CAAA,KAAA,CAAM,WAAA;AAEhD,IAAM,cAAA,GAAuBF,4BAG3B,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,qBAC1BC,cAAA;AAAA,EAAiBC,0BAAA,CAAA,QAAA;AAAA,EAAhB;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,EAAA;AAAA,MACT,+FAAA;AAAA,MACA;AAAA,KACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,cAAA,CAAe,cAA8BA,0BAAA,CAAA,QAAA,CAAS,WAAA","file":"avatar.cjs","sourcesContent":["import { clsx } from \"clsx\";\nimport type { ClassValue } from \"clsx\";\nimport { toast } from \"sonner\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport const cn = (...inputs: ClassValue[]): string => twMerge(clsx(inputs));\n\nexport const capitalize = (str: string) =>\n str?.charAt(0)?.toUpperCase() + str?.slice(1);\n\nexport const handleError = (error: { message: string }): void => {\n toast.error(error.message);\n};\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\";\nimport { cn } from \"../lib/utils\";\n\nconst Avatar = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Root\n ref={ref}\n className={cn(\n \"relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full\",\n className,\n )}\n {...props}\n />\n));\nAvatar.displayName = AvatarPrimitive.Root.displayName;\n\nconst AvatarImage = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Image>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Image\n ref={ref}\n className={cn(\"aspect-square h-full w-full\", className)}\n {...props}\n />\n));\nAvatarImage.displayName = AvatarPrimitive.Image.displayName;\n\nconst AvatarFallback = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Fallback>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n ref={ref}\n className={cn(\n \"flex h-full w-full items-center justify-center rounded-full bg-secondary dark:bg-secondary/20\",\n className,\n )}\n {...props}\n />\n));\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;\n\nexport { Avatar, AvatarImage, AvatarFallback };\n"]}
@@ -0,0 +1,45 @@
1
+ import * as React from 'react';
2
+ import * as AvatarPrimitive from '@radix-ui/react-avatar';
3
+ import { clsx } from 'clsx';
4
+ import 'sonner';
5
+ import { twMerge } from 'tailwind-merge';
6
+ import { jsx } from 'react/jsx-runtime';
7
+
8
+ var cn = (...inputs) => twMerge(clsx(inputs));
9
+ var Avatar = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
10
+ AvatarPrimitive.Root,
11
+ {
12
+ ref,
13
+ className: cn(
14
+ "relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full",
15
+ className
16
+ ),
17
+ ...props
18
+ }
19
+ ));
20
+ Avatar.displayName = AvatarPrimitive.Root.displayName;
21
+ var AvatarImage = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
22
+ AvatarPrimitive.Image,
23
+ {
24
+ ref,
25
+ className: cn("aspect-square h-full w-full", className),
26
+ ...props
27
+ }
28
+ ));
29
+ AvatarImage.displayName = AvatarPrimitive.Image.displayName;
30
+ var AvatarFallback = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
31
+ AvatarPrimitive.Fallback,
32
+ {
33
+ ref,
34
+ className: cn(
35
+ "flex h-full w-full items-center justify-center rounded-full bg-secondary dark:bg-secondary/20",
36
+ className
37
+ ),
38
+ ...props
39
+ }
40
+ ));
41
+ AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;
42
+
43
+ export { Avatar, AvatarFallback, AvatarImage };
44
+ //# sourceMappingURL=avatar.js.map
45
+ //# sourceMappingURL=avatar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/utils.ts","../../src/ui/avatar.tsx"],"names":[],"mappings":";;;;;;;AAKO,IAAM,KAAK,CAAA,GAAI,MAAA,KAAiC,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;ACC3E,IAAM,MAAA,GAAe,iBAGnB,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,qBAC1B,GAAA;AAAA,EAAiB,eAAA,CAAA,IAAA;AAAA,EAAhB;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,EAAA;AAAA,MACT,+DAAA;AAAA,MACA;AAAA,KACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,MAAA,CAAO,cAA8B,eAAA,CAAA,IAAA,CAAK,WAAA;AAE1C,IAAM,WAAA,GAAoB,iBAGxB,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,qBAC1B,GAAA;AAAA,EAAiB,eAAA,CAAA,KAAA;AAAA,EAAhB;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,EAAA,CAAG,6BAAA,EAA+B,SAAS,CAAA;AAAA,IACrD,GAAG;AAAA;AACN,CACD;AACD,WAAA,CAAY,cAA8B,eAAA,CAAA,KAAA,CAAM,WAAA;AAEhD,IAAM,cAAA,GAAuB,iBAG3B,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,qBAC1B,GAAA;AAAA,EAAiB,eAAA,CAAA,QAAA;AAAA,EAAhB;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,EAAA;AAAA,MACT,+FAAA;AAAA,MACA;AAAA,KACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,cAAA,CAAe,cAA8B,eAAA,CAAA,QAAA,CAAS,WAAA","file":"avatar.js","sourcesContent":["import { clsx } from \"clsx\";\nimport type { ClassValue } from \"clsx\";\nimport { toast } from \"sonner\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport const cn = (...inputs: ClassValue[]): string => twMerge(clsx(inputs));\n\nexport const capitalize = (str: string) =>\n str?.charAt(0)?.toUpperCase() + str?.slice(1);\n\nexport const handleError = (error: { message: string }): void => {\n toast.error(error.message);\n};\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\";\nimport { cn } from \"../lib/utils\";\n\nconst Avatar = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Root\n ref={ref}\n className={cn(\n \"relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full\",\n className,\n )}\n {...props}\n />\n));\nAvatar.displayName = AvatarPrimitive.Root.displayName;\n\nconst AvatarImage = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Image>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Image\n ref={ref}\n className={cn(\"aspect-square h-full w-full\", className)}\n {...props}\n />\n));\nAvatarImage.displayName = AvatarPrimitive.Image.displayName;\n\nconst AvatarFallback = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Fallback>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n ref={ref}\n className={cn(\n \"flex h-full w-full items-center justify-center rounded-full bg-secondary dark:bg-secondary/20\",\n className,\n )}\n {...props}\n />\n));\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;\n\nexport { Avatar, AvatarImage, AvatarFallback };\n"]}
@@ -0,0 +1,34 @@
1
+ 'use strict';
2
+
3
+ var classVarianceAuthority = require('class-variance-authority');
4
+ var clsx = require('clsx');
5
+ require('sonner');
6
+ var tailwindMerge = require('tailwind-merge');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+
9
+ // src/ui/badge.tsx
10
+ var cn = (...inputs) => tailwindMerge.twMerge(clsx.clsx(inputs));
11
+ var badgeVariants = classVarianceAuthority.cva(
12
+ "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
13
+ {
14
+ variants: {
15
+ variant: {
16
+ default: "border-transparent bg-primary text-primary-foreground hover:bg-primary/80",
17
+ secondary: "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
18
+ destructive: "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",
19
+ outline: "text-foreground"
20
+ }
21
+ },
22
+ defaultVariants: {
23
+ variant: "default"
24
+ }
25
+ }
26
+ );
27
+ function Badge({ className, variant, ...props }) {
28
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(badgeVariants({ variant }), className), ...props });
29
+ }
30
+
31
+ exports.Badge = Badge;
32
+ exports.badgeVariants = badgeVariants;
33
+ //# sourceMappingURL=badge.cjs.map
34
+ //# sourceMappingURL=badge.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/utils.ts","../../src/ui/badge.tsx"],"names":["twMerge","clsx","cva","jsx"],"mappings":";;;;;;;;;AAKO,IAAM,KAAK,CAAA,GAAI,MAAA,KAAiCA,qBAAA,CAAQC,SAAA,CAAK,MAAM,CAAC,CAAA;ACD3E,IAAM,aAAA,GAAgBC,0BAAA;AAAA,EACpB,wKAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,OAAA,EACE,2EAAA;AAAA,QACF,SAAA,EACE,iFAAA;AAAA,QACF,WAAA,EACE,uFAAA;AAAA,QACF,OAAA,EAAS;AAAA;AACX,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS;AAAA;AACX;AAEJ;AAMA,SAAS,MAAM,EAAE,SAAA,EAAW,OAAA,EAAS,GAAG,OAAM,EAAe;AAC3D,EAAA,uBACEC,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,aAAA,CAAc,EAAE,OAAA,EAAS,CAAA,EAAG,SAAS,CAAA,EAAI,GAAG,KAAA,EAAO,CAAA;AAE1E","file":"badge.cjs","sourcesContent":["import { clsx } from \"clsx\";\nimport type { ClassValue } from \"clsx\";\nimport { toast } from \"sonner\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport const cn = (...inputs: ClassValue[]): string => twMerge(clsx(inputs));\n\nexport const capitalize = (str: string) =>\n str?.charAt(0)?.toUpperCase() + str?.slice(1);\n\nexport const handleError = (error: { message: string }): void => {\n toast.error(error.message);\n};\n","import type * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../lib/utils\";\n\nconst badgeVariants = cva(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary text-primary-foreground hover:bg-primary/80\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n destructive:\n \"border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80\",\n outline: \"text-foreground\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return (\n <div className={cn(badgeVariants({ variant }), className)} {...props} />\n );\n}\n\nexport { Badge, badgeVariants };\n"]}
@@ -0,0 +1,31 @@
1
+ import { cva } from 'class-variance-authority';
2
+ import { clsx } from 'clsx';
3
+ import 'sonner';
4
+ import { twMerge } from 'tailwind-merge';
5
+ import { jsx } from 'react/jsx-runtime';
6
+
7
+ // src/ui/badge.tsx
8
+ var cn = (...inputs) => twMerge(clsx(inputs));
9
+ var badgeVariants = cva(
10
+ "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
11
+ {
12
+ variants: {
13
+ variant: {
14
+ default: "border-transparent bg-primary text-primary-foreground hover:bg-primary/80",
15
+ secondary: "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
16
+ destructive: "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",
17
+ outline: "text-foreground"
18
+ }
19
+ },
20
+ defaultVariants: {
21
+ variant: "default"
22
+ }
23
+ }
24
+ );
25
+ function Badge({ className, variant, ...props }) {
26
+ return /* @__PURE__ */ jsx("div", { className: cn(badgeVariants({ variant }), className), ...props });
27
+ }
28
+
29
+ export { Badge, badgeVariants };
30
+ //# sourceMappingURL=badge.js.map
31
+ //# sourceMappingURL=badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/utils.ts","../../src/ui/badge.tsx"],"names":[],"mappings":";;;;;;;AAKO,IAAM,KAAK,CAAA,GAAI,MAAA,KAAiC,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;ACD3E,IAAM,aAAA,GAAgB,GAAA;AAAA,EACpB,wKAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,OAAA,EACE,2EAAA;AAAA,QACF,SAAA,EACE,iFAAA;AAAA,QACF,WAAA,EACE,uFAAA;AAAA,QACF,OAAA,EAAS;AAAA;AACX,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS;AAAA;AACX;AAEJ;AAMA,SAAS,MAAM,EAAE,SAAA,EAAW,OAAA,EAAS,GAAG,OAAM,EAAe;AAC3D,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,aAAA,CAAc,EAAE,OAAA,EAAS,CAAA,EAAG,SAAS,CAAA,EAAI,GAAG,KAAA,EAAO,CAAA;AAE1E","file":"badge.js","sourcesContent":["import { clsx } from \"clsx\";\nimport type { ClassValue } from \"clsx\";\nimport { toast } from \"sonner\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport const cn = (...inputs: ClassValue[]): string => twMerge(clsx(inputs));\n\nexport const capitalize = (str: string) =>\n str?.charAt(0)?.toUpperCase() + str?.slice(1);\n\nexport const handleError = (error: { message: string }): void => {\n toast.error(error.message);\n};\n","import type * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../lib/utils\";\n\nconst badgeVariants = cva(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary text-primary-foreground hover:bg-primary/80\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n destructive:\n \"border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80\",\n outline: \"text-foreground\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return (\n <div className={cn(badgeVariants({ variant }), className)} {...props} />\n );\n}\n\nexport { Badge, badgeVariants };\n"]}