@fanvue/ui 1.13.1 → 1.14.1

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 (543) hide show
  1. package/dist/cjs/components/Alert/Alert.cjs +10 -10
  2. package/dist/cjs/components/Alert/Alert.cjs.map +1 -1
  3. package/dist/cjs/components/AudioUpload/AudioUpload.cjs +15 -8
  4. package/dist/cjs/components/AudioUpload/AudioUpload.cjs.map +1 -1
  5. package/dist/cjs/components/AudioUpload/AudioWaveform.cjs +1 -1
  6. package/dist/cjs/components/AudioUpload/AudioWaveform.cjs.map +1 -1
  7. package/dist/cjs/components/Avatar/Avatar.cjs +15 -12
  8. package/dist/cjs/components/Avatar/Avatar.cjs.map +1 -1
  9. package/dist/cjs/components/Badge/Badge.cjs +29 -25
  10. package/dist/cjs/components/Badge/Badge.cjs.map +1 -1
  11. package/dist/cjs/components/Button/Button.cjs +14 -14
  12. package/dist/cjs/components/Button/Button.cjs.map +1 -1
  13. package/dist/cjs/components/Checkbox/Checkbox.cjs +15 -15
  14. package/dist/cjs/components/Checkbox/Checkbox.cjs.map +1 -1
  15. package/dist/cjs/components/Chip/Chip.cjs +7 -6
  16. package/dist/cjs/components/Chip/Chip.cjs.map +1 -1
  17. package/dist/cjs/components/Count/Count.cjs +8 -8
  18. package/dist/cjs/components/Count/Count.cjs.map +1 -1
  19. package/dist/cjs/components/DatePicker/DatePicker.cjs +13 -13
  20. package/dist/cjs/components/DatePicker/DatePicker.cjs.map +1 -1
  21. package/dist/cjs/components/Divider/Divider.cjs +1 -1
  22. package/dist/cjs/components/Divider/Divider.cjs.map +1 -1
  23. package/dist/cjs/components/IconButton/IconButton.cjs +9 -9
  24. package/dist/cjs/components/IconButton/IconButton.cjs.map +1 -1
  25. package/dist/cjs/components/Icons/AIIcon.cjs +40 -0
  26. package/dist/cjs/components/Icons/AIIcon.cjs.map +1 -0
  27. package/dist/cjs/components/Icons/AddIcon.cjs +45 -0
  28. package/dist/cjs/components/Icons/AddIcon.cjs.map +1 -0
  29. package/dist/cjs/components/Icons/AlertIcon.cjs +45 -0
  30. package/dist/cjs/components/Icons/AlertIcon.cjs.map +1 -0
  31. package/dist/cjs/components/Icons/ArrowDownIcon.cjs +57 -0
  32. package/dist/cjs/components/Icons/ArrowDownIcon.cjs.map +1 -0
  33. package/dist/cjs/components/Icons/ArrowLeftIcon.cjs +57 -0
  34. package/dist/cjs/components/Icons/ArrowLeftIcon.cjs.map +1 -0
  35. package/dist/cjs/components/Icons/ArrowRightIcon.cjs +29 -19
  36. package/dist/cjs/components/Icons/ArrowRightIcon.cjs.map +1 -1
  37. package/dist/cjs/components/Icons/ArrowUpIcon.cjs +57 -0
  38. package/dist/cjs/components/Icons/ArrowUpIcon.cjs.map +1 -0
  39. package/dist/cjs/components/Icons/BankIcon.cjs +46 -0
  40. package/dist/cjs/components/Icons/BankIcon.cjs.map +1 -0
  41. package/dist/cjs/components/Icons/BellIcon.cjs +42 -0
  42. package/dist/cjs/components/Icons/BellIcon.cjs.map +1 -0
  43. package/dist/cjs/components/Icons/BellOffIcon.cjs +51 -0
  44. package/dist/cjs/components/Icons/BellOffIcon.cjs.map +1 -0
  45. package/dist/cjs/components/Icons/BoltIcon.cjs +51 -0
  46. package/dist/cjs/components/Icons/BoltIcon.cjs.map +1 -0
  47. package/dist/cjs/components/Icons/BulbIcon.cjs +42 -0
  48. package/dist/cjs/components/Icons/BulbIcon.cjs.map +1 -0
  49. package/dist/cjs/components/Icons/Calendar2Icon.cjs +46 -0
  50. package/dist/cjs/components/Icons/Calendar2Icon.cjs.map +1 -0
  51. package/dist/cjs/components/Icons/CalendarIcon.cjs +46 -0
  52. package/dist/cjs/components/Icons/CalendarIcon.cjs.map +1 -0
  53. package/dist/cjs/components/Icons/CameraIcon.cjs +45 -0
  54. package/dist/cjs/components/Icons/CameraIcon.cjs.map +1 -0
  55. package/dist/cjs/components/Icons/ChartIcon.cjs +45 -0
  56. package/dist/cjs/components/Icons/ChartIcon.cjs.map +1 -0
  57. package/dist/cjs/components/Icons/ChevronDownIcon.cjs +24 -21
  58. package/dist/cjs/components/Icons/ChevronDownIcon.cjs.map +1 -1
  59. package/dist/cjs/components/Icons/ChevronLeftIcon.cjs +24 -21
  60. package/dist/cjs/components/Icons/ChevronLeftIcon.cjs.map +1 -1
  61. package/dist/cjs/components/Icons/ChevronRightIcon.cjs +24 -21
  62. package/dist/cjs/components/Icons/ChevronRightIcon.cjs.map +1 -1
  63. package/dist/cjs/components/Icons/ChevronUpIcon.cjs +52 -0
  64. package/dist/cjs/components/Icons/ChevronUpIcon.cjs.map +1 -0
  65. package/dist/cjs/components/Icons/ClockIcon.cjs +46 -0
  66. package/dist/cjs/components/Icons/ClockIcon.cjs.map +1 -0
  67. package/dist/cjs/components/Icons/CloseIcon.cjs +14 -18
  68. package/dist/cjs/components/Icons/CloseIcon.cjs.map +1 -1
  69. package/dist/cjs/components/Icons/CodeIcon.cjs +46 -0
  70. package/dist/cjs/components/Icons/CodeIcon.cjs.map +1 -0
  71. package/dist/cjs/components/Icons/CoinIcon.cjs +47 -0
  72. package/dist/cjs/components/Icons/CoinIcon.cjs.map +1 -0
  73. package/dist/cjs/components/Icons/CompassIcon.cjs +45 -0
  74. package/dist/cjs/components/Icons/CompassIcon.cjs.map +1 -0
  75. package/dist/cjs/components/Icons/CopyIcon.cjs +45 -0
  76. package/dist/cjs/components/Icons/CopyIcon.cjs.map +1 -0
  77. package/dist/cjs/components/Icons/CrownIcon.cjs +20 -12
  78. package/dist/cjs/components/Icons/CrownIcon.cjs.map +1 -1
  79. package/dist/cjs/components/Icons/DiamondIcon.cjs +45 -0
  80. package/dist/cjs/components/Icons/DiamondIcon.cjs.map +1 -0
  81. package/dist/cjs/components/Icons/DiscountIcon.cjs +45 -0
  82. package/dist/cjs/components/Icons/DiscountIcon.cjs.map +1 -0
  83. package/dist/cjs/components/Icons/DonateIcon.cjs +46 -0
  84. package/dist/cjs/components/Icons/DonateIcon.cjs.map +1 -0
  85. package/dist/cjs/components/Icons/DoubleTickIcon.cjs +52 -0
  86. package/dist/cjs/components/Icons/DoubleTickIcon.cjs.map +1 -0
  87. package/dist/cjs/components/Icons/DownloadIcon.cjs +46 -0
  88. package/dist/cjs/components/Icons/DownloadIcon.cjs.map +1 -0
  89. package/dist/cjs/components/Icons/EditIcon.cjs +45 -0
  90. package/dist/cjs/components/Icons/EditIcon.cjs.map +1 -0
  91. package/dist/cjs/components/Icons/ExpandIcon.cjs +45 -0
  92. package/dist/cjs/components/Icons/ExpandIcon.cjs.map +1 -0
  93. package/dist/cjs/components/Icons/EyeIcon.cjs +17 -35
  94. package/dist/cjs/components/Icons/EyeIcon.cjs.map +1 -1
  95. package/dist/cjs/components/Icons/EyeSlashIcon.cjs +46 -0
  96. package/dist/cjs/components/Icons/EyeSlashIcon.cjs.map +1 -0
  97. package/dist/cjs/components/Icons/FlagIcon.cjs +45 -0
  98. package/dist/cjs/components/Icons/FlagIcon.cjs.map +1 -0
  99. package/dist/cjs/components/Icons/FlameIcon.cjs +48 -0
  100. package/dist/cjs/components/Icons/FlameIcon.cjs.map +1 -0
  101. package/dist/cjs/components/Icons/FolderIcon.cjs +48 -0
  102. package/dist/cjs/components/Icons/FolderIcon.cjs.map +1 -0
  103. package/dist/cjs/components/Icons/ForwardIcon.cjs +48 -0
  104. package/dist/cjs/components/Icons/ForwardIcon.cjs.map +1 -0
  105. package/dist/cjs/components/Icons/GalleryIcon.cjs +47 -0
  106. package/dist/cjs/components/Icons/GalleryIcon.cjs.map +1 -0
  107. package/dist/cjs/components/Icons/GenderIcon.cjs +46 -0
  108. package/dist/cjs/components/Icons/GenderIcon.cjs.map +1 -0
  109. package/dist/cjs/components/Icons/GiftIcon.cjs +47 -0
  110. package/dist/cjs/components/Icons/GiftIcon.cjs.map +1 -0
  111. package/dist/cjs/components/Icons/HelpIcon.cjs +46 -0
  112. package/dist/cjs/components/Icons/HelpIcon.cjs.map +1 -0
  113. package/dist/cjs/components/Icons/HomeIcon.cjs +17 -12
  114. package/dist/cjs/components/Icons/HomeIcon.cjs.map +1 -1
  115. package/dist/cjs/components/Icons/HourglassIcon.cjs +48 -0
  116. package/dist/cjs/components/Icons/HourglassIcon.cjs.map +1 -0
  117. package/dist/cjs/components/Icons/ImageIcon.cjs +45 -0
  118. package/dist/cjs/components/Icons/ImageIcon.cjs.map +1 -0
  119. package/dist/cjs/components/Icons/InboxIcon.cjs +46 -0
  120. package/dist/cjs/components/Icons/InboxIcon.cjs.map +1 -0
  121. package/dist/cjs/components/Icons/LinkIcon.cjs +45 -0
  122. package/dist/cjs/components/Icons/LinkIcon.cjs.map +1 -0
  123. package/dist/cjs/components/Icons/LocationIcon.cjs +45 -0
  124. package/dist/cjs/components/Icons/LocationIcon.cjs.map +1 -0
  125. package/dist/cjs/components/Icons/LockerOffIcon.cjs +47 -0
  126. package/dist/cjs/components/Icons/LockerOffIcon.cjs.map +1 -0
  127. package/dist/cjs/components/Icons/LockerOnIcon.cjs +45 -0
  128. package/dist/cjs/components/Icons/LockerOnIcon.cjs.map +1 -0
  129. package/dist/cjs/components/Icons/LogoutIcon.cjs +64 -0
  130. package/dist/cjs/components/Icons/LogoutIcon.cjs.map +1 -0
  131. package/dist/cjs/components/Icons/LoveIcon.cjs +46 -0
  132. package/dist/cjs/components/Icons/LoveIcon.cjs.map +1 -0
  133. package/dist/cjs/components/Icons/MegaphoneIcon.cjs +46 -0
  134. package/dist/cjs/components/Icons/MegaphoneIcon.cjs.map +1 -0
  135. package/dist/cjs/components/Icons/MenuCloseIcon.cjs +45 -0
  136. package/dist/cjs/components/Icons/MenuCloseIcon.cjs.map +1 -0
  137. package/dist/cjs/components/Icons/MenuIcon.cjs +42 -0
  138. package/dist/cjs/components/Icons/MenuIcon.cjs.map +1 -0
  139. package/dist/cjs/components/Icons/MenuOpenIcon.cjs +45 -0
  140. package/dist/cjs/components/Icons/MenuOpenIcon.cjs.map +1 -0
  141. package/dist/cjs/components/Icons/MessageIcon.cjs +45 -0
  142. package/dist/cjs/components/Icons/MessageIcon.cjs.map +1 -0
  143. package/dist/cjs/components/Icons/MicrophoneIcon.cjs +18 -27
  144. package/dist/cjs/components/Icons/MicrophoneIcon.cjs.map +1 -1
  145. package/dist/cjs/components/Icons/MinusIcon.cjs +20 -12
  146. package/dist/cjs/components/Icons/MinusIcon.cjs.map +1 -1
  147. package/dist/cjs/components/Icons/MoonIcon.cjs +42 -0
  148. package/dist/cjs/components/Icons/MoonIcon.cjs.map +1 -0
  149. package/dist/cjs/components/Icons/MoreIcon.cjs +46 -0
  150. package/dist/cjs/components/Icons/MoreIcon.cjs.map +1 -0
  151. package/dist/cjs/components/Icons/MoreVerticalIcon.cjs +46 -0
  152. package/dist/cjs/components/Icons/MoreVerticalIcon.cjs.map +1 -0
  153. package/dist/cjs/components/Icons/PauseIcon.cjs +45 -0
  154. package/dist/cjs/components/Icons/PauseIcon.cjs.map +1 -0
  155. package/dist/cjs/components/Icons/PhoneIcon.cjs +48 -0
  156. package/dist/cjs/components/Icons/PhoneIcon.cjs.map +1 -0
  157. package/dist/cjs/components/Icons/PhoneOffIcon.cjs +51 -0
  158. package/dist/cjs/components/Icons/PhoneOffIcon.cjs.map +1 -0
  159. package/dist/cjs/components/Icons/PinIcon.cjs +45 -0
  160. package/dist/cjs/components/Icons/PinIcon.cjs.map +1 -0
  161. package/dist/cjs/components/Icons/PlayIcon.cjs +45 -0
  162. package/dist/cjs/components/Icons/PlayIcon.cjs.map +1 -0
  163. package/dist/cjs/components/Icons/PrivacyIcon.cjs +45 -0
  164. package/dist/cjs/components/Icons/PrivacyIcon.cjs.map +1 -0
  165. package/dist/cjs/components/Icons/RepeatIcon.cjs +64 -0
  166. package/dist/cjs/components/Icons/RepeatIcon.cjs.map +1 -0
  167. package/dist/cjs/components/Icons/Reply2Icon.cjs +46 -0
  168. package/dist/cjs/components/Icons/Reply2Icon.cjs.map +1 -0
  169. package/dist/cjs/components/Icons/ReplyIcon.cjs +48 -0
  170. package/dist/cjs/components/Icons/ReplyIcon.cjs.map +1 -0
  171. package/dist/cjs/components/Icons/SearchIcon.cjs +16 -31
  172. package/dist/cjs/components/Icons/SearchIcon.cjs.map +1 -1
  173. package/dist/cjs/components/Icons/SendIcon.cjs +45 -0
  174. package/dist/cjs/components/Icons/SendIcon.cjs.map +1 -0
  175. package/dist/cjs/components/Icons/SettingsIcon.cjs +46 -0
  176. package/dist/cjs/components/Icons/SettingsIcon.cjs.map +1 -0
  177. package/dist/cjs/components/Icons/ShareIcon.cjs +45 -0
  178. package/dist/cjs/components/Icons/ShareIcon.cjs.map +1 -0
  179. package/dist/cjs/components/Icons/StarIcon.cjs +48 -0
  180. package/dist/cjs/components/Icons/StarIcon.cjs.map +1 -0
  181. package/dist/cjs/components/Icons/StopIcon.cjs +17 -18
  182. package/dist/cjs/components/Icons/StopIcon.cjs.map +1 -1
  183. package/dist/cjs/components/Icons/SunIcon.cjs +42 -0
  184. package/dist/cjs/components/Icons/SunIcon.cjs.map +1 -0
  185. package/dist/cjs/components/Icons/Support2Icon.cjs +46 -0
  186. package/dist/cjs/components/Icons/Support2Icon.cjs.map +1 -0
  187. package/dist/cjs/components/Icons/SupportIcon.cjs +46 -0
  188. package/dist/cjs/components/Icons/SupportIcon.cjs.map +1 -0
  189. package/dist/cjs/components/Icons/TagIcon.cjs +45 -0
  190. package/dist/cjs/components/Icons/TagIcon.cjs.map +1 -0
  191. package/dist/cjs/components/Icons/TaskIcon.cjs +42 -0
  192. package/dist/cjs/components/Icons/TaskIcon.cjs.map +1 -0
  193. package/dist/cjs/components/Icons/ThumbDownIcon.cjs +45 -0
  194. package/dist/cjs/components/Icons/ThumbDownIcon.cjs.map +1 -0
  195. package/dist/cjs/components/Icons/ThumbUpIcon.cjs +45 -0
  196. package/dist/cjs/components/Icons/ThumbUpIcon.cjs.map +1 -0
  197. package/dist/cjs/components/Icons/TickCircleIcon.cjs +45 -0
  198. package/dist/cjs/components/Icons/TickCircleIcon.cjs.map +1 -0
  199. package/dist/cjs/components/Icons/TickCircleOffIcon.cjs +48 -0
  200. package/dist/cjs/components/Icons/TickCircleOffIcon.cjs.map +1 -0
  201. package/dist/cjs/components/Icons/TickIcon.cjs +48 -0
  202. package/dist/cjs/components/Icons/TickIcon.cjs.map +1 -0
  203. package/dist/cjs/components/Icons/TrashBinIcon.cjs +46 -0
  204. package/dist/cjs/components/Icons/TrashBinIcon.cjs.map +1 -0
  205. package/dist/cjs/components/Icons/TrophyIcon.cjs +46 -0
  206. package/dist/cjs/components/Icons/TrophyIcon.cjs.map +1 -0
  207. package/dist/cjs/components/Icons/UploadIcon.cjs +45 -0
  208. package/dist/cjs/components/Icons/UploadIcon.cjs.map +1 -0
  209. package/dist/cjs/components/Icons/UserCircleIcon.cjs +48 -0
  210. package/dist/cjs/components/Icons/UserCircleIcon.cjs.map +1 -0
  211. package/dist/cjs/components/Icons/UserIcon.cjs +67 -0
  212. package/dist/cjs/components/Icons/UserIcon.cjs.map +1 -0
  213. package/dist/cjs/components/Icons/UsersIcon.cjs +45 -0
  214. package/dist/cjs/components/Icons/UsersIcon.cjs.map +1 -0
  215. package/dist/cjs/components/Icons/VideoIcon.cjs +45 -0
  216. package/dist/cjs/components/Icons/VideoIcon.cjs.map +1 -0
  217. package/dist/cjs/components/Icons/WalletIcon.cjs +47 -0
  218. package/dist/cjs/components/Icons/WalletIcon.cjs.map +1 -0
  219. package/dist/cjs/components/Icons/WifiOffIcon.cjs +45 -0
  220. package/dist/cjs/components/Icons/WifiOffIcon.cjs.map +1 -0
  221. package/dist/cjs/components/Icons/WifiOnIcon.cjs +45 -0
  222. package/dist/cjs/components/Icons/WifiOnIcon.cjs.map +1 -0
  223. package/dist/cjs/components/Icons/WrenchIcon.cjs +48 -0
  224. package/dist/cjs/components/Icons/WrenchIcon.cjs.map +1 -0
  225. package/dist/cjs/components/Loader/Loader.cjs +1 -1
  226. package/dist/cjs/components/Loader/Loader.cjs.map +1 -1
  227. package/dist/cjs/components/Logo/Logo.cjs +13 -13
  228. package/dist/cjs/components/Logo/Logo.cjs.map +1 -1
  229. package/dist/cjs/components/Pagination/Pagination.cjs +2 -2
  230. package/dist/cjs/components/Pagination/Pagination.cjs.map +1 -1
  231. package/dist/cjs/components/PasswordField/PasswordField.cjs +1 -1
  232. package/dist/cjs/components/PasswordField/PasswordField.cjs.map +1 -1
  233. package/dist/cjs/components/Pill/Pill.cjs +24 -12
  234. package/dist/cjs/components/Pill/Pill.cjs.map +1 -1
  235. package/dist/cjs/components/ProgressBar/ProgressBar.cjs +16 -13
  236. package/dist/cjs/components/ProgressBar/ProgressBar.cjs.map +1 -1
  237. package/dist/cjs/components/Radio/Radio.cjs +6 -6
  238. package/dist/cjs/components/Radio/Radio.cjs.map +1 -1
  239. package/dist/cjs/components/Select/Select.cjs +13 -13
  240. package/dist/cjs/components/Select/Select.cjs.map +1 -1
  241. package/dist/cjs/components/Slider/Slider.cjs +1 -1
  242. package/dist/cjs/components/Slider/Slider.cjs.map +1 -1
  243. package/dist/cjs/components/Slider/SliderLayout.cjs +12 -5
  244. package/dist/cjs/components/Slider/SliderLayout.cjs.map +1 -1
  245. package/dist/cjs/components/Slider/SliderThumb.cjs +6 -6
  246. package/dist/cjs/components/Slider/SliderThumb.cjs.map +1 -1
  247. package/dist/cjs/components/Snackbar/Snackbar.cjs +8 -8
  248. package/dist/cjs/components/Snackbar/Snackbar.cjs.map +1 -1
  249. package/dist/cjs/components/Switch/Switch.cjs +2 -2
  250. package/dist/cjs/components/Switch/Switch.cjs.map +1 -1
  251. package/dist/cjs/components/SwitchField/SwitchField.cjs +13 -8
  252. package/dist/cjs/components/SwitchField/SwitchField.cjs.map +1 -1
  253. package/dist/cjs/components/SwitchToggle/SwitchToggle.cjs +4 -4
  254. package/dist/cjs/components/SwitchToggle/SwitchToggle.cjs.map +1 -1
  255. package/dist/cjs/components/Tabs/TabsList.cjs +1 -1
  256. package/dist/cjs/components/Tabs/TabsList.cjs.map +1 -1
  257. package/dist/cjs/components/Tabs/TabsTrigger.cjs +8 -8
  258. package/dist/cjs/components/Tabs/TabsTrigger.cjs.map +1 -1
  259. package/dist/cjs/components/TextArea/TextArea.cjs +10 -10
  260. package/dist/cjs/components/TextArea/TextArea.cjs.map +1 -1
  261. package/dist/cjs/components/TextField/TextField.cjs +11 -11
  262. package/dist/cjs/components/TextField/TextField.cjs.map +1 -1
  263. package/dist/cjs/components/Toast/Toast.cjs +9 -9
  264. package/dist/cjs/components/Toast/Toast.cjs.map +1 -1
  265. package/dist/cjs/components/Tooltip/Tooltip.cjs +40 -14
  266. package/dist/cjs/components/Tooltip/Tooltip.cjs.map +1 -1
  267. package/dist/cjs/index.cjs +176 -2
  268. package/dist/cjs/index.cjs.map +1 -1
  269. package/dist/components/Alert/Alert.mjs +10 -10
  270. package/dist/components/Alert/Alert.mjs.map +1 -1
  271. package/dist/components/AudioUpload/AudioUpload.mjs +15 -8
  272. package/dist/components/AudioUpload/AudioUpload.mjs.map +1 -1
  273. package/dist/components/AudioUpload/AudioWaveform.mjs +1 -1
  274. package/dist/components/AudioUpload/AudioWaveform.mjs.map +1 -1
  275. package/dist/components/Avatar/Avatar.mjs +15 -12
  276. package/dist/components/Avatar/Avatar.mjs.map +1 -1
  277. package/dist/components/Badge/Badge.mjs +29 -25
  278. package/dist/components/Badge/Badge.mjs.map +1 -1
  279. package/dist/components/Button/Button.mjs +14 -14
  280. package/dist/components/Button/Button.mjs.map +1 -1
  281. package/dist/components/Checkbox/Checkbox.mjs +15 -15
  282. package/dist/components/Checkbox/Checkbox.mjs.map +1 -1
  283. package/dist/components/Chip/Chip.mjs +7 -6
  284. package/dist/components/Chip/Chip.mjs.map +1 -1
  285. package/dist/components/Count/Count.mjs +8 -8
  286. package/dist/components/Count/Count.mjs.map +1 -1
  287. package/dist/components/DatePicker/DatePicker.mjs +13 -13
  288. package/dist/components/DatePicker/DatePicker.mjs.map +1 -1
  289. package/dist/components/Divider/Divider.mjs +1 -1
  290. package/dist/components/Divider/Divider.mjs.map +1 -1
  291. package/dist/components/IconButton/IconButton.mjs +9 -9
  292. package/dist/components/IconButton/IconButton.mjs.map +1 -1
  293. package/dist/components/Icons/AIIcon.mjs +23 -0
  294. package/dist/components/Icons/AIIcon.mjs.map +1 -0
  295. package/dist/components/Icons/AddIcon.mjs +28 -0
  296. package/dist/components/Icons/AddIcon.mjs.map +1 -0
  297. package/dist/components/Icons/AlertIcon.mjs +28 -0
  298. package/dist/components/Icons/AlertIcon.mjs.map +1 -0
  299. package/dist/components/Icons/ArrowDownIcon.mjs +40 -0
  300. package/dist/components/Icons/ArrowDownIcon.mjs.map +1 -0
  301. package/dist/components/Icons/ArrowLeftIcon.mjs +40 -0
  302. package/dist/components/Icons/ArrowLeftIcon.mjs.map +1 -0
  303. package/dist/components/Icons/ArrowRightIcon.mjs +30 -20
  304. package/dist/components/Icons/ArrowRightIcon.mjs.map +1 -1
  305. package/dist/components/Icons/ArrowUpIcon.mjs +40 -0
  306. package/dist/components/Icons/ArrowUpIcon.mjs.map +1 -0
  307. package/dist/components/Icons/BankIcon.mjs +29 -0
  308. package/dist/components/Icons/BankIcon.mjs.map +1 -0
  309. package/dist/components/Icons/BellIcon.mjs +25 -0
  310. package/dist/components/Icons/BellIcon.mjs.map +1 -0
  311. package/dist/components/Icons/BellOffIcon.mjs +34 -0
  312. package/dist/components/Icons/BellOffIcon.mjs.map +1 -0
  313. package/dist/components/Icons/BoltIcon.mjs +34 -0
  314. package/dist/components/Icons/BoltIcon.mjs.map +1 -0
  315. package/dist/components/Icons/BulbIcon.mjs +25 -0
  316. package/dist/components/Icons/BulbIcon.mjs.map +1 -0
  317. package/dist/components/Icons/Calendar2Icon.mjs +29 -0
  318. package/dist/components/Icons/Calendar2Icon.mjs.map +1 -0
  319. package/dist/components/Icons/CalendarIcon.mjs +29 -0
  320. package/dist/components/Icons/CalendarIcon.mjs.map +1 -0
  321. package/dist/components/Icons/CameraIcon.mjs +28 -0
  322. package/dist/components/Icons/CameraIcon.mjs.map +1 -0
  323. package/dist/components/Icons/ChartIcon.mjs +28 -0
  324. package/dist/components/Icons/ChartIcon.mjs.map +1 -0
  325. package/dist/components/Icons/ChevronDownIcon.mjs +24 -21
  326. package/dist/components/Icons/ChevronDownIcon.mjs.map +1 -1
  327. package/dist/components/Icons/ChevronLeftIcon.mjs +24 -21
  328. package/dist/components/Icons/ChevronLeftIcon.mjs.map +1 -1
  329. package/dist/components/Icons/ChevronRightIcon.mjs +24 -21
  330. package/dist/components/Icons/ChevronRightIcon.mjs.map +1 -1
  331. package/dist/components/Icons/ChevronUpIcon.mjs +35 -0
  332. package/dist/components/Icons/ChevronUpIcon.mjs.map +1 -0
  333. package/dist/components/Icons/ClockIcon.mjs +29 -0
  334. package/dist/components/Icons/ClockIcon.mjs.map +1 -0
  335. package/dist/components/Icons/CloseIcon.mjs +14 -18
  336. package/dist/components/Icons/CloseIcon.mjs.map +1 -1
  337. package/dist/components/Icons/CodeIcon.mjs +29 -0
  338. package/dist/components/Icons/CodeIcon.mjs.map +1 -0
  339. package/dist/components/Icons/CoinIcon.mjs +30 -0
  340. package/dist/components/Icons/CoinIcon.mjs.map +1 -0
  341. package/dist/components/Icons/CompassIcon.mjs +28 -0
  342. package/dist/components/Icons/CompassIcon.mjs.map +1 -0
  343. package/dist/components/Icons/CopyIcon.mjs +28 -0
  344. package/dist/components/Icons/CopyIcon.mjs.map +1 -0
  345. package/dist/components/Icons/CrownIcon.mjs +20 -12
  346. package/dist/components/Icons/CrownIcon.mjs.map +1 -1
  347. package/dist/components/Icons/DiamondIcon.mjs +28 -0
  348. package/dist/components/Icons/DiamondIcon.mjs.map +1 -0
  349. package/dist/components/Icons/DiscountIcon.mjs +28 -0
  350. package/dist/components/Icons/DiscountIcon.mjs.map +1 -0
  351. package/dist/components/Icons/DonateIcon.mjs +29 -0
  352. package/dist/components/Icons/DonateIcon.mjs.map +1 -0
  353. package/dist/components/Icons/DoubleTickIcon.mjs +35 -0
  354. package/dist/components/Icons/DoubleTickIcon.mjs.map +1 -0
  355. package/dist/components/Icons/DownloadIcon.mjs +29 -0
  356. package/dist/components/Icons/DownloadIcon.mjs.map +1 -0
  357. package/dist/components/Icons/EditIcon.mjs +28 -0
  358. package/dist/components/Icons/EditIcon.mjs.map +1 -0
  359. package/dist/components/Icons/ExpandIcon.mjs +28 -0
  360. package/dist/components/Icons/ExpandIcon.mjs.map +1 -0
  361. package/dist/components/Icons/EyeIcon.mjs +18 -36
  362. package/dist/components/Icons/EyeIcon.mjs.map +1 -1
  363. package/dist/components/Icons/EyeSlashIcon.mjs +29 -0
  364. package/dist/components/Icons/EyeSlashIcon.mjs.map +1 -0
  365. package/dist/components/Icons/FlagIcon.mjs +28 -0
  366. package/dist/components/Icons/FlagIcon.mjs.map +1 -0
  367. package/dist/components/Icons/FlameIcon.mjs +31 -0
  368. package/dist/components/Icons/FlameIcon.mjs.map +1 -0
  369. package/dist/components/Icons/FolderIcon.mjs +31 -0
  370. package/dist/components/Icons/FolderIcon.mjs.map +1 -0
  371. package/dist/components/Icons/ForwardIcon.mjs +31 -0
  372. package/dist/components/Icons/ForwardIcon.mjs.map +1 -0
  373. package/dist/components/Icons/GalleryIcon.mjs +30 -0
  374. package/dist/components/Icons/GalleryIcon.mjs.map +1 -0
  375. package/dist/components/Icons/GenderIcon.mjs +29 -0
  376. package/dist/components/Icons/GenderIcon.mjs.map +1 -0
  377. package/dist/components/Icons/GiftIcon.mjs +30 -0
  378. package/dist/components/Icons/GiftIcon.mjs.map +1 -0
  379. package/dist/components/Icons/HelpIcon.mjs +29 -0
  380. package/dist/components/Icons/HelpIcon.mjs.map +1 -0
  381. package/dist/components/Icons/HomeIcon.mjs +18 -13
  382. package/dist/components/Icons/HomeIcon.mjs.map +1 -1
  383. package/dist/components/Icons/HourglassIcon.mjs +31 -0
  384. package/dist/components/Icons/HourglassIcon.mjs.map +1 -0
  385. package/dist/components/Icons/ImageIcon.mjs +28 -0
  386. package/dist/components/Icons/ImageIcon.mjs.map +1 -0
  387. package/dist/components/Icons/InboxIcon.mjs +29 -0
  388. package/dist/components/Icons/InboxIcon.mjs.map +1 -0
  389. package/dist/components/Icons/LinkIcon.mjs +28 -0
  390. package/dist/components/Icons/LinkIcon.mjs.map +1 -0
  391. package/dist/components/Icons/LocationIcon.mjs +28 -0
  392. package/dist/components/Icons/LocationIcon.mjs.map +1 -0
  393. package/dist/components/Icons/LockerOffIcon.mjs +30 -0
  394. package/dist/components/Icons/LockerOffIcon.mjs.map +1 -0
  395. package/dist/components/Icons/LockerOnIcon.mjs +28 -0
  396. package/dist/components/Icons/LockerOnIcon.mjs.map +1 -0
  397. package/dist/components/Icons/LogoutIcon.mjs +47 -0
  398. package/dist/components/Icons/LogoutIcon.mjs.map +1 -0
  399. package/dist/components/Icons/LoveIcon.mjs +29 -0
  400. package/dist/components/Icons/LoveIcon.mjs.map +1 -0
  401. package/dist/components/Icons/MegaphoneIcon.mjs +29 -0
  402. package/dist/components/Icons/MegaphoneIcon.mjs.map +1 -0
  403. package/dist/components/Icons/MenuCloseIcon.mjs +28 -0
  404. package/dist/components/Icons/MenuCloseIcon.mjs.map +1 -0
  405. package/dist/components/Icons/MenuIcon.mjs +25 -0
  406. package/dist/components/Icons/MenuIcon.mjs.map +1 -0
  407. package/dist/components/Icons/MenuOpenIcon.mjs +28 -0
  408. package/dist/components/Icons/MenuOpenIcon.mjs.map +1 -0
  409. package/dist/components/Icons/MessageIcon.mjs +28 -0
  410. package/dist/components/Icons/MessageIcon.mjs.map +1 -0
  411. package/dist/components/Icons/MicrophoneIcon.mjs +19 -28
  412. package/dist/components/Icons/MicrophoneIcon.mjs.map +1 -1
  413. package/dist/components/Icons/MinusIcon.mjs +20 -12
  414. package/dist/components/Icons/MinusIcon.mjs.map +1 -1
  415. package/dist/components/Icons/MoonIcon.mjs +25 -0
  416. package/dist/components/Icons/MoonIcon.mjs.map +1 -0
  417. package/dist/components/Icons/MoreIcon.mjs +29 -0
  418. package/dist/components/Icons/MoreIcon.mjs.map +1 -0
  419. package/dist/components/Icons/MoreVerticalIcon.mjs +29 -0
  420. package/dist/components/Icons/MoreVerticalIcon.mjs.map +1 -0
  421. package/dist/components/Icons/PauseIcon.mjs +28 -0
  422. package/dist/components/Icons/PauseIcon.mjs.map +1 -0
  423. package/dist/components/Icons/PhoneIcon.mjs +31 -0
  424. package/dist/components/Icons/PhoneIcon.mjs.map +1 -0
  425. package/dist/components/Icons/PhoneOffIcon.mjs +34 -0
  426. package/dist/components/Icons/PhoneOffIcon.mjs.map +1 -0
  427. package/dist/components/Icons/PinIcon.mjs +28 -0
  428. package/dist/components/Icons/PinIcon.mjs.map +1 -0
  429. package/dist/components/Icons/PlayIcon.mjs +28 -0
  430. package/dist/components/Icons/PlayIcon.mjs.map +1 -0
  431. package/dist/components/Icons/PrivacyIcon.mjs +28 -0
  432. package/dist/components/Icons/PrivacyIcon.mjs.map +1 -0
  433. package/dist/components/Icons/RepeatIcon.mjs +47 -0
  434. package/dist/components/Icons/RepeatIcon.mjs.map +1 -0
  435. package/dist/components/Icons/Reply2Icon.mjs +29 -0
  436. package/dist/components/Icons/Reply2Icon.mjs.map +1 -0
  437. package/dist/components/Icons/ReplyIcon.mjs +31 -0
  438. package/dist/components/Icons/ReplyIcon.mjs.map +1 -0
  439. package/dist/components/Icons/SearchIcon.mjs +17 -32
  440. package/dist/components/Icons/SearchIcon.mjs.map +1 -1
  441. package/dist/components/Icons/SendIcon.mjs +28 -0
  442. package/dist/components/Icons/SendIcon.mjs.map +1 -0
  443. package/dist/components/Icons/SettingsIcon.mjs +29 -0
  444. package/dist/components/Icons/SettingsIcon.mjs.map +1 -0
  445. package/dist/components/Icons/ShareIcon.mjs +28 -0
  446. package/dist/components/Icons/ShareIcon.mjs.map +1 -0
  447. package/dist/components/Icons/StarIcon.mjs +31 -0
  448. package/dist/components/Icons/StarIcon.mjs.map +1 -0
  449. package/dist/components/Icons/StopIcon.mjs +18 -19
  450. package/dist/components/Icons/StopIcon.mjs.map +1 -1
  451. package/dist/components/Icons/SunIcon.mjs +25 -0
  452. package/dist/components/Icons/SunIcon.mjs.map +1 -0
  453. package/dist/components/Icons/Support2Icon.mjs +29 -0
  454. package/dist/components/Icons/Support2Icon.mjs.map +1 -0
  455. package/dist/components/Icons/SupportIcon.mjs +29 -0
  456. package/dist/components/Icons/SupportIcon.mjs.map +1 -0
  457. package/dist/components/Icons/TagIcon.mjs +28 -0
  458. package/dist/components/Icons/TagIcon.mjs.map +1 -0
  459. package/dist/components/Icons/TaskIcon.mjs +25 -0
  460. package/dist/components/Icons/TaskIcon.mjs.map +1 -0
  461. package/dist/components/Icons/ThumbDownIcon.mjs +28 -0
  462. package/dist/components/Icons/ThumbDownIcon.mjs.map +1 -0
  463. package/dist/components/Icons/ThumbUpIcon.mjs +28 -0
  464. package/dist/components/Icons/ThumbUpIcon.mjs.map +1 -0
  465. package/dist/components/Icons/TickCircleIcon.mjs +28 -0
  466. package/dist/components/Icons/TickCircleIcon.mjs.map +1 -0
  467. package/dist/components/Icons/TickCircleOffIcon.mjs +31 -0
  468. package/dist/components/Icons/TickCircleOffIcon.mjs.map +1 -0
  469. package/dist/components/Icons/TickIcon.mjs +31 -0
  470. package/dist/components/Icons/TickIcon.mjs.map +1 -0
  471. package/dist/components/Icons/TrashBinIcon.mjs +29 -0
  472. package/dist/components/Icons/TrashBinIcon.mjs.map +1 -0
  473. package/dist/components/Icons/TrophyIcon.mjs +29 -0
  474. package/dist/components/Icons/TrophyIcon.mjs.map +1 -0
  475. package/dist/components/Icons/UploadIcon.mjs +28 -0
  476. package/dist/components/Icons/UploadIcon.mjs.map +1 -0
  477. package/dist/components/Icons/UserCircleIcon.mjs +31 -0
  478. package/dist/components/Icons/UserCircleIcon.mjs.map +1 -0
  479. package/dist/components/Icons/UserIcon.mjs +50 -0
  480. package/dist/components/Icons/UserIcon.mjs.map +1 -0
  481. package/dist/components/Icons/UsersIcon.mjs +28 -0
  482. package/dist/components/Icons/UsersIcon.mjs.map +1 -0
  483. package/dist/components/Icons/VideoIcon.mjs +28 -0
  484. package/dist/components/Icons/VideoIcon.mjs.map +1 -0
  485. package/dist/components/Icons/WalletIcon.mjs +30 -0
  486. package/dist/components/Icons/WalletIcon.mjs.map +1 -0
  487. package/dist/components/Icons/WifiOffIcon.mjs +28 -0
  488. package/dist/components/Icons/WifiOffIcon.mjs.map +1 -0
  489. package/dist/components/Icons/WifiOnIcon.mjs +28 -0
  490. package/dist/components/Icons/WifiOnIcon.mjs.map +1 -0
  491. package/dist/components/Icons/WrenchIcon.mjs +31 -0
  492. package/dist/components/Icons/WrenchIcon.mjs.map +1 -0
  493. package/dist/components/Loader/Loader.mjs +1 -1
  494. package/dist/components/Loader/Loader.mjs.map +1 -1
  495. package/dist/components/Logo/Logo.mjs +13 -13
  496. package/dist/components/Logo/Logo.mjs.map +1 -1
  497. package/dist/components/Pagination/Pagination.mjs +2 -2
  498. package/dist/components/Pagination/Pagination.mjs.map +1 -1
  499. package/dist/components/PasswordField/PasswordField.mjs +1 -1
  500. package/dist/components/PasswordField/PasswordField.mjs.map +1 -1
  501. package/dist/components/Pill/Pill.mjs +24 -12
  502. package/dist/components/Pill/Pill.mjs.map +1 -1
  503. package/dist/components/ProgressBar/ProgressBar.mjs +16 -13
  504. package/dist/components/ProgressBar/ProgressBar.mjs.map +1 -1
  505. package/dist/components/Radio/Radio.mjs +6 -6
  506. package/dist/components/Radio/Radio.mjs.map +1 -1
  507. package/dist/components/Select/Select.mjs +13 -13
  508. package/dist/components/Select/Select.mjs.map +1 -1
  509. package/dist/components/Slider/Slider.mjs +1 -1
  510. package/dist/components/Slider/Slider.mjs.map +1 -1
  511. package/dist/components/Slider/SliderLayout.mjs +12 -5
  512. package/dist/components/Slider/SliderLayout.mjs.map +1 -1
  513. package/dist/components/Slider/SliderThumb.mjs +6 -6
  514. package/dist/components/Slider/SliderThumb.mjs.map +1 -1
  515. package/dist/components/Snackbar/Snackbar.mjs +8 -8
  516. package/dist/components/Snackbar/Snackbar.mjs.map +1 -1
  517. package/dist/components/Switch/Switch.mjs +2 -2
  518. package/dist/components/Switch/Switch.mjs.map +1 -1
  519. package/dist/components/SwitchField/SwitchField.mjs +13 -8
  520. package/dist/components/SwitchField/SwitchField.mjs.map +1 -1
  521. package/dist/components/SwitchToggle/SwitchToggle.mjs +4 -4
  522. package/dist/components/SwitchToggle/SwitchToggle.mjs.map +1 -1
  523. package/dist/components/Tabs/TabsList.mjs +1 -1
  524. package/dist/components/Tabs/TabsList.mjs.map +1 -1
  525. package/dist/components/Tabs/TabsTrigger.mjs +8 -8
  526. package/dist/components/Tabs/TabsTrigger.mjs.map +1 -1
  527. package/dist/components/TextArea/TextArea.mjs +10 -10
  528. package/dist/components/TextArea/TextArea.mjs.map +1 -1
  529. package/dist/components/TextField/TextField.mjs +11 -11
  530. package/dist/components/TextField/TextField.mjs.map +1 -1
  531. package/dist/components/Toast/Toast.mjs +9 -9
  532. package/dist/components/Toast/Toast.mjs.map +1 -1
  533. package/dist/components/Tooltip/Tooltip.mjs +40 -14
  534. package/dist/components/Tooltip/Tooltip.mjs.map +1 -1
  535. package/dist/index.d.ts +349 -14
  536. package/dist/index.mjs +176 -2
  537. package/dist/index.mjs.map +1 -1
  538. package/dist/styles/theme.css +298 -428
  539. package/package.json +2 -2
  540. package/dist/cjs/components/Icons/FireIcon.cjs +0 -47
  541. package/dist/cjs/components/Icons/FireIcon.cjs.map +0 -1
  542. package/dist/components/Icons/FireIcon.mjs +0 -30
  543. package/dist/components/Icons/FireIcon.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Tooltip.cjs","sources":["../../../../src/components/Tooltip/Tooltip.tsx"],"sourcesContent":["import * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\nimport * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Button } from \"../Button/Button\";\n\n/** Props for the {@link TooltipProvider}. Wraps Radix `Tooltip.Provider`. */\nexport type TooltipProviderProps = React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Provider>;\n\n/** Provides tooltip delay and skip-delay context. Wrap your app or a subtree. */\nexport const TooltipProvider = TooltipPrimitive.Provider;\n\n/** Props for the {@link Tooltip} root component. */\nexport interface TooltipProps extends React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Root> {\n /**\n * Controlled open state. When provided, the component is in controlled mode\n * and you must also supply `onOpenChange` to update the value.\n */\n open?: boolean;\n /** Called when the open state changes. Required when `open` is controlled. */\n onOpenChange?: (open: boolean) => void;\n /** The open state of the tooltip when it is initially rendered (uncontrolled). */\n defaultOpen?: boolean;\n}\n\n/** Root component that manages open/close state for a single tooltip. */\nexport const Tooltip = TooltipPrimitive.Root;\n\n/** Props for the {@link TooltipTrigger} component. */\nexport type TooltipTriggerProps = React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Trigger>;\n\n/** The element that triggers the tooltip on hover/focus. */\nexport const TooltipTrigger = TooltipPrimitive.Trigger;\n\n/**\n * Visual style variant of the tooltip content.\n *\n * - `\"tooltip\"` — simple text bubble, no border.\n * - `\"infobox\"` — richer card with a visible border, structured header, body text, and optional actions.\n */\nexport type TooltipContentVariant = \"tooltip\" | \"infobox\";\n\n/** Action button configuration for the infobox variant of {@link TooltipContent}. */\nexport interface TooltipAction {\n /** Button label. */\n label: string;\n /** Click handler. */\n onClick?: () => void;\n /**\n * Optional custom React node to be rendered for the action instead of the default button.\n * Only used in the infobox variant.\n */\n element?: React.ReactNode;\n}\n\nexport interface TooltipContentProps\n extends React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content> {\n /**\n * Visual style variant.\n *\n * `\"tooltip\"` is a lightweight text bubble. `\"infobox\"` renders a structured card\n * with optional heading, icon, pill, body text, and action buttons.\n *\n * @default \"tooltip\"\n */\n variant?: TooltipContentVariant;\n /** Whether to show the directional arrow pointer. @default true */\n showArrow?: boolean;\n /**\n * Heading text rendered in subtitle style at the top of the infobox.\n * Infobox variant only.\n */\n heading?: React.ReactNode;\n /**\n * Icon element displayed to the left of the heading.\n * Infobox variant only.\n */\n icon?: React.ReactNode;\n /**\n * Pill or badge element displayed to the right of the heading.\n * Infobox variant only.\n */\n pill?: React.ReactNode;\n /**\n * Primary action button (brand green). Rendered below the body text.\n * Infobox variant only.\n */\n primaryAction?: TooltipAction;\n /**\n * Secondary action button (ghost). Rendered next to the primary action.\n * Infobox variant only.\n */\n secondaryAction?: TooltipAction;\n}\n\n/**\n * The popup content of the tooltip. Renders inside a portal.\n *\n * Arrow direction is controlled via the `side` and `align` props (Radix passthrough).\n *\n * @example\n * ```tsx\n * // Simple tooltip\n * <TooltipContent>Info text</TooltipContent>\n *\n * // Infobox with structured content\n * <TooltipContent\n * variant=\"infobox\"\n * heading=\"Title\"\n * icon={<InfoCircleIcon className=\"size-5\" />}\n * primaryAction={{ label: \"OK\", onClick: () => {} }}\n * secondaryAction={{ label: \"Dismiss\" }}\n * >\n * Info text\n * </TooltipContent>\n * ```\n */\nexport const TooltipContent = React.forwardRef<\n React.ComponentRef<typeof TooltipPrimitive.Content>,\n TooltipContentProps\n>(\n (\n {\n className,\n variant = \"tooltip\",\n showArrow = true,\n sideOffset = 8,\n heading,\n icon,\n pill,\n primaryAction,\n secondaryAction,\n children,\n side,\n style,\n ...props\n },\n ref,\n ) => {\n const isInfobox = variant === \"infobox\";\n const hasHeader =\n isInfobox && (icon !== undefined || heading !== undefined || pill !== undefined);\n const hasActions = isInfobox && (primaryAction !== undefined || secondaryAction !== undefined);\n\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n style={{ zIndex: \"var(--fanvue-ui-portal-z-index, 50)\", ...style }}\n className={cn(\n \"typography-body-2-regular max-w-[320px] overflow-hidden rounded-3xl bg-background-solid p-4 text-background-inverse-solid shadow-[0px_2px_4px_0px_rgba(17,24,39,0.08)]\",\n isInfobox && \"border border-neutral-200\",\n className,\n )}\n align=\"center\"\n arrowPadding={12}\n side={side}\n {...props}\n >\n {isInfobox ? (\n <div className=\"flex flex-col gap-3\">\n {hasHeader && (\n <div className=\"flex items-center gap-3\">\n {icon && <div className=\"size-5 shrink-0\">{icon}</div>}\n {heading && (\n <p className=\"typography-subtitle min-w-0 flex-1 text-background-inverse-solid\">\n {heading}\n </p>\n )}\n {pill && <div className=\"shrink-0\">{pill}</div>}\n </div>\n )}\n {children && (\n <div className=\"typography-body-2-regular text-background-inverse-solid\">\n {children}\n </div>\n )}\n {hasActions && (\n <div className=\"flex items-center gap-1\">\n {primaryAction &&\n (primaryAction.element ? (\n primaryAction.element\n ) : (\n <Button variant=\"brand\" size=\"32\" onClick={primaryAction.onClick}>\n {primaryAction.label}\n </Button>\n ))}\n {secondaryAction &&\n (secondaryAction.element ? (\n secondaryAction.element\n ) : (\n <Button variant=\"tertiary\" size=\"32\" onClick={secondaryAction.onClick}>\n {secondaryAction.label}\n </Button>\n ))}\n </div>\n )}\n </div>\n ) : (\n children\n )}\n {showArrow && (\n <TooltipPrimitive.Arrow\n className={\"-translate-y-px! fill-background-solid stroke-2 stroke-background-solid\"}\n width={12}\n height={6}\n />\n )}\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n );\n },\n);\nTooltipContent.displayName = \"TooltipContent\";\n"],"names":["TooltipPrimitive","React","jsx","jsxs","cn","Button"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AASO,MAAM,kBAAkBA,4BAAiB;AAgBzC,MAAM,UAAUA,4BAAiB;AAMjC,MAAM,iBAAiBA,4BAAiB;AAqFxC,MAAM,iBAAiBC,iBAAM;AAAA,EAIlC,CACE;AAAA,IACE;AAAA,IACA,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EAAA,GAEL,QACG;AACH,UAAM,YAAY,YAAY;AAC9B,UAAM,YACJ,cAAc,SAAS,UAAa,YAAY,UAAa,SAAS;AACxE,UAAM,aAAa,cAAc,kBAAkB,UAAa,oBAAoB;AAEpF,WACEC,2BAAAA,IAACF,4BAAiB,QAAjB,EACC,UAAAG,2BAAAA;AAAAA,MAACH,4BAAiB;AAAA,MAAjB;AAAA,QACC;AAAA,QACA;AAAA,QACA,OAAO,EAAE,QAAQ,uCAAuC,GAAG,MAAA;AAAA,QAC3D,WAAWI,GAAAA;AAAAA,UACT;AAAA,UACA,aAAa;AAAA,UACb;AAAA,QAAA;AAAA,QAEF,OAAM;AAAA,QACN,cAAc;AAAA,QACd;AAAA,QACC,GAAG;AAAA,QAEH,UAAA;AAAA,UAAA,YACCD,2BAAAA,KAAC,OAAA,EAAI,WAAU,uBACZ,UAAA;AAAA,YAAA,aACCA,2BAAAA,KAAC,OAAA,EAAI,WAAU,2BACZ,UAAA;AAAA,cAAA,QAAQD,2BAAAA,IAAC,OAAA,EAAI,WAAU,mBAAmB,UAAA,MAAK;AAAA,cAC/C,WACCA,2BAAAA,IAAC,KAAA,EAAE,WAAU,oEACV,UAAA,SACH;AAAA,cAED,QAAQA,2BAAAA,IAAC,OAAA,EAAI,WAAU,YAAY,UAAA,KAAA,CAAK;AAAA,YAAA,GAC3C;AAAA,YAED,YACCA,2BAAAA,IAAC,OAAA,EAAI,WAAU,2DACZ,UACH;AAAA,YAED,cACCC,2BAAAA,KAAC,OAAA,EAAI,WAAU,2BACZ,UAAA;AAAA,cAAA,kBACE,cAAc,UACb,cAAc,yCAEbE,OAAAA,QAAA,EAAO,SAAQ,SAAQ,MAAK,MAAK,SAAS,cAAc,SACtD,wBAAc,MAAA,CACjB;AAAA,cAEH,oBACE,gBAAgB,UACf,gBAAgB,UAEhBH,2BAAAA,IAACG,OAAAA,QAAA,EAAO,SAAQ,YAAW,MAAK,MAAK,SAAS,gBAAgB,SAC3D,0BAAgB,OACnB;AAAA,YAAA,EAAA,CAEN;AAAA,UAAA,EAAA,CAEJ,IAEA;AAAA,UAED,aACCH,2BAAAA;AAAAA,YAACF,4BAAiB;AAAA,YAAjB;AAAA,cACC,WAAW;AAAA,cACX,OAAO;AAAA,cACP,QAAQ;AAAA,YAAA;AAAA,UAAA;AAAA,QACV;AAAA,MAAA;AAAA,IAAA,GAGN;AAAA,EAEJ;AACF;AACA,eAAe,cAAc;;;;;"}
1
+ {"version":3,"file":"Tooltip.cjs","sources":["../../../../src/components/Tooltip/Tooltip.tsx"],"sourcesContent":["import * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\nimport * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Button } from \"../Button/Button\";\n\n/** Props for the {@link TooltipProvider}. Wraps Radix `Tooltip.Provider`. */\nexport type TooltipProviderProps = React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Provider>;\n\n/** Provides tooltip delay and skip-delay context. Wrap your app or a subtree. */\nexport const TooltipProvider = TooltipPrimitive.Provider;\n\n/** Props for the {@link Tooltip} root component. */\nexport interface TooltipProps extends React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Root> {\n /**\n * Controlled open state. When provided, the component is in controlled mode\n * and you must also supply `onOpenChange` to update the value.\n */\n open?: boolean;\n /** Called when the open state changes. Required when `open` is controlled. */\n onOpenChange?: (open: boolean) => void;\n /** The open state of the tooltip when it is initially rendered (uncontrolled). */\n defaultOpen?: boolean;\n}\n\n/** Root component that manages open/close state for a single tooltip. */\nexport const Tooltip = TooltipPrimitive.Root;\n\n/** Props for the {@link TooltipTrigger} component. */\nexport type TooltipTriggerProps = React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Trigger>;\n\n/** The element that triggers the tooltip on hover/focus. */\nexport const TooltipTrigger = TooltipPrimitive.Trigger;\n\n/**\n * Visual style variant of the tooltip content.\n *\n * - `\"tooltip\"` — simple text bubble, no border.\n * - `\"infobox\"` — richer card with a visible border, structured header, body text, and optional actions.\n */\nexport type TooltipContentVariant = \"tooltip\" | \"infobox\";\n\n/** Action button configuration for the infobox variant of {@link TooltipContent}. */\nexport interface TooltipAction {\n /** Button label. */\n label: string;\n /** Click handler. */\n onClick?: () => void;\n /**\n * Optional custom React node to be rendered for the action instead of the default button.\n * Only used in the infobox variant.\n */\n element?: React.ReactNode;\n}\n\nexport interface TooltipContentProps\n extends React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content> {\n /**\n * Visual style variant.\n *\n * `\"tooltip\"` is a lightweight text bubble. `\"infobox\"` renders a structured card\n * with optional heading, icon, pill, body text, and action buttons.\n *\n * @default \"tooltip\"\n */\n variant?: TooltipContentVariant;\n /** Whether to show the directional arrow pointer. @default true */\n showArrow?: boolean;\n /**\n * Heading text rendered in subtitle style at the top of the infobox.\n * Infobox variant only.\n */\n heading?: React.ReactNode;\n /**\n * Icon element displayed to the left of the heading.\n * Infobox variant only.\n */\n icon?: React.ReactNode;\n /**\n * Pill or badge element displayed to the right of the heading.\n * Infobox variant only.\n */\n pill?: React.ReactNode;\n /**\n * Primary action button (brand green). Rendered below the body text.\n * Infobox variant only.\n */\n primaryAction?: TooltipAction;\n /**\n * Secondary action button (ghost). Rendered next to the primary action.\n * Infobox variant only.\n */\n secondaryAction?: TooltipAction;\n}\n\nconst ActionButton = ({\n action,\n variant,\n}: {\n action: TooltipAction;\n variant: \"brand\" | \"tertiary\";\n}) =>\n action.element ? (\n action.element\n ) : (\n <Button variant={variant} size=\"32\" onClick={action.onClick}>\n {action.label}\n </Button>\n );\n\nconst InfoboxContent = ({\n icon,\n heading,\n pill,\n children,\n primaryAction,\n secondaryAction,\n hasHeader,\n hasActions,\n}: {\n icon?: React.ReactNode;\n heading?: React.ReactNode;\n pill?: React.ReactNode;\n children?: React.ReactNode;\n primaryAction?: TooltipAction;\n secondaryAction?: TooltipAction;\n hasHeader: boolean;\n hasActions: boolean;\n}) => (\n <div className=\"flex flex-col gap-3\">\n {hasHeader && (\n <div className=\"flex items-center gap-3\">\n {icon && <div className=\"size-5 shrink-0\">{icon}</div>}\n {heading && (\n <p className=\"typography-semibold-body-lg min-w-0 flex-1 text-foreground-inverse\">\n {heading}\n </p>\n )}\n {pill && <div className=\"shrink-0\">{pill}</div>}\n </div>\n )}\n {children && (\n <div className=\"typography-regular-body-md text-foreground-inverse\">{children}</div>\n )}\n {hasActions && (\n <div className=\"flex items-center gap-1\">\n {primaryAction && <ActionButton action={primaryAction} variant=\"brand\" />}\n {secondaryAction && <ActionButton action={secondaryAction} variant=\"tertiary\" />}\n </div>\n )}\n </div>\n);\n\n/**\n * The popup content of the tooltip. Renders inside a portal.\n *\n * Arrow direction is controlled via the `side` and `align` props (Radix passthrough).\n *\n * @example\n * ```tsx\n * // Simple tooltip\n * <TooltipContent>Info text</TooltipContent>\n *\n * // Infobox with structured content\n * <TooltipContent\n * variant=\"infobox\"\n * heading=\"Title\"\n * icon={<InfoCircleIcon className=\"size-5\" />}\n * primaryAction={{ label: \"OK\", onClick: () => {} }}\n * secondaryAction={{ label: \"Dismiss\" }}\n * >\n * Info text\n * </TooltipContent>\n * ```\n */\nexport const TooltipContent = React.forwardRef<\n React.ComponentRef<typeof TooltipPrimitive.Content>,\n TooltipContentProps\n>(\n (\n {\n className,\n variant = \"tooltip\",\n showArrow = true,\n sideOffset = 8,\n heading,\n icon,\n pill,\n primaryAction,\n secondaryAction,\n children,\n side,\n style,\n ...props\n },\n ref,\n ) => {\n const isInfobox = variant === \"infobox\";\n const hasHeader =\n isInfobox && (icon !== undefined || heading !== undefined || pill !== undefined);\n const hasActions = isInfobox && (primaryAction !== undefined || secondaryAction !== undefined);\n\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n style={{ zIndex: \"var(--fanvue-ui-portal-z-index, 50)\", ...style }}\n className={cn(\n \"typography-regular-body-md max-w-[320px] overflow-hidden rounded-3xl bg-surface-pageinverse p-4 text-foreground-inverse shadow-[0px_2px_4px_0px_rgba(17,24,39,0.08)]\",\n isInfobox && \"border border-neutral-200\",\n className,\n )}\n align=\"center\"\n arrowPadding={12}\n side={side}\n {...props}\n >\n {isInfobox ? (\n <InfoboxContent\n icon={icon}\n heading={heading}\n pill={pill}\n primaryAction={primaryAction}\n secondaryAction={secondaryAction}\n hasHeader={hasHeader}\n hasActions={hasActions}\n >\n {children}\n </InfoboxContent>\n ) : (\n children\n )}\n {showArrow && (\n <TooltipPrimitive.Arrow\n className={\n \"-translate-y-px! fill-surface-pageinverse stroke-2 stroke-surface-pageinverse\"\n }\n width={12}\n height={6}\n />\n )}\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n );\n },\n);\nTooltipContent.displayName = \"TooltipContent\";\n"],"names":["TooltipPrimitive","jsx","Button","jsxs","React","cn"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AASO,MAAM,kBAAkBA,4BAAiB;AAgBzC,MAAM,UAAUA,4BAAiB;AAMjC,MAAM,iBAAiBA,4BAAiB;AA+D/C,MAAM,eAAe,CAAC;AAAA,EACpB;AAAA,EACA;AACF,MAIE,OAAO,UACL,OAAO,UAEPC,2BAAAA,IAACC,OAAAA,QAAA,EAAO,SAAkB,MAAK,MAAK,SAAS,OAAO,SACjD,iBAAO,OACV;AAGJ,MAAM,iBAAiB,CAAC;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAUEC,2BAAAA,KAAC,OAAA,EAAI,WAAU,uBACZ,UAAA;AAAA,EAAA,aACCA,2BAAAA,KAAC,OAAA,EAAI,WAAU,2BACZ,UAAA;AAAA,IAAA,QAAQF,2BAAAA,IAAC,OAAA,EAAI,WAAU,mBAAmB,UAAA,MAAK;AAAA,IAC/C,WACCA,2BAAAA,IAAC,KAAA,EAAE,WAAU,sEACV,UAAA,SACH;AAAA,IAED,QAAQA,2BAAAA,IAAC,OAAA,EAAI,WAAU,YAAY,UAAA,KAAA,CAAK;AAAA,EAAA,GAC3C;AAAA,EAED,YACCA,2BAAAA,IAAC,OAAA,EAAI,WAAU,sDAAsD,UAAS;AAAA,EAE/E,cACCE,2BAAAA,KAAC,OAAA,EAAI,WAAU,2BACZ,UAAA;AAAA,IAAA,iBAAiBF,2BAAAA,IAAC,cAAA,EAAa,QAAQ,eAAe,SAAQ,SAAQ;AAAA,IACtE,mBAAmBA,2BAAAA,IAAC,cAAA,EAAa,QAAQ,iBAAiB,SAAQ,WAAA,CAAW;AAAA,EAAA,EAAA,CAChF;AAAA,GAEJ;AAyBK,MAAM,iBAAiBG,iBAAM;AAAA,EAIlC,CACE;AAAA,IACE;AAAA,IACA,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EAAA,GAEL,QACG;AACH,UAAM,YAAY,YAAY;AAC9B,UAAM,YACJ,cAAc,SAAS,UAAa,YAAY,UAAa,SAAS;AACxE,UAAM,aAAa,cAAc,kBAAkB,UAAa,oBAAoB;AAEpF,WACEH,2BAAAA,IAACD,4BAAiB,QAAjB,EACC,UAAAG,2BAAAA;AAAAA,MAACH,4BAAiB;AAAA,MAAjB;AAAA,QACC;AAAA,QACA;AAAA,QACA,OAAO,EAAE,QAAQ,uCAAuC,GAAG,MAAA;AAAA,QAC3D,WAAWK,GAAAA;AAAAA,UACT;AAAA,UACA,aAAa;AAAA,UACb;AAAA,QAAA;AAAA,QAEF,OAAM;AAAA,QACN,cAAc;AAAA,QACd;AAAA,QACC,GAAG;AAAA,QAEH,UAAA;AAAA,UAAA,YACCJ,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cAEC;AAAA,YAAA;AAAA,UAAA,IAGH;AAAA,UAED,aACCA,2BAAAA;AAAAA,YAACD,4BAAiB;AAAA,YAAjB;AAAA,cACC,WACE;AAAA,cAEF,OAAO;AAAA,cACP,QAAQ;AAAA,YAAA;AAAA,UAAA;AAAA,QACV;AAAA,MAAA;AAAA,IAAA,GAGN;AAAA,EAEJ;AACF;AACA,eAAe,cAAc;;;;;"}
@@ -12,36 +12,123 @@ const Chip = require("./components/Chip/Chip.cjs");
12
12
  const Count = require("./components/Count/Count.cjs");
13
13
  const Divider = require("./components/Divider/Divider.cjs");
14
14
  const IconButton = require("./components/IconButton/IconButton.cjs");
15
+ const AddIcon = require("./components/Icons/AddIcon.cjs");
16
+ const AIIcon = require("./components/Icons/AIIcon.cjs");
17
+ const AlertIcon = require("./components/Icons/AlertIcon.cjs");
18
+ const ArrowDownIcon = require("./components/Icons/ArrowDownIcon.cjs");
19
+ const ArrowLeftIcon = require("./components/Icons/ArrowLeftIcon.cjs");
15
20
  const ArrowRightIcon = require("./components/Icons/ArrowRightIcon.cjs");
21
+ const ArrowUpIcon = require("./components/Icons/ArrowUpIcon.cjs");
16
22
  const ArrowUpRightIcon = require("./components/Icons/ArrowUpRightIcon.cjs");
23
+ const BankIcon = require("./components/Icons/BankIcon.cjs");
24
+ const BellIcon = require("./components/Icons/BellIcon.cjs");
25
+ const BellOffIcon = require("./components/Icons/BellOffIcon.cjs");
26
+ const BoltIcon = require("./components/Icons/BoltIcon.cjs");
27
+ const BulbIcon = require("./components/Icons/BulbIcon.cjs");
28
+ const Calendar2Icon = require("./components/Icons/Calendar2Icon.cjs");
29
+ const CalendarIcon = require("./components/Icons/CalendarIcon.cjs");
30
+ const CameraIcon = require("./components/Icons/CameraIcon.cjs");
31
+ const ChartIcon = require("./components/Icons/ChartIcon.cjs");
17
32
  const CheckCircleIcon = require("./components/Icons/CheckCircleIcon.cjs");
18
33
  const CheckIcon = require("./components/Icons/CheckIcon.cjs");
19
34
  const CheckOutlineIcon = require("./components/Icons/CheckOutlineIcon.cjs");
20
35
  const ChevronDownIcon = require("./components/Icons/ChevronDownIcon.cjs");
21
36
  const ChevronLeftIcon = require("./components/Icons/ChevronLeftIcon.cjs");
22
37
  const ChevronRightIcon = require("./components/Icons/ChevronRightIcon.cjs");
38
+ const ChevronUpIcon = require("./components/Icons/ChevronUpIcon.cjs");
39
+ const ClockIcon = require("./components/Icons/ClockIcon.cjs");
23
40
  const CloseIcon = require("./components/Icons/CloseIcon.cjs");
41
+ const CodeIcon = require("./components/Icons/CodeIcon.cjs");
42
+ const CoinIcon = require("./components/Icons/CoinIcon.cjs");
43
+ const CompassIcon = require("./components/Icons/CompassIcon.cjs");
44
+ const CopyIcon = require("./components/Icons/CopyIcon.cjs");
24
45
  const CrossIcon = require("./components/Icons/CrossIcon.cjs");
25
46
  const CrownIcon = require("./components/Icons/CrownIcon.cjs");
47
+ const DiamondIcon = require("./components/Icons/DiamondIcon.cjs");
48
+ const DiscountIcon = require("./components/Icons/DiscountIcon.cjs");
49
+ const DonateIcon = require("./components/Icons/DonateIcon.cjs");
50
+ const DoubleTickIcon = require("./components/Icons/DoubleTickIcon.cjs");
51
+ const DownloadIcon = require("./components/Icons/DownloadIcon.cjs");
52
+ const EditIcon = require("./components/Icons/EditIcon.cjs");
26
53
  const ErrorCircleIcon = require("./components/Icons/ErrorCircleIcon.cjs");
27
54
  const ErrorIcon = require("./components/Icons/ErrorIcon.cjs");
55
+ const ExpandIcon = require("./components/Icons/ExpandIcon.cjs");
28
56
  const EyeClosedIcon = require("./components/Icons/EyeClosedIcon.cjs");
29
57
  const EyeIcon = require("./components/Icons/EyeIcon.cjs");
30
- const FireIcon = require("./components/Icons/FireIcon.cjs");
58
+ const EyeSlashIcon = require("./components/Icons/EyeSlashIcon.cjs");
59
+ const FlagIcon = require("./components/Icons/FlagIcon.cjs");
60
+ const FlameIcon = require("./components/Icons/FlameIcon.cjs");
61
+ const FolderIcon = require("./components/Icons/FolderIcon.cjs");
62
+ const ForwardIcon = require("./components/Icons/ForwardIcon.cjs");
63
+ const GalleryIcon = require("./components/Icons/GalleryIcon.cjs");
64
+ const GenderIcon = require("./components/Icons/GenderIcon.cjs");
65
+ const GiftIcon = require("./components/Icons/GiftIcon.cjs");
66
+ const HelpIcon = require("./components/Icons/HelpIcon.cjs");
31
67
  const HomeIcon = require("./components/Icons/HomeIcon.cjs");
68
+ const HourglassIcon = require("./components/Icons/HourglassIcon.cjs");
69
+ const ImageIcon = require("./components/Icons/ImageIcon.cjs");
70
+ const InboxIcon = require("./components/Icons/InboxIcon.cjs");
32
71
  const InfoCircleIcon = require("./components/Icons/InfoCircleIcon.cjs");
33
72
  const InfoIcon = require("./components/Icons/InfoIcon.cjs");
73
+ const LinkIcon = require("./components/Icons/LinkIcon.cjs");
74
+ const LocationIcon = require("./components/Icons/LocationIcon.cjs");
75
+ const LockerOffIcon = require("./components/Icons/LockerOffIcon.cjs");
76
+ const LockerOnIcon = require("./components/Icons/LockerOnIcon.cjs");
77
+ const LogoutIcon = require("./components/Icons/LogoutIcon.cjs");
78
+ const LoveIcon = require("./components/Icons/LoveIcon.cjs");
79
+ const MegaphoneIcon = require("./components/Icons/MegaphoneIcon.cjs");
80
+ const MenuCloseIcon = require("./components/Icons/MenuCloseIcon.cjs");
81
+ const MenuIcon = require("./components/Icons/MenuIcon.cjs");
82
+ const MenuOpenIcon = require("./components/Icons/MenuOpenIcon.cjs");
83
+ const MessageIcon = require("./components/Icons/MessageIcon.cjs");
34
84
  const MicrophoneIcon = require("./components/Icons/MicrophoneIcon.cjs");
35
85
  const MinusIcon = require("./components/Icons/MinusIcon.cjs");
86
+ const MoonIcon = require("./components/Icons/MoonIcon.cjs");
87
+ const MoreIcon = require("./components/Icons/MoreIcon.cjs");
88
+ const MoreVerticalIcon = require("./components/Icons/MoreVerticalIcon.cjs");
89
+ const PauseIcon = require("./components/Icons/PauseIcon.cjs");
90
+ const PhoneIcon = require("./components/Icons/PhoneIcon.cjs");
91
+ const PhoneOffIcon = require("./components/Icons/PhoneOffIcon.cjs");
92
+ const PinIcon = require("./components/Icons/PinIcon.cjs");
93
+ const PlayIcon = require("./components/Icons/PlayIcon.cjs");
36
94
  const PlusIcon = require("./components/Icons/PlusIcon.cjs");
95
+ const PrivacyIcon = require("./components/Icons/PrivacyIcon.cjs");
96
+ const RepeatIcon = require("./components/Icons/RepeatIcon.cjs");
97
+ const Reply2Icon = require("./components/Icons/Reply2Icon.cjs");
98
+ const ReplyIcon = require("./components/Icons/ReplyIcon.cjs");
37
99
  const SearchIcon = require("./components/Icons/SearchIcon.cjs");
100
+ const SendIcon = require("./components/Icons/SendIcon.cjs");
101
+ const SettingsIcon = require("./components/Icons/SettingsIcon.cjs");
102
+ const ShareIcon = require("./components/Icons/ShareIcon.cjs");
38
103
  const SpinnerIcon = require("./components/Icons/SpinnerIcon.cjs");
104
+ const StarIcon = require("./components/Icons/StarIcon.cjs");
39
105
  const StopIcon = require("./components/Icons/StopIcon.cjs");
40
106
  const SuccessIcon = require("./components/Icons/SuccessIcon.cjs");
107
+ const SunIcon = require("./components/Icons/SunIcon.cjs");
108
+ const Support2Icon = require("./components/Icons/Support2Icon.cjs");
109
+ const SupportIcon = require("./components/Icons/SupportIcon.cjs");
110
+ const TagIcon = require("./components/Icons/TagIcon.cjs");
111
+ const TaskIcon = require("./components/Icons/TaskIcon.cjs");
112
+ const ThumbDownIcon = require("./components/Icons/ThumbDownIcon.cjs");
113
+ const ThumbUpIcon = require("./components/Icons/ThumbUpIcon.cjs");
114
+ const TickCircleIcon = require("./components/Icons/TickCircleIcon.cjs");
115
+ const TickCircleOffIcon = require("./components/Icons/TickCircleOffIcon.cjs");
116
+ const TickIcon = require("./components/Icons/TickIcon.cjs");
117
+ const TrashBinIcon = require("./components/Icons/TrashBinIcon.cjs");
118
+ const TrophyIcon = require("./components/Icons/TrophyIcon.cjs");
41
119
  const UploadCloudIcon = require("./components/Icons/UploadCloudIcon.cjs");
120
+ const UploadIcon = require("./components/Icons/UploadIcon.cjs");
121
+ const UserCircleIcon = require("./components/Icons/UserCircleIcon.cjs");
122
+ const UserIcon = require("./components/Icons/UserIcon.cjs");
123
+ const UsersIcon = require("./components/Icons/UsersIcon.cjs");
124
+ const VideoIcon = require("./components/Icons/VideoIcon.cjs");
42
125
  const VipBadgeIcon = require("./components/Icons/VipBadgeIcon.cjs");
126
+ const WalletIcon = require("./components/Icons/WalletIcon.cjs");
43
127
  const WarningIcon = require("./components/Icons/WarningIcon.cjs");
44
128
  const WarningTriangleIcon = require("./components/Icons/WarningTriangleIcon.cjs");
129
+ const WifiOffIcon = require("./components/Icons/WifiOffIcon.cjs");
130
+ const WifiOnIcon = require("./components/Icons/WifiOnIcon.cjs");
131
+ const WrenchIcon = require("./components/Icons/WrenchIcon.cjs");
45
132
  const Loader = require("./components/Loader/Loader.cjs");
46
133
  const Logo = require("./components/Logo/Logo.cjs");
47
134
  const Pagination = require("./components/Pagination/Pagination.cjs");
@@ -80,36 +167,123 @@ exports.Chip = Chip.Chip;
80
167
  exports.Count = Count.Count;
81
168
  exports.Divider = Divider.Divider;
82
169
  exports.IconButton = IconButton.IconButton;
170
+ exports.AddIcon = AddIcon.AddIcon;
171
+ exports.AIIcon = AIIcon.AIIcon;
172
+ exports.AlertIcon = AlertIcon.AlertIcon;
173
+ exports.ArrowDownIcon = ArrowDownIcon.ArrowDownIcon;
174
+ exports.ArrowLeftIcon = ArrowLeftIcon.ArrowLeftIcon;
83
175
  exports.ArrowRightIcon = ArrowRightIcon.ArrowRightIcon;
176
+ exports.ArrowUpIcon = ArrowUpIcon.ArrowUpIcon;
84
177
  exports.ArrowUpRightIcon = ArrowUpRightIcon.ArrowUpRightIcon;
178
+ exports.BankIcon = BankIcon.BankIcon;
179
+ exports.BellIcon = BellIcon.BellIcon;
180
+ exports.BellOffIcon = BellOffIcon.BellOffIcon;
181
+ exports.BoltIcon = BoltIcon.BoltIcon;
182
+ exports.BulbIcon = BulbIcon.BulbIcon;
183
+ exports.Calendar2Icon = Calendar2Icon.Calendar2Icon;
184
+ exports.CalendarIcon = CalendarIcon.CalendarIcon;
185
+ exports.CameraIcon = CameraIcon.CameraIcon;
186
+ exports.ChartIcon = ChartIcon.ChartIcon;
85
187
  exports.CheckCircleIcon = CheckCircleIcon.CheckCircleIcon;
86
188
  exports.CheckIcon = CheckIcon.CheckIcon;
87
189
  exports.CheckOutlineIcon = CheckOutlineIcon.CheckOutlineIcon;
88
190
  exports.ChevronDownIcon = ChevronDownIcon.ChevronDownIcon;
89
191
  exports.ChevronLeftIcon = ChevronLeftIcon.ChevronLeftIcon;
90
192
  exports.ChevronRightIcon = ChevronRightIcon.ChevronRightIcon;
193
+ exports.ChevronUpIcon = ChevronUpIcon.ChevronUpIcon;
194
+ exports.ClockIcon = ClockIcon.ClockIcon;
91
195
  exports.CloseIcon = CloseIcon.CloseIcon;
196
+ exports.CodeIcon = CodeIcon.CodeIcon;
197
+ exports.CoinIcon = CoinIcon.CoinIcon;
198
+ exports.CompassIcon = CompassIcon.CompassIcon;
199
+ exports.CopyIcon = CopyIcon.CopyIcon;
92
200
  exports.CrossIcon = CrossIcon.CrossIcon;
93
201
  exports.CrownIcon = CrownIcon.CrownIcon;
202
+ exports.DiamondIcon = DiamondIcon.DiamondIcon;
203
+ exports.DiscountIcon = DiscountIcon.DiscountIcon;
204
+ exports.DonateIcon = DonateIcon.DonateIcon;
205
+ exports.DoubleTickIcon = DoubleTickIcon.DoubleTickIcon;
206
+ exports.DownloadIcon = DownloadIcon.DownloadIcon;
207
+ exports.EditIcon = EditIcon.EditIcon;
94
208
  exports.ErrorCircleIcon = ErrorCircleIcon.ErrorCircleIcon;
95
209
  exports.ErrorIcon = ErrorIcon.ErrorIcon;
210
+ exports.ExpandIcon = ExpandIcon.ExpandIcon;
96
211
  exports.EyeClosedIcon = EyeClosedIcon.EyeClosedIcon;
97
212
  exports.EyeIcon = EyeIcon.EyeIcon;
98
- exports.FireIcon = FireIcon.FireIcon;
213
+ exports.EyeSlashIcon = EyeSlashIcon.EyeSlashIcon;
214
+ exports.FlagIcon = FlagIcon.FlagIcon;
215
+ exports.FlameIcon = FlameIcon.FlameIcon;
216
+ exports.FolderIcon = FolderIcon.FolderIcon;
217
+ exports.ForwardIcon = ForwardIcon.ForwardIcon;
218
+ exports.GalleryIcon = GalleryIcon.GalleryIcon;
219
+ exports.GenderIcon = GenderIcon.GenderIcon;
220
+ exports.GiftIcon = GiftIcon.GiftIcon;
221
+ exports.HelpIcon = HelpIcon.HelpIcon;
99
222
  exports.HomeIcon = HomeIcon.HomeIcon;
223
+ exports.HourglassIcon = HourglassIcon.HourglassIcon;
224
+ exports.ImageIcon = ImageIcon.ImageIcon;
225
+ exports.InboxIcon = InboxIcon.InboxIcon;
100
226
  exports.InfoCircleIcon = InfoCircleIcon.InfoCircleIcon;
101
227
  exports.InfoIcon = InfoIcon.InfoIcon;
228
+ exports.LinkIcon = LinkIcon.LinkIcon;
229
+ exports.LocationIcon = LocationIcon.LocationIcon;
230
+ exports.LockerOffIcon = LockerOffIcon.LockerOffIcon;
231
+ exports.LockerOnIcon = LockerOnIcon.LockerOnIcon;
232
+ exports.LogoutIcon = LogoutIcon.LogoutIcon;
233
+ exports.LoveIcon = LoveIcon.LoveIcon;
234
+ exports.MegaphoneIcon = MegaphoneIcon.MegaphoneIcon;
235
+ exports.MenuCloseIcon = MenuCloseIcon.MenuCloseIcon;
236
+ exports.MenuIcon = MenuIcon.MenuIcon;
237
+ exports.MenuOpenIcon = MenuOpenIcon.MenuOpenIcon;
238
+ exports.MessageIcon = MessageIcon.MessageIcon;
102
239
  exports.MicrophoneIcon = MicrophoneIcon.MicrophoneIcon;
103
240
  exports.MinusIcon = MinusIcon.MinusIcon;
241
+ exports.MoonIcon = MoonIcon.MoonIcon;
242
+ exports.MoreIcon = MoreIcon.MoreIcon;
243
+ exports.MoreVerticalIcon = MoreVerticalIcon.MoreVerticalIcon;
244
+ exports.PauseIcon = PauseIcon.PauseIcon;
245
+ exports.PhoneIcon = PhoneIcon.PhoneIcon;
246
+ exports.PhoneOffIcon = PhoneOffIcon.PhoneOffIcon;
247
+ exports.PinIcon = PinIcon.PinIcon;
248
+ exports.PlayIcon = PlayIcon.PlayIcon;
104
249
  exports.PlusIcon = PlusIcon.PlusIcon;
250
+ exports.PrivacyIcon = PrivacyIcon.PrivacyIcon;
251
+ exports.RepeatIcon = RepeatIcon.RepeatIcon;
252
+ exports.Reply2Icon = Reply2Icon.Reply2Icon;
253
+ exports.ReplyIcon = ReplyIcon.ReplyIcon;
105
254
  exports.SearchIcon = SearchIcon.SearchIcon;
255
+ exports.SendIcon = SendIcon.SendIcon;
256
+ exports.SettingsIcon = SettingsIcon.SettingsIcon;
257
+ exports.ShareIcon = ShareIcon.ShareIcon;
106
258
  exports.SpinnerIcon = SpinnerIcon.SpinnerIcon;
259
+ exports.StarIcon = StarIcon.StarIcon;
107
260
  exports.StopIcon = StopIcon.StopIcon;
108
261
  exports.SuccessIcon = SuccessIcon.SuccessIcon;
262
+ exports.SunIcon = SunIcon.SunIcon;
263
+ exports.Support2Icon = Support2Icon.Support2Icon;
264
+ exports.SupportIcon = SupportIcon.SupportIcon;
265
+ exports.TagIcon = TagIcon.TagIcon;
266
+ exports.TaskIcon = TaskIcon.TaskIcon;
267
+ exports.ThumbDownIcon = ThumbDownIcon.ThumbDownIcon;
268
+ exports.ThumbUpIcon = ThumbUpIcon.ThumbUpIcon;
269
+ exports.TickCircleIcon = TickCircleIcon.TickCircleIcon;
270
+ exports.TickCircleOffIcon = TickCircleOffIcon.TickCircleOffIcon;
271
+ exports.TickIcon = TickIcon.TickIcon;
272
+ exports.TrashBinIcon = TrashBinIcon.TrashBinIcon;
273
+ exports.TrophyIcon = TrophyIcon.TrophyIcon;
109
274
  exports.UploadCloudIcon = UploadCloudIcon.UploadCloudIcon;
275
+ exports.UploadIcon = UploadIcon.UploadIcon;
276
+ exports.UserCircleIcon = UserCircleIcon.UserCircleIcon;
277
+ exports.UserIcon = UserIcon.UserIcon;
278
+ exports.UsersIcon = UsersIcon.UsersIcon;
279
+ exports.VideoIcon = VideoIcon.VideoIcon;
110
280
  exports.VipBadgeIcon = VipBadgeIcon.VipBadgeIcon;
281
+ exports.WalletIcon = WalletIcon.WalletIcon;
111
282
  exports.WarningIcon = WarningIcon.WarningIcon;
112
283
  exports.WarningTriangleIcon = WarningTriangleIcon.WarningTriangleIcon;
284
+ exports.WifiOffIcon = WifiOffIcon.WifiOffIcon;
285
+ exports.WifiOnIcon = WifiOnIcon.WifiOnIcon;
286
+ exports.WrenchIcon = WrenchIcon.WrenchIcon;
113
287
  exports.Loader = Loader.Loader;
114
288
  exports.Logo = Logo.Logo;
115
289
  exports.Pagination = Pagination.Pagination;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -15,10 +15,10 @@ const DEFAULT_ICONS = {
15
15
  error: /* @__PURE__ */ jsx(ErrorCircleIcon, {})
16
16
  };
17
17
  const CLOSE_BUTTON_CLASSES = {
18
- info: "hover:bg-info-500/10 active:bg-info-500/10 text-info-500 motion-safe:transition-colors motion-safe:duration-150",
19
- success: "hover:bg-success-500/10 active:bg-success-500/10 text-success-500 motion-safe:transition-colors motion-safe:duration-150",
20
- warning: "hover:bg-warning-500/10 active:bg-warning-500/10 text-warning-500 motion-safe:transition-colors motion-safe:duration-150",
21
- error: "hover:bg-error-500/10 active:bg-error-500/10 text-error-500 motion-safe:transition-colors motion-safe:duration-150"
18
+ info: "hover:bg-info-default active:bg-info-default text-info-default motion-safe:transition-colors motion-safe:duration-150",
19
+ success: "hover:bg-success-default active:bg-success-default text-success-default motion-safe:transition-colors motion-safe:duration-150",
20
+ warning: "hover:bg-warning-default active:bg-warning-default text-warning-default motion-safe:transition-colors motion-safe:duration-150",
21
+ error: "hover:bg-error-default active:bg-error-default text-error-default motion-safe:transition-colors motion-safe:duration-150"
22
22
  };
23
23
  const Alert = React.forwardRef(
24
24
  ({
@@ -46,18 +46,18 @@ const Alert = React.forwardRef(
46
46
  !resolvedIcon && closable && "grid-cols-[1fr_auto]",
47
47
  !resolvedIcon && !closable && "grid-cols-[1fr]",
48
48
  title && children ? "items-start" : "items-center",
49
- variant === "info" && "bg-info-50 text-info-500",
50
- variant === "success" && "bg-success-50 text-success-500",
51
- variant === "warning" && "bg-warning-50 text-warning-500",
52
- variant === "error" && "bg-error-50 text-error-500",
49
+ variant === "info" && "bg-info-background text-info-default",
50
+ variant === "success" && "bg-success-background text-success-default",
51
+ variant === "warning" && "bg-warning-background text-warning-default",
52
+ variant === "error" && "bg-error-background text-error-default",
53
53
  className
54
54
  ),
55
55
  ...props,
56
56
  children: [
57
57
  resolvedIcon && /* @__PURE__ */ jsx("span", { className: "flex shrink-0 items-start", "aria-hidden": "true", children: resolvedIcon }),
58
58
  /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-col gap-2", children: [
59
- title && /* @__PURE__ */ jsx("div", { className: "typography-body-2-semibold text-body-100", children: title }),
60
- /* @__PURE__ */ jsx("div", { className: "typography-body-2-regular text-body-200", children })
59
+ title && /* @__PURE__ */ jsx("div", { className: "typography-semibold-body-md text-foreground-default", children: title }),
60
+ /* @__PURE__ */ jsx("div", { className: "typography-regular-body-md text-foreground-secondary", children })
61
61
  ] }),
62
62
  closable && /* @__PURE__ */ jsx(
63
63
  Button,
@@ -1 +1 @@
1
- {"version":3,"file":"Alert.mjs","sources":["../../../src/components/Alert/Alert.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Button } from \"../Button/Button\";\nimport { CheckCircleIcon } from \"../Icons/CheckCircleIcon\";\nimport { CrossIcon } from \"../Icons/CrossIcon\";\nimport { ErrorCircleIcon } from \"../Icons/ErrorCircleIcon\";\nimport { InfoCircleIcon } from \"../Icons/InfoCircleIcon\";\nimport { WarningTriangleIcon } from \"../Icons/WarningTriangleIcon\";\n\n/** Visual style variant of the alert. */\nexport type AlertVariant = \"info\" | \"success\" | \"warning\" | \"error\";\n\nconst DEFAULT_ICONS: Record<AlertVariant, React.ReactNode> = {\n info: <InfoCircleIcon />,\n success: <CheckCircleIcon />,\n warning: <WarningTriangleIcon />,\n error: <ErrorCircleIcon />,\n};\n\nexport interface AlertProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Visual style variant of the alert. @default \"info\" */\n variant?: AlertVariant;\n /** Optional title text displayed in bold above the description. */\n title?: string;\n /** Custom icon override. Pass `null` to hide the icon entirely. Each variant shows a default icon when left `undefined`. */\n icon?: React.ReactNode | null;\n /** Whether to show the close button. @default false */\n closable?: boolean;\n /** Callback fired when the close button is clicked. */\n onClose?: () => void;\n /** Accessible label for the close button. @default \"Close alert\" */\n closeLabel?: string;\n}\n\nconst CLOSE_BUTTON_CLASSES: Record<AlertVariant, string> = {\n info: \"hover:bg-info-500/10 active:bg-info-500/10 text-info-500 motion-safe:transition-colors motion-safe:duration-150\",\n success:\n \"hover:bg-success-500/10 active:bg-success-500/10 text-success-500 motion-safe:transition-colors motion-safe:duration-150\",\n warning:\n \"hover:bg-warning-500/10 active:bg-warning-500/10 text-warning-500 motion-safe:transition-colors motion-safe:duration-150\",\n error:\n \"hover:bg-error-500/10 active:bg-error-500/10 text-error-500 motion-safe:transition-colors motion-safe:duration-150\",\n};\n\n/**\n * Displays a contextual feedback message to the user.\n *\n * Supports `info`, `success`, `warning`, and `error` variants with a default\n * icon per variant, optional title, description, and dismiss button.\n *\n * Each variant renders a default icon automatically. Pass a custom `icon` to\n * override, or `icon={null}` to hide the icon entirely.\n *\n * @example\n * ```tsx\n * <Alert variant=\"success\" title=\"Saved\" closable onClose={handleClose}>\n * Your changes have been saved.\n * </Alert>\n * ```\n */\nexport const Alert = React.forwardRef<HTMLDivElement, AlertProps>(\n (\n {\n className,\n variant = \"info\",\n title,\n icon,\n closable = false,\n onClose,\n closeLabel = \"Close alert\",\n children,\n ...props\n },\n ref,\n ) => {\n const resolvedIcon = icon === null ? null : (icon ?? DEFAULT_ICONS[variant]);\n\n return (\n <div\n ref={ref}\n role=\"alert\"\n data-testid=\"alert\"\n className={cn(\n \"grid gap-x-3 rounded-lg p-4 text-sm leading-[18px]\",\n resolvedIcon && closable && \"grid-cols-[auto_1fr_auto]\",\n resolvedIcon && !closable && \"grid-cols-[auto_1fr]\",\n !resolvedIcon && closable && \"grid-cols-[1fr_auto]\",\n !resolvedIcon && !closable && \"grid-cols-[1fr]\",\n title && children ? \"items-start\" : \"items-center\",\n variant === \"info\" && \"bg-info-50 text-info-500\",\n variant === \"success\" && \"bg-success-50 text-success-500\",\n variant === \"warning\" && \"bg-warning-50 text-warning-500\",\n variant === \"error\" && \"bg-error-50 text-error-500\",\n className,\n )}\n {...props}\n >\n {resolvedIcon && (\n <span className=\"flex shrink-0 items-start\" aria-hidden=\"true\">\n {resolvedIcon}\n </span>\n )}\n\n <div className=\"flex min-w-0 flex-col gap-2\">\n {title && <div className=\"typography-body-2-semibold text-body-100\">{title}</div>}\n <div className=\"typography-body-2-regular text-body-200\">{children}</div>\n </div>\n\n {closable && (\n <Button\n variant=\"tertiary\"\n size=\"24\"\n onClick={onClose}\n className={cn(\"self-start px-0\", CLOSE_BUTTON_CLASSES[variant])}\n aria-label={closeLabel}\n >\n <CrossIcon />\n </Button>\n )}\n </div>\n );\n },\n);\n\nAlert.displayName = \"Alert\";\n"],"names":[],"mappings":";;;;;;;;;;AAYA,MAAM,gBAAuD;AAAA,EAC3D,0BAAO,gBAAA,EAAe;AAAA,EACtB,6BAAU,iBAAA,EAAgB;AAAA,EAC1B,6BAAU,qBAAA,EAAoB;AAAA,EAC9B,2BAAQ,iBAAA,CAAA,CAAgB;AAC1B;AAiBA,MAAM,uBAAqD;AAAA,EACzD,MAAM;AAAA,EACN,SACE;AAAA,EACF,SACE;AAAA,EACF,OACE;AACJ;AAkBO,MAAM,QAAQ,MAAM;AAAA,EACzB,CACE;AAAA,IACE;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA,aAAa;AAAA,IACb;AAAA,IACA,GAAG;AAAA,EAAA,GAEL,QACG;AACH,UAAM,eAAe,SAAS,OAAO,OAAQ,QAAQ,cAAc,OAAO;AAE1E,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,eAAY;AAAA,QACZ,WAAW;AAAA,UACT;AAAA,UACA,gBAAgB,YAAY;AAAA,UAC5B,gBAAgB,CAAC,YAAY;AAAA,UAC7B,CAAC,gBAAgB,YAAY;AAAA,UAC7B,CAAC,gBAAgB,CAAC,YAAY;AAAA,UAC9B,SAAS,WAAW,gBAAgB;AAAA,UACpC,YAAY,UAAU;AAAA,UACtB,YAAY,aAAa;AAAA,UACzB,YAAY,aAAa;AAAA,UACzB,YAAY,WAAW;AAAA,UACvB;AAAA,QAAA;AAAA,QAED,GAAG;AAAA,QAEH,UAAA;AAAA,UAAA,oCACE,QAAA,EAAK,WAAU,6BAA4B,eAAY,QACrD,UAAA,cACH;AAAA,UAGF,qBAAC,OAAA,EAAI,WAAU,+BACZ,UAAA;AAAA,YAAA,SAAS,oBAAC,OAAA,EAAI,WAAU,4CAA4C,UAAA,OAAM;AAAA,YAC3E,oBAAC,OAAA,EAAI,WAAU,2CAA2C,SAAA,CAAS;AAAA,UAAA,GACrE;AAAA,UAEC,YACC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,SAAS;AAAA,cACT,WAAW,GAAG,mBAAmB,qBAAqB,OAAO,CAAC;AAAA,cAC9D,cAAY;AAAA,cAEZ,8BAAC,WAAA,CAAA,CAAU;AAAA,YAAA;AAAA,UAAA;AAAA,QACb;AAAA,MAAA;AAAA,IAAA;AAAA,EAIR;AACF;AAEA,MAAM,cAAc;"}
1
+ {"version":3,"file":"Alert.mjs","sources":["../../../src/components/Alert/Alert.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Button } from \"../Button/Button\";\nimport { CheckCircleIcon } from \"../Icons/CheckCircleIcon\";\nimport { CrossIcon } from \"../Icons/CrossIcon\";\nimport { ErrorCircleIcon } from \"../Icons/ErrorCircleIcon\";\nimport { InfoCircleIcon } from \"../Icons/InfoCircleIcon\";\nimport { WarningTriangleIcon } from \"../Icons/WarningTriangleIcon\";\n\n/** Visual style variant of the alert. */\nexport type AlertVariant = \"info\" | \"success\" | \"warning\" | \"error\";\n\nconst DEFAULT_ICONS: Record<AlertVariant, React.ReactNode> = {\n info: <InfoCircleIcon />,\n success: <CheckCircleIcon />,\n warning: <WarningTriangleIcon />,\n error: <ErrorCircleIcon />,\n};\n\nexport interface AlertProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Visual style variant of the alert. @default \"info\" */\n variant?: AlertVariant;\n /** Optional title text displayed in bold above the description. */\n title?: string;\n /** Custom icon override. Pass `null` to hide the icon entirely. Each variant shows a default icon when left `undefined`. */\n icon?: React.ReactNode | null;\n /** Whether to show the close button. @default false */\n closable?: boolean;\n /** Callback fired when the close button is clicked. */\n onClose?: () => void;\n /** Accessible label for the close button. @default \"Close alert\" */\n closeLabel?: string;\n}\n\nconst CLOSE_BUTTON_CLASSES: Record<AlertVariant, string> = {\n info: \"hover:bg-info-default active:bg-info-default text-info-default motion-safe:transition-colors motion-safe:duration-150\",\n success:\n \"hover:bg-success-default active:bg-success-default text-success-default motion-safe:transition-colors motion-safe:duration-150\",\n warning:\n \"hover:bg-warning-default active:bg-warning-default text-warning-default motion-safe:transition-colors motion-safe:duration-150\",\n error:\n \"hover:bg-error-default active:bg-error-default text-error-default motion-safe:transition-colors motion-safe:duration-150\",\n};\n\n/**\n * Displays a contextual feedback message to the user.\n *\n * Supports `info`, `success`, `warning`, and `error` variants with a default\n * icon per variant, optional title, description, and dismiss button.\n *\n * Each variant renders a default icon automatically. Pass a custom `icon` to\n * override, or `icon={null}` to hide the icon entirely.\n *\n * @example\n * ```tsx\n * <Alert variant=\"success\" title=\"Saved\" closable onClose={handleClose}>\n * Your changes have been saved.\n * </Alert>\n * ```\n */\nexport const Alert = React.forwardRef<HTMLDivElement, AlertProps>(\n (\n {\n className,\n variant = \"info\",\n title,\n icon,\n closable = false,\n onClose,\n closeLabel = \"Close alert\",\n children,\n ...props\n },\n ref,\n ) => {\n const resolvedIcon = icon === null ? null : (icon ?? DEFAULT_ICONS[variant]);\n\n return (\n <div\n ref={ref}\n role=\"alert\"\n data-testid=\"alert\"\n className={cn(\n \"grid gap-x-3 rounded-lg p-4 text-sm leading-[18px]\",\n resolvedIcon && closable && \"grid-cols-[auto_1fr_auto]\",\n resolvedIcon && !closable && \"grid-cols-[auto_1fr]\",\n !resolvedIcon && closable && \"grid-cols-[1fr_auto]\",\n !resolvedIcon && !closable && \"grid-cols-[1fr]\",\n title && children ? \"items-start\" : \"items-center\",\n variant === \"info\" && \"bg-info-background text-info-default\",\n variant === \"success\" && \"bg-success-background text-success-default\",\n variant === \"warning\" && \"bg-warning-background text-warning-default\",\n variant === \"error\" && \"bg-error-background text-error-default\",\n className,\n )}\n {...props}\n >\n {resolvedIcon && (\n <span className=\"flex shrink-0 items-start\" aria-hidden=\"true\">\n {resolvedIcon}\n </span>\n )}\n\n <div className=\"flex min-w-0 flex-col gap-2\">\n {title && (\n <div className=\"typography-semibold-body-md text-foreground-default\">{title}</div>\n )}\n <div className=\"typography-regular-body-md text-foreground-secondary\">{children}</div>\n </div>\n\n {closable && (\n <Button\n variant=\"tertiary\"\n size=\"24\"\n onClick={onClose}\n className={cn(\"self-start px-0\", CLOSE_BUTTON_CLASSES[variant])}\n aria-label={closeLabel}\n >\n <CrossIcon />\n </Button>\n )}\n </div>\n );\n },\n);\n\nAlert.displayName = \"Alert\";\n"],"names":[],"mappings":";;;;;;;;;;AAYA,MAAM,gBAAuD;AAAA,EAC3D,0BAAO,gBAAA,EAAe;AAAA,EACtB,6BAAU,iBAAA,EAAgB;AAAA,EAC1B,6BAAU,qBAAA,EAAoB;AAAA,EAC9B,2BAAQ,iBAAA,CAAA,CAAgB;AAC1B;AAiBA,MAAM,uBAAqD;AAAA,EACzD,MAAM;AAAA,EACN,SACE;AAAA,EACF,SACE;AAAA,EACF,OACE;AACJ;AAkBO,MAAM,QAAQ,MAAM;AAAA,EACzB,CACE;AAAA,IACE;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA,aAAa;AAAA,IACb;AAAA,IACA,GAAG;AAAA,EAAA,GAEL,QACG;AACH,UAAM,eAAe,SAAS,OAAO,OAAQ,QAAQ,cAAc,OAAO;AAE1E,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,eAAY;AAAA,QACZ,WAAW;AAAA,UACT;AAAA,UACA,gBAAgB,YAAY;AAAA,UAC5B,gBAAgB,CAAC,YAAY;AAAA,UAC7B,CAAC,gBAAgB,YAAY;AAAA,UAC7B,CAAC,gBAAgB,CAAC,YAAY;AAAA,UAC9B,SAAS,WAAW,gBAAgB;AAAA,UACpC,YAAY,UAAU;AAAA,UACtB,YAAY,aAAa;AAAA,UACzB,YAAY,aAAa;AAAA,UACzB,YAAY,WAAW;AAAA,UACvB;AAAA,QAAA;AAAA,QAED,GAAG;AAAA,QAEH,UAAA;AAAA,UAAA,oCACE,QAAA,EAAK,WAAU,6BAA4B,eAAY,QACrD,UAAA,cACH;AAAA,UAGF,qBAAC,OAAA,EAAI,WAAU,+BACZ,UAAA;AAAA,YAAA,SACC,oBAAC,OAAA,EAAI,WAAU,uDAAuD,UAAA,OAAM;AAAA,YAE9E,oBAAC,OAAA,EAAI,WAAU,wDAAwD,SAAA,CAAS;AAAA,UAAA,GAClF;AAAA,UAEC,YACC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,SAAS;AAAA,cACT,WAAW,GAAG,mBAAmB,qBAAqB,OAAO,CAAC;AAAA,cAC9D,cAAY;AAAA,cAEZ,8BAAC,WAAA,CAAA,CAAU;AAAA,YAAA;AAAA,UAAA;AAAA,QACb;AAAA,MAAA;AAAA,IAAA;AAAA,EAIR;AACF;AAEA,MAAM,cAAc;"}
@@ -153,7 +153,7 @@ const AudioUpload = React.forwardRef(
153
153
  {
154
154
  className: "flex size-[72px] items-center justify-center rounded-full bg-neutral-400",
155
155
  "aria-hidden": "true",
156
- children: /* @__PURE__ */ jsx(MicrophoneIcon, { className: "size-5 text-body-300" })
156
+ children: /* @__PURE__ */ jsx(MicrophoneIcon, { className: "size-5 text-foreground-inverse" })
157
157
  }
158
158
  ),
159
159
  /* @__PURE__ */ jsxs(
@@ -161,7 +161,7 @@ const AudioUpload = React.forwardRef(
161
161
  {
162
162
  role: "timer",
163
163
  "aria-label": "Recording time",
164
- className: "typography-body-1-regular text-body-100",
164
+ className: "typography-regular-body-lg text-foreground-default",
165
165
  children: [
166
166
  formattedElapsed,
167
167
  " / ",
@@ -184,7 +184,7 @@ const AudioUpload = React.forwardRef(
184
184
  ref: stopButtonRef,
185
185
  type: "button",
186
186
  onClick: handleStopClick,
187
- className: "mt-1 flex size-11 items-center justify-center rounded-full bg-error-500 text-body-white-solid-constant transition-colors hover:bg-error-500/80 focus:shadow-focus-ring focus-visible:outline-none",
187
+ className: "mt-1 flex size-11 items-center justify-center rounded-full bg-error-default text-foreground-onaccentinverse transition-colors hover:bg-error-default/80 focus:shadow-focus-ring focus-visible:outline-none",
188
188
  "aria-label": stopButtonAriaLabel,
189
189
  children: /* @__PURE__ */ jsx(StopIcon, { className: "size-5" })
190
190
  }
@@ -210,7 +210,7 @@ const AudioUpload = React.forwardRef(
210
210
  onDragLeave: handleDragLeave,
211
211
  className: cn(
212
212
  "flex flex-col items-center justify-center gap-2 rounded-xl bg-neutral-100 px-4 py-3 transition-colors",
213
- isDragActive && "bg-brand-green-50 ring-2 ring-brand-green-500",
213
+ isDragActive && "bg-brand-accent-muted ring-2 ring-brand-accent-default",
214
214
  disabled && "pointer-events-none opacity-50",
215
215
  className
216
216
  ),
@@ -235,14 +235,21 @@ const AudioUpload = React.forwardRef(
235
235
  htmlFor: inputId,
236
236
  className: "flex cursor-pointer flex-col items-center gap-2 rounded-lg px-2 py-1 peer-focus-visible:shadow-focus-ring",
237
237
  children: [
238
- /* @__PURE__ */ jsx(UploadCloudIcon, { className: "size-5 text-body-100" }),
239
- /* @__PURE__ */ jsx("span", { className: "typography-body-1-semibold text-center text-body-100", children: uploadTitle }),
240
- /* @__PURE__ */ jsx("span", { id: descriptionId, className: "typography-body-2-regular text-center text-body-100", children: uploadDescription })
238
+ /* @__PURE__ */ jsx(UploadCloudIcon, { className: "size-5 text-foreground-default" }),
239
+ /* @__PURE__ */ jsx("span", { className: "typography-semibold-body-lg text-center text-foreground-default", children: uploadTitle }),
240
+ /* @__PURE__ */ jsx(
241
+ "span",
242
+ {
243
+ id: descriptionId,
244
+ className: "typography-regular-body-md text-center text-foreground-default",
245
+ children: uploadDescription
246
+ }
247
+ )
241
248
  ]
242
249
  }
243
250
  ),
244
251
  allowRecording && isRecordingSupported && /* @__PURE__ */ jsxs(Fragment, { children: [
245
- /* @__PURE__ */ jsx("p", { className: "typography-body-2-regular text-center text-body-100", children: separatorText }),
252
+ /* @__PURE__ */ jsx("p", { className: "typography-regular-body-md text-center text-foreground-default", children: separatorText }),
246
253
  /* @__PURE__ */ jsx(
247
254
  Button,
248
255
  {
@@ -1 +1 @@
1
- {"version":3,"file":"AudioUpload.mjs","sources":["../../../src/components/AudioUpload/AudioUpload.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport { Button } from \"../Button/Button\";\nimport { MicrophoneIcon } from \"../Icons/MicrophoneIcon\";\nimport { StopIcon } from \"../Icons/StopIcon\";\nimport { UploadCloudIcon } from \"../Icons/UploadCloudIcon\";\nimport { AudioWaveform } from \"./AudioWaveform\";\nimport { type AudioValidationError, formatAudioTime, validateAudioFile } from \"./audioUtils\";\nimport {\n DEFAULT_ACCEPTED_TYPES,\n DEFAULT_MAX_FILE_SIZE,\n DEFAULT_MAX_RECORDING_DURATION,\n DEFAULT_MIN_RECORDING_DURATION,\n} from \"./constants\";\nimport { useAudioRecorder } from \"./useAudioRecorder\";\n\n/** A file that was rejected during drop or browse, along with the reasons. */\nexport interface AudioFileRejection {\n /** The rejected file. */\n file: File;\n /** One or more validation errors explaining why the file was rejected. */\n errors: AudioValidationError[];\n}\n\nexport interface AudioUploadProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onDrop\"> {\n /** Maximum file size in bytes. @default 10_485_760 (10MB) */\n maxFileSize?: number;\n /** Accepted audio MIME types. @default DEFAULT_ACCEPTED_TYPES */\n accept?: readonly string[];\n /** Maximum number of files per drop. @default 1 */\n maxFiles?: number;\n /** Whether to show the record audio button. @default true */\n allowRecording?: boolean;\n /** Maximum recording duration in seconds. @default 30 */\n maxRecordingDuration?: number;\n /** Minimum recording duration in seconds. @default 5 */\n minRecordingDuration?: number;\n\n /** Called when valid files are accepted via drop or browse */\n onFilesAccepted?: (files: File[]) => void;\n /** Called when files are rejected (wrong type, too large, etc.) */\n onFilesRejected?: (rejections: AudioFileRejection[]) => void;\n /** Called when a recording completes and meets minimum duration */\n onRecordingComplete?: (blob: Blob, durationMs: number) => void;\n /** Called when recording is stopped but does not meet minimum duration */\n onRecordingTooShort?: (durationMs: number, minDurationMs: number) => void;\n /** Called when microphone permission is denied or unavailable */\n onPermissionError?: (error: Error) => void;\n /** Called when an unexpected recording error occurs */\n onRecordingError?: (error: Error) => void;\n\n /** Upload area title text. @default \"Click to upload, or drag & drop\" */\n uploadTitle?: string;\n /** Upload area description text. @default \"Audio files only, up to 10MB each\" */\n uploadDescription?: string;\n /** Separator text between upload and record. @default \"or\" */\n separatorText?: string;\n /** Record button label. @default \"Record audio\" */\n recordButtonLabel?: string;\n /** Stop recording button aria-label. @default \"Stop recording\" */\n stopButtonAriaLabel?: string;\n\n /** Whether the component is disabled. @default false */\n disabled?: boolean;\n}\n\nfunction partitionFiles(\n files: File[],\n maxFileSize: number,\n accept: readonly string[],\n maxFiles: number,\n): { accepted: File[]; rejected: AudioFileRejection[] } {\n const accepted: File[] = [];\n const rejected: AudioFileRejection[] = [];\n\n for (const file of files) {\n const errors = validateAudioFile(file, { maxFileSize, acceptedTypes: accept });\n if (errors.length > 0) {\n rejected.push({ file, errors });\n } else {\n accepted.push(file);\n }\n }\n\n if (maxFiles > 0 && accepted.length > maxFiles) {\n const excess = accepted.splice(maxFiles);\n for (const file of excess) {\n rejected.push({\n file,\n errors: [{ code: \"too-many-files\", message: `Too many files. Maximum is ${maxFiles}` }],\n });\n }\n }\n\n return { accepted, rejected };\n}\n\n/**\n * Audio file upload with drag-and-drop and optional in-browser recording.\n * Supports file validation, multiple files, and real-time waveform visualization during recording.\n *\n * @example\n * ```tsx\n * <AudioUpload\n * onFilesAccepted={(files) => console.log(files)}\n * onRecordingComplete={(blob, duration) => console.log(blob, duration)}\n * />\n * ```\n */\nexport const AudioUpload = React.forwardRef<HTMLDivElement, AudioUploadProps>(\n (\n {\n className,\n maxFileSize = DEFAULT_MAX_FILE_SIZE,\n accept = DEFAULT_ACCEPTED_TYPES,\n maxFiles = 1,\n allowRecording = true,\n maxRecordingDuration = DEFAULT_MAX_RECORDING_DURATION,\n minRecordingDuration = DEFAULT_MIN_RECORDING_DURATION,\n onFilesAccepted,\n onFilesRejected,\n onRecordingComplete,\n onRecordingTooShort,\n onPermissionError,\n onRecordingError,\n uploadTitle = \"Click to upload, or drag & drop\",\n uploadDescription = \"Audio files only, up to 10MB each\",\n separatorText = \"or\",\n recordButtonLabel = \"Record audio\",\n stopButtonAriaLabel = \"Stop recording\",\n disabled = false,\n ...props\n },\n ref,\n ) => {\n const inputId = React.useId();\n const descriptionId = React.useId();\n const [isDragActive, setIsDragActive] = React.useState(false);\n const stopButtonRef = React.useRef<HTMLButtonElement>(null);\n\n const {\n isRecording,\n elapsedMs,\n startRecording,\n stopRecording,\n analyserNode,\n isSupported: isRecordingSupported,\n } = useAudioRecorder({\n maxDuration: maxRecordingDuration,\n minDuration: minRecordingDuration,\n onComplete: onRecordingComplete,\n onTooShort: onRecordingTooShort,\n onPermissionError,\n onError: onRecordingError,\n });\n\n const acceptString = accept.join(\",\");\n\n // Move focus to stop button when recording starts\n React.useEffect(() => {\n if (isRecording) {\n stopButtonRef.current?.focus();\n }\n }, [isRecording]);\n\n const validateAndAcceptFiles = React.useCallback(\n (files: FileList | File[]) => {\n const { accepted, rejected } = partitionFiles(\n Array.from(files),\n maxFileSize,\n accept,\n maxFiles,\n );\n if (accepted.length > 0) onFilesAccepted?.(accepted);\n if (rejected.length > 0) onFilesRejected?.(rejected);\n },\n [maxFileSize, accept, maxFiles, onFilesAccepted, onFilesRejected],\n );\n\n const handleDrop = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragActive(false);\n\n if (disabled) return;\n\n const { files } = e.dataTransfer;\n if (files.length > 0) {\n validateAndAcceptFiles(files);\n }\n };\n\n const handleDragOver = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n if (!disabled) {\n setIsDragActive(true);\n }\n };\n\n const handleDragLeave = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragActive(false);\n };\n\n const handleFileInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const { files } = e.target;\n if (files && files.length > 0) {\n validateAndAcceptFiles(files);\n }\n // Reset input so same file can be selected again\n e.target.value = \"\";\n };\n\n const handleRecordClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n startRecording();\n };\n\n const handleStopClick = () => {\n stopRecording();\n };\n\n if (isRecording) {\n const formattedElapsed = formatAudioTime(elapsedMs);\n\n return (\n // biome-ignore lint/a11y/useSemanticElements: <fieldset> would break the public HTMLDivElement ref/props API\n <div\n ref={ref}\n role=\"group\"\n aria-label=\"Audio recording in progress\"\n data-testid=\"audio-upload\"\n data-state=\"recording\"\n className={cn(\n \"flex flex-col items-center justify-center gap-2 rounded-xl bg-neutral-100 px-4 py-3\",\n className,\n )}\n {...props}\n >\n <div className=\"flex flex-1 flex-col items-center gap-2\">\n <div\n className=\"flex size-[72px] items-center justify-center rounded-full bg-neutral-400\"\n aria-hidden=\"true\"\n >\n <MicrophoneIcon className=\"size-5 text-body-300\" />\n </div>\n\n <p\n role=\"timer\"\n aria-label=\"Recording time\"\n className=\"typography-body-1-regular text-body-100\"\n >\n {formattedElapsed} / {formatAudioTime(maxRecordingDuration * 1000)}\n </p>\n </div>\n\n <div className=\"flex w-full items-center gap-2.5\" aria-hidden=\"true\">\n <AudioWaveform\n analyserNode={analyserNode}\n isRecording={isRecording}\n className=\"flex-1\"\n />\n </div>\n\n <button\n ref={stopButtonRef}\n type=\"button\"\n onClick={handleStopClick}\n className=\"mt-1 flex size-11 items-center justify-center rounded-full bg-error-500 text-body-white-solid-constant transition-colors hover:bg-error-500/80 focus:shadow-focus-ring focus-visible:outline-none\"\n aria-label={stopButtonAriaLabel}\n >\n <StopIcon className=\"size-5\" />\n </button>\n </div>\n );\n }\n\n return (\n // biome-ignore lint/a11y/useSemanticElements: <fieldset> would break the public HTMLDivElement ref/props API\n <div\n ref={ref}\n role=\"group\"\n aria-label=\"Audio upload\"\n data-testid=\"audio-upload\"\n data-state=\"idle\"\n aria-disabled={disabled || undefined}\n onDrop={handleDrop}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n className={cn(\n \"flex flex-col items-center justify-center gap-2 rounded-xl bg-neutral-100 px-4 py-3 transition-colors\",\n isDragActive && \"bg-brand-green-50 ring-2 ring-brand-green-500\",\n disabled && \"pointer-events-none opacity-50\",\n className,\n )}\n {...props}\n >\n <input\n id={inputId}\n type=\"file\"\n accept={acceptString}\n multiple={maxFiles > 1}\n onChange={handleFileInputChange}\n className=\"peer sr-only\"\n disabled={disabled}\n aria-describedby={descriptionId}\n />\n\n <label\n htmlFor={inputId}\n className=\"flex cursor-pointer flex-col items-center gap-2 rounded-lg px-2 py-1 peer-focus-visible:shadow-focus-ring\"\n >\n <UploadCloudIcon className=\"size-5 text-body-100\" />\n\n <span className=\"typography-body-1-semibold text-center text-body-100\">\n {uploadTitle}\n </span>\n\n <span id={descriptionId} className=\"typography-body-2-regular text-center text-body-100\">\n {uploadDescription}\n </span>\n </label>\n\n {allowRecording && isRecordingSupported && (\n <>\n <p className=\"typography-body-2-regular text-center text-body-100\">{separatorText}</p>\n\n <Button\n variant=\"brand\"\n size=\"40\"\n leftIcon={<MicrophoneIcon className=\"size-5\" />}\n onClick={handleRecordClick}\n disabled={disabled}\n type=\"button\"\n >\n {recordButtonLabel}\n </Button>\n </>\n )}\n </div>\n );\n },\n);\n\nAudioUpload.displayName = \"AudioUpload\";\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AudioUpload.mjs","sources":["../../../src/components/AudioUpload/AudioUpload.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport { Button } from \"../Button/Button\";\nimport { MicrophoneIcon } from \"../Icons/MicrophoneIcon\";\nimport { StopIcon } from \"../Icons/StopIcon\";\nimport { UploadCloudIcon } from \"../Icons/UploadCloudIcon\";\nimport { AudioWaveform } from \"./AudioWaveform\";\nimport { type AudioValidationError, formatAudioTime, validateAudioFile } from \"./audioUtils\";\nimport {\n DEFAULT_ACCEPTED_TYPES,\n DEFAULT_MAX_FILE_SIZE,\n DEFAULT_MAX_RECORDING_DURATION,\n DEFAULT_MIN_RECORDING_DURATION,\n} from \"./constants\";\nimport { useAudioRecorder } from \"./useAudioRecorder\";\n\n/** A file that was rejected during drop or browse, along with the reasons. */\nexport interface AudioFileRejection {\n /** The rejected file. */\n file: File;\n /** One or more validation errors explaining why the file was rejected. */\n errors: AudioValidationError[];\n}\n\nexport interface AudioUploadProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onDrop\"> {\n /** Maximum file size in bytes. @default 10_485_760 (10MB) */\n maxFileSize?: number;\n /** Accepted audio MIME types. @default DEFAULT_ACCEPTED_TYPES */\n accept?: readonly string[];\n /** Maximum number of files per drop. @default 1 */\n maxFiles?: number;\n /** Whether to show the record audio button. @default true */\n allowRecording?: boolean;\n /** Maximum recording duration in seconds. @default 30 */\n maxRecordingDuration?: number;\n /** Minimum recording duration in seconds. @default 5 */\n minRecordingDuration?: number;\n\n /** Called when valid files are accepted via drop or browse */\n onFilesAccepted?: (files: File[]) => void;\n /** Called when files are rejected (wrong type, too large, etc.) */\n onFilesRejected?: (rejections: AudioFileRejection[]) => void;\n /** Called when a recording completes and meets minimum duration */\n onRecordingComplete?: (blob: Blob, durationMs: number) => void;\n /** Called when recording is stopped but does not meet minimum duration */\n onRecordingTooShort?: (durationMs: number, minDurationMs: number) => void;\n /** Called when microphone permission is denied or unavailable */\n onPermissionError?: (error: Error) => void;\n /** Called when an unexpected recording error occurs */\n onRecordingError?: (error: Error) => void;\n\n /** Upload area title text. @default \"Click to upload, or drag & drop\" */\n uploadTitle?: string;\n /** Upload area description text. @default \"Audio files only, up to 10MB each\" */\n uploadDescription?: string;\n /** Separator text between upload and record. @default \"or\" */\n separatorText?: string;\n /** Record button label. @default \"Record audio\" */\n recordButtonLabel?: string;\n /** Stop recording button aria-label. @default \"Stop recording\" */\n stopButtonAriaLabel?: string;\n\n /** Whether the component is disabled. @default false */\n disabled?: boolean;\n}\n\nfunction partitionFiles(\n files: File[],\n maxFileSize: number,\n accept: readonly string[],\n maxFiles: number,\n): { accepted: File[]; rejected: AudioFileRejection[] } {\n const accepted: File[] = [];\n const rejected: AudioFileRejection[] = [];\n\n for (const file of files) {\n const errors = validateAudioFile(file, { maxFileSize, acceptedTypes: accept });\n if (errors.length > 0) {\n rejected.push({ file, errors });\n } else {\n accepted.push(file);\n }\n }\n\n if (maxFiles > 0 && accepted.length > maxFiles) {\n const excess = accepted.splice(maxFiles);\n for (const file of excess) {\n rejected.push({\n file,\n errors: [{ code: \"too-many-files\", message: `Too many files. Maximum is ${maxFiles}` }],\n });\n }\n }\n\n return { accepted, rejected };\n}\n\n/**\n * Audio file upload with drag-and-drop and optional in-browser recording.\n * Supports file validation, multiple files, and real-time waveform visualization during recording.\n *\n * @example\n * ```tsx\n * <AudioUpload\n * onFilesAccepted={(files) => console.log(files)}\n * onRecordingComplete={(blob, duration) => console.log(blob, duration)}\n * />\n * ```\n */\nexport const AudioUpload = React.forwardRef<HTMLDivElement, AudioUploadProps>(\n (\n {\n className,\n maxFileSize = DEFAULT_MAX_FILE_SIZE,\n accept = DEFAULT_ACCEPTED_TYPES,\n maxFiles = 1,\n allowRecording = true,\n maxRecordingDuration = DEFAULT_MAX_RECORDING_DURATION,\n minRecordingDuration = DEFAULT_MIN_RECORDING_DURATION,\n onFilesAccepted,\n onFilesRejected,\n onRecordingComplete,\n onRecordingTooShort,\n onPermissionError,\n onRecordingError,\n uploadTitle = \"Click to upload, or drag & drop\",\n uploadDescription = \"Audio files only, up to 10MB each\",\n separatorText = \"or\",\n recordButtonLabel = \"Record audio\",\n stopButtonAriaLabel = \"Stop recording\",\n disabled = false,\n ...props\n },\n ref,\n ) => {\n const inputId = React.useId();\n const descriptionId = React.useId();\n const [isDragActive, setIsDragActive] = React.useState(false);\n const stopButtonRef = React.useRef<HTMLButtonElement>(null);\n\n const {\n isRecording,\n elapsedMs,\n startRecording,\n stopRecording,\n analyserNode,\n isSupported: isRecordingSupported,\n } = useAudioRecorder({\n maxDuration: maxRecordingDuration,\n minDuration: minRecordingDuration,\n onComplete: onRecordingComplete,\n onTooShort: onRecordingTooShort,\n onPermissionError,\n onError: onRecordingError,\n });\n\n const acceptString = accept.join(\",\");\n\n // Move focus to stop button when recording starts\n React.useEffect(() => {\n if (isRecording) {\n stopButtonRef.current?.focus();\n }\n }, [isRecording]);\n\n const validateAndAcceptFiles = React.useCallback(\n (files: FileList | File[]) => {\n const { accepted, rejected } = partitionFiles(\n Array.from(files),\n maxFileSize,\n accept,\n maxFiles,\n );\n if (accepted.length > 0) onFilesAccepted?.(accepted);\n if (rejected.length > 0) onFilesRejected?.(rejected);\n },\n [maxFileSize, accept, maxFiles, onFilesAccepted, onFilesRejected],\n );\n\n const handleDrop = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragActive(false);\n\n if (disabled) return;\n\n const { files } = e.dataTransfer;\n if (files.length > 0) {\n validateAndAcceptFiles(files);\n }\n };\n\n const handleDragOver = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n if (!disabled) {\n setIsDragActive(true);\n }\n };\n\n const handleDragLeave = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragActive(false);\n };\n\n const handleFileInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const { files } = e.target;\n if (files && files.length > 0) {\n validateAndAcceptFiles(files);\n }\n // Reset input so same file can be selected again\n e.target.value = \"\";\n };\n\n const handleRecordClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n startRecording();\n };\n\n const handleStopClick = () => {\n stopRecording();\n };\n\n if (isRecording) {\n const formattedElapsed = formatAudioTime(elapsedMs);\n\n return (\n // biome-ignore lint/a11y/useSemanticElements: <fieldset> would break the public HTMLDivElement ref/props API\n <div\n ref={ref}\n role=\"group\"\n aria-label=\"Audio recording in progress\"\n data-testid=\"audio-upload\"\n data-state=\"recording\"\n className={cn(\n \"flex flex-col items-center justify-center gap-2 rounded-xl bg-neutral-100 px-4 py-3\",\n className,\n )}\n {...props}\n >\n <div className=\"flex flex-1 flex-col items-center gap-2\">\n <div\n className=\"flex size-[72px] items-center justify-center rounded-full bg-neutral-400\"\n aria-hidden=\"true\"\n >\n <MicrophoneIcon className=\"size-5 text-foreground-inverse\" />\n </div>\n\n <p\n role=\"timer\"\n aria-label=\"Recording time\"\n className=\"typography-regular-body-lg text-foreground-default\"\n >\n {formattedElapsed} / {formatAudioTime(maxRecordingDuration * 1000)}\n </p>\n </div>\n\n <div className=\"flex w-full items-center gap-2.5\" aria-hidden=\"true\">\n <AudioWaveform\n analyserNode={analyserNode}\n isRecording={isRecording}\n className=\"flex-1\"\n />\n </div>\n\n <button\n ref={stopButtonRef}\n type=\"button\"\n onClick={handleStopClick}\n className=\"mt-1 flex size-11 items-center justify-center rounded-full bg-error-default text-foreground-onaccentinverse transition-colors hover:bg-error-default/80 focus:shadow-focus-ring focus-visible:outline-none\"\n aria-label={stopButtonAriaLabel}\n >\n <StopIcon className=\"size-5\" />\n </button>\n </div>\n );\n }\n\n return (\n // biome-ignore lint/a11y/useSemanticElements: <fieldset> would break the public HTMLDivElement ref/props API\n <div\n ref={ref}\n role=\"group\"\n aria-label=\"Audio upload\"\n data-testid=\"audio-upload\"\n data-state=\"idle\"\n aria-disabled={disabled || undefined}\n onDrop={handleDrop}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n className={cn(\n \"flex flex-col items-center justify-center gap-2 rounded-xl bg-neutral-100 px-4 py-3 transition-colors\",\n isDragActive && \"bg-brand-accent-muted ring-2 ring-brand-accent-default\",\n disabled && \"pointer-events-none opacity-50\",\n className,\n )}\n {...props}\n >\n <input\n id={inputId}\n type=\"file\"\n accept={acceptString}\n multiple={maxFiles > 1}\n onChange={handleFileInputChange}\n className=\"peer sr-only\"\n disabled={disabled}\n aria-describedby={descriptionId}\n />\n\n <label\n htmlFor={inputId}\n className=\"flex cursor-pointer flex-col items-center gap-2 rounded-lg px-2 py-1 peer-focus-visible:shadow-focus-ring\"\n >\n <UploadCloudIcon className=\"size-5 text-foreground-default\" />\n\n <span className=\"typography-semibold-body-lg text-center text-foreground-default\">\n {uploadTitle}\n </span>\n\n <span\n id={descriptionId}\n className=\"typography-regular-body-md text-center text-foreground-default\"\n >\n {uploadDescription}\n </span>\n </label>\n\n {allowRecording && isRecordingSupported && (\n <>\n <p className=\"typography-regular-body-md text-center text-foreground-default\">\n {separatorText}\n </p>\n\n <Button\n variant=\"brand\"\n size=\"40\"\n leftIcon={<MicrophoneIcon className=\"size-5\" />}\n onClick={handleRecordClick}\n disabled={disabled}\n type=\"button\"\n >\n {recordButtonLabel}\n </Button>\n </>\n )}\n </div>\n );\n },\n);\n\nAudioUpload.displayName = \"AudioUpload\";\n"],"names":[],"mappings":";;;;;;;;;;;;AAkEA,SAAS,eACP,OACA,aACA,QACA,UACsD;AACtD,QAAM,WAAmB,CAAA;AACzB,QAAM,WAAiC,CAAA;AAEvC,aAAW,QAAQ,OAAO;AACxB,UAAM,SAAS,kBAAkB,MAAM,EAAE,aAAa,eAAe,QAAQ;AAC7E,QAAI,OAAO,SAAS,GAAG;AACrB,eAAS,KAAK,EAAE,MAAM,OAAA,CAAQ;AAAA,IAChC,OAAO;AACL,eAAS,KAAK,IAAI;AAAA,IACpB;AAAA,EACF;AAEA,MAAI,WAAW,KAAK,SAAS,SAAS,UAAU;AAC9C,UAAM,SAAS,SAAS,OAAO,QAAQ;AACvC,eAAW,QAAQ,QAAQ;AACzB,eAAS,KAAK;AAAA,QACZ;AAAA,QACA,QAAQ,CAAC,EAAE,MAAM,kBAAkB,SAAS,8BAA8B,QAAQ,GAAA,CAAI;AAAA,MAAA,CACvF;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,UAAU,SAAA;AACrB;AAcO,MAAM,cAAc,MAAM;AAAA,EAC/B,CACE;AAAA,IACE;AAAA,IACA,cAAc;AAAA,IACd,SAAS;AAAA,IACT,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,uBAAuB;AAAA,IACvB,uBAAuB;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,oBAAoB;AAAA,IACpB,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,sBAAsB;AAAA,IACtB,WAAW;AAAA,IACX,GAAG;AAAA,EAAA,GAEL,QACG;AACH,UAAM,UAAU,MAAM,MAAA;AACtB,UAAM,gBAAgB,MAAM,MAAA;AAC5B,UAAM,CAAC,cAAc,eAAe,IAAI,MAAM,SAAS,KAAK;AAC5D,UAAM,gBAAgB,MAAM,OAA0B,IAAI;AAE1D,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,IAAA,IACX,iBAAiB;AAAA,MACnB,aAAa;AAAA,MACb,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ;AAAA,MACA,SAAS;AAAA,IAAA,CACV;AAED,UAAM,eAAe,OAAO,KAAK,GAAG;AAGpC,UAAM,UAAU,MAAM;AACpB,UAAI,aAAa;AACf,sBAAc,SAAS,MAAA;AAAA,MACzB;AAAA,IACF,GAAG,CAAC,WAAW,CAAC;AAEhB,UAAM,yBAAyB,MAAM;AAAA,MACnC,CAAC,UAA6B;AAC5B,cAAM,EAAE,UAAU,SAAA,IAAa;AAAA,UAC7B,MAAM,KAAK,KAAK;AAAA,UAChB;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAEF,YAAI,SAAS,SAAS,EAAG,mBAAkB,QAAQ;AACnD,YAAI,SAAS,SAAS,EAAG,mBAAkB,QAAQ;AAAA,MACrD;AAAA,MACA,CAAC,aAAa,QAAQ,UAAU,iBAAiB,eAAe;AAAA,IAAA;AAGlE,UAAM,aAAa,CAAC,MAAuC;AACzD,QAAE,eAAA;AACF,QAAE,gBAAA;AACF,sBAAgB,KAAK;AAErB,UAAI,SAAU;AAEd,YAAM,EAAE,UAAU,EAAE;AACpB,UAAI,MAAM,SAAS,GAAG;AACpB,+BAAuB,KAAK;AAAA,MAC9B;AAAA,IACF;AAEA,UAAM,iBAAiB,CAAC,MAAuC;AAC7D,QAAE,eAAA;AACF,QAAE,gBAAA;AACF,UAAI,CAAC,UAAU;AACb,wBAAgB,IAAI;AAAA,MACtB;AAAA,IACF;AAEA,UAAM,kBAAkB,CAAC,MAAuC;AAC9D,QAAE,eAAA;AACF,QAAE,gBAAA;AACF,sBAAgB,KAAK;AAAA,IACvB;AAEA,UAAM,wBAAwB,CAAC,MAA2C;AACxE,YAAM,EAAE,UAAU,EAAE;AACpB,UAAI,SAAS,MAAM,SAAS,GAAG;AAC7B,+BAAuB,KAAK;AAAA,MAC9B;AAEA,QAAE,OAAO,QAAQ;AAAA,IACnB;AAEA,UAAM,oBAAoB,CAAC,MAAwB;AACjD,QAAE,gBAAA;AACF,qBAAA;AAAA,IACF;AAEA,UAAM,kBAAkB,MAAM;AAC5B,oBAAA;AAAA,IACF;AAEA,QAAI,aAAa;AACf,YAAM,mBAAmB,gBAAgB,SAAS;AAElD;AAAA;AAAA,QAEE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC;AAAA,YACA,MAAK;AAAA,YACL,cAAW;AAAA,YACX,eAAY;AAAA,YACZ,cAAW;AAAA,YACX,WAAW;AAAA,cACT;AAAA,cACA;AAAA,YAAA;AAAA,YAED,GAAG;AAAA,YAEJ,UAAA;AAAA,cAAA,qBAAC,OAAA,EAAI,WAAU,2CACb,UAAA;AAAA,gBAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAU;AAAA,oBACV,eAAY;AAAA,oBAEZ,UAAA,oBAAC,gBAAA,EAAe,WAAU,iCAAA,CAAiC;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAG7D;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,cAAW;AAAA,oBACX,WAAU;AAAA,oBAET,UAAA;AAAA,sBAAA;AAAA,sBAAiB;AAAA,sBAAI,gBAAgB,uBAAuB,GAAI;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACnE,GACF;AAAA,cAEA,oBAAC,OAAA,EAAI,WAAU,oCAAmC,eAAY,QAC5D,UAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC;AAAA,kBACA;AAAA,kBACA,WAAU;AAAA,gBAAA;AAAA,cAAA,GAEd;AAAA,cAEA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,KAAK;AAAA,kBACL,MAAK;AAAA,kBACL,SAAS;AAAA,kBACT,WAAU;AAAA,kBACV,cAAY;AAAA,kBAEZ,UAAA,oBAAC,UAAA,EAAS,WAAU,SAAA,CAAS;AAAA,gBAAA;AAAA,cAAA;AAAA,YAC/B;AAAA,UAAA;AAAA,QAAA;AAAA;AAAA,IAGN;AAEA;AAAA;AAAA,MAEE;AAAA,QAAC;AAAA,QAAA;AAAA,UACC;AAAA,UACA,MAAK;AAAA,UACL,cAAW;AAAA,UACX,eAAY;AAAA,UACZ,cAAW;AAAA,UACX,iBAAe,YAAY;AAAA,UAC3B,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,aAAa;AAAA,UACb,WAAW;AAAA,YACT;AAAA,YACA,gBAAgB;AAAA,YAChB,YAAY;AAAA,YACZ;AAAA,UAAA;AAAA,UAED,GAAG;AAAA,UAEJ,UAAA;AAAA,YAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,IAAI;AAAA,gBACJ,MAAK;AAAA,gBACL,QAAQ;AAAA,gBACR,UAAU,WAAW;AAAA,gBACrB,UAAU;AAAA,gBACV,WAAU;AAAA,gBACV;AAAA,gBACA,oBAAkB;AAAA,cAAA;AAAA,YAAA;AAAA,YAGpB;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,SAAS;AAAA,gBACT,WAAU;AAAA,gBAEV,UAAA;AAAA,kBAAA,oBAAC,iBAAA,EAAgB,WAAU,iCAAA,CAAiC;AAAA,kBAE5D,oBAAC,QAAA,EAAK,WAAU,mEACb,UAAA,aACH;AAAA,kBAEA;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,IAAI;AAAA,sBACJ,WAAU;AAAA,sBAET,UAAA;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACH;AAAA,cAAA;AAAA,YAAA;AAAA,YAGD,kBAAkB,wBACjB,qBAAA,UAAA,EACE,UAAA;AAAA,cAAA,oBAAC,KAAA,EAAE,WAAU,kEACV,UAAA,eACH;AAAA,cAEA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,UAAU,oBAAC,gBAAA,EAAe,WAAU,SAAA,CAAS;AAAA,kBAC7C,SAAS;AAAA,kBACT;AAAA,kBACA,MAAK;AAAA,kBAEJ,UAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,YACH,EAAA,CACF;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA;AAAA,EAIR;AACF;AAEA,YAAY,cAAc;"}
@@ -96,7 +96,7 @@ function AudioWaveform({ analyserNode, isRecording, className }) {
96
96
  observer.disconnect();
97
97
  };
98
98
  }, [analyserNode, isRecording]);
99
- return /* @__PURE__ */ jsx("canvas", { ref: canvasRef, className: cn("h-5 w-full text-body-200", className) });
99
+ return /* @__PURE__ */ jsx("canvas", { ref: canvasRef, className: cn("h-5 w-full text-foreground-secondary", className) });
100
100
  }
101
101
  export {
102
102
  AudioWaveform
@@ -1 +1 @@
1
- {"version":3,"file":"AudioWaveform.mjs","sources":["../../../src/components/AudioUpload/AudioWaveform.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"@/utils/cn\";\n\ninterface AudioWaveformProps {\n /** AnalyserNode from useAudioRecorder for frequency data */\n analyserNode: AnalyserNode | null;\n /** Whether recording is active (affects rendering mode) */\n isRecording: boolean;\n /** Additional className */\n className?: string;\n}\n\nconst BAR_WIDTH = 3;\nconst BAR_GAP = 4;\nconst BAR_RADIUS = 1.5;\nconst MIN_BAR_HEIGHT = 3;\nconst IDLE_DOT_SIZE = 3;\n\n/** Draw a rounded rect, falling back to a plain rect if unsupported. */\nfunction drawRoundedRect(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n r: number,\n) {\n ctx.beginPath();\n if (ctx.roundRect) {\n ctx.roundRect(x, y, w, h, r);\n } else {\n ctx.rect(x, y, w, h);\n }\n ctx.fill();\n}\n\n/**\n * Canvas-based waveform visualization for audio recording.\n * Shows animated frequency bars when recording, static dots when idle.\n *\n * @internal Not exported from the library — used internally by AudioUpload.\n */\nexport function AudioWaveform({ analyserNode, isRecording, className }: AudioWaveformProps) {\n const canvasRef = React.useRef<HTMLCanvasElement>(null);\n const rafRef = React.useRef<number>(0);\n\n React.useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n\n // Cache color, dimensions, and frequency buffer outside the animation loop\n let cachedColor = \"\";\n let cachedWidth = 0;\n let cachedHeight = 0;\n let dataArray: Uint8Array<ArrayBuffer> | null = null;\n\n const resizeCanvas = () => {\n const rect = canvas.getBoundingClientRect();\n const dpr = window.devicePixelRatio || 1;\n canvas.width = rect.width * dpr;\n canvas.height = rect.height * dpr;\n ctx.scale(dpr, dpr);\n cachedColor = getComputedStyle(canvas).color || \"#151515\";\n cachedWidth = rect.width;\n cachedHeight = rect.height;\n };\n\n resizeCanvas();\n\n const drawIdle = () => {\n ctx.clearRect(0, 0, cachedWidth, cachedHeight);\n ctx.fillStyle = cachedColor;\n\n const totalBarSpace = IDLE_DOT_SIZE + BAR_GAP;\n const barCount = Math.floor(cachedWidth / totalBarSpace);\n const startX = (cachedWidth - barCount * totalBarSpace + BAR_GAP) / 2;\n const y = cachedHeight / 2 - IDLE_DOT_SIZE / 2;\n\n for (let i = 0; i < barCount; i++) {\n const x = startX + i * totalBarSpace;\n ctx.beginPath();\n ctx.arc(x + IDLE_DOT_SIZE / 2, y + IDLE_DOT_SIZE / 2, IDLE_DOT_SIZE / 2, 0, Math.PI * 2);\n ctx.fill();\n }\n };\n\n const drawRecording = () => {\n if (!analyserNode) {\n drawIdle();\n return;\n }\n\n ctx.clearRect(0, 0, cachedWidth, cachedHeight);\n\n // Reuse typed array across frames\n const bufferLength = analyserNode.frequencyBinCount;\n if (!dataArray || dataArray.length !== bufferLength) {\n dataArray = new Uint8Array(bufferLength);\n }\n analyserNode.getByteFrequencyData(dataArray);\n\n ctx.fillStyle = cachedColor;\n\n const totalBarSpace = BAR_WIDTH + BAR_GAP;\n const barCount = Math.floor(cachedWidth / totalBarSpace);\n const startX = (cachedWidth - barCount * totalBarSpace + BAR_GAP) / 2;\n\n const step = bufferLength / barCount;\n\n for (let i = 0; i < barCount; i++) {\n const dataIndex = Math.floor(i * step);\n const value = (dataArray[dataIndex] ?? 0) / 255;\n const barHeight = Math.max(MIN_BAR_HEIGHT, value * (cachedHeight - 4));\n const x = startX + i * totalBarSpace;\n const y = (cachedHeight - barHeight) / 2;\n\n drawRoundedRect(ctx, x, y, BAR_WIDTH, barHeight, BAR_RADIUS);\n }\n\n rafRef.current = requestAnimationFrame(drawRecording);\n };\n\n if (isRecording && analyserNode) {\n rafRef.current = requestAnimationFrame(drawRecording);\n } else {\n drawIdle();\n }\n\n const observer = new ResizeObserver(() => {\n resizeCanvas();\n if (!isRecording || !analyserNode) {\n drawIdle();\n }\n });\n observer.observe(canvas);\n\n return () => {\n cancelAnimationFrame(rafRef.current);\n observer.disconnect();\n };\n }, [analyserNode, isRecording]);\n\n return <canvas ref={canvasRef} className={cn(\"h-5 w-full text-body-200\", className)} />;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AudioWaveform.mjs","sources":["../../../src/components/AudioUpload/AudioWaveform.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"@/utils/cn\";\n\ninterface AudioWaveformProps {\n /** AnalyserNode from useAudioRecorder for frequency data */\n analyserNode: AnalyserNode | null;\n /** Whether recording is active (affects rendering mode) */\n isRecording: boolean;\n /** Additional className */\n className?: string;\n}\n\nconst BAR_WIDTH = 3;\nconst BAR_GAP = 4;\nconst BAR_RADIUS = 1.5;\nconst MIN_BAR_HEIGHT = 3;\nconst IDLE_DOT_SIZE = 3;\n\n/** Draw a rounded rect, falling back to a plain rect if unsupported. */\nfunction drawRoundedRect(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n r: number,\n) {\n ctx.beginPath();\n if (ctx.roundRect) {\n ctx.roundRect(x, y, w, h, r);\n } else {\n ctx.rect(x, y, w, h);\n }\n ctx.fill();\n}\n\n/**\n * Canvas-based waveform visualization for audio recording.\n * Shows animated frequency bars when recording, static dots when idle.\n *\n * @internal Not exported from the library — used internally by AudioUpload.\n */\nexport function AudioWaveform({ analyserNode, isRecording, className }: AudioWaveformProps) {\n const canvasRef = React.useRef<HTMLCanvasElement>(null);\n const rafRef = React.useRef<number>(0);\n\n React.useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n\n // Cache color, dimensions, and frequency buffer outside the animation loop\n let cachedColor = \"\";\n let cachedWidth = 0;\n let cachedHeight = 0;\n let dataArray: Uint8Array<ArrayBuffer> | null = null;\n\n const resizeCanvas = () => {\n const rect = canvas.getBoundingClientRect();\n const dpr = window.devicePixelRatio || 1;\n canvas.width = rect.width * dpr;\n canvas.height = rect.height * dpr;\n ctx.scale(dpr, dpr);\n cachedColor = getComputedStyle(canvas).color || \"#151515\";\n cachedWidth = rect.width;\n cachedHeight = rect.height;\n };\n\n resizeCanvas();\n\n const drawIdle = () => {\n ctx.clearRect(0, 0, cachedWidth, cachedHeight);\n ctx.fillStyle = cachedColor;\n\n const totalBarSpace = IDLE_DOT_SIZE + BAR_GAP;\n const barCount = Math.floor(cachedWidth / totalBarSpace);\n const startX = (cachedWidth - barCount * totalBarSpace + BAR_GAP) / 2;\n const y = cachedHeight / 2 - IDLE_DOT_SIZE / 2;\n\n for (let i = 0; i < barCount; i++) {\n const x = startX + i * totalBarSpace;\n ctx.beginPath();\n ctx.arc(x + IDLE_DOT_SIZE / 2, y + IDLE_DOT_SIZE / 2, IDLE_DOT_SIZE / 2, 0, Math.PI * 2);\n ctx.fill();\n }\n };\n\n const drawRecording = () => {\n if (!analyserNode) {\n drawIdle();\n return;\n }\n\n ctx.clearRect(0, 0, cachedWidth, cachedHeight);\n\n // Reuse typed array across frames\n const bufferLength = analyserNode.frequencyBinCount;\n if (!dataArray || dataArray.length !== bufferLength) {\n dataArray = new Uint8Array(bufferLength);\n }\n analyserNode.getByteFrequencyData(dataArray);\n\n ctx.fillStyle = cachedColor;\n\n const totalBarSpace = BAR_WIDTH + BAR_GAP;\n const barCount = Math.floor(cachedWidth / totalBarSpace);\n const startX = (cachedWidth - barCount * totalBarSpace + BAR_GAP) / 2;\n\n const step = bufferLength / barCount;\n\n for (let i = 0; i < barCount; i++) {\n const dataIndex = Math.floor(i * step);\n const value = (dataArray[dataIndex] ?? 0) / 255;\n const barHeight = Math.max(MIN_BAR_HEIGHT, value * (cachedHeight - 4));\n const x = startX + i * totalBarSpace;\n const y = (cachedHeight - barHeight) / 2;\n\n drawRoundedRect(ctx, x, y, BAR_WIDTH, barHeight, BAR_RADIUS);\n }\n\n rafRef.current = requestAnimationFrame(drawRecording);\n };\n\n if (isRecording && analyserNode) {\n rafRef.current = requestAnimationFrame(drawRecording);\n } else {\n drawIdle();\n }\n\n const observer = new ResizeObserver(() => {\n resizeCanvas();\n if (!isRecording || !analyserNode) {\n drawIdle();\n }\n });\n observer.observe(canvas);\n\n return () => {\n cancelAnimationFrame(rafRef.current);\n observer.disconnect();\n };\n }, [analyserNode, isRecording]);\n\n return (\n <canvas ref={canvasRef} className={cn(\"h-5 w-full text-foreground-secondary\", className)} />\n );\n}\n"],"names":[],"mappings":"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"}