@fanvue/ui 1.13.0 → 1.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +25 -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 +5 -5
  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 +11 -11
  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 -19
  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 +10 -10
  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 +25 -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 +5 -5
  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 +11 -11
  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 -19
  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 +10 -10
  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
@@ -34,10 +34,10 @@ const DEFAULT_ICONS = {
34
34
  error: /* @__PURE__ */ jsxRuntime.jsx(ErrorCircleIcon.ErrorCircleIcon, {})
35
35
  };
36
36
  const CLOSE_BUTTON_CLASSES = {
37
- info: "hover:bg-info-500/10 active:bg-info-500/10 text-info-500 motion-safe:transition-colors motion-safe:duration-150",
38
- success: "hover:bg-success-500/10 active:bg-success-500/10 text-success-500 motion-safe:transition-colors motion-safe:duration-150",
39
- warning: "hover:bg-warning-500/10 active:bg-warning-500/10 text-warning-500 motion-safe:transition-colors motion-safe:duration-150",
40
- error: "hover:bg-error-500/10 active:bg-error-500/10 text-error-500 motion-safe:transition-colors motion-safe:duration-150"
37
+ info: "hover:bg-info-default active:bg-info-default text-info-default motion-safe:transition-colors motion-safe:duration-150",
38
+ success: "hover:bg-success-default active:bg-success-default text-success-default motion-safe:transition-colors motion-safe:duration-150",
39
+ warning: "hover:bg-warning-default active:bg-warning-default text-warning-default motion-safe:transition-colors motion-safe:duration-150",
40
+ error: "hover:bg-error-default active:bg-error-default text-error-default motion-safe:transition-colors motion-safe:duration-150"
41
41
  };
42
42
  const Alert = React__namespace.forwardRef(
43
43
  ({
@@ -65,18 +65,18 @@ const Alert = React__namespace.forwardRef(
65
65
  !resolvedIcon && closable && "grid-cols-[1fr_auto]",
66
66
  !resolvedIcon && !closable && "grid-cols-[1fr]",
67
67
  title && children ? "items-start" : "items-center",
68
- variant === "info" && "bg-info-50 text-info-500",
69
- variant === "success" && "bg-success-50 text-success-500",
70
- variant === "warning" && "bg-warning-50 text-warning-500",
71
- variant === "error" && "bg-error-50 text-error-500",
68
+ variant === "info" && "bg-info-background text-info-default",
69
+ variant === "success" && "bg-success-background text-success-default",
70
+ variant === "warning" && "bg-warning-background text-warning-default",
71
+ variant === "error" && "bg-error-background text-error-default",
72
72
  className
73
73
  ),
74
74
  ...props,
75
75
  children: [
76
76
  resolvedIcon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex shrink-0 items-start", "aria-hidden": "true", children: resolvedIcon }),
77
77
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-col gap-2", children: [
78
- title && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "typography-body-2-semibold text-body-100", children: title }),
79
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "typography-body-2-regular text-body-200", children })
78
+ title && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "typography-semibold-body-md text-foreground-default", children: title }),
79
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "typography-regular-body-md text-foreground-secondary", children })
80
80
  ] }),
