@intlayer/design-system 6.1.5 → 6.1.6

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 (336) hide show
  1. package/dist/.vite/manifest.json +13 -9
  2. package/dist/Form-CriPBaZk.js.map +1 -1
  3. package/dist/Form-DJrUK3mm.cjs.map +1 -1
  4. package/dist/components/Accordion/Accordion.cjs +51 -15
  5. package/dist/components/Accordion/Accordion.cjs.map +1 -1
  6. package/dist/components/Accordion/Accordion.d.ts +44 -5
  7. package/dist/components/Accordion/Accordion.d.ts.map +1 -1
  8. package/dist/components/Accordion/Accordion.mjs +52 -16
  9. package/dist/components/Accordion/Accordion.mjs.map +1 -1
  10. package/dist/components/Avatar/index.cjs +114 -31
  11. package/dist/components/Avatar/index.cjs.map +1 -1
  12. package/dist/components/Avatar/index.d.ts +46 -2
  13. package/dist/components/Avatar/index.d.ts.map +1 -1
  14. package/dist/components/Avatar/index.mjs +115 -32
  15. package/dist/components/Avatar/index.mjs.map +1 -1
  16. package/dist/components/Badge/index.cjs +88 -9
  17. package/dist/components/Badge/index.cjs.map +1 -1
  18. package/dist/components/Badge/index.d.ts +80 -2
  19. package/dist/components/Badge/index.d.ts.map +1 -1
  20. package/dist/components/Badge/index.mjs +89 -10
  21. package/dist/components/Badge/index.mjs.map +1 -1
  22. package/dist/components/Breadcrumb/index.cjs +124 -59
  23. package/dist/components/Breadcrumb/index.cjs.map +1 -1
  24. package/dist/components/Breadcrumb/index.d.ts +89 -5
  25. package/dist/components/Breadcrumb/index.d.ts.map +1 -1
  26. package/dist/components/Breadcrumb/index.mjs +124 -59
  27. package/dist/components/Breadcrumb/index.mjs.map +1 -1
  28. package/dist/components/Button/Button.cjs +44 -25
  29. package/dist/components/Button/Button.cjs.map +1 -1
  30. package/dist/components/Button/Button.d.ts +95 -1
  31. package/dist/components/Button/Button.d.ts.map +1 -1
  32. package/dist/components/Button/Button.mjs +44 -25
  33. package/dist/components/Button/Button.mjs.map +1 -1
  34. package/dist/components/ClickOutsideDiv/index.cjs +38 -7
  35. package/dist/components/ClickOutsideDiv/index.cjs.map +1 -1
  36. package/dist/components/ClickOutsideDiv/index.d.ts +13 -0
  37. package/dist/components/ClickOutsideDiv/index.d.ts.map +1 -1
  38. package/dist/components/ClickOutsideDiv/index.mjs +39 -8
  39. package/dist/components/ClickOutsideDiv/index.mjs.map +1 -1
  40. package/dist/components/Container/index.cjs +2 -0
  41. package/dist/components/Container/index.cjs.map +1 -1
  42. package/dist/components/Container/index.d.ts +42 -0
  43. package/dist/components/Container/index.d.ts.map +1 -1
  44. package/dist/components/Container/index.mjs +2 -0
  45. package/dist/components/Container/index.mjs.map +1 -1
  46. package/dist/components/ContentEditor/ContentEditor.cjs +80 -33
  47. package/dist/components/ContentEditor/ContentEditor.cjs.map +1 -1
  48. package/dist/components/ContentEditor/ContentEditor.d.ts +29 -0
  49. package/dist/components/ContentEditor/ContentEditor.d.ts.map +1 -1
  50. package/dist/components/ContentEditor/ContentEditor.mjs +80 -33
  51. package/dist/components/ContentEditor/ContentEditor.mjs.map +1 -1
  52. package/dist/components/ContentEditor/ContentEditorInput.cjs +58 -31
  53. package/dist/components/ContentEditor/ContentEditorInput.cjs.map +1 -1
  54. package/dist/components/ContentEditor/ContentEditorInput.d.ts +33 -0
  55. package/dist/components/ContentEditor/ContentEditorInput.d.ts.map +1 -1
  56. package/dist/components/ContentEditor/ContentEditorInput.mjs +58 -31
  57. package/dist/components/ContentEditor/ContentEditorInput.mjs.map +1 -1
  58. package/dist/components/ContentEditor/ContentEditorTextArea.cjs +58 -30
  59. package/dist/components/ContentEditor/ContentEditorTextArea.cjs.map +1 -1
  60. package/dist/components/ContentEditor/ContentEditorTextArea.d.ts +35 -0
  61. package/dist/components/ContentEditor/ContentEditorTextArea.d.ts.map +1 -1
  62. package/dist/components/ContentEditor/ContentEditorTextArea.mjs +59 -31
  63. package/dist/components/ContentEditor/ContentEditorTextArea.mjs.map +1 -1
  64. package/dist/components/ContentEditor/index.cjs +4 -0
  65. package/dist/components/ContentEditor/index.cjs.map +1 -1
  66. package/dist/components/ContentEditor/index.d.ts +2 -0
  67. package/dist/components/ContentEditor/index.d.ts.map +1 -1
  68. package/dist/components/ContentEditor/index.mjs +5 -1
  69. package/dist/components/ContentEditor/index.mjs.map +1 -1
  70. package/dist/components/ContentSelector/ContentSelector.cjs +9 -1
  71. package/dist/components/ContentSelector/ContentSelector.cjs.map +1 -1
  72. package/dist/components/ContentSelector/ContentSelector.d.ts +167 -0
  73. package/dist/components/ContentSelector/ContentSelector.d.ts.map +1 -1
  74. package/dist/components/ContentSelector/ContentSelector.mjs +9 -1
  75. package/dist/components/ContentSelector/ContentSelector.mjs.map +1 -1
  76. package/dist/components/CopyButton/index.cjs +23 -8
  77. package/dist/components/CopyButton/index.cjs.map +1 -1
  78. package/dist/components/CopyButton/index.d.ts +78 -0
  79. package/dist/components/CopyButton/index.d.ts.map +1 -1
  80. package/dist/components/CopyButton/index.mjs +23 -8
  81. package/dist/components/CopyButton/index.mjs.map +1 -1
  82. package/dist/components/CopyToClipboard/index.cjs +58 -22
  83. package/dist/components/CopyToClipboard/index.cjs.map +1 -1
  84. package/dist/components/CopyToClipboard/index.d.ts +68 -2
  85. package/dist/components/CopyToClipboard/index.d.ts.map +1 -1
  86. package/dist/components/CopyToClipboard/index.mjs +59 -23
  87. package/dist/components/CopyToClipboard/index.mjs.map +1 -1
  88. package/dist/components/DictionaryFieldEditor/DictionaryFieldEditor.cjs +4 -2
  89. package/dist/components/DictionaryFieldEditor/DictionaryFieldEditor.cjs.map +1 -1
  90. package/dist/components/DictionaryFieldEditor/DictionaryFieldEditor.d.ts +1 -0
  91. package/dist/components/DictionaryFieldEditor/DictionaryFieldEditor.d.ts.map +1 -1
  92. package/dist/components/DictionaryFieldEditor/DictionaryFieldEditor.mjs +4 -2
  93. package/dist/components/DictionaryFieldEditor/DictionaryFieldEditor.mjs.map +1 -1
  94. package/dist/components/DictionaryFieldEditor/NavigationView/NavigationViewNode.cjs +2 -2
  95. package/dist/components/DictionaryFieldEditor/NavigationView/NavigationViewNode.cjs.map +1 -1
  96. package/dist/components/DictionaryFieldEditor/NavigationView/NavigationViewNode.mjs +2 -2
  97. package/dist/components/DictionaryFieldEditor/NavigationView/NavigationViewNode.mjs.map +1 -1
  98. package/dist/components/DictionaryFieldEditor/SaveForm/SaveForm.cjs +3 -0
  99. package/dist/components/DictionaryFieldEditor/SaveForm/SaveForm.cjs.map +1 -1
  100. package/dist/components/DictionaryFieldEditor/SaveForm/SaveForm.d.ts +1 -0
  101. package/dist/components/DictionaryFieldEditor/SaveForm/SaveForm.d.ts.map +1 -1
  102. package/dist/components/DictionaryFieldEditor/SaveForm/SaveForm.mjs +3 -0
  103. package/dist/components/DictionaryFieldEditor/SaveForm/SaveForm.mjs.map +1 -1
  104. package/dist/components/DropDown/index.cjs +6 -4
  105. package/dist/components/DropDown/index.cjs.map +1 -1
  106. package/dist/components/DropDown/index.d.ts +92 -15
  107. package/dist/components/DropDown/index.d.ts.map +1 -1
  108. package/dist/components/DropDown/index.mjs +6 -4
  109. package/dist/components/DropDown/index.mjs.map +1 -1
  110. package/dist/components/EditableField/EditableFieldInput.cjs.map +1 -1
  111. package/dist/components/EditableField/EditableFieldInput.d.ts +38 -0
  112. package/dist/components/EditableField/EditableFieldInput.d.ts.map +1 -1
  113. package/dist/components/EditableField/EditableFieldInput.mjs.map +1 -1
  114. package/dist/components/EditableField/EditableFieldLayout.cjs +10 -2
  115. package/dist/components/EditableField/EditableFieldLayout.cjs.map +1 -1
  116. package/dist/components/EditableField/EditableFieldLayout.d.ts.map +1 -1
  117. package/dist/components/EditableField/EditableFieldLayout.mjs +10 -2
  118. package/dist/components/EditableField/EditableFieldLayout.mjs.map +1 -1
  119. package/dist/components/EditableField/EditableFieldTextArea.cjs.map +1 -1
  120. package/dist/components/EditableField/EditableFieldTextArea.d.ts +42 -0
  121. package/dist/components/EditableField/EditableFieldTextArea.d.ts.map +1 -1
  122. package/dist/components/EditableField/EditableFieldTextArea.mjs.map +1 -1
  123. package/dist/components/ExpandCollapse/ExpandCollapse.cjs.map +1 -1
  124. package/dist/components/ExpandCollapse/ExpandCollapse.d.ts +58 -0
  125. package/dist/components/ExpandCollapse/ExpandCollapse.d.ts.map +1 -1
  126. package/dist/components/ExpandCollapse/ExpandCollapse.mjs.map +1 -1
  127. package/dist/components/Footer/index.cjs.map +1 -1
  128. package/dist/components/Footer/index.d.ts +101 -0
  129. package/dist/components/Footer/index.d.ts.map +1 -1
  130. package/dist/components/Footer/index.mjs.map +1 -1
  131. package/dist/components/Form/elements/MultiselectElement.d.ts.map +1 -1
  132. package/dist/components/Form/elements/SelectElement.d.ts.map +1 -1
  133. package/dist/components/Form/elements/SwitchSelectorElement.d.ts.map +1 -1
  134. package/dist/components/Headers/index.cjs.map +1 -1
  135. package/dist/components/Headers/index.d.ts +69 -2
  136. package/dist/components/Headers/index.d.ts.map +1 -1
  137. package/dist/components/Headers/index.mjs.map +1 -1
  138. package/dist/components/HeightResizer/index.cjs +10 -7
  139. package/dist/components/HeightResizer/index.cjs.map +1 -1
  140. package/dist/components/HeightResizer/index.d.ts +89 -0
  141. package/dist/components/HeightResizer/index.d.ts.map +1 -1
  142. package/dist/components/HeightResizer/index.mjs +10 -7
  143. package/dist/components/HeightResizer/index.mjs.map +1 -1
  144. package/dist/components/InformationTag/index.cjs.map +1 -1
  145. package/dist/components/InformationTag/index.d.ts +72 -0
  146. package/dist/components/InformationTag/index.d.ts.map +1 -1
  147. package/dist/components/InformationTag/index.mjs.map +1 -1
  148. package/dist/components/KeyboardScreenAdapter/index.cjs.map +1 -1
  149. package/dist/components/KeyboardScreenAdapter/index.d.ts +100 -0
  150. package/dist/components/KeyboardScreenAdapter/index.d.ts.map +1 -1
  151. package/dist/components/KeyboardScreenAdapter/index.mjs.map +1 -1
  152. package/dist/components/Label/index.cjs +25 -3
  153. package/dist/components/Label/index.cjs.map +1 -1
  154. package/dist/components/Label/index.d.ts +65 -1
  155. package/dist/components/Label/index.d.ts.map +1 -1
  156. package/dist/components/Label/index.mjs +26 -4
  157. package/dist/components/Label/index.mjs.map +1 -1
  158. package/dist/components/Link/Link.cjs +0 -4
  159. package/dist/components/Link/Link.cjs.map +1 -1
  160. package/dist/components/Link/Link.d.ts +169 -0
  161. package/dist/components/Link/Link.d.ts.map +1 -1
  162. package/dist/components/Link/Link.mjs +0 -4
  163. package/dist/components/Link/Link.mjs.map +1 -1
  164. package/dist/components/Loader/index.cjs.map +1 -1
  165. package/dist/components/Loader/index.d.ts +82 -11
  166. package/dist/components/Loader/index.d.ts.map +1 -1
  167. package/dist/components/Loader/index.mjs.map +1 -1
  168. package/dist/components/Loader/spinner.cjs.map +1 -1
  169. package/dist/components/Loader/spinner.d.ts +56 -0
  170. package/dist/components/Loader/spinner.d.ts.map +1 -1
  171. package/dist/components/Loader/spinner.mjs.map +1 -1
  172. package/dist/components/MarkDownRender/MarkDownRender.cjs +0 -1
  173. package/dist/components/MarkDownRender/MarkDownRender.cjs.map +1 -1
  174. package/dist/components/MarkDownRender/MarkDownRender.d.ts +147 -0
  175. package/dist/components/MarkDownRender/MarkDownRender.d.ts.map +1 -1
  176. package/dist/components/MarkDownRender/MarkDownRender.mjs +0 -1
  177. package/dist/components/MarkDownRender/MarkDownRender.mjs.map +1 -1
  178. package/dist/components/MarkDownRender/processor.cjs +12 -9
  179. package/dist/components/MarkDownRender/processor.cjs.map +1 -1
  180. package/dist/components/MarkDownRender/processor.d.ts.map +1 -1
  181. package/dist/components/MarkDownRender/processor.mjs +12 -9
  182. package/dist/components/MarkDownRender/processor.mjs.map +1 -1
  183. package/dist/components/MaxHeightSmoother/index.cjs.map +1 -1
  184. package/dist/components/MaxHeightSmoother/index.d.ts +152 -0
  185. package/dist/components/MaxHeightSmoother/index.d.ts.map +1 -1
  186. package/dist/components/MaxHeightSmoother/index.mjs.map +1 -1
  187. package/dist/components/Modal/Modal.cjs +5 -0
  188. package/dist/components/Modal/Modal.cjs.map +1 -1
  189. package/dist/components/Modal/Modal.d.ts +81 -3
  190. package/dist/components/Modal/Modal.d.ts.map +1 -1
  191. package/dist/components/Modal/Modal.mjs +5 -0
  192. package/dist/components/Modal/Modal.mjs.map +1 -1
  193. package/dist/components/Navbar/Burger.cjs.map +1 -1
  194. package/dist/components/Navbar/Burger.d.ts +54 -0
  195. package/dist/components/Navbar/Burger.d.ts.map +1 -1
  196. package/dist/components/Navbar/Burger.mjs.map +1 -1
  197. package/dist/components/Navbar/DesktopNavbar.cjs.map +1 -1
  198. package/dist/components/Navbar/DesktopNavbar.d.ts +78 -0
  199. package/dist/components/Navbar/DesktopNavbar.d.ts.map +1 -1
  200. package/dist/components/Navbar/DesktopNavbar.mjs.map +1 -1
  201. package/dist/components/Navbar/MobileNavbar.cjs.map +1 -1
  202. package/dist/components/Navbar/MobileNavbar.d.ts +88 -0
  203. package/dist/components/Navbar/MobileNavbar.d.ts.map +1 -1
  204. package/dist/components/Navbar/MobileNavbar.mjs.map +1 -1
  205. package/dist/components/Navbar/index.cjs.map +1 -1
  206. package/dist/components/Navbar/index.d.ts +69 -0
  207. package/dist/components/Navbar/index.d.ts.map +1 -1
  208. package/dist/components/Navbar/index.mjs.map +1 -1
  209. package/dist/components/Navbar/useNavigation.cjs +8 -1
  210. package/dist/components/Navbar/useNavigation.cjs.map +1 -1
  211. package/dist/components/Navbar/useNavigation.d.ts +83 -0
  212. package/dist/components/Navbar/useNavigation.d.ts.map +1 -1
  213. package/dist/components/Navbar/useNavigation.mjs +8 -1
  214. package/dist/components/Navbar/useNavigation.mjs.map +1 -1
  215. package/dist/components/Pattern/DotPattern.cjs.map +1 -1
  216. package/dist/components/Pattern/DotPattern.d.ts +101 -0
  217. package/dist/components/Pattern/DotPattern.d.ts.map +1 -1
  218. package/dist/components/Pattern/DotPattern.mjs.map +1 -1
  219. package/dist/components/Pattern/GridPattern.cjs.map +1 -1
  220. package/dist/components/Pattern/GridPattern.d.ts +114 -0
  221. package/dist/components/Pattern/GridPattern.d.ts.map +1 -1
  222. package/dist/components/Pattern/GridPattern.mjs.map +1 -1
  223. package/dist/components/Pattern/SpotLight.cjs.map +1 -1
  224. package/dist/components/Pattern/SpotLight.d.ts +125 -0
  225. package/dist/components/Pattern/SpotLight.d.ts.map +1 -1
  226. package/dist/components/Pattern/SpotLight.mjs.map +1 -1
  227. package/dist/components/Popover/index.cjs +10 -10
  228. package/dist/components/Popover/index.cjs.map +1 -1
  229. package/dist/components/Popover/index.d.ts +110 -15
  230. package/dist/components/Popover/index.d.ts.map +1 -1
  231. package/dist/components/Popover/index.mjs +10 -10
  232. package/dist/components/Popover/index.mjs.map +1 -1
  233. package/dist/components/PressableSpan/PressableSpan.cjs +22 -5
  234. package/dist/components/PressableSpan/PressableSpan.cjs.map +1 -1
  235. package/dist/components/PressableSpan/PressableSpan.d.ts +105 -3
  236. package/dist/components/PressableSpan/PressableSpan.d.ts.map +1 -1
  237. package/dist/components/PressableSpan/PressableSpan.mjs +22 -5
  238. package/dist/components/PressableSpan/PressableSpan.mjs.map +1 -1
  239. package/dist/components/RightDrawer/RightDrawer.cjs.map +1 -1
  240. package/dist/components/RightDrawer/RightDrawer.d.ts +182 -0
  241. package/dist/components/RightDrawer/RightDrawer.d.ts.map +1 -1
  242. package/dist/components/RightDrawer/RightDrawer.mjs.map +1 -1
  243. package/dist/components/RightDrawer/isElementAtTopAndNotCovered.cjs.map +1 -1
  244. package/dist/components/RightDrawer/isElementAtTopAndNotCovered.d.ts +44 -0
  245. package/dist/components/RightDrawer/isElementAtTopAndNotCovered.d.ts.map +1 -1
  246. package/dist/components/RightDrawer/isElementAtTopAndNotCovered.mjs.map +1 -1
  247. package/dist/components/RightDrawer/useRightDrawerStore.cjs.map +1 -1
  248. package/dist/components/RightDrawer/useRightDrawerStore.d.ts +102 -0
  249. package/dist/components/RightDrawer/useRightDrawerStore.d.ts.map +1 -1
  250. package/dist/components/RightDrawer/useRightDrawerStore.mjs.map +1 -1
  251. package/dist/components/Select/Multiselect.cjs.map +1 -1
  252. package/dist/components/Select/Multiselect.d.ts +125 -18
  253. package/dist/components/Select/Multiselect.d.ts.map +1 -1
  254. package/dist/components/Select/Multiselect.mjs.map +1 -1
  255. package/dist/components/Select/Select.cjs.map +1 -1
  256. package/dist/components/Select/Select.d.ts +214 -7
  257. package/dist/components/Select/Select.d.ts.map +1 -1
  258. package/dist/components/Select/Select.mjs.map +1 -1
  259. package/dist/components/SwitchSelector/index.cjs.map +1 -1
  260. package/dist/components/SwitchSelector/index.d.ts +157 -8
  261. package/dist/components/SwitchSelector/index.d.ts.map +1 -1
  262. package/dist/components/SwitchSelector/index.mjs.map +1 -1
  263. package/dist/components/Table/Table.cjs.map +1 -1
  264. package/dist/components/Table/Table.d.ts +184 -0
  265. package/dist/components/Table/Table.d.ts.map +1 -1
  266. package/dist/components/Table/Table.mjs.map +1 -1
  267. package/dist/components/Tag/index.cjs.map +1 -1
  268. package/dist/components/Tag/index.d.ts +223 -0
  269. package/dist/components/Tag/index.d.ts.map +1 -1
  270. package/dist/components/Tag/index.mjs.map +1 -1
  271. package/dist/components/TextArea/AutoSizeTextArea.cjs.map +1 -1
  272. package/dist/components/TextArea/AutoSizeTextArea.d.ts +91 -0
  273. package/dist/components/TextArea/AutoSizeTextArea.d.ts.map +1 -1
  274. package/dist/components/TextArea/AutoSizeTextArea.mjs.map +1 -1
  275. package/dist/components/TextArea/AutocompleteTextArea.cjs.map +1 -1
  276. package/dist/components/TextArea/AutocompleteTextArea.d.ts +145 -0
  277. package/dist/components/TextArea/AutocompleteTextArea.d.ts.map +1 -1
  278. package/dist/components/TextArea/AutocompleteTextArea.mjs.map +1 -1
  279. package/dist/components/TextArea/TextArea.cjs.map +1 -1
  280. package/dist/components/TextArea/TextArea.d.ts +74 -0
  281. package/dist/components/TextArea/TextArea.d.ts.map +1 -1
  282. package/dist/components/TextArea/TextArea.mjs.map +1 -1
  283. package/dist/components/Toaster/Toast.cjs +4 -0
  284. package/dist/components/Toaster/Toast.cjs.map +1 -1
  285. package/dist/components/Toaster/Toast.d.ts +148 -2
  286. package/dist/components/Toaster/Toast.d.ts.map +1 -1
  287. package/dist/components/Toaster/Toast.mjs +4 -0
  288. package/dist/components/Toaster/Toast.mjs.map +1 -1
  289. package/dist/components/Toaster/Toaster.cjs.map +1 -1
  290. package/dist/components/Toaster/Toaster.d.ts +42 -0
  291. package/dist/components/Toaster/Toaster.d.ts.map +1 -1
  292. package/dist/components/Toaster/Toaster.mjs.map +1 -1
  293. package/dist/components/Toaster/useToast.cjs.map +1 -1
  294. package/dist/components/Toaster/useToast.d.ts +199 -2
  295. package/dist/components/Toaster/useToast.d.ts.map +1 -1
  296. package/dist/components/Toaster/useToast.mjs.map +1 -1
  297. package/dist/components/WithResizer/index.cjs.map +1 -1
  298. package/dist/components/WithResizer/index.d.ts +143 -0
  299. package/dist/components/WithResizer/index.d.ts.map +1 -1
  300. package/dist/components/WithResizer/index.mjs.map +1 -1
  301. package/dist/components/index.cjs +2 -2
  302. package/dist/components/index.d.ts +0 -1
  303. package/dist/components/index.d.ts.map +1 -1
  304. package/dist/components/index.mjs +4 -4
  305. package/dist/components/index.mjs.map +1 -1
  306. package/dist/hooks/auth.cjs +2 -2
  307. package/dist/hooks/auth.cjs.map +1 -1
  308. package/dist/hooks/auth.mjs +2 -2
  309. package/dist/hooks/auth.mjs.map +1 -1
  310. package/dist/hooks/reactQuery.cjs +2 -1
  311. package/dist/hooks/reactQuery.cjs.map +1 -1
  312. package/dist/hooks/reactQuery.d.ts +1 -1
  313. package/dist/hooks/reactQuery.d.ts.map +1 -1
  314. package/dist/hooks/reactQuery.mjs +2 -1
  315. package/dist/hooks/reactQuery.mjs.map +1 -1
  316. package/dist/hooks/useAuth/useOAuth2.cjs +3 -3
  317. package/dist/hooks/useAuth/useOAuth2.cjs.map +1 -1
  318. package/dist/hooks/useAuth/useOAuth2.mjs +3 -3
  319. package/dist/hooks/useAuth/useOAuth2.mjs.map +1 -1
  320. package/dist/hooks/useAuth/useSession.cjs +3 -3
  321. package/dist/hooks/useAuth/useSession.cjs.map +1 -1
  322. package/dist/hooks/useAuth/useSession.mjs +3 -3
  323. package/dist/hooks/useAuth/useSession.mjs.map +1 -1
  324. package/dist/utils/image.cjs +30 -0
  325. package/dist/utils/image.cjs.map +1 -0
  326. package/dist/utils/image.d.ts +37 -0
  327. package/dist/utils/image.d.ts.map +1 -0
  328. package/dist/utils/image.mjs +30 -0
  329. package/dist/utils/image.mjs.map +1 -0
  330. package/package.json +20 -18
  331. package/dist/utils/capitalize.cjs +0 -10
  332. package/dist/utils/capitalize.cjs.map +0 -1
  333. package/dist/utils/capitalize.d.ts +0 -2
  334. package/dist/utils/capitalize.d.ts.map +0 -1
  335. package/dist/utils/capitalize.mjs +0 -10
  336. package/dist/utils/capitalize.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Accordion.mjs","sources":["../../../src/components/Accordion/Accordion.tsx"],"sourcesContent":["'use client';\n\nimport { ChevronDown } from 'lucide-react';\nimport { useEffect, useState, type FC, type ReactNode } from 'react';\nimport { cn } from '../../utils/cn';\nimport {\n Button,\n ButtonColor,\n ButtonVariant,\n type ButtonProps,\n} from '../Button';\nimport { MaxHeightSmoother } from '../MaxHeightSmoother';\n\ntype AccordionProps = {\n header: ReactNode;\n children: ReactNode;\n isOpen?: boolean;\n} & ButtonProps;\n\n/**\n * Accordion component that allows the user to expand and collapse content.\n * It provides a header with a chevron icon that controls the visibility of the content.\n *\n * @param header - The content of the header.\n * @param children - The content to be expanded and collapsed.\n * @param isOpen - Whether the content is expanded or collapsed by default.\n *\n * @example\n * <Accordion header=\"Accordion Header\" isOpen={true}>\n * <p>Accordion content</p>\n * </Accordion>\n *\n */\nexport const Accordion: FC<AccordionProps> = ({\n children,\n header,\n isOpen: isOpenDefault = false,\n onClick,\n ...props\n}) => {\n const [isOpen, setIsOpen] = useState(isOpenDefault);\n const isHidden = isOpen == undefined ? undefined : !isOpen;\n\n useEffect(() => {\n if (isOpenDefault != undefined) {\n setIsOpen(isOpenDefault);\n }\n }, [isOpenDefault]);\n\n return (\n <div className=\"w-full\">\n <Button\n variant={ButtonVariant.HOVERABLE}\n color={ButtonColor.TEXT}\n onClick={(e) => {\n setIsOpen((prevIsOpen) => !prevIsOpen);\n onClick?.(e);\n }}\n isFullWidth\n className=\"flex items-center justify-between gap-2\"\n IconRight={ChevronDown}\n iconClassName={cn(\n 'transform transition-transform duration-500 ease-in-out',\n isOpen ? 'rotate-0' : '-rotate-180'\n )}\n {...props}\n >\n {header}\n </Button>\n\n <MaxHeightSmoother\n tabIndex={isHidden !== false ? undefined : -1}\n isHidden={isHidden}\n >\n {children}\n </MaxHeightSmoother>\n </div>\n );\n};\n"],"names":[],"mappings":";;;;;;;AAiCO,MAAM,YAAgC,CAAC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA,QAAQ,gBAAgB;AAAA,EACxB;AAAA,EACA,GAAG;AACL,MAAM;AACJ,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,aAAa;AAClD,QAAM,WAAW,UAAU,SAAY,SAAY,CAAC;AAEpD,YAAU,MAAM;AACd,QAAI,iBAAiB,QAAW;AAC9B,gBAAU,aAAa;AAAA,IACzB;AAAA,EACF,GAAG,CAAC,aAAa,CAAC;AAElB,SACE,qBAAC,OAAA,EAAI,WAAU,UACb,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAAS,cAAc;AAAA,QACvB,OAAO,YAAY;AAAA,QACnB,SAAS,CAAC,MAAM;AACd,oBAAU,CAAC,eAAe,CAAC,UAAU;AACrC,oBAAU,CAAC;AAAA,QACb;AAAA,QACA,aAAW;AAAA,QACX,WAAU;AAAA,QACV,WAAW;AAAA,QACX,eAAe;AAAA,UACb;AAAA,UACA,SAAS,aAAa;AAAA,QAAA;AAAA,QAEvB,GAAG;AAAA,QAEH,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAGH;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,UAAU,aAAa,QAAQ,SAAY;AAAA,QAC3C;AAAA,QAEC;AAAA,MAAA;AAAA,IAAA;AAAA,EACH,GACF;AAEJ;"}