81
81
  closable && /* @__PURE__ */ jsxRuntime.jsx(
82
82
  Button.Button,
@@ -1 +1 @@
1
- {"version":3,"file":"Alert.cjs","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":["InfoCircleIcon","CheckCircleIcon","WarningTriangleIcon","ErrorCircleIcon","React","jsxs","cn","jsx","Button","CrossIcon"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,MAAM,gBAAuD;AAAA,EAC3D,qCAAOA,eAAAA,gBAAA,EAAe;AAAA,EACtB,wCAAUC,gBAAAA,iBAAA,EAAgB;AAAA,EAC1B,wCAAUC,oBAAAA,qBAAA,EAAoB;AAAA,EAC9B,sCAAQC,gBAAAA,iBAAA,CAAA,CAAgB;AAC1B;AAiBA,MAAM,uBAAqD;AAAA,EACzD,MAAM;AAAA,EACN,SACE;AAAA,EACF,SACE;AAAA,EACF,OACE;AACJ;AAkBO,MAAM,QAAQC,iBAAM;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,WACEC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,eAAY;AAAA,QACZ,WAAWC,GAAAA;AAAAA,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,+CACE,QAAA,EAAK,WAAU,6BAA4B,eAAY,QACrD,UAAA,cACH;AAAA,UAGFD,2BAAAA,KAAC,OAAA,EAAI,WAAU,+BACZ,UAAA;AAAA,YAAA,SAASE,2BAAAA,IAAC,OAAA,EAAI,WAAU,4CAA4C,UAAA,OAAM;AAAA,YAC3EA,2BAAAA,IAAC,OAAA,EAAI,WAAU,2CAA2C,SAAA,CAAS;AAAA,UAAA,GACrE;AAAA,UAEC,YACCA,2BAAAA;AAAAA,YAACC,OAAAA;AAAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,SAAS;AAAA,cACT,WAAWF,GAAAA,GAAG,mBAAmB,qBAAqB,OAAO,CAAC;AAAA,cAC9D,cAAY;AAAA,cAEZ,yCAACG,UAAAA,WAAA,CAAA,CAAU;AAAA,YAAA;AAAA,UAAA;AAAA,QACb;AAAA,MAAA;AAAA,IAAA;AAAA,EAIR;AACF;AAEA,MAAM,cAAc;;"}
1
+ {"version":3,"file":"Alert.cjs","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":["InfoCircleIcon","CheckCircleIcon","WarningTriangleIcon","ErrorCircleIcon","React","jsxs","cn","jsx","Button","CrossIcon"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,MAAM,gBAAuD;AAAA,EAC3D,qCAAOA,eAAAA,gBAAA,EAAe;AAAA,EACtB,wCAAUC,gBAAAA,iBAAA,EAAgB;AAAA,EAC1B,wCAAUC,oBAAAA,qBAAA,EAAoB;AAAA,EAC9B,sCAAQC,gBAAAA,iBAAA,CAAA,CAAgB;AAC1B;AAiBA,MAAM,uBAAqD;AAAA,EACzD,MAAM;AAAA,EACN,SACE;AAAA,EACF,SACE;AAAA,EACF,OACE;AACJ;AAkBO,MAAM,QAAQC,iBAAM;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,WACEC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,eAAY;AAAA,QACZ,WAAWC,GAAAA;AAAAA,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,+CACE,QAAA,EAAK,WAAU,6BAA4B,eAAY,QACrD,UAAA,cACH;AAAA,UAGFD,2BAAAA,KAAC,OAAA,EAAI,WAAU,+BACZ,UAAA;AAAA,YAAA,SACCE,2BAAAA,IAAC,OAAA,EAAI,WAAU,uDAAuD,UAAA,OAAM;AAAA,YAE9EA,2BAAAA,IAAC,OAAA,EAAI,WAAU,wDAAwD,SAAA,CAAS;AAAA,UAAA,GAClF;AAAA,UAEC,YACCA,2BAAAA;AAAAA,YAACC,OAAAA;AAAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,SAAS;AAAA,cACT,WAAWF,GAAAA,GAAG,mBAAmB,qBAAqB,OAAO,CAAC;AAAA,cAC9D,cAAY;AAAA,cAEZ,yCAACG,UAAAA,WAAA,CAAA,CAAU;AAAA,YAAA;AAAA,UAAA;AAAA,QACb;AAAA,MAAA;AAAA,IAAA;AAAA,EAIR;AACF;AAEA,MAAM,cAAc;;"}
@@ -172,7 +172,7 @@ const AudioUpload = React__namespace.forwardRef(
172
172
  {
173
173
  className: "flex size-[72px] items-center justify-center rounded-full bg-neutral-400",
174
174
  "aria-hidden": "true",
175
- children: /* @__PURE__ */ jsxRuntime.jsx(MicrophoneIcon.MicrophoneIcon, { className: "size-5 text-body-300" })
175
+ children: /* @__PURE__ */ jsxRuntime.jsx(MicrophoneIcon.MicrophoneIcon, { className: "size-5 text-foreground-inverse" })
176
176
  }
177
177
  ),
178
178
  /* @__PURE__ */ jsxRuntime.jsxs(
@@ -180,7 +180,7 @@ const AudioUpload = React__namespace.forwardRef(
180
180
  {
181
181
  role: "timer",
182
182
  "aria-label": "Recording time",
183
- className: "typography-body-1-regular text-body-100",
183
+ className: "typography-regular-body-lg text-foreground-default",
184
184
  children: [
185
185
  formattedElapsed,
186
186
  " / ",
@@ -203,7 +203,7 @@ const AudioUpload = React__namespace.forwardRef(
203
203
  ref: stopButtonRef,
204
204
  type: "button",
205
205
  onClick: handleStopClick,
206
- 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",
206
+ 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",
207
207
  "aria-label": stopButtonAriaLabel,
208
208
  children: /* @__PURE__ */ jsxRuntime.jsx(StopIcon.StopIcon, { className: "size-5" })
209
209
  }
@@ -229,7 +229,7 @@ const AudioUpload = React__namespace.forwardRef(
229
229
  onDragLeave: handleDragLeave,
230
230
  className: cn.cn(
231
231
  "flex flex-col items-center justify-center gap-2 rounded-xl bg-neutral-100 px-4 py-3 transition-colors",
232
- isDragActive && "bg-brand-green-50 ring-2 ring-brand-green-500",
232
+ isDragActive && "bg-brand-accent-muted ring-2 ring-brand-accent-default",
233
233
  disabled && "pointer-events-none opacity-50",
234
234
  className
235
235
  ),
@@ -254,14 +254,21 @@ const AudioUpload = React__namespace.forwardRef(
254
254
  htmlFor: inputId,
255
255
  className: "flex cursor-pointer flex-col items-center gap-2 rounded-lg px-2 py-1 peer-focus-visible:shadow-focus-ring",
256
256
  children: [
257
- /* @__PURE__ */ jsxRuntime.jsx(UploadCloudIcon.UploadCloudIcon, { className: "size-5 text-body-100" }),
258
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typography-body-1-semibold text-center text-body-100", children: uploadTitle }),
259
- /* @__PURE__ */ jsxRuntime.jsx("span", { id: descriptionId, className: "typography-body-2-regular text-center text-body-100", children: uploadDescription })
257
+ /* @__PURE__ */ jsxRuntime.jsx(UploadCloudIcon.UploadCloudIcon, { className: "size-5 text-foreground-default" }),
258
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typography-semibold-body-lg text-center text-foreground-default", children: uploadTitle }),
259
+ /* @__PURE__ */ jsxRuntime.jsx(
260
+ "span",
261
+ {
262
+ id: descriptionId,
263
+ className: "typography-regular-body-md text-center text-foreground-default",
264
+ children: uploadDescription
265
+ }
266
+ )
260
267
  ]
261
268
  }
262
269
  ),
263
270
  allowRecording && isRecordingSupported && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
264
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "typography-body-2-regular text-center text-body-100", children: separatorText }),
271
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "typography-regular-body-md text-center text-foreground-default", children: separatorText }),
265
272
  /* @__PURE__ */ jsxRuntime.jsx(
266
273
  Button.Button,
267
274
  {
@@ -1 +1 @@
1
- {"version":3,"file":"AudioUpload.cjs","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":["validateAudioFile","React","DEFAULT_MAX_FILE_SIZE","DEFAULT_ACCEPTED_TYPES","DEFAULT_MAX_RECORDING_DURATION","DEFAULT_MIN_RECORDING_DURATION","useAudioRecorder","formatAudioTime","jsxs","cn","jsx","MicrophoneIcon","AudioWaveform","StopIcon","UploadCloudIcon","Fragment","Button"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkEA,SAAS,eACP,OACA,aACA,QACA,UACsD;AACtD,QAAM,WAAmB,CAAA;AACzB,QAAM,WAAiC,CAAA;AAEvC,aAAW,QAAQ,OAAO;AACxB,UAAM,SAASA,WAAAA,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,cAAcC,iBAAM;AAAA,EAC/B,CACE;AAAA,IACE;AAAA,IACA,cAAcC,UAAAA;AAAAA,IACd,SAASC,UAAAA;AAAAA,IACT,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,uBAAuBC,UAAAA;AAAAA,IACvB,uBAAuBC,UAAAA;AAAAA,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,UAAUJ,iBAAM,MAAA;AACtB,UAAM,gBAAgBA,iBAAM,MAAA;AAC5B,UAAM,CAAC,cAAc,eAAe,IAAIA,iBAAM,SAAS,KAAK;AAC5D,UAAM,gBAAgBA,iBAAM,OAA0B,IAAI;AAE1D,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,IAAA,IACXK,kCAAiB;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;AAGpCL,qBAAM,UAAU,MAAM;AACpB,UAAI,aAAa;AACf,sBAAc,SAAS,MAAA;AAAA,MACzB;AAAA,IACF,GAAG,CAAC,WAAW,CAAC;AAEhB,UAAM,yBAAyBA,iBAAM;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,mBAAmBM,WAAAA,gBAAgB,SAAS;AAElD;AAAA;AAAA,QAEEC,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC;AAAA,YACA,MAAK;AAAA,YACL,cAAW;AAAA,YACX,eAAY;AAAA,YACZ,cAAW;AAAA,YACX,WAAWC,GAAAA;AAAAA,cACT;AAAA,cACA;AAAA,YAAA;AAAA,YAED,GAAG;AAAA,YAEJ,UAAA;AAAA,cAAAD,2BAAAA,KAAC,OAAA,EAAI,WAAU,2CACb,UAAA;AAAA,gBAAAE,2BAAAA;AAAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAU;AAAA,oBACV,eAAY;AAAA,oBAEZ,UAAAA,2BAAAA,IAACC,eAAAA,gBAAA,EAAe,WAAU,uBAAA,CAAuB;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAGnDH,2BAAAA;AAAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,cAAW;AAAA,oBACX,WAAU;AAAA,oBAET,UAAA;AAAA,sBAAA;AAAA,sBAAiB;AAAA,sBAAID,WAAAA,gBAAgB,uBAAuB,GAAI;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACnE,GACF;AAAA,cAEAG,2BAAAA,IAAC,OAAA,EAAI,WAAU,oCAAmC,eAAY,QAC5D,UAAAA,2BAAAA;AAAAA,gBAACE,cAAAA;AAAAA,gBAAA;AAAA,kBACC;AAAA,kBACA;AAAA,kBACA,WAAU;AAAA,gBAAA;AAAA,cAAA,GAEd;AAAA,cAEAF,2BAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,KAAK;AAAA,kBACL,MAAK;AAAA,kBACL,SAAS;AAAA,kBACT,WAAU;AAAA,kBACV,cAAY;AAAA,kBAEZ,UAAAA,2BAAAA,IAACG,SAAAA,UAAA,EAAS,WAAU,SAAA,CAAS;AAAA,gBAAA;AAAA,cAAA;AAAA,YAC/B;AAAA,UAAA;AAAA,QAAA;AAAA;AAAA,IAGN;AAEA;AAAA;AAAA,MAEEL,2BAAAA;AAAAA,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,WAAWC,GAAAA;AAAAA,YACT;AAAA,YACA,gBAAgB;AAAA,YAChB,YAAY;AAAA,YACZ;AAAA,UAAA;AAAA,UAED,GAAG;AAAA,UAEJ,UAAA;AAAA,YAAAC,2BAAAA;AAAAA,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,YAGpBF,2BAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBACC,SAAS;AAAA,gBACT,WAAU;AAAA,gBAEV,UAAA;AAAA,kBAAAE,2BAAAA,IAACI,gBAAAA,iBAAA,EAAgB,WAAU,uBAAA,CAAuB;AAAA,kBAElDJ,2BAAAA,IAAC,QAAA,EAAK,WAAU,wDACb,UAAA,aACH;AAAA,iDAEC,QAAA,EAAK,IAAI,eAAe,WAAU,uDAChC,UAAA,kBAAA,CACH;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,YAGD,kBAAkB,wBACjBF,2BAAAA,KAAAO,WAAAA,UAAA,EACE,UAAA;AAAA,cAAAL,2BAAAA,IAAC,KAAA,EAAE,WAAU,uDAAuD,UAAA,eAAc;AAAA,cAElFA,2BAAAA;AAAAA,gBAACM,OAAAA;AAAAA,gBAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,UAAUN,2BAAAA,IAACC,eAAAA,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;;"}
1
+ {"version":3,"file":"AudioUpload.cjs","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":["validateAudioFile","React","DEFAULT_MAX_FILE_SIZE","DEFAULT_ACCEPTED_TYPES","DEFAULT_MAX_RECORDING_DURATION","DEFAULT_MIN_RECORDING_DURATION","useAudioRecorder","formatAudioTime","jsxs","cn","jsx","MicrophoneIcon","AudioWaveform","StopIcon","UploadCloudIcon","Fragment","Button"],"mappings":"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"}
@@ -115,7 +115,7 @@ function AudioWaveform({ analyserNode, isRecording, className }) {
115
115
  observer.disconnect();
116
116
  };
117
117
  }, [analyserNode, isRecording]);
118
- return /* @__PURE__ */ jsxRuntime.jsx("canvas", { ref: canvasRef, className: cn.cn("h-5 w-full text-body-200", className) });
118
+ return /* @__PURE__ */ jsxRuntime.jsx("canvas", { ref: canvasRef, className: cn.cn("h-5 w-full text-foreground-secondary", className) });
119
119
  }
120
120
  exports.AudioWaveform = AudioWaveform;
121
121
  //# sourceMappingURL=AudioWaveform.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"AudioWaveform.cjs","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":["React","jsx","cn"],"mappings":"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"}
1
+ {"version":3,"file":"AudioWaveform.cjs","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":["React","jsx","cn"],"mappings":"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"}
@@ -28,14 +28,14 @@ const AvatarContext = React__namespace.createContext({
28
28
  NSFWShow: false
29
29
  });
30
30
  const STATUS_POSITIONS = {
31
- 16: { top: -4, right: -4 },
32
- 24: { top: -3, right: -3 },
33
- 32: { top: -2, right: -2 },
34
- 40: { top: -1, right: -1 },
35
- 48: { top: 0, right: 0 },
36
- 64: { top: 2, right: 2 },
37
- 88: { top: 6, right: 6 },
38
- 148: { top: 15, right: 15 }
31
+ 16: { top: -2, right: -2, indicatorSize: "size-2" },
32
+ 24: { top: 0, right: 0, indicatorSize: "size-2" },
33
+ 32: { top: 0, right: 0, indicatorSize: "size-2" },
34
+ 40: { top: 2, right: 2, indicatorSize: "size-2" },
35
+ 48: { top: 5, right: 2, indicatorSize: "size-2" },
36
+ 64: { top: 5, right: 1, indicatorSize: "size-3" },
37
+ 88: { top: 8, right: 6, indicatorSize: "size-3" },
38
+ 148: { top: 15, right: 15, indicatorSize: "size-3" }
39
39
  };
40
40
  const AvatarRoot = React__namespace.forwardRef(
41
41
  ({
@@ -55,7 +55,7 @@ const AvatarRoot = React__namespace.forwardRef(
55
55
  ref,
56
56
  "data-testid": "avatar",
57
57
  className: cn.cn(
58
- "relative inline-flex shrink-0 items-center justify-center overflow-hidden rounded-full bg-neutral-500",
58
+ "relative inline-flex shrink-0 items-center justify-center overflow-hidden rounded-full bg-neutral-200",
59
59
  size === 16 && "size-4 text-[10px]",
60
60
  size === 24 && "size-6 text-xs",
61
61
  size === 32 && "size-8 text-xs",
@@ -85,7 +85,10 @@ const AvatarRoot = React__namespace.forwardRef(
85
85
  onlineIndicator && /* @__PURE__ */ jsxRuntime.jsx(
86
86
  "span",
87
87
  {
88
- className: "absolute size-3 rounded-full border-2 border-background-150 bg-brand-green-500",
88
+ className: cn.cn(
89
+ "absolute rounded-full border-2 border-surface-container bg-brand-accent-default",
90
+ statusPosition.indicatorSize
91
+ ),
89
92
  style: {
90
93
  top: `${statusPosition.top}px`,
91
94
  right: `${statusPosition.right}px`
@@ -103,7 +106,7 @@ const AvatarImage = React__namespace.forwardRef(({ className, ...props }, ref) =
103
106
  AvatarPrimitive__namespace.Image,
104
107
  {
105
108
  ref,
106
- className: cn.cn("size-full bg-neutral-500 object-cover", NSFWShow && "blur-md", className),
109
+ className: cn.cn("size-full object-cover", NSFWShow && "blur-md", className),
107
110
  ...props
108
111
  }
109
112
  );
@@ -114,7 +117,7 @@ const AvatarFallback = React__namespace.forwardRef(({ className, children, ...pr
114
117
  {
115
118
  ref,
116
119
  className: cn.cn(
117
- "flex size-full items-center justify-center bg-neutral-500 font-semibold text-neutral-400 uppercase leading-none",
120
+ "flex size-full items-center justify-center font-semibold text-foreground-default uppercase leading-none",
118
121
  className
119
122
  ),
120
123
  delayMs: 0,
@@ -1 +1 @@
1
- {"version":3,"file":"Avatar.cjs","sources":["../../../../src/components/Avatar/Avatar.tsx"],"sourcesContent":["import * as AvatarPrimitive from \"@radix-ui/react-avatar\";\nimport * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\n/** Allowed pixel sizes for the avatar. */\nexport type AvatarSize = 16 | 24 | 32 | 40 | 48 | 64 | 88 | 148;\n\nconst AvatarContext = React.createContext<{ size: AvatarSize; NSFWShow: boolean }>({\n size: 40,\n NSFWShow: false,\n});\n\nconst STATUS_POSITIONS: Record<AvatarSize, { top: number; right: number }> = {\n 16: { top: -4, right: -4 },\n 24: { top: -3, right: -3 },\n 32: { top: -2, right: -2 },\n 40: { top: -1, right: -1 },\n 48: { top: 0, right: 0 },\n 64: { top: 2, right: 2 },\n 88: { top: 6, right: 6 },\n 148: { top: 15, right: 15 },\n};\n\n/** Shared avatar styling props. */\ninterface AvatarStyleProps {\n /** Pixel size of the avatar. @default 40 */\n size?: AvatarSize;\n /** Whether to show the online-status indicator dot. @default false */\n onlineIndicator?: boolean;\n /** Whether to show the platinum gradient border ring. @default false */\n platinumShow?: boolean;\n /** Whether to apply the NSFW blur filter over the image. @default false */\n NSFWShow?: boolean;\n}\n\n/** Props for the low-level {@link AvatarRoot} compound component. */\nexport interface AvatarRootProps\n extends React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>,\n AvatarStyleProps {}\n\n/**\n * Low-level avatar root for custom compositions. Provides size context to\n * child `AvatarImage` and `AvatarFallback` components.\n *\n * Prefer the higher-level {@link Avatar} component for most use cases.\n */\nconst AvatarRoot = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Root>,\n AvatarRootProps\n>(\n (\n {\n className,\n size = 40,\n onlineIndicator = false,\n platinumShow = false,\n NSFWShow = false,\n children,\n ...props\n },\n ref,\n ) => {\n const statusPosition = STATUS_POSITIONS[size];\n\n return (\n <AvatarContext.Provider value={{ size, NSFWShow }}>\n <div className=\"relative inline-flex\">\n <AvatarPrimitive.Root\n ref={ref}\n data-testid=\"avatar\"\n className={cn(\n \"relative inline-flex shrink-0 items-center justify-center overflow-hidden rounded-full bg-neutral-500\",\n size === 16 && \"size-4 text-[10px]\",\n size === 24 && \"size-6 text-xs\",\n size === 32 && \"size-8 text-xs\",\n size === 40 && \"size-10 text-sm\",\n size === 48 && \"size-12 text-base\",\n size === 64 && \"size-16 text-xl\",\n size === 88 && \"size-[88px] text-2xl\",\n size === 148 && \"size-[148px] text-4xl\",\n className,\n )}\n {...props}\n >\n {children}\n </AvatarPrimitive.Root>\n {platinumShow && (\n <div\n className=\"pointer-events-none absolute inset-0 rounded-full\"\n style={{\n background: `linear-gradient(143deg, #504F54 0%, #B1B1B1 20.3154%, #13181C 37.3727%, #C6C6C8 58.8154%, #FFFFFF 69.3154%, #0C0F14 81.3154%, #696A6E 100%)`,\n WebkitMask: \"radial-gradient(circle closest-side, transparent 96%, black 96%)\",\n mask: \"radial-gradient(circle closest-side, transparent 96%, black 96%)\",\n }}\n aria-hidden=\"true\"\n />\n )}\n {onlineIndicator && (\n <span\n className=\"absolute size-3 rounded-full border-2 border-background-150 bg-brand-green-500\"\n style={{\n top: `${statusPosition.top}px`,\n right: `${statusPosition.right}px`,\n }}\n aria-hidden=\"true\"\n />\n )}\n </div>\n </AvatarContext.Provider>\n );\n },\n);\n\nAvatarRoot.displayName = \"AvatarRoot\";\n\n/** Props for the {@link AvatarImage} compound component. */\nexport interface AvatarImageProps\n extends React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image> {}\n\n/** Renders the avatar image. Automatically applies the NSFW blur when enabled on the parent `AvatarRoot`. */\nconst AvatarImage = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Image>,\n AvatarImageProps\n>(({ className, ...props }, ref) => {\n const { NSFWShow } = React.useContext(AvatarContext);\n return (\n <AvatarPrimitive.Image\n ref={ref}\n className={cn(\"size-full bg-neutral-500 object-cover\", NSFWShow && \"blur-md\", className)}\n {...props}\n />\n );\n});\n\nAvatarImage.displayName = \"AvatarImage\";\n\n/** Props for the {@link AvatarFallback} compound component. */\nexport interface AvatarFallbackProps\n extends React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback> {}\n\n/** Renders fallback content (e.g. initials or an icon) when the avatar image has not loaded. */\nconst AvatarFallback = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Fallback>,\n AvatarFallbackProps\n>(({ className, children, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n ref={ref}\n className={cn(\n \"flex size-full items-center justify-center bg-neutral-500 font-semibold text-neutral-400 uppercase leading-none\",\n className,\n )}\n delayMs={0}\n {...props}\n >\n {children}\n </AvatarPrimitive.Fallback>\n));\n\nAvatarFallback.displayName = \"AvatarFallback\";\n\nexport interface AvatarProps\n extends React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>,\n AvatarStyleProps {\n /** URL of the avatar image. */\n src?: string;\n /** Alt text for the avatar image. @default \"Avatar\" */\n alt?: string;\n /** Fallback content rendered when the image has not loaded (e.g. initials or an icon). */\n fallback?: React.ReactNode;\n}\n\n/**\n * Displays a user avatar with optional online indicator, platinum border, and\n * NSFW blur. Pass `src` and `fallback` for the simple API, or compose your own\n * layout with `AvatarRoot`, `AvatarImage`, and `AvatarFallback` as children.\n *\n * @example\n * ```tsx\n * <Avatar src=\"/photo.jpg\" alt=\"Jane Doe\" fallback=\"JD\" size={48} />\n * ```\n */\nexport const Avatar = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Root>,\n AvatarProps\n>(\n (\n {\n className,\n size = 40,\n src,\n alt,\n fallback,\n onlineIndicator = false,\n platinumShow = false,\n NSFWShow = false,\n children,\n ...props\n },\n ref,\n ) => {\n const rootProps = {\n ref,\n size,\n onlineIndicator,\n platinumShow,\n NSFWShow,\n className,\n ...props,\n };\n\n if (children) {\n return <AvatarRoot {...rootProps}>{children}</AvatarRoot>;\n }\n\n return (\n <AvatarRoot {...rootProps}>\n {src && <AvatarImage src={src} alt={alt ?? \"Avatar\"} />}\n <AvatarFallback>{fallback}</AvatarFallback>\n </AvatarRoot>\n );\n },\n);\n\nAvatar.displayName = \"Avatar\";\n\nexport { AvatarRoot, AvatarImage, AvatarFallback };\n"],"names":["React","jsx","jsxs","AvatarPrimitive","cn"],"mappings":"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"}
1
+ {"version":3,"file":"Avatar.cjs","sources":["../../../../src/components/Avatar/Avatar.tsx"],"sourcesContent":["import * as AvatarPrimitive from \"@radix-ui/react-avatar\";\nimport * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\n/** Allowed pixel sizes for the avatar. */\nexport type AvatarSize = 16 | 24 | 32 | 40 | 48 | 64 | 88 | 148;\n\nconst AvatarContext = React.createContext<{ size: AvatarSize; NSFWShow: boolean }>({\n size: 40,\n NSFWShow: false,\n});\n\nconst STATUS_POSITIONS: Record<AvatarSize, { top: number; right: number; indicatorSize: string }> =\n {\n 16: { top: -2, right: -2, indicatorSize: \"size-2\" },\n 24: { top: 0, right: 0, indicatorSize: \"size-2\" },\n 32: { top: 0, right: 0, indicatorSize: \"size-2\" },\n 40: { top: 2, right: 2, indicatorSize: \"size-2\" },\n 48: { top: 5, right: 2, indicatorSize: \"size-2\" },\n 64: { top: 5, right: 1, indicatorSize: \"size-3\" },\n 88: { top: 8, right: 6, indicatorSize: \"size-3\" },\n 148: { top: 15, right: 15, indicatorSize: \"size-3\" },\n };\n\n/** Shared avatar styling props. */\ninterface AvatarStyleProps {\n /** Pixel size of the avatar. @default 40 */\n size?: AvatarSize;\n /** Whether to show the online-status indicator dot. @default false */\n onlineIndicator?: boolean;\n /** Whether to show the platinum gradient border ring. @default false */\n platinumShow?: boolean;\n /** Whether to apply the NSFW blur filter over the image. @default false */\n NSFWShow?: boolean;\n}\n\n/** Props for the low-level {@link AvatarRoot} compound component. */\nexport interface AvatarRootProps\n extends React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>,\n AvatarStyleProps {}\n\n/**\n * Low-level avatar root for custom compositions. Provides size context to\n * child `AvatarImage` and `AvatarFallback` components.\n *\n * Prefer the higher-level {@link Avatar} component for most use cases.\n */\nconst AvatarRoot = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Root>,\n AvatarRootProps\n>(\n (\n {\n className,\n size = 40,\n onlineIndicator = false,\n platinumShow = false,\n NSFWShow = false,\n children,\n ...props\n },\n ref,\n ) => {\n const statusPosition = STATUS_POSITIONS[size];\n\n return (\n <AvatarContext.Provider value={{ size, NSFWShow }}>\n <div className=\"relative inline-flex\">\n <AvatarPrimitive.Root\n ref={ref}\n data-testid=\"avatar\"\n className={cn(\n \"relative inline-flex shrink-0 items-center justify-center overflow-hidden rounded-full bg-neutral-200\",\n size === 16 && \"size-4 text-[10px]\",\n size === 24 && \"size-6 text-xs\",\n size === 32 && \"size-8 text-xs\",\n size === 40 && \"size-10 text-sm\",\n size === 48 && \"size-12 text-base\",\n size === 64 && \"size-16 text-xl\",\n size === 88 && \"size-[88px] text-2xl\",\n size === 148 && \"size-[148px] text-4xl\",\n className,\n )}\n {...props}\n >\n {children}\n </AvatarPrimitive.Root>\n {platinumShow && (\n <div\n className=\"pointer-events-none absolute inset-0 rounded-full\"\n style={{\n background: `linear-gradient(143deg, #504F54 0%, #B1B1B1 20.3154%, #13181C 37.3727%, #C6C6C8 58.8154%, #FFFFFF 69.3154%, #0C0F14 81.3154%, #696A6E 100%)`,\n WebkitMask: \"radial-gradient(circle closest-side, transparent 96%, black 96%)\",\n mask: \"radial-gradient(circle closest-side, transparent 96%, black 96%)\",\n }}\n aria-hidden=\"true\"\n />\n )}\n {onlineIndicator && (\n <span\n className={cn(\n \"absolute rounded-full border-2 border-surface-container bg-brand-accent-default\",\n statusPosition.indicatorSize,\n )}\n style={{\n top: `${statusPosition.top}px`,\n right: `${statusPosition.right}px`,\n }}\n aria-hidden=\"true\"\n />\n )}\n </div>\n </AvatarContext.Provider>\n );\n },\n);\n\nAvatarRoot.displayName = \"AvatarRoot\";\n\n/** Props for the {@link AvatarImage} compound component. */\nexport interface AvatarImageProps\n extends React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image> {}\n\n/** Renders the avatar image. Automatically applies the NSFW blur when enabled on the parent `AvatarRoot`. */\nconst AvatarImage = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Image>,\n AvatarImageProps\n>(({ className, ...props }, ref) => {\n const { NSFWShow } = React.useContext(AvatarContext);\n return (\n <AvatarPrimitive.Image\n ref={ref}\n className={cn(\"size-full object-cover\", NSFWShow && \"blur-md\", className)}\n {...props}\n />\n );\n});\n\nAvatarImage.displayName = \"AvatarImage\";\n\n/** Props for the {@link AvatarFallback} compound component. */\nexport interface AvatarFallbackProps\n extends React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback> {}\n\n/** Renders fallback content (e.g. initials or an icon) when the avatar image has not loaded. */\nconst AvatarFallback = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Fallback>,\n AvatarFallbackProps\n>(({ className, children, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n ref={ref}\n className={cn(\n \"flex size-full items-center justify-center font-semibold text-foreground-default uppercase leading-none\",\n className,\n )}\n delayMs={0}\n {...props}\n >\n {children}\n </AvatarPrimitive.Fallback>\n));\n\nAvatarFallback.displayName = \"AvatarFallback\";\n\nexport interface AvatarProps\n extends React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>,\n AvatarStyleProps {\n /** URL of the avatar image. */\n src?: string;\n /** Alt text for the avatar image. @default \"Avatar\" */\n alt?: string;\n /** Fallback content rendered when the image has not loaded (e.g. initials or an icon). */\n fallback?: React.ReactNode;\n}\n\n/**\n * Displays a user avatar with optional online indicator, platinum border, and\n * NSFW blur. Pass `src` and `fallback` for the simple API, or compose your own\n * layout with `AvatarRoot`, `AvatarImage`, and `AvatarFallback` as children.\n *\n * @example\n * ```tsx\n * <Avatar src=\"/photo.jpg\" alt=\"Jane Doe\" fallback=\"JD\" size={48} />\n * ```\n */\nexport const Avatar = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Root>,\n AvatarProps\n>(\n (\n {\n className,\n size = 40,\n src,\n alt,\n fallback,\n onlineIndicator = false,\n platinumShow = false,\n NSFWShow = false,\n children,\n ...props\n },\n ref,\n ) => {\n const rootProps = {\n ref,\n size,\n onlineIndicator,\n platinumShow,\n NSFWShow,\n className,\n ...props,\n };\n\n if (children) {\n return <AvatarRoot {...rootProps}>{children}</AvatarRoot>;\n }\n\n return (\n <AvatarRoot {...rootProps}>\n {src && <AvatarImage src={src} alt={alt ?? \"Avatar\"} />}\n <AvatarFallback>{fallback}</AvatarFallback>\n </AvatarRoot>\n );\n },\n);\n\nAvatar.displayName = \"Avatar\";\n\nexport { AvatarRoot, AvatarImage, AvatarFallback };\n"],"names":["React","jsx","jsxs","AvatarPrimitive","cn"],"mappings":"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"}
@@ -24,32 +24,32 @@ function _interopNamespaceDefault(e) {
24
24
  const React__namespace = /* @__PURE__ */ _interopNamespaceDefault(React);
25
25
  const badgeVariants = {
26
26
  variant: {
27
- default: "bg-neutral-100 text-neutral-400",
28
- dark: "bg-background-800 text-body-300 dark:text-body-white-solid-constant",
29
- success: "bg-neutral-100 text-neutral-400",
30
- warning: "bg-neutral-100 text-neutral-400",
31
- error: "bg-neutral-100 text-neutral-400",
32
- special: "bg-neutral-100 text-neutral-400",
33
- info: "bg-neutral-100 text-neutral-400",
34
- online: "bg-background-200 text-brand-green-500",
35
- brand: "bg-brand-green-500 text-body-black-solid-constant",
36
- pink: "bg-brand-pink-500 text-body-black-solid-constant",
37
- brandLight: "bg-brand-green-50 text-body-black-solid-constant",
38
- pinkLight: "bg-brand-pink-50 text-body-black-solid-constant"
27
+ default: "bg-neutral-100 text-foreground-secondary",
28
+ dark: "bg-neutral-50 text-foreground-inverse dark:text-foreground-onaccentinverse",
29
+ success: "bg-neutral-100 text-foreground-secondary",
30
+ warning: "bg-neutral-100 text-foreground-secondary",
31
+ error: "bg-neutral-100 text-foreground-secondary",
32
+ special: "bg-neutral-100 text-foreground-secondary",
33
+ info: "bg-neutral-100 text-foreground-secondary",
34
+ online: "bg-neutral-100 text-brand-accent-default",
35
+ brand: "bg-brand-accent-default text-foreground-onaccent",
36
+ pink: "bg-brand-secondary-default text-foreground-onaccent",
37
+ brandLight: "bg-brand-accent-muted text-foreground-onaccent",
38
+ pinkLight: "bg-brand-secondary-muted text-foreground-onaccent"
39
39
  },
40
40
  dotColor: {
41
- default: "bg-body-black-solid-constant",
42
- dark: "bg-body-300 dark:bg-body-white-solid-constant",
43
- success: "bg-success-500",
44
- warning: "bg-warning-500",
45
- error: "bg-error-500",
46
- special: "bg-special-500",
47
- info: "bg-info-500",
48
- online: "bg-brand-green-500",
49
- brand: "bg-body-black-solid-constant",
50
- pink: "bg-body-black-solid-constant",
51
- brandLight: "bg-body-black-solid-constant",
52
- pinkLight: "bg-body-black-solid-constant"
41
+ default: "bg-foreground-onaccent",
42
+ dark: "bg-foreground-inverse dark:bg-foreground-onaccentinverse",
43
+ success: "bg-success-default",
44
+ warning: "bg-warning-default",
45
+ error: "bg-error-default",
46
+ special: "bg-special-default",
47
+ info: "bg-info-default",
48
+ online: "bg-brand-accent-default",
49
+ brand: "bg-foreground-onaccent",
50
+ pink: "bg-foreground-onaccent",
51
+ brandLight: "bg-foreground-onaccent",
52
+ pinkLight: "bg-foreground-onaccent"
53
53
  }
54
54
  };
55
55
  const Badge = React__namespace.forwardRef(
@@ -71,7 +71,7 @@ const Badge = React__namespace.forwardRef(
71
71
  "data-testid": "badge",
72
72
  className: cn.cn(
73
73
  // Base styles
74
- "typography-caption-semibold inline-flex h-5 items-center gap-2 rounded-full px-2",
74
+ "typography-semibold-body-sm inline-flex h-5 items-center gap-2 rounded-full px-2",
75
75
  // Variant styles
76
76
  badgeVariants.variant[variant],
77
77
  // Manual CSS overrides
@@ -1 +1 @@
1
- {"version":3,"file":"Badge.cjs","sources":["../../../../src/components/Badge/Badge.tsx"],"sourcesContent":["import { Slot, Slottable } from \"@radix-ui/react-slot\";\nimport * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nconst badgeVariants = {\n variant: {\n default: \"bg-neutral-100 text-neutral-400\",\n dark: \"bg-background-800 text-body-300 dark:text-body-white-solid-constant\",\n success: \"bg-neutral-100 text-neutral-400\",\n warning: \"bg-neutral-100 text-neutral-400\",\n error: \"bg-neutral-100 text-neutral-400\",\n special: \"bg-neutral-100 text-neutral-400\",\n info: \"bg-neutral-100 text-neutral-400\",\n online: \"bg-background-200 text-brand-green-500\",\n brand: \"bg-brand-green-500 text-body-black-solid-constant\",\n pink: \"bg-brand-pink-500 text-body-black-solid-constant\",\n brandLight: \"bg-brand-green-50 text-body-black-solid-constant\",\n pinkLight: \"bg-brand-pink-50 text-body-black-solid-constant\",\n },\n dotColor: {\n default: \"bg-body-black-solid-constant\",\n dark: \"bg-body-300 dark:bg-body-white-solid-constant\",\n success: \"bg-success-500\",\n warning: \"bg-warning-500\",\n error: \"bg-error-500\",\n special: \"bg-special-500\",\n info: \"bg-info-500\",\n online: \"bg-brand-green-500\",\n brand: \"bg-body-black-solid-constant\",\n pink: \"bg-body-black-solid-constant\",\n brandLight: \"bg-body-black-solid-constant\",\n pinkLight: \"bg-body-black-solid-constant\",\n },\n} as const;\n\n/** Visual style variant of the badge. */\nexport type BadgeVariant =\n | \"default\"\n | \"dark\"\n | \"success\"\n | \"warning\"\n | \"error\"\n | \"special\"\n | \"info\"\n | \"online\"\n | \"brand\"\n | \"pink\"\n | \"brandLight\"\n | \"pinkLight\";\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n /** Visual style variant of the badge. @default \"default\" */\n variant?: BadgeVariant;\n /** Whether to show a coloured status dot at the leading edge. @default true */\n leftDot?: boolean;\n /** Icon element displayed before the label. */\n leftIcon?: React.ReactNode;\n /** Icon element displayed after the label. */\n rightIcon?: React.ReactNode;\n /** Merge props onto a child element instead of rendering a `<span>`. @default false */\n asChild?: boolean;\n}\n\n/**\n * A small inline label for status, category, or metadata information.\n *\n * @example\n * ```tsx\n * <Badge variant=\"success\">Active</Badge>\n * ```\n */\nexport const Badge = React.forwardRef<HTMLSpanElement, BadgeProps>(\n (\n {\n className,\n variant = \"default\",\n leftDot = true,\n leftIcon,\n rightIcon,\n asChild = false,\n children,\n ...props\n },\n ref,\n ) => {\n const Comp = asChild ? Slot : \"span\";\n\n return (\n <Comp\n ref={ref}\n data-testid=\"badge\"\n className={cn(\n // Base styles\n \"typography-caption-semibold inline-flex h-5 items-center gap-2 rounded-full px-2\",\n // Variant styles\n badgeVariants.variant[variant],\n // Manual CSS overrides\n className,\n )}\n {...props}\n >\n {leftIcon && (\n <span className=\"flex size-3\" aria-hidden=\"true\">\n {leftIcon}\n </span>\n )}\n {leftDot && (\n <span\n className={cn(\"size-1 shrink-0 rounded-full\", badgeVariants.dotColor[variant])}\n aria-hidden=\"true\"\n />\n )}\n <Slottable>{children}</Slottable>\n {rightIcon && (\n <span className=\"flex size-3\" aria-hidden=\"true\">\n {rightIcon}\n </span>\n )}\n </Comp>\n );\n },\n);\n\nBadge.displayName = \"Badge\";\n"],"names":["React","Slot","jsxs","cn","jsx","Slottable"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAIA,MAAM,gBAAgB;AAAA,EACpB,SAAS;AAAA,IACP,SAAS;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,IACT,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,WAAW;AAAA,EAAA;AAAA,EAEb,UAAU;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,IACT,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,WAAW;AAAA,EAAA;AAEf;AAsCO,MAAM,QAAQA,iBAAM;AAAA,EACzB,CACE;AAAA,IACE;AAAA,IACA,UAAU;AAAA,IACV,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA,GAAG;AAAA,EAAA,GAEL,QACG;AACH,UAAM,OAAO,UAAUC,UAAAA,OAAO;AAE9B,WACEC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,eAAY;AAAA,QACZ,WAAWC,GAAAA;AAAAA;AAAAA,UAET;AAAA;AAAA,UAEA,cAAc,QAAQ,OAAO;AAAA;AAAA,UAE7B;AAAA,QAAA;AAAA,QAED,GAAG;AAAA,QAEH,UAAA;AAAA,UAAA,2CACE,QAAA,EAAK,WAAU,eAAc,eAAY,QACvC,UAAA,UACH;AAAA,UAED,WACCC,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAWD,GAAAA,GAAG,gCAAgC,cAAc,SAAS,OAAO,CAAC;AAAA,cAC7E,eAAY;AAAA,YAAA;AAAA,UAAA;AAAA,UAGhBC,+BAACC,UAAAA,aAAW,UAAS;AAAA,UACpB,aACCD,2BAAAA,IAAC,QAAA,EAAK,WAAU,eAAc,eAAY,QACvC,UAAA,UAAA,CACH;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAIR;AACF;AAEA,MAAM,cAAc;;"}
1
+ {"version":3,"file":"Badge.cjs","sources":["../../../../src/components/Badge/Badge.tsx"],"sourcesContent":["import { Slot, Slottable } from \"@radix-ui/react-slot\";\nimport * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nconst badgeVariants = {\n variant: {\n default: \"bg-neutral-100 text-foreground-secondary\",\n dark: \"bg-neutral-50 text-foreground-inverse dark:text-foreground-onaccentinverse\",\n success: \"bg-neutral-100 text-foreground-secondary\",\n warning: \"bg-neutral-100 text-foreground-secondary\",\n error: \"bg-neutral-100 text-foreground-secondary\",\n special: \"bg-neutral-100 text-foreground-secondary\",\n info: \"bg-neutral-100 text-foreground-secondary\",\n online: \"bg-neutral-100 text-brand-accent-default\",\n brand: \"bg-brand-accent-default text-foreground-onaccent\",\n pink: \"bg-brand-secondary-default text-foreground-onaccent\",\n brandLight: \"bg-brand-accent-muted text-foreground-onaccent\",\n pinkLight: \"bg-brand-secondary-muted text-foreground-onaccent\",\n },\n dotColor: {\n default: \"bg-foreground-onaccent\",\n dark: \"bg-foreground-inverse dark:bg-foreground-onaccentinverse\",\n success: \"bg-success-default\",\n warning: \"bg-warning-default\",\n error: \"bg-error-default\",\n special: \"bg-special-default\",\n info: \"bg-info-default\",\n online: \"bg-brand-accent-default\",\n brand: \"bg-foreground-onaccent\",\n pink: \"bg-foreground-onaccent\",\n brandLight: \"bg-foreground-onaccent\",\n pinkLight: \"bg-foreground-onaccent\",\n },\n} as const;\n\n/** Visual style variant of the badge. */\nexport type BadgeVariant =\n | \"default\"\n | \"dark\"\n | \"success\"\n | \"warning\"\n | \"error\"\n | \"special\"\n | \"info\"\n | \"online\"\n | \"brand\"\n | \"pink\"\n | \"brandLight\"\n | \"pinkLight\";\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n /** Visual style variant of the badge. @default \"default\" */\n variant?: BadgeVariant;\n /** Whether to show a coloured status dot at the leading edge. @default true */\n leftDot?: boolean;\n /** Icon element displayed before the label. */\n leftIcon?: React.ReactNode;\n /** Icon element displayed after the label. */\n rightIcon?: React.ReactNode;\n /** Merge props onto a child element instead of rendering a `<span>`. @default false */\n asChild?: boolean;\n}\n\n/**\n * A small inline label for status, category, or metadata information.\n *\n * @example\n * ```tsx\n * <Badge variant=\"success\">Active</Badge>\n * ```\n */\nexport const Badge = React.forwardRef<HTMLSpanElement, BadgeProps>(\n (\n {\n className,\n variant = \"default\",\n leftDot = true,\n leftIcon,\n rightIcon,\n asChild = false,\n children,\n ...props\n },\n ref,\n ) => {\n const Comp = asChild ? Slot : \"span\";\n\n return (\n <Comp\n ref={ref}\n data-testid=\"badge\"\n className={cn(\n // Base styles\n \"typography-semibold-body-sm inline-flex h-5 items-center gap-2 rounded-full px-2\",\n // Variant styles\n badgeVariants.variant[variant],\n // Manual CSS overrides\n className,\n )}\n {...props}\n >\n {leftIcon && (\n <span className=\"flex size-3\" aria-hidden=\"true\">\n {leftIcon}\n </span>\n )}\n {leftDot && (\n <span\n className={cn(\"size-1 shrink-0 rounded-full\", badgeVariants.dotColor[variant])}\n aria-hidden=\"true\"\n />\n )}\n <Slottable>{children}</Slottable>\n {rightIcon && (\n <span className=\"flex size-3\" aria-hidden=\"true\">\n {rightIcon}\n </span>\n )}\n </Comp>\n );\n },\n);\n\nBadge.displayName = \"Badge\";\n"],"names":["React","Slot","jsxs","cn","jsx","Slottable"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAIA,MAAM,gBAAgB;AAAA,EACpB,SAAS;AAAA,IACP,SAAS;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,IACT,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,WAAW;AAAA,EAAA;AAAA,EAEb,UAAU;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,IACT,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,WAAW;AAAA,EAAA;AAEf;AAsCO,MAAM,QAAQA,iBAAM;AAAA,EACzB,CACE;AAAA,IACE;AAAA,IACA,UAAU;AAAA,IACV,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA,GAAG;AAAA,EAAA,GAEL,QACG;AACH,UAAM,OAAO,UAAUC,UAAAA,OAAO;AAE9B,WACEC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,eAAY;AAAA,QACZ,WAAWC,GAAAA;AAAAA;AAAAA,UAET;AAAA;AAAA,UAEA,cAAc,QAAQ,OAAO;AAAA;AAAA,UAE7B;AAAA,QAAA;AAAA,QAED,GAAG;AAAA,QAEH,UAAA;AAAA,UAAA,2CACE,QAAA,EAAK,WAAU,eAAc,eAAY,QACvC,UAAA,UACH;AAAA,UAED,WACCC,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAWD,GAAAA,GAAG,gCAAgC,cAAc,SAAS,OAAO,CAAC;AAAA,cAC7E,eAAY;AAAA,YAAA;AAAA,UAAA;AAAA,UAGhBC,+BAACC,UAAAA,aAAW,UAAS;AAAA,UACpB,aACCD,2BAAAA,IAAC,QAAA,EAAK,WAAU,eAAc,eAAY,QACvC,UAAA,UAAA,CACH;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAIR;AACF;AAEA,MAAM,cAAc;;"}
@@ -24,10 +24,10 @@ function _interopNamespaceDefault(e) {
24
24
  }
25
25
  const React__namespace = /* @__PURE__ */ _interopNamespaceDefault(React);
26
26
  const SIZE_CLASSES = {
27
- "48": "h-12 px-4 py-3 typography-button-large",
28
- "40": "h-10 px-4 py-2 typography-button-small",
29
- "32": "h-8 px-3 py-2 typography-body-2-semibold",
30
- "24": "h-6 px-2 py-1 typography-body-2-semibold"
27
+ "48": "h-12 px-4 py-3 typography-semibold-body-lg",
28
+ "40": "h-10 px-4 py-2 typography-semibold-body-lg",
29
+ "32": "h-8 px-3 py-2 typography-semibold-body-md",
30
+ "24": "h-6 px-2 py-1 typography-semibold-body-md"
31
31
  };
32
32
  const ICON_SIZE_CLASS = {
33
33
  "48": "size-5",
@@ -42,15 +42,15 @@ const ICON_WRAPPER_CLASS = {
42
42
  "24": "[&>svg]:size-3.5"
43
43
  };
44
44
  const VARIANT_CLASSES = {
45
- primary: "bg-neutral-400 text-body-300 hover:bg-brand-green-500 hover:text-body-black-solid-constant active:bg-brand-green-500 active:text-body-black-solid-constant",
46
- secondary: "border-body-100 border border-1 border-body-100 bg-transparent text-body-100 hover:bg-brand-green-50 active:bg-brand-green-50",
47
- tertiary: "bg-transparent text-body-100 hover:bg-brand-green-50 active:bg-brand-green-50",
48
- link: "bg-transparent text-body-100 underline decoration-solid hover:bg-brand-green-50 active:bg-brand-green-50",
49
- brand: "bg-brand-green-500 text-body-black-solid-constant hover:bg-brand-pink-500 active:bg-brand-pink-500",
50
- destructive: "bg-error-500 text-body-white-solid-constant hover:bg-background-solid dark:hover:bg-background-white-solid-constant dark:hover:text-error-500 active:bg-background-solid dark:active:bg-background-white-solid-constant dark:active:text-error-500",
51
- white: "bg-background-white-solid-constant text-body-black-solid-constant hover:bg-brand-green-500 active:bg-brand-green-500",
52
- tertiaryDestructive: "bg-transparent text-error-500 hover:bg-error-50 active:bg-error-50",
53
- text: "bg-transparent text-body-100 hover:underline active:underline"
45
+ primary: "bg-neutral-solid text-foreground-inverse hover:bg-brand-accent-muted hover:text-foreground-default active:bg-brand-accent-muted active:text-foreground-default",
46
+ secondary: "border-foreground-default border border-1 border-foreground-default bg-transparent text-foreground-default hover:bg-brand-accent-muted active:bg-brand-accent-muted",
47
+ tertiary: "bg-transparent text-foreground-default hover:bg-brand-accent-muted active:bg-brand-accent-muted",
48
+ link: "bg-transparent text-foreground-default underline decoration-solid hover:bg-brand-accent-muted active:bg-brand-accent-muted",
49
+ brand: "bg-brand-accent-default text-foreground-onaccent hover:bg-brand-accent-muted hover:text-foreground-default active:bg-brand-accent-muted active:text-foreground-default",
50
+ destructive: "bg-error-default text-foreground-onaccentinverse hover:bg-brand-accent-muted hover:text-foreground-default active:bg-brand-accent-muted active:text-foreground-default",
51
+ white: "bg-foreground-onaccentinverse text-foreground-onaccent hover:bg-brand-accent-muted hover:text-foreground-default active:bg-brand-accent-muted active:text-foreground-default",
52
+ tertiaryDestructive: "bg-transparent text-error-default hover:bg-error-background active:bg-error-background",
53
+ text: "bg-transparent text-foreground-default hover:underline active:underline"
54
54
  };
55
55
  function getTextContent(node) {
56
56
  if (typeof node === "string") return node;
@@ -111,7 +111,7 @@ function renderContent({
111
111
  }
112
112
  ),
113
113
  (price || discount) && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
114
- discount && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typography-body-1-regular line-through", "aria-hidden": "true", children: discount }),
114
+ discount && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typography-regular-body-lg line-through", "aria-hidden": "true", children: discount }),
115
115
  price && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-2", "aria-hidden": "true", children: price })
116
116
  ] })
117
117
  ] });