1
+ {"version":3,"file":"Accordion.mjs","sources":["../../../src/components/Accordion/Accordion.tsx"],"sourcesContent":["'use client';\n\nimport { ChevronDown } from 'lucide-react';\nimport {\n useCallback,\n useState,\n type FC,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { cn } from '../../utils/cn';\nimport {\n Button,\n ButtonColor,\n ButtonVariant,\n type ButtonProps,\n} from '../Button';\nimport { MaxHeightSmoother } from '../MaxHeightSmoother';\n\nexport interface AccordionProps\n extends Omit<ButtonProps, 'children' | 'onToggle'> {\n /** The content displayed in the accordion header */\n header: ReactNode;\n /** The collapsible content inside the accordion */\n children: ReactNode;\n /** Controls whether the accordion is open (controlled mode) */\n isOpen?: boolean;\n /** Default open state (uncontrolled mode) */\n defaultIsOpen?: boolean;\n /** Called when the accordion state changes */\n onToggle?: (isOpen: boolean) => void;\n /** Disable the accordion interaction */\n disabled?: boolean;\n /** Custom class for the content container */\n contentClassName?: string;\n /** Custom class for the header container */\n headerClassName?: string;\n /** Accessible label for screen readers */\n 'aria-label'?: string;\n /** ID for the accordion content (for aria-controls) */\n contentId?: string;\n}\n\n/**\n * Accordion component that allows the user to expand and collapse content.\n * It provides a header with a chevron icon that controls the visibility of the content.\n *\n * Features:\n * - Supports both controlled and uncontrolled modes\n * - Accessible with proper ARIA attributes\n * - Keyboard navigation support\n * - Smooth animations for expand/collapse\n * - Customizable styling\n *\n * @param header - The content of the header.\n * @param children - The content to be expanded and collapsed.\n * @param isOpen - Controlled state for whether the content is expanded.\n * @param defaultIsOpen - Default open state for uncontrolled mode.\n * @param onToggle - Callback when the accordion state changes.\n * @param disabled - Whether the accordion is disabled.\n * @param contentClassName - Custom class for the content container.\n * @param headerClassName - Custom class for the header.\n * @param contentId - ID for the content (used for aria-controls).\n *\n * @example\n * // Uncontrolled mode\n * <Accordion header=\"Accordion Header\" defaultIsOpen={true}>\n * <p>Accordion content</p>\n * </Accordion>\n *\n * @example\n * // Controlled mode\n * <Accordion\n * header=\"Controlled Accordion\"\n * isOpen={isOpen}\n * onToggle={setIsOpen}\n * >\n * <p>Controlled content</p>\n * </Accordion>\n */\nexport const Accordion: FC<AccordionProps> = ({\n children,\n header,\n isOpen,\n defaultIsOpen = false,\n onToggle,\n onClick,\n disabled = false,\n contentClassName,\n headerClassName,\n contentId,\n 'aria-label': ariaLabel,\n ...props\n}) => {\n // Determine if we're in controlled or uncontrolled mode\n const isControlled = isOpen !== undefined;\n const [internalIsOpen, setInternalIsOpen] = useState(defaultIsOpen);\n\n // Use controlled value if provided, otherwise use internal state\n const isExpandedState = isControlled ? isOpen : internalIsOpen;\n const isHidden = !isExpandedState;\n\n // Generate unique ID for content if not provided\n const generatedContentId =\n contentId || `accordion-content-${Math.random().toString(36).substr(2, 9)}`;\n\n const handleToggle = useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n if (disabled) return;\n\n const newIsOpen = !isExpandedState;\n\n // Update internal state if uncontrolled\n if (!isControlled) {\n setInternalIsOpen(newIsOpen);\n }\n\n // Call external handlers\n onToggle?.(newIsOpen);\n onClick?.(e);\n },\n [disabled, isExpandedState, isControlled, onToggle, onClick]\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLButtonElement>) => {\n // Enter and Space should toggle the accordion\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleToggle(e as any);\n }\n },\n [handleToggle]\n );\n\n return (\n <div className=\"w-full\">\n <Button\n variant={ButtonVariant.HOVERABLE}\n color={ButtonColor.TEXT}\n onClick={handleToggle}\n onKeyDown={handleKeyDown}\n disabled={disabled}\n isFullWidth\n className={cn(\n 'flex items-center justify-between gap-2',\n headerClassName\n )}\n IconRight={ChevronDown}\n iconClassName={cn(\n 'transform transition-transform duration-500 ease-in-out',\n isExpandedState ? 'rotate-0' : '-rotate-180'\n )}\n aria-expanded={isExpandedState}\n aria-controls={generatedContentId}\n aria-label={ariaLabel}\n role=\"button\"\n {...props}\n >\n {header}\n </Button>\n\n <MaxHeightSmoother\n id={generatedContentId}\n tabIndex={isHidden ? -1 : undefined}\n isHidden={isHidden}\n className={contentClassName}\n role=\"region\"\n aria-labelledby={generatedContentId}\n >\n {children}\n </MaxHeightSmoother>\n </div>\n );\n};\n"],"names":[],"mappings":";;;;;;;AAgFO,MAAM,YAAgC,CAAC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,GAAG;AACL,MAAM;AAEJ,QAAM,eAAe,WAAW;AAChC,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAS,aAAa;AAGlE,QAAM,kBAAkB,eAAe,SAAS;AAChD,QAAM,WAAW,CAAC;AAGlB,QAAM,qBACJ,aAAa,qBAAqB,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AAE3E,QAAM,eAAe;AAAA,IACnB,CAAC,MAA2C;AAC1C,UAAI,SAAU;AAEd,YAAM,YAAY,CAAC;AAGnB,UAAI,CAAC,cAAc;AACjB,0BAAkB,SAAS;AAAA,MAC7B;AAGA,iBAAW,SAAS;AACpB,gBAAU,CAAC;AAAA,IACb;AAAA,IACA,CAAC,UAAU,iBAAiB,cAAc,UAAU,OAAO;AAAA,EAAA;AAG7D,QAAM,gBAAgB;AAAA,IACpB,CAAC,MAAwC;AAEvC,UAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,UAAE,eAAA;AACF,qBAAa,CAAQ;AAAA,MACvB;AAAA,IACF;AAAA,IACA,CAAC,YAAY;AAAA,EAAA;AAGf,SACE,qBAAC,OAAA,EAAI,WAAU,UACb,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAAS,cAAc;AAAA,QACvB,OAAO,YAAY;AAAA,QACnB,SAAS;AAAA,QACT,WAAW;AAAA,QACX;AAAA,QACA,aAAW;AAAA,QACX,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QAAA;AAAA,QAEF,WAAW;AAAA,QACX,eAAe;AAAA,UACb;AAAA,UACA,kBAAkB,aAAa;AAAA,QAAA;AAAA,QAEjC,iBAAe;AAAA,QACf,iBAAe;AAAA,QACf,cAAY;AAAA,QACZ,MAAK;AAAA,QACJ,GAAG;AAAA,QAEH,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAGH;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,IAAI;AAAA,QACJ,UAAU,WAAW,KAAK;AAAA,QAC1B;AAAA,QACA,WAAW;AAAA,QACX,MAAK;AAAA,QACL,mBAAiB;AAAA,QAEhB;AAAA,MAAA;AAAA,IAAA;AAAA,EACH,GACF;AAEJ;"}
@@ -2,62 +2,145 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const lucideReact = require("lucide-react");
5
+ const ReactExports = require("react");
5
6
  const utils_cn = require("../../utils/cn.cjs");
6
7
  const components_Loader_index = require("../Loader/index.cjs");
7
- const getCapitals = (name) => name.split(" ").map((word) => word[0]).filter(Boolean).map((char) => char.toUpperCase());
8
+ const sizeVariants = {
9
+ sm: "size-6",
10
+ md: "size-9",
11
+ lg: "size-12",
12
+ xl: "size-16"
13
+ };
14
+ const getCapitals = (name, separator = " ") => {
15
+ if (!name) return [];
16
+ const parts = separator === " " ? name.trim().split(/\s+/) : name.split(separator);
17
+ return parts.filter(Boolean).map((word) => word.charAt(0).toUpperCase());
18
+ };
19
+ const Container = ReactExports.forwardRef(({ isClickable, onClick, ...props }, ref) => {
20
+ if (isClickable && onClick) {
21
+ return /* @__PURE__ */ jsxRuntime.jsx(
22
+ "button",
23
+ {
24
+ ...props,
25
+ ref,
26
+ onClick,
27
+ type: "button"
28
+ }
29
+ );
30
+ }
31
+ return /* @__PURE__ */ jsxRuntime.jsx(
32
+ "div",
33
+ {
34
+ ...props,
35
+ ref,
36
+ role: props.tabIndex !== void 0 || props["aria-label"] ? "img" : void 0
37
+ }
38
+ );
39
+ });
40
+ Container.displayName = "AvatarContainer";
8
41
  const Avatar = ({
9
42
  fullname,
10
43
  className,
11
- isLoading,
12
- isLoggedIn,
44
+ isLoading = false,
45
+ isLoggedIn = true,
13
46
  src,
14
47
  onClick,
48
+ size = "md",
49
+ alt,
50
+ focusable = false,
15
51
  ...props
16
52
  }) => {
17
53
  const isImageDefined = Boolean(src);
18
54
  const isNameDefined = Boolean((fullname ?? "").length > 0);
19
55
  const capitals = fullname ? getCapitals(fullname) : void 0;
20
56
  const displayLoader = isLoading;
21
- const displayAvatar = isLoggedIn && !displayLoader && !displayLoader && isImageDefined;
57
+ const displayAvatar = isLoggedIn && !displayLoader && isImageDefined;
22
58
  const displayInitials = isLoggedIn && !displayLoader && !displayAvatar && isNameDefined;
23
59
  const displayUserIcon = isLoggedIn && !displayLoader && !displayAvatar && !displayInitials;
24
60
  const isClickable = onClick !== void 0;
25
- const Container = (props2) => isClickable ? /* @__PURE__ */ jsxRuntime.jsx("button", { ...props2 }) : /* @__PURE__ */ jsxRuntime.jsx("div", { ...props2 });
26
- return /* @__PURE__ */ jsxRuntime.jsx(
61
+ const sizeClass = sizeVariants[size];
62
+ const accessibilityProps = ReactExports.useMemo(() => {
63
+ const baseProps = {};
64
+ if (displayAvatar && alt) {
65
+ baseProps["aria-label"] = alt;
66
+ } else if (displayAvatar && fullname) {
67
+ baseProps["aria-label"] = `Avatar of ${fullname}`;
68
+ } else if (displayInitials && fullname) {
69
+ baseProps["aria-label"] = `Avatar initials for ${fullname}`;
70
+ } else if (displayUserIcon) {
71
+ baseProps["aria-label"] = "Default user avatar";
72
+ } else if (displayLoader) {
73
+ baseProps["aria-label"] = "Loading avatar";
74
+ baseProps["aria-busy"] = true;
75
+ }
76
+ if (!isClickable && focusable) {
77
+ baseProps.tabIndex = 0;
78
+ }
79
+ if (isClickable) {
80
+ baseProps["aria-describedby"] = "avatar-description";
81
+ }
82
+ return baseProps;
83
+ }, [
84
+ displayAvatar,
85
+ displayInitials,
86
+ displayUserIcon,
87
+ displayLoader,
88
+ alt,
89
+ fullname,
90
+ isClickable,
91
+ focusable
92
+ ]);
93
+ return /* @__PURE__ */ jsxRuntime.jsxs(
27
94
  Container,
28
95
  {
96
+ isClickable,
29
97
  className: utils_cn.cn(
30
- `border-text size-9 rounded-full border-[1.5px] p-[1.5px]`,
31
- isClickable && `cursor-pointer`,
98
+ `border-text border-[1.5px] rounded-full p-[1.5px]`,
99
+ sizeClass,
100
+ isClickable && `cursor-pointer hover:opacity-80 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2`,
101
+ !isClickable && focusable && `focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2`,
102
+ displayLoader && "animate-pulse",
32
103
  className
33
104
  ),
34
105
  onClick,
106
+ ...accessibilityProps,
35
107
  ...props,
36
- children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative flex size-full flex-row items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-text text-text-opposite absolute left-0 top-0 flex size-full flex-col items-center justify-center rounded-full", children: [
37
- displayLoader && /* @__PURE__ */ jsxRuntime.jsx(components_Loader_index.Loader, { className: "w-3/4" }),
38
- displayAvatar && /* @__PURE__ */ jsxRuntime.jsx(
39
- "img",
40
- {
41
- className: "size-full rounded-full",
42
- src,
43
- srcSet: src,
44
- alt: `avatar of ${fullname}`,
45
- width: 59,
46
- height: 59
47
- }
48
- ),
49
- displayInitials && /* @__PURE__ */ jsxRuntime.jsx(
50
- "div",
51
- {
52
- className: "flex size-full items-center justify-center gap-[0.1rem] text-sm font-bold max-md:py-1",
53
- "aria-label": "Initials of user's name",
54
- children: capitals?.map((capital) => /* @__PURE__ */ jsxRuntime.jsx("span", { children: capital }, capital))
55
- }
56
- ),
57
- displayUserIcon && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.User, { size: 25 })
58
- ] }) })
108
+ children: [
109
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative flex size-full flex-row items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-text text-text-opposite absolute left-0 top-0 flex size-full flex-col items-center justify-center rounded-full", children: [
110
+ displayLoader && /* @__PURE__ */ jsxRuntime.jsx(components_Loader_index.Loader, { className: "w-3/4", "aria-label": "Loading user avatar" }),
111
+ displayAvatar && /* @__PURE__ */ jsxRuntime.jsx(
112
+ "img",
113
+ {
114
+ className: "size-full rounded-full object-cover",
115
+ src,
116
+ srcSet: src,
117
+ alt: alt || `Avatar of ${fullname}`,
118
+ width: 59,
119
+ height: 59,
120
+ loading: "lazy"
121
+ }
122
+ ),
123
+ displayInitials && /* @__PURE__ */ jsxRuntime.jsx(
124
+ "div",
125
+ {
126
+ className: "flex size-full items-center justify-center gap-[0.1rem] text-sm font-bold max-md:py-1",
127
+ "aria-label": `Initials for ${fullname}`,
128
+ children: capitals?.map((capital, index) => /* @__PURE__ */ jsxRuntime.jsx("span", { children: capital }, `${capital}-${index}`))
129
+ }
130
+ ),
131
+ displayUserIcon && /* @__PURE__ */ jsxRuntime.jsx(
132
+ lucideReact.User,
133
+ {
134
+ size: size === "sm" ? 14 : size === "md" ? 25 : size === "lg" ? 30 : 40,
135
+ "aria-label": "Default user icon"
136
+ }
137
+ )
138
+ ] }) }),
139
+ isClickable && /* @__PURE__ */ jsxRuntime.jsx("span", { id: "avatar-description", className: "sr-only", children: "Click to view profile" })
140
+ ]
59
141
  }
60
142
  );
61
143
  };
62
144
  exports.Avatar = Avatar;
145
+ exports.getCapitals = getCapitals;
63
146
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../src/components/Avatar/index.tsx"],"sourcesContent":["import { User } from 'lucide-react';\nimport type { ComponentProps, FC, HTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport { Loader } from '../Loader';\n\nconst getCapitals = (name: string): string[] =>\n name\n .split(' ') // split by space\n .map((word) => word[0]) // get first letter of each word\n .filter(Boolean) // remove empty strings\n .map((char) => char.toUpperCase()); // convert to uppercase\n\nexport type AvatarProps = ComponentProps<'button'> & {\n src?: string;\n fullname?: string;\n isLoading?: boolean;\n isLoggedIn?: boolean;\n};\n\nexport const Avatar: FC<AvatarProps> = ({\n fullname,\n className,\n isLoading,\n isLoggedIn,\n src,\n onClick,\n ...props\n}) => {\n const isImageDefined = Boolean(src);\n const isNameDefined = Boolean((fullname ?? '').length > 0);\n const capitals = fullname ? getCapitals(fullname) : undefined;\n\n const displayLoader = isLoading;\n const displayAvatar =\n isLoggedIn && !displayLoader && !displayLoader && isImageDefined;\n const displayInitials =\n isLoggedIn && !displayLoader && !displayAvatar && isNameDefined;\n const displayUserIcon =\n isLoggedIn && !displayLoader && !displayAvatar && !displayInitials;\n\n const isClickable = onClick !== undefined;\n\n const Container = (props: HTMLAttributes<HTMLElement>) =>\n isClickable ? <button {...props} /> : <div {...props} />;\n\n return (\n <Container\n className={cn(\n `border-text size-9 rounded-full border-[1.5px] p-[1.5px]`,\n isClickable && `cursor-pointer`,\n className\n )}\n onClick={onClick}\n {...props}\n >\n <div className=\"relative flex size-full flex-row items-center justify-center\">\n <div className=\"bg-text text-text-opposite absolute left-0 top-0 flex size-full flex-col items-center justify-center rounded-full\">\n {displayLoader && <Loader className=\"w-3/4\" />}\n {displayAvatar && (\n <img\n className=\"size-full rounded-full\"\n src={src}\n srcSet={src}\n alt={`avatar of ${fullname}`}\n width={59}\n height={59}\n />\n )}\n {displayInitials && (\n <div\n className=\"flex size-full items-center justify-center gap-[0.1rem] text-sm font-bold max-md:py-1\"\n aria-label=\"Initials of user's name\"\n >\n {capitals?.map((capital) => <span key={capital}>{capital}</span>)}\n </div>\n )}\n {displayUserIcon && <User size={25} />}\n </div>\n </div>\n </Container>\n );\n};\n"],"names":["props","jsx","cn","jsxs","Loader","User"],"mappings":";;;;;;AAKA,MAAM,cAAc,CAAC,SACnB,KACG,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,CAAC,CAAC,EACrB,OAAO,OAAO,EACd,IAAI,CAAC,SAAS,KAAK,aAAa;AAS9B,MAAM,SAA0B,CAAC;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAM;AACJ,QAAM,iBAAiB,QAAQ,GAAG;AAClC,QAAM,gBAAgB,SAAS,YAAY,IAAI,SAAS,CAAC;AACzD,QAAM,WAAW,WAAW,YAAY,QAAQ,IAAI;AAEpD,QAAM,gBAAgB;AACtB,QAAM,gBACJ,cAAc,CAAC,iBAAiB,CAAC,iBAAiB;AACpD,QAAM,kBACJ,cAAc,CAAC,iBAAiB,CAAC,iBAAiB;AACpD,QAAM,kBACJ,cAAc,CAAC,iBAAiB,CAAC,iBAAiB,CAAC;AAErD,QAAM,cAAc,YAAY;AAEhC,QAAM,YAAY,CAACA,WACjB,cAAcC,2BAAAA,IAAC,UAAA,EAAQ,GAAGD,OAAAA,CAAO,IAAKC,2BAAAA,IAAC,OAAA,EAAK,GAAGD,OAAAA,CAAO;AAExD,SACEC,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC,SAAAA;AAAAA,QACT;AAAA,QACA,eAAe;AAAA,QACf;AAAA,MAAA;AAAA,MAEF;AAAA,MACC,GAAG;AAAA,MAEJ,yCAAC,OAAA,EAAI,WAAU,gEACb,UAAAC,2BAAAA,KAAC,OAAA,EAAI,WAAU,qHACZ,UAAA;AAAA,QAAA,iBAAiBF,2BAAAA,IAACG,wBAAAA,QAAA,EAAO,WAAU,QAAA,CAAQ;AAAA,QAC3C,iBACCH,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV;AAAA,YACA,QAAQ;AAAA,YACR,KAAK,aAAa,QAAQ;AAAA,YAC1B,OAAO;AAAA,YACP,QAAQ;AAAA,UAAA;AAAA,QAAA;AAAA,QAGX,mBACCA,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,cAAW;AAAA,YAEV,UAAA,UAAU,IAAI,CAAC,2CAAa,QAAA,EAAoB,UAAA,QAAA,GAAV,OAAkB,CAAO;AAAA,UAAA;AAAA,QAAA;AAAA,QAGnE,mBAAmBA,2BAAAA,IAACI,YAAAA,MAAA,EAAK,MAAM,GAAA,CAAI;AAAA,MAAA,EAAA,CACtC,EAAA,CACF;AAAA,IAAA;AAAA,EAAA;AAGN;;"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../src/components/Avatar/index.tsx"],"sourcesContent":["import { User } from 'lucide-react';\nimport type { ComponentProps, FC, HTMLAttributes } from 'react';\nimport { forwardRef, useMemo } from 'react';\nimport { cn } from '../../utils/cn';\nimport { Loader } from '../Loader';\n\n/**\n * Props for the Avatar component\n */\nexport interface AvatarProps extends Omit<ComponentProps<'button'>, 'onClick'> {\n /** Image source URL for the avatar */\n src?: string;\n /** Full name used to generate initials and alt text */\n fullname?: string;\n /** Displays a loading spinner when true */\n isLoading?: boolean;\n /** Whether the user is authenticated */\n isLoggedIn?: boolean;\n /** Size variant of the avatar */\n size?: 'sm' | 'md' | 'lg' | 'xl';\n /** Click handler - when provided, makes the avatar clickable */\n onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;\n /** Alternative text for accessibility */\n alt?: string;\n /** Whether the avatar should be focusable when not clickable */\n focusable?: boolean;\n}\n\n/**\n * Size variants for the avatar\n */\nconst sizeVariants = {\n sm: 'size-6',\n md: 'size-9',\n lg: 'size-12',\n xl: 'size-16',\n} as const;\n\n/**\n * @description Gets the capital letters from a name.\n * @param name - The name to extract capitals from.\n * @param separator - The separator to split the name (default is an empty string, which splits by each character).\n * @returns {string[]} An array of capital letters from the name.\n */\nexport const getCapitals = (name: string, separator = ' '): string[] => {\n if (!name) return [];\n\n const parts =\n separator === ' '\n ? name.trim().split(/\\s+/) // handle multiple spaces\n : name.split(separator);\n\n return parts.filter(Boolean).map((word) => word.charAt(0).toUpperCase());\n};\n\n/**\n * Container component that renders either a button or div based on interactivity\n */\nconst Container = forwardRef<\n HTMLElement,\n HTMLAttributes<HTMLElement> & {\n isClickable: boolean;\n onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;\n }\n>(({ isClickable, onClick, ...props }, ref) => {\n if (isClickable && onClick) {\n return (\n <button\n {...(props as ComponentProps<'button'>)}\n ref={ref as React.Ref<HTMLButtonElement>}\n onClick={onClick}\n type=\"button\"\n />\n );\n }\n\n return (\n <div\n {...(props as ComponentProps<'div'>)}\n ref={ref as React.Ref<HTMLDivElement>}\n role={\n props.tabIndex !== undefined || props['aria-label'] ? 'img' : undefined\n }\n />\n );\n});\n\nContainer.displayName = 'AvatarContainer';\n\n/**\n * Avatar component that displays user profile images, initials, or a default user icon.\n * Supports loading states, authentication states, and accessibility features.\n *\n * @example\n * ```tsx\n * // With image\n * <Avatar src=\"https://example.com/avatar.jpg\" fullname=\"John Doe\" />\n *\n * // With initials\n * <Avatar fullname=\"John Doe\" />\n *\n * // Clickable avatar\n * <Avatar\n * fullname=\"John Doe\"\n * onClick={(e) => console.log('Avatar clicked')}\n * />\n *\n * // Loading state\n * <Avatar isLoading fullname=\"John Doe\" />\n * ```\n */\nexport const Avatar: FC<AvatarProps> = ({\n fullname,\n className,\n isLoading = false,\n isLoggedIn = true,\n src,\n onClick,\n size = 'md',\n alt,\n focusable = false,\n ...props\n}) => {\n const isImageDefined = Boolean(src);\n const isNameDefined = Boolean((fullname ?? '').length > 0);\n const capitals = fullname ? getCapitals(fullname) : undefined;\n\n // Display logic\n const displayLoader = isLoading;\n const displayAvatar = isLoggedIn && !displayLoader && isImageDefined;\n const displayInitials =\n isLoggedIn && !displayLoader && !displayAvatar && isNameDefined;\n const displayUserIcon =\n isLoggedIn && !displayLoader && !displayAvatar && !displayInitials;\n\n const isClickable = onClick !== undefined;\n const sizeClass = sizeVariants[size];\n\n // Accessibility attributes\n const accessibilityProps = useMemo(() => {\n const baseProps: Record<string, any> = {};\n\n if (displayAvatar && alt) {\n baseProps['aria-label'] = alt;\n } else if (displayAvatar && fullname) {\n baseProps['aria-label'] = `Avatar of ${fullname}`;\n } else if (displayInitials && fullname) {\n baseProps['aria-label'] = `Avatar initials for ${fullname}`;\n } else if (displayUserIcon) {\n baseProps['aria-label'] = 'Default user avatar';\n } else if (displayLoader) {\n baseProps['aria-label'] = 'Loading avatar';\n baseProps['aria-busy'] = true;\n }\n\n if (!isClickable && focusable) {\n baseProps.tabIndex = 0;\n }\n\n if (isClickable) {\n baseProps['aria-describedby'] = 'avatar-description';\n }\n\n return baseProps;\n }, [\n displayAvatar,\n displayInitials,\n displayUserIcon,\n displayLoader,\n alt,\n fullname,\n isClickable,\n focusable,\n ]);\n\n return (\n <Container\n isClickable={isClickable}\n className={cn(\n `border-text border-[1.5px] rounded-full p-[1.5px]`,\n sizeClass,\n isClickable &&\n `cursor-pointer hover:opacity-80 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2`,\n !isClickable &&\n focusable &&\n `focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2`,\n displayLoader && 'animate-pulse',\n className\n )}\n onClick={onClick}\n {...accessibilityProps}\n {...props}\n >\n <div className=\"relative flex size-full flex-row items-center justify-center\">\n <div className=\"bg-text text-text-opposite absolute left-0 top-0 flex size-full flex-col items-center justify-center rounded-full\">\n {displayLoader && (\n <Loader className=\"w-3/4\" aria-label=\"Loading user avatar\" />\n )}\n\n {displayAvatar && (\n <img\n className=\"size-full rounded-full object-cover\"\n src={src}\n srcSet={src}\n alt={alt || `Avatar of ${fullname}`}\n width={59}\n height={59}\n loading=\"lazy\"\n />\n )}\n\n {displayInitials && (\n <div\n className=\"flex size-full items-center justify-center gap-[0.1rem] text-sm font-bold max-md:py-1\"\n aria-label={`Initials for ${fullname}`}\n >\n {capitals?.map((capital, index) => (\n <span key={`${capital}-${index}`}>{capital}</span>\n ))}\n </div>\n )}\n\n {displayUserIcon && (\n <User\n size={\n size === 'sm'\n ? 14\n : size === 'md'\n ? 25\n : size === 'lg'\n ? 30\n : 40\n }\n aria-label=\"Default user icon\"\n />\n )}\n </div>\n </div>\n\n {isClickable && (\n <span id=\"avatar-description\" className=\"sr-only\">\n Click to view profile\n </span>\n )}\n </Container>\n );\n};\n"],"names":["forwardRef","jsx","useMemo","jsxs","cn","Loader","User"],"mappings":"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"}
@@ -1,9 +1,53 @@
1
1
  import { ComponentProps, FC } from 'react';
2
- export type AvatarProps = ComponentProps<'button'> & {
2
+ /**
3
+ * Props for the Avatar component
4
+ */
5
+ export interface AvatarProps extends Omit<ComponentProps<'button'>, 'onClick'> {
6
+ /** Image source URL for the avatar */
3
7
  src?: string;
8
+ /** Full name used to generate initials and alt text */
4
9
  fullname?: string;
10
+ /** Displays a loading spinner when true */
5
11
  isLoading?: boolean;
12
+ /** Whether the user is authenticated */
6
13
  isLoggedIn?: boolean;
7
- };
14
+ /** Size variant of the avatar */
15
+ size?: 'sm' | 'md' | 'lg' | 'xl';
16
+ /** Click handler - when provided, makes the avatar clickable */
17
+ onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;
18
+ /** Alternative text for accessibility */
19
+ alt?: string;
20
+ /** Whether the avatar should be focusable when not clickable */
21
+ focusable?: boolean;
22
+ }
23
+ /**
24
+ * @description Gets the capital letters from a name.
25
+ * @param name - The name to extract capitals from.
26
+ * @param separator - The separator to split the name (default is an empty string, which splits by each character).
27
+ * @returns {string[]} An array of capital letters from the name.
28
+ */
29
+ export declare const getCapitals: (name: string, separator?: string) => string[];
30
+ /**
31
+ * Avatar component that displays user profile images, initials, or a default user icon.
32
+ * Supports loading states, authentication states, and accessibility features.
33
+ *
34
+ * @example
35
+ * ```tsx
36
+ * // With image
37
+ * <Avatar src="https://example.com/avatar.jpg" fullname="John Doe" />
38
+ *
39
+ * // With initials
40
+ * <Avatar fullname="John Doe" />
41
+ *
42
+ * // Clickable avatar
43
+ * <Avatar
44
+ * fullname="John Doe"
45
+ * onClick={(e) => console.log('Avatar clicked')}
46
+ * />
47
+ *
48
+ * // Loading state
49
+ * <Avatar isLoading fullname="John Doe" />
50
+ * ```
51
+ */
8
52
  export declare const Avatar: FC<AvatarProps>;
9
53
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Avatar/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,EAAE,EAAkB,MAAM,OAAO,CAAC;AAWhE,MAAM,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,CAAC,GAAG;IACnD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,EAAE,CAAC,WAAW,CA8DlC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Avatar/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,EAAE,EAAkB,MAAM,OAAO,CAAC;AAKhE;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;IAC5E,sCAAsC;IACtC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,wCAAwC;IACxC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iCAAiC;IACjC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IACjC,gEAAgE;IAChE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IAC/D,yCAAyC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gEAAgE;IAChE,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAYD;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,EAAE,kBAAe,KAAG,MAAM,EASjE,CAAC;AAoCF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,MAAM,EAAE,EAAE,CAAC,WAAW,CAuIlC,CAAC"}
@@ -1,63 +1,146 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { User } from "lucide-react";
3
+ import { forwardRef, useMemo } from "react";
3
4
  import { cn } from "../../utils/cn.mjs";
4
5
  import { Loader } from "../Loader/index.mjs";
5
- const getCapitals = (name) => name.split(" ").map((word) => word[0]).filter(Boolean).map((char) => char.toUpperCase());
6
+ const sizeVariants = {
7
+ sm: "size-6",
8
+ md: "size-9",
9
+ lg: "size-12",
10
+ xl: "size-16"
11
+ };
12
+ const getCapitals = (name, separator = " ") => {
13
+ if (!name) return [];
14
+ const parts = separator === " " ? name.trim().split(/\s+/) : name.split(separator);
15
+ return parts.filter(Boolean).map((word) => word.charAt(0).toUpperCase());
16
+ };
17
+ const Container = forwardRef(({ isClickable, onClick, ...props }, ref) => {
18
+ if (isClickable && onClick) {
19
+ return /* @__PURE__ */ jsx(
20
+ "button",
21
+ {
22
+ ...props,
23
+ ref,
24
+ onClick,
25
+ type: "button"
26
+ }
27
+ );
28
+ }
29
+ return /* @__PURE__ */ jsx(
30
+ "div",
31
+ {
32
+ ...props,
33
+ ref,
34
+ role: props.tabIndex !== void 0 || props["aria-label"] ? "img" : void 0
35
+ }
36
+ );
37
+ });
38
+ Container.displayName = "AvatarContainer";
6
39
  const Avatar = ({
7
40
  fullname,
8
41
  className,
9
- isLoading,
10
- isLoggedIn,
42
+ isLoading = false,
43
+ isLoggedIn = true,
11
44
  src,
12
45
  onClick,
46
+ size = "md",
47
+ alt,
48
+ focusable = false,
13
49
  ...props
14
50
  }) => {
15
51
  const isImageDefined = Boolean(src);
16
52
  const isNameDefined = Boolean((fullname ?? "").length > 0);
17
53
  const capitals = fullname ? getCapitals(fullname) : void 0;
18
54
  const displayLoader = isLoading;
19
- const displayAvatar = isLoggedIn && !displayLoader && !displayLoader && isImageDefined;
55
+ const displayAvatar = isLoggedIn && !displayLoader && isImageDefined;
20
56
  const displayInitials = isLoggedIn && !displayLoader && !displayAvatar && isNameDefined;
21
57
  const displayUserIcon = isLoggedIn && !displayLoader && !displayAvatar && !displayInitials;
22
58
  const isClickable = onClick !== void 0;
23
- const Container = (props2) => isClickable ? /* @__PURE__ */ jsx("button", { ...props2 }) : /* @__PURE__ */ jsx("div", { ...props2 });
24
- return /* @__PURE__ */ jsx(
59
+ const sizeClass = sizeVariants[size];
60
+ const accessibilityProps = useMemo(() => {
61
+ const baseProps = {};
62
+ if (displayAvatar && alt) {
63
+ baseProps["aria-label"] = alt;
64
+ } else if (displayAvatar && fullname) {
65
+ baseProps["aria-label"] = `Avatar of ${fullname}`;
66
+ } else if (displayInitials && fullname) {
67
+ baseProps["aria-label"] = `Avatar initials for ${fullname}`;
68
+ } else if (displayUserIcon) {
69
+ baseProps["aria-label"] = "Default user avatar";
70
+ } else if (displayLoader) {
71
+ baseProps["aria-label"] = "Loading avatar";
72
+ baseProps["aria-busy"] = true;
73
+ }
74
+ if (!isClickable && focusable) {
75
+ baseProps.tabIndex = 0;
76
+ }
77
+ if (isClickable) {
78
+ baseProps["aria-describedby"] = "avatar-description";
79
+ }
80
+ return baseProps;
81
+ }, [
82
+ displayAvatar,
83
+ displayInitials,
84
+ displayUserIcon,
85
+ displayLoader,
86
+ alt,
87
+ fullname,
88
+ isClickable,
89
+ focusable
90
+ ]);
91
+ return /* @__PURE__ */ jsxs(
25
92
  Container,
26
93
  {
94
+ isClickable,
27
95
  className: cn(
28
- `border-text size-9 rounded-full border-[1.5px] p-[1.5px]`,
29
- isClickable && `cursor-pointer`,
96
+ `border-text border-[1.5px] rounded-full p-[1.5px]`,
97
+ sizeClass,
98
+ isClickable && `cursor-pointer hover:opacity-80 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2`,
99
+ !isClickable && focusable && `focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2`,
100
+ displayLoader && "animate-pulse",
30
101
  className
31
102
  ),
32
103
  onClick,
104
+ ...accessibilityProps,
33
105
  ...props,
34
- children: /* @__PURE__ */ jsx("div", { className: "relative flex size-full flex-row items-center justify-center", children: /* @__PURE__ */ jsxs("div", { className: "bg-text text-text-opposite absolute left-0 top-0 flex size-full flex-col items-center justify-center rounded-full", children: [
35
- displayLoader && /* @__PURE__ */ jsx(Loader, { className: "w-3/4" }),
36
- displayAvatar && /* @__PURE__ */ jsx(
37
- "img",
38
- {
39
- className: "size-full rounded-full",
40
- src,
41
- srcSet: src,
42
- alt: `avatar of ${fullname}`,
43
- width: 59,
44
- height: 59
45
- }
46
- ),
47
- displayInitials && /* @__PURE__ */ jsx(
48
- "div",
49
- {
50
- className: "flex size-full items-center justify-center gap-[0.1rem] text-sm font-bold max-md:py-1",
51
- "aria-label": "Initials of user's name",
52
- children: capitals?.map((capital) => /* @__PURE__ */ jsx("span", { children: capital }, capital))
53
- }
54
- ),
55
- displayUserIcon && /* @__PURE__ */ jsx(User, { size: 25 })
56
- ] }) })
106
+ children: [
107
+ /* @__PURE__ */ jsx("div", { className: "relative flex size-full flex-row items-center justify-center", children: /* @__PURE__ */ jsxs("div", { className: "bg-text text-text-opposite absolute left-0 top-0 flex size-full flex-col items-center justify-center rounded-full", children: [
108
+ displayLoader && /* @__PURE__ */ jsx(Loader, { className: "w-3/4", "aria-label": "Loading user avatar" }),
109
+ displayAvatar && /* @__PURE__ */ jsx(
110
+ "img",
111
+ {
112
+ className: "size-full rounded-full object-cover",
113
+ src,
114
+ srcSet: src,
115
+ alt: alt || `Avatar of ${fullname}`,
116
+ width: 59,
117
+ height: 59,
118
+ loading: "lazy"
119
+ }
120
+ ),
121
+ displayInitials && /* @__PURE__ */ jsx(
122
+ "div",
123
+ {
124
+ className: "flex size-full items-center justify-center gap-[0.1rem] text-sm font-bold max-md:py-1",
125
+ "aria-label": `Initials for ${fullname}`,
126
+ children: capitals?.map((capital, index) => /* @__PURE__ */ jsx("span", { children: capital }, `${capital}-${index}`))
127
+ }
128
+ ),
129
+ displayUserIcon && /* @__PURE__ */ jsx(
130
+ User,
131
+ {
132
+ size: size === "sm" ? 14 : size === "md" ? 25 : size === "lg" ? 30 : 40,
133
+ "aria-label": "Default user icon"
134
+ }
135
+ )
136
+ ] }) }),
137
+ isClickable && /* @__PURE__ */ jsx("span", { id: "avatar-description", className: "sr-only", children: "Click to view profile" })
138
+ ]
57
139
  }
58
140
  );
59
141
  };
60
142
  export {
61
- Avatar
143
+ Avatar,
144
+ getCapitals
62
145
  };
63
146
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../src/components/Avatar/index.tsx"],"sourcesContent":["import { User } from 'lucide-react';\nimport type { ComponentProps, FC, HTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport { Loader } from '../Loader';\n\nconst getCapitals = (name: string): string[] =>\n name\n .split(' ') // split by space\n .map((word) => word[0]) // get first letter of each word\n .filter(Boolean) // remove empty strings\n .map((char) => char.toUpperCase()); // convert to uppercase\n\nexport type AvatarProps = ComponentProps<'button'> & {\n src?: string;\n fullname?: string;\n isLoading?: boolean;\n isLoggedIn?: boolean;\n};\n\nexport const Avatar: FC<AvatarProps> = ({\n fullname,\n className,\n isLoading,\n isLoggedIn,\n src,\n onClick,\n ...props\n}) => {\n const isImageDefined = Boolean(src);\n const isNameDefined = Boolean((fullname ?? '').length > 0);\n const capitals = fullname ? getCapitals(fullname) : undefined;\n\n const displayLoader = isLoading;\n const displayAvatar =\n isLoggedIn && !displayLoader && !displayLoader && isImageDefined;\n const displayInitials =\n isLoggedIn && !displayLoader && !displayAvatar && isNameDefined;\n const displayUserIcon =\n isLoggedIn && !displayLoader && !displayAvatar && !displayInitials;\n\n const isClickable = onClick !== undefined;\n\n const Container = (props: HTMLAttributes<HTMLElement>) =>\n isClickable ? <button {...props} /> : <div {...props} />;\n\n return (\n <Container\n className={cn(\n `border-text size-9 rounded-full border-[1.5px] p-[1.5px]`,\n isClickable && `cursor-pointer`,\n className\n )}\n onClick={onClick}\n {...props}\n >\n <div className=\"relative flex size-full flex-row items-center justify-center\">\n <div className=\"bg-text text-text-opposite absolute left-0 top-0 flex size-full flex-col items-center justify-center rounded-full\">\n {displayLoader && <Loader className=\"w-3/4\" />}\n {displayAvatar && (\n <img\n className=\"size-full rounded-full\"\n src={src}\n srcSet={src}\n alt={`avatar of ${fullname}`}\n width={59}\n height={59}\n />\n )}\n {displayInitials && (\n <div\n className=\"flex size-full items-center justify-center gap-[0.1rem] text-sm font-bold max-md:py-1\"\n aria-label=\"Initials of user's name\"\n >\n {capitals?.map((capital) => <span key={capital}>{capital}</span>)}\n </div>\n )}\n {displayUserIcon && <User size={25} />}\n </div>\n </div>\n </Container>\n );\n};\n"],"names":["props"],"mappings":";;;;AAKA,MAAM,cAAc,CAAC,SACnB,KACG,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,CAAC,CAAC,EACrB,OAAO,OAAO,EACd,IAAI,CAAC,SAAS,KAAK,aAAa;AAS9B,MAAM,SAA0B,CAAC;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAM;AACJ,QAAM,iBAAiB,QAAQ,GAAG;AAClC,QAAM,gBAAgB,SAAS,YAAY,IAAI,SAAS,CAAC;AACzD,QAAM,WAAW,WAAW,YAAY,QAAQ,IAAI;AAEpD,QAAM,gBAAgB;AACtB,QAAM,gBACJ,cAAc,CAAC,iBAAiB,CAAC,iBAAiB;AACpD,QAAM,kBACJ,cAAc,CAAC,iBAAiB,CAAC,iBAAiB;AACpD,QAAM,kBACJ,cAAc,CAAC,iBAAiB,CAAC,iBAAiB,CAAC;AAErD,QAAM,cAAc,YAAY;AAEhC,QAAM,YAAY,CAACA,WACjB,cAAc,oBAAC,UAAA,EAAQ,GAAGA,OAAAA,CAAO,IAAK,oBAAC,OAAA,EAAK,GAAGA,OAAAA,CAAO;AAExD,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,eAAe;AAAA,QACf;AAAA,MAAA;AAAA,MAEF;AAAA,MACC,GAAG;AAAA,MAEJ,8BAAC,OAAA,EAAI,WAAU,gEACb,UAAA,qBAAC,OAAA,EAAI,WAAU,qHACZ,UAAA;AAAA,QAAA,iBAAiB,oBAAC,QAAA,EAAO,WAAU,QAAA,CAAQ;AAAA,QAC3C,iBACC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV;AAAA,YACA,QAAQ;AAAA,YACR,KAAK,aAAa,QAAQ;AAAA,YAC1B,OAAO;AAAA,YACP,QAAQ;AAAA,UAAA;AAAA,QAAA;AAAA,QAGX,mBACC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,cAAW;AAAA,YAEV,UAAA,UAAU,IAAI,CAAC,gCAAa,QAAA,EAAoB,UAAA,QAAA,GAAV,OAAkB,CAAO;AAAA,UAAA;AAAA,QAAA;AAAA,QAGnE,mBAAmB,oBAAC,MAAA,EAAK,MAAM,GAAA,CAAI;AAAA,MAAA,EAAA,CACtC,EAAA,CACF;AAAA,IAAA;AAAA,EAAA;AAGN;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../src/components/Avatar/index.tsx"],"sourcesContent":["import { User } from 'lucide-react';\nimport type { ComponentProps, FC, HTMLAttributes } from 'react';\nimport { forwardRef, useMemo } from 'react';\nimport { cn } from '../../utils/cn';\nimport { Loader } from '../Loader';\n\n/**\n * Props for the Avatar component\n */\nexport interface AvatarProps extends Omit<ComponentProps<'button'>, 'onClick'> {\n /** Image source URL for the avatar */\n src?: string;\n /** Full name used to generate initials and alt text */\n fullname?: string;\n /** Displays a loading spinner when true */\n isLoading?: boolean;\n /** Whether the user is authenticated */\n isLoggedIn?: boolean;\n /** Size variant of the avatar */\n size?: 'sm' | 'md' | 'lg' | 'xl';\n /** Click handler - when provided, makes the avatar clickable */\n onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;\n /** Alternative text for accessibility */\n alt?: string;\n /** Whether the avatar should be focusable when not clickable */\n focusable?: boolean;\n}\n\n/**\n * Size variants for the avatar\n */\nconst sizeVariants = {\n sm: 'size-6',\n md: 'size-9',\n lg: 'size-12',\n xl: 'size-16',\n} as const;\n\n/**\n * @description Gets the capital letters from a name.\n * @param name - The name to extract capitals from.\n * @param separator - The separator to split the name (default is an empty string, which splits by each character).\n * @returns {string[]} An array of capital letters from the name.\n */\nexport const getCapitals = (name: string, separator = ' '): string[] => {\n if (!name) return [];\n\n const parts =\n separator === ' '\n ? name.trim().split(/\\s+/) // handle multiple spaces\n : name.split(separator);\n\n return parts.filter(Boolean).map((word) => word.charAt(0).toUpperCase());\n};\n\n/**\n * Container component that renders either a button or div based on interactivity\n */\nconst Container = forwardRef<\n HTMLElement,\n HTMLAttributes<HTMLElement> & {\n isClickable: boolean;\n onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;\n }\n>(({ isClickable, onClick, ...props }, ref) => {\n if (isClickable && onClick) {\n return (\n <button\n {...(props as ComponentProps<'button'>)}\n ref={ref as React.Ref<HTMLButtonElement>}\n onClick={onClick}\n type=\"button\"\n />\n );\n }\n\n return (\n <div\n {...(props as ComponentProps<'div'>)}\n ref={ref as React.Ref<HTMLDivElement>}\n role={\n props.tabIndex !== undefined || props['aria-label'] ? 'img' : undefined\n }\n />\n );\n});\n\nContainer.displayName = 'AvatarContainer';\n\n/**\n * Avatar component that displays user profile images, initials, or a default user icon.\n * Supports loading states, authentication states, and accessibility features.\n *\n * @example\n * ```tsx\n * // With image\n * <Avatar src=\"https://example.com/avatar.jpg\" fullname=\"John Doe\" />\n *\n * // With initials\n * <Avatar fullname=\"John Doe\" />\n *\n * // Clickable avatar\n * <Avatar\n * fullname=\"John Doe\"\n * onClick={(e) => console.log('Avatar clicked')}\n * />\n *\n * // Loading state\n * <Avatar isLoading fullname=\"John Doe\" />\n * ```\n */\nexport const Avatar: FC<AvatarProps> = ({\n fullname,\n className,\n isLoading = false,\n isLoggedIn = true,\n src,\n onClick,\n size = 'md',\n alt,\n focusable = false,\n ...props\n}) => {\n const isImageDefined = Boolean(src);\n const isNameDefined = Boolean((fullname ?? '').length > 0);\n const capitals = fullname ? getCapitals(fullname) : undefined;\n\n // Display logic\n const displayLoader = isLoading;\n const displayAvatar = isLoggedIn && !displayLoader && isImageDefined;\n const displayInitials =\n isLoggedIn && !displayLoader && !displayAvatar && isNameDefined;\n const displayUserIcon =\n isLoggedIn && !displayLoader && !displayAvatar && !displayInitials;\n\n const isClickable = onClick !== undefined;\n const sizeClass = sizeVariants[size];\n\n // Accessibility attributes\n const accessibilityProps = useMemo(() => {\n const baseProps: Record<string, any> = {};\n\n if (displayAvatar && alt) {\n baseProps['aria-label'] = alt;\n } else if (displayAvatar && fullname) {\n baseProps['aria-label'] = `Avatar of ${fullname}`;\n } else if (displayInitials && fullname) {\n baseProps['aria-label'] = `Avatar initials for ${fullname}`;\n } else if (displayUserIcon) {\n baseProps['aria-label'] = 'Default user avatar';\n } else if (displayLoader) {\n baseProps['aria-label'] = 'Loading avatar';\n baseProps['aria-busy'] = true;\n }\n\n if (!isClickable && focusable) {\n baseProps.tabIndex = 0;\n }\n\n if (isClickable) {\n baseProps['aria-describedby'] = 'avatar-description';\n }\n\n return baseProps;\n }, [\n displayAvatar,\n displayInitials,\n displayUserIcon,\n displayLoader,\n alt,\n fullname,\n isClickable,\n focusable,\n ]);\n\n return (\n <Container\n isClickable={isClickable}\n className={cn(\n `border-text border-[1.5px] rounded-full p-[1.5px]`,\n sizeClass,\n isClickable &&\n `cursor-pointer hover:opacity-80 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2`,\n !isClickable &&\n focusable &&\n `focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2`,\n displayLoader && 'animate-pulse',\n className\n )}\n onClick={onClick}\n {...accessibilityProps}\n {...props}\n >\n <div className=\"relative flex size-full flex-row items-center justify-center\">\n <div className=\"bg-text text-text-opposite absolute left-0 top-0 flex size-full flex-col items-center justify-center rounded-full\">\n {displayLoader && (\n <Loader className=\"w-3/4\" aria-label=\"Loading user avatar\" />\n )}\n\n {displayAvatar && (\n <img\n className=\"size-full rounded-full object-cover\"\n src={src}\n srcSet={src}\n alt={alt || `Avatar of ${fullname}`}\n width={59}\n height={59}\n loading=\"lazy\"\n />\n )}\n\n {displayInitials && (\n <div\n className=\"flex size-full items-center justify-center gap-[0.1rem] text-sm font-bold max-md:py-1\"\n aria-label={`Initials for ${fullname}`}\n >\n {capitals?.map((capital, index) => (\n <span key={`${capital}-${index}`}>{capital}</span>\n ))}\n </div>\n )}\n\n {displayUserIcon && (\n <User\n size={\n size === 'sm'\n ? 14\n : size === 'md'\n ? 25\n : size === 'lg'\n ? 30\n : 40\n }\n aria-label=\"Default user icon\"\n />\n )}\n </div>\n </div>\n\n {isClickable && (\n <span id=\"avatar-description\" className=\"sr-only\">\n Click to view profile\n </span>\n )}\n </Container>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -21,6 +21,12 @@ var BadgeVariant = /* @__PURE__ */ ((BadgeVariant2) => {
21
21
  BadgeVariant2["HOVERABLE"] = "hoverable";
22
22
  return BadgeVariant2;
23
23
  })(BadgeVariant || {});
24
+ var BadgeSize = /* @__PURE__ */ ((BadgeSize2) => {
25
+ BadgeSize2["SMALL"] = "sm";
26
+ BadgeSize2["MEDIUM"] = "md";
27
+ BadgeSize2["LARGE"] = "lg";
28
+ return BadgeSize2;
29
+ })(BadgeSize || {});
24
30
  const badgeVariants = classVarianceAuthority.cva(
25
31
  "focus:ring-ring inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-hidden focus:ring-2 focus:ring-offset-2",
26
32
  {
@@ -76,24 +82,97 @@ const badgeVariants = classVarianceAuthority.cva(
76
82
  "hoverable"
77
83
  /* HOVERABLE */
78
84
  ]: "rounded-lg border-none bg-opacity-0 transition hover:bg-opacity-10"
85
+ },
86
+ size: {
87
+ [
88
+ "sm"
89
+ /* SMALL */
90
+ ]: "px-2 py-0.5 text-xs",
91
+ [
92
+ "md"
93
+ /* MEDIUM */
94
+ ]: "px-2.5 py-0.5 text-xs",
95
+ [
96
+ "lg"
97
+ /* LARGE */
98
+ ]: "px-3 py-1 text-sm"
79
99
  }
80
100
  },
81
101
  defaultVariants: {
82
102
  variant: "default",
83
- color: "primary"
84
- /* PRIMARY */
103
+ color: "primary",
104
+ size: "md"
105
+ /* MEDIUM */
85
106
  }
86
107
  }
87
108
  );
88
- const Badge = ({ className, variant, color, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(
89
- "div",
90
- {
91
- className: utils_cn.cn(badgeVariants({ variant, color }), className),
92
- ...props
93
- }
94
- );
109
+ const Badge = ({
110
+ className,
111
+ variant = "default",
112
+ color = "primary",
113
+ size = "md",
114
+ children,
115
+ clickable = false,
116
+ dismissible = false,
117
+ onClick,
118
+ onDismiss,
119
+ role,
120
+ tabIndex,
121
+ "aria-label": ariaLabel,
122
+ ...props
123
+ }) => {
124
+ const Component = clickable ? "button" : "span";
125
+ const handleKeyDown = (event) => {
126
+ if (clickable && onClick && (event.key === "Enter" || event.key === " ")) {
127
+ event.preventDefault();
128
+ onClick(event);
129
+ }
130
+ };
131
+ const handleDismiss = (event) => {
132
+ event.stopPropagation();
133
+ onDismiss?.();
134
+ };
135
+ return /* @__PURE__ */ jsxRuntime.jsxs(
136
+ Component,
137
+ {
138
+ className: utils_cn.cn(
139
+ badgeVariants({ variant, color, size }),
140
+ clickable && "cursor-pointer hover:opacity-80 focus-visible:ring-2 focus-visible:ring-offset-2",
141
+ dismissible && "pr-1",
142
+ className
143
+ ),
144
+ onClick: clickable ? onClick : void 0,
145
+ onKeyDown: clickable ? handleKeyDown : void 0,
146
+ role: role || (clickable ? "button" : "status"),
147
+ tabIndex: clickable ? tabIndex ?? 0 : tabIndex,
148
+ "aria-label": ariaLabel || (clickable ? `${children} button` : void 0),
149
+ ...props,
150
+ children: [
151
+ children,
152
+ dismissible && /* @__PURE__ */ jsxRuntime.jsx(
153
+ "button",
154
+ {
155
+ type: "button",
156
+ className: "ml-1 inline-flex h-4 w-4 items-center justify-center rounded-full hover:bg-black/10 focus:outline-none focus:ring-1 focus:ring-offset-1",
157
+ onClick: handleDismiss,
158
+ "aria-label": `Remove ${children} badge`,
159
+ children: /* @__PURE__ */ jsxRuntime.jsx("svg", { className: "h-3 w-3", viewBox: "0 0 20 20", fill: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx(
160
+ "path",
161
+ {
162
+ fillRule: "evenodd",
163
+ d: "M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z",
164
+ clipRule: "evenodd"
165
+ }
166
+ ) })
167
+ }
168
+ )
169
+ ]
170
+ }
171
+ );
172
+ };
95
173
  exports.Badge = Badge;
96
174
  exports.BadgeColor = BadgeColor;
175
+ exports.BadgeSize = BadgeSize;
97
176
  exports.BadgeVariant = BadgeVariant;
98
177
  exports.badgeVariants = badgeVariants;
99
178
  //# sourceMappingURL=index.cjs.map