@fragments-sdk/ui 0.12.0 → 0.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 (675) hide show
  1. package/dist/assets/ui.css +1642 -1679
  2. package/dist/chart.cjs.map +1 -1
  3. package/dist/chart.js.map +1 -1
  4. package/dist/codeblock.cjs +26 -18
  5. package/dist/codeblock.cjs.map +1 -1
  6. package/dist/codeblock.js +26 -18
  7. package/dist/codeblock.js.map +1 -1
  8. package/dist/components/Accordion/Accordion.module.scss.cjs +8 -8
  9. package/dist/components/Accordion/Accordion.module.scss.js +8 -8
  10. package/dist/components/Accordion/index.cjs +17 -6
  11. package/dist/components/Accordion/index.cjs.map +1 -1
  12. package/dist/components/Accordion/index.d.ts +25 -12
  13. package/dist/components/Accordion/index.d.ts.map +1 -1
  14. package/dist/components/Accordion/index.js +17 -6
  15. package/dist/components/Accordion/index.js.map +1 -1
  16. package/dist/components/Alert/Alert.module.scss.cjs +12 -12
  17. package/dist/components/Alert/Alert.module.scss.js +12 -12
  18. package/dist/components/Alert/index.cjs +37 -15
  19. package/dist/components/Alert/index.cjs.map +1 -1
  20. package/dist/components/Alert/index.d.ts +15 -22
  21. package/dist/components/Alert/index.d.ts.map +1 -1
  22. package/dist/components/Alert/index.js +37 -15
  23. package/dist/components/Alert/index.js.map +1 -1
  24. package/dist/components/AppShell/AppShell.module.scss.cjs +14 -14
  25. package/dist/components/AppShell/AppShell.module.scss.js +14 -14
  26. package/dist/components/AppShell/index.cjs +3 -1
  27. package/dist/components/AppShell/index.cjs.map +1 -1
  28. package/dist/components/AppShell/index.d.ts.map +1 -1
  29. package/dist/components/AppShell/index.js +3 -1
  30. package/dist/components/AppShell/index.js.map +1 -1
  31. package/dist/components/Avatar/index.cjs +9 -1
  32. package/dist/components/Avatar/index.cjs.map +1 -1
  33. package/dist/components/Avatar/index.d.ts +2 -0
  34. package/dist/components/Avatar/index.d.ts.map +1 -1
  35. package/dist/components/Avatar/index.js +9 -1
  36. package/dist/components/Avatar/index.js.map +1 -1
  37. package/dist/components/Badge/index.cjs +4 -2
  38. package/dist/components/Badge/index.cjs.map +1 -1
  39. package/dist/components/Badge/index.d.ts +3 -0
  40. package/dist/components/Badge/index.d.ts.map +1 -1
  41. package/dist/components/Badge/index.js +4 -2
  42. package/dist/components/Badge/index.js.map +1 -1
  43. package/dist/components/BentoGrid/BentoGrid.module.scss.cjs +11 -11
  44. package/dist/components/BentoGrid/BentoGrid.module.scss.js +11 -11
  45. package/dist/components/BentoGrid/index.cjs +8 -5
  46. package/dist/components/BentoGrid/index.cjs.map +1 -1
  47. package/dist/components/BentoGrid/index.d.ts +2 -8
  48. package/dist/components/BentoGrid/index.d.ts.map +1 -1
  49. package/dist/components/BentoGrid/index.js +8 -5
  50. package/dist/components/BentoGrid/index.js.map +1 -1
  51. package/dist/components/Box/index.cjs +12 -2
  52. package/dist/components/Box/index.cjs.map +1 -1
  53. package/dist/components/Box/index.d.ts +1 -1
  54. package/dist/components/Box/index.d.ts.map +1 -1
  55. package/dist/components/Box/index.js +12 -2
  56. package/dist/components/Box/index.js.map +1 -1
  57. package/dist/components/Breadcrumbs/index.cjs +3 -1
  58. package/dist/components/Breadcrumbs/index.cjs.map +1 -1
  59. package/dist/components/Breadcrumbs/index.d.ts +3 -1
  60. package/dist/components/Breadcrumbs/index.d.ts.map +1 -1
  61. package/dist/components/Breadcrumbs/index.js +3 -1
  62. package/dist/components/Breadcrumbs/index.js.map +1 -1
  63. package/dist/components/Button/Button.module.scss.cjs +11 -11
  64. package/dist/components/Button/Button.module.scss.js +11 -11
  65. package/dist/components/Button/index.cjs +5 -2
  66. package/dist/components/Button/index.cjs.map +1 -1
  67. package/dist/components/Button/index.d.ts +3 -3
  68. package/dist/components/Button/index.d.ts.map +1 -1
  69. package/dist/components/Button/index.js +5 -2
  70. package/dist/components/Button/index.js.map +1 -1
  71. package/dist/components/ButtonGroup/index.cjs +3 -2
  72. package/dist/components/ButtonGroup/index.cjs.map +1 -1
  73. package/dist/components/ButtonGroup/index.d.ts +1 -2
  74. package/dist/components/ButtonGroup/index.d.ts.map +1 -1
  75. package/dist/components/ButtonGroup/index.js +3 -2
  76. package/dist/components/ButtonGroup/index.js.map +1 -1
  77. package/dist/components/Card/Card.module.scss.cjs +14 -14
  78. package/dist/components/Card/Card.module.scss.js +14 -14
  79. package/dist/components/Card/index.cjs +3 -22
  80. package/dist/components/Card/index.cjs.map +1 -1
  81. package/dist/components/Card/index.d.ts +6 -11
  82. package/dist/components/Card/index.d.ts.map +1 -1
  83. package/dist/components/Card/index.js +3 -22
  84. package/dist/components/Card/index.js.map +1 -1
  85. package/dist/components/Chart/Chart.module.scss.cjs +15 -15
  86. package/dist/components/Chart/Chart.module.scss.js +15 -15
  87. package/dist/components/Chart/index.d.ts +3 -3
  88. package/dist/components/Chart/index.d.ts.map +1 -1
  89. package/dist/components/Checkbox/Checkbox.module.scss.cjs +10 -10
  90. package/dist/components/Checkbox/Checkbox.module.scss.js +10 -10
  91. package/dist/components/Checkbox/index.cjs +11 -4
  92. package/dist/components/Checkbox/index.cjs.map +1 -1
  93. package/dist/components/Checkbox/index.d.ts +6 -0
  94. package/dist/components/Checkbox/index.d.ts.map +1 -1
  95. package/dist/components/Checkbox/index.js +11 -4
  96. package/dist/components/Checkbox/index.js.map +1 -1
  97. package/dist/components/Chip/index.cjs +11 -3
  98. package/dist/components/Chip/index.cjs.map +1 -1
  99. package/dist/components/Chip/index.d.ts +1 -2
  100. package/dist/components/Chip/index.d.ts.map +1 -1
  101. package/dist/components/Chip/index.js +11 -3
  102. package/dist/components/Chip/index.js.map +1 -1
  103. package/dist/components/CodeBlock/CodeBlock.module.scss.cjs +20 -20
  104. package/dist/components/CodeBlock/CodeBlock.module.scss.js +20 -20
  105. package/dist/components/CodeBlock/index.d.ts +8 -2
  106. package/dist/components/CodeBlock/index.d.ts.map +1 -1
  107. package/dist/components/Collapsible/Collapsible.module.scss.cjs +10 -10
  108. package/dist/components/Collapsible/Collapsible.module.scss.js +10 -10
  109. package/dist/components/Collapsible/index.cjs +45 -10
  110. package/dist/components/Collapsible/index.cjs.map +1 -1
  111. package/dist/components/Collapsible/index.d.ts +6 -12
  112. package/dist/components/Collapsible/index.d.ts.map +1 -1
  113. package/dist/components/Collapsible/index.js +45 -10
  114. package/dist/components/Collapsible/index.js.map +1 -1
  115. package/dist/components/Combobox/Combobox.module.scss.cjs +15 -15
  116. package/dist/components/Combobox/Combobox.module.scss.js +15 -15
  117. package/dist/components/Combobox/index.cjs +86 -27
  118. package/dist/components/Combobox/index.cjs.map +1 -1
  119. package/dist/components/Combobox/index.d.ts +40 -23
  120. package/dist/components/Combobox/index.d.ts.map +1 -1
  121. package/dist/components/Combobox/index.js +86 -27
  122. package/dist/components/Combobox/index.js.map +1 -1
  123. package/dist/components/Command/Command.module.scss.cjs +11 -11
  124. package/dist/components/Command/Command.module.scss.js +11 -11
  125. package/dist/components/Command/index.cjs +55 -22
  126. package/dist/components/Command/index.cjs.map +1 -1
  127. package/dist/components/Command/index.d.ts +3 -3
  128. package/dist/components/Command/index.d.ts.map +1 -1
  129. package/dist/components/Command/index.js +55 -22
  130. package/dist/components/Command/index.js.map +1 -1
  131. package/dist/components/ConversationList/ConversationList.module.scss.cjs +10 -10
  132. package/dist/components/ConversationList/ConversationList.module.scss.js +10 -10
  133. package/dist/components/ConversationList/index.cjs +6 -3
  134. package/dist/components/ConversationList/index.cjs.map +1 -1
  135. package/dist/components/ConversationList/index.d.ts +1 -1
  136. package/dist/components/ConversationList/index.d.ts.map +1 -1
  137. package/dist/components/ConversationList/index.js +6 -3
  138. package/dist/components/ConversationList/index.js.map +1 -1
  139. package/dist/components/DataTable/DataTable.module.scss.cjs +26 -26
  140. package/dist/components/DataTable/DataTable.module.scss.js +26 -26
  141. package/dist/components/DataTable/index.cjs +25 -4
  142. package/dist/components/DataTable/index.cjs.map +1 -1
  143. package/dist/components/DataTable/index.d.ts +7 -2
  144. package/dist/components/DataTable/index.d.ts.map +1 -1
  145. package/dist/components/DataTable/index.js +25 -4
  146. package/dist/components/DataTable/index.js.map +1 -1
  147. package/dist/components/DatePicker/DatePicker.module.scss.cjs +26 -26
  148. package/dist/components/DatePicker/DatePicker.module.scss.js +26 -26
  149. package/dist/components/DatePicker/index.d.ts +4 -5
  150. package/dist/components/DatePicker/index.d.ts.map +1 -1
  151. package/dist/components/Dialog/Dialog.module.scss.cjs +14 -14
  152. package/dist/components/Dialog/Dialog.module.scss.js +14 -14
  153. package/dist/components/Dialog/index.cjs +14 -10
  154. package/dist/components/Dialog/index.cjs.map +1 -1
  155. package/dist/components/Dialog/index.d.ts +26 -17
  156. package/dist/components/Dialog/index.d.ts.map +1 -1
  157. package/dist/components/Dialog/index.js +14 -10
  158. package/dist/components/Dialog/index.js.map +1 -1
  159. package/dist/components/Drawer/Drawer.module.scss.cjs +26 -26
  160. package/dist/components/Drawer/Drawer.module.scss.js +26 -26
  161. package/dist/components/Drawer/index.cjs +41 -11
  162. package/dist/components/Drawer/index.cjs.map +1 -1
  163. package/dist/components/Drawer/index.d.ts +11 -13
  164. package/dist/components/Drawer/index.d.ts.map +1 -1
  165. package/dist/components/Drawer/index.js +24 -11
  166. package/dist/components/Drawer/index.js.map +1 -1
  167. package/dist/components/Editor/Editor.module.scss.cjs +17 -17
  168. package/dist/components/Editor/Editor.module.scss.js +17 -17
  169. package/dist/components/Editor/index.cjs +32 -7
  170. package/dist/components/Editor/index.cjs.map +1 -1
  171. package/dist/components/Editor/index.d.ts +16 -3
  172. package/dist/components/Editor/index.d.ts.map +1 -1
  173. package/dist/components/Editor/index.js +32 -7
  174. package/dist/components/Editor/index.js.map +1 -1
  175. package/dist/components/EmptyState/EmptyState.module.scss.cjs +8 -8
  176. package/dist/components/EmptyState/EmptyState.module.scss.js +8 -8
  177. package/dist/components/EmptyState/index.cjs +12 -8
  178. package/dist/components/EmptyState/index.cjs.map +1 -1
  179. package/dist/components/EmptyState/index.d.ts +8 -12
  180. package/dist/components/EmptyState/index.d.ts.map +1 -1
  181. package/dist/components/EmptyState/index.js +12 -8
  182. package/dist/components/EmptyState/index.js.map +1 -1
  183. package/dist/components/Fieldset/index.cjs +2 -2
  184. package/dist/components/Fieldset/index.cjs.map +1 -1
  185. package/dist/components/Fieldset/index.d.ts +2 -3
  186. package/dist/components/Fieldset/index.d.ts.map +1 -1
  187. package/dist/components/Fieldset/index.js +2 -2
  188. package/dist/components/Fieldset/index.js.map +1 -1
  189. package/dist/components/Form/index.cjs +13 -13
  190. package/dist/components/Form/index.cjs.map +1 -1
  191. package/dist/components/Form/index.d.ts +5 -2
  192. package/dist/components/Form/index.d.ts.map +1 -1
  193. package/dist/components/Form/index.js +13 -13
  194. package/dist/components/Form/index.js.map +1 -1
  195. package/dist/components/Grid/Grid.module.scss.cjs +57 -57
  196. package/dist/components/Grid/Grid.module.scss.js +57 -57
  197. package/dist/components/Grid/index.cjs +7 -4
  198. package/dist/components/Grid/index.cjs.map +1 -1
  199. package/dist/components/Grid/index.d.ts +5 -3
  200. package/dist/components/Grid/index.d.ts.map +1 -1
  201. package/dist/components/Grid/index.js +7 -4
  202. package/dist/components/Grid/index.js.map +1 -1
  203. package/dist/components/Header/Header.module.scss.cjs +21 -21
  204. package/dist/components/Header/Header.module.scss.js +21 -21
  205. package/dist/components/Header/index.cjs +61 -23
  206. package/dist/components/Header/index.cjs.map +1 -1
  207. package/dist/components/Header/index.d.ts +27 -34
  208. package/dist/components/Header/index.d.ts.map +1 -1
  209. package/dist/components/Header/index.js +61 -23
  210. package/dist/components/Header/index.js.map +1 -1
  211. package/dist/components/Icon/index.cjs +11 -1
  212. package/dist/components/Icon/index.cjs.map +1 -1
  213. package/dist/components/Icon/index.d.ts +28 -9
  214. package/dist/components/Icon/index.d.ts.map +1 -1
  215. package/dist/components/Icon/index.js +11 -1
  216. package/dist/components/Icon/index.js.map +1 -1
  217. package/dist/components/Image/index.cjs +15 -4
  218. package/dist/components/Image/index.cjs.map +1 -1
  219. package/dist/components/Image/index.d.ts +7 -1
  220. package/dist/components/Image/index.d.ts.map +1 -1
  221. package/dist/components/Image/index.js +15 -4
  222. package/dist/components/Image/index.js.map +1 -1
  223. package/dist/components/Input/Input.module.scss.cjs +13 -13
  224. package/dist/components/Input/Input.module.scss.js +13 -13
  225. package/dist/components/Input/index.cjs +79 -31
  226. package/dist/components/Input/index.cjs.map +1 -1
  227. package/dist/components/Input/index.d.ts +17 -3
  228. package/dist/components/Input/index.d.ts.map +1 -1
  229. package/dist/components/Input/index.js +79 -31
  230. package/dist/components/Input/index.js.map +1 -1
  231. package/dist/components/Link/index.cjs +17 -0
  232. package/dist/components/Link/index.cjs.map +1 -1
  233. package/dist/components/Link/index.d.ts.map +1 -1
  234. package/dist/components/Link/index.js +17 -0
  235. package/dist/components/Link/index.js.map +1 -1
  236. package/dist/components/Listbox/Listbox.module.scss.cjs +8 -8
  237. package/dist/components/Listbox/Listbox.module.scss.js +8 -8
  238. package/dist/components/Listbox/index.cjs +10 -6
  239. package/dist/components/Listbox/index.cjs.map +1 -1
  240. package/dist/components/Listbox/index.d.ts +2 -2
  241. package/dist/components/Listbox/index.d.ts.map +1 -1
  242. package/dist/components/Listbox/index.js +10 -6
  243. package/dist/components/Listbox/index.js.map +1 -1
  244. package/dist/components/Markdown/Markdown.module.scss.cjs +1 -1
  245. package/dist/components/Markdown/Markdown.module.scss.js +1 -1
  246. package/dist/components/Markdown/index.d.ts +4 -2
  247. package/dist/components/Markdown/index.d.ts.map +1 -1
  248. package/dist/components/Menu/Menu.module.scss.cjs +13 -13
  249. package/dist/components/Menu/Menu.module.scss.js +13 -13
  250. package/dist/components/Menu/index.cjs +41 -16
  251. package/dist/components/Menu/index.cjs.map +1 -1
  252. package/dist/components/Menu/index.d.ts +24 -27
  253. package/dist/components/Menu/index.d.ts.map +1 -1
  254. package/dist/components/Menu/index.js +41 -16
  255. package/dist/components/Menu/index.js.map +1 -1
  256. package/dist/components/Message/Message.module.scss.cjs +18 -18
  257. package/dist/components/Message/Message.module.scss.js +18 -18
  258. package/dist/components/NavigationMenu/NavigationMenu.module.scss.cjs +28 -28
  259. package/dist/components/NavigationMenu/NavigationMenu.module.scss.js +28 -28
  260. package/dist/components/NavigationMenu/NavigationMenuContext.cjs.map +1 -1
  261. package/dist/components/NavigationMenu/NavigationMenuContext.d.ts +9 -0
  262. package/dist/components/NavigationMenu/NavigationMenuContext.d.ts.map +1 -1
  263. package/dist/components/NavigationMenu/NavigationMenuContext.js.map +1 -1
  264. package/dist/components/NavigationMenu/index.cjs +92 -21
  265. package/dist/components/NavigationMenu/index.cjs.map +1 -1
  266. package/dist/components/NavigationMenu/index.d.ts +5 -1
  267. package/dist/components/NavigationMenu/index.d.ts.map +1 -1
  268. package/dist/components/NavigationMenu/index.js +92 -21
  269. package/dist/components/NavigationMenu/index.js.map +1 -1
  270. package/dist/components/NavigationMenu/useNavigationMenu.cjs +2 -0
  271. package/dist/components/NavigationMenu/useNavigationMenu.cjs.map +1 -1
  272. package/dist/components/NavigationMenu/useNavigationMenu.d.ts +1 -0
  273. package/dist/components/NavigationMenu/useNavigationMenu.d.ts.map +1 -1
  274. package/dist/components/NavigationMenu/useNavigationMenu.js +2 -0
  275. package/dist/components/NavigationMenu/useNavigationMenu.js.map +1 -1
  276. package/dist/components/Pagination/index.cjs +37 -9
  277. package/dist/components/Pagination/index.cjs.map +1 -1
  278. package/dist/components/Pagination/index.d.ts +2 -3
  279. package/dist/components/Pagination/index.d.ts.map +1 -1
  280. package/dist/components/Pagination/index.js +37 -9
  281. package/dist/components/Pagination/index.js.map +1 -1
  282. package/dist/components/Popover/Popover.module.scss.cjs +10 -10
  283. package/dist/components/Popover/Popover.module.scss.js +10 -10
  284. package/dist/components/Popover/index.cjs +52 -10
  285. package/dist/components/Popover/index.cjs.map +1 -1
  286. package/dist/components/Popover/index.d.ts +22 -16
  287. package/dist/components/Popover/index.d.ts.map +1 -1
  288. package/dist/components/Popover/index.js +35 -10
  289. package/dist/components/Popover/index.js.map +1 -1
  290. package/dist/components/Progress/index.cjs +3 -1
  291. package/dist/components/Progress/index.cjs.map +1 -1
  292. package/dist/components/Progress/index.d.ts.map +1 -1
  293. package/dist/components/Progress/index.js +3 -1
  294. package/dist/components/Progress/index.js.map +1 -1
  295. package/dist/components/Prompt/Prompt.module.scss.cjs +14 -14
  296. package/dist/components/Prompt/Prompt.module.scss.js +14 -14
  297. package/dist/components/Prompt/index.cjs +14 -2
  298. package/dist/components/Prompt/index.cjs.map +1 -1
  299. package/dist/components/Prompt/index.d.ts +8 -5
  300. package/dist/components/Prompt/index.d.ts.map +1 -1
  301. package/dist/components/Prompt/index.js +14 -2
  302. package/dist/components/Prompt/index.js.map +1 -1
  303. package/dist/components/RadioGroup/index.cjs +14 -6
  304. package/dist/components/RadioGroup/index.cjs.map +1 -1
  305. package/dist/components/RadioGroup/index.d.ts +12 -2
  306. package/dist/components/RadioGroup/index.d.ts.map +1 -1
  307. package/dist/components/RadioGroup/index.js +14 -6
  308. package/dist/components/RadioGroup/index.js.map +1 -1
  309. package/dist/components/Select/Select.module.scss.cjs +10 -10
  310. package/dist/components/Select/Select.module.scss.js +10 -10
  311. package/dist/components/Select/index.cjs +43 -29
  312. package/dist/components/Select/index.cjs.map +1 -1
  313. package/dist/components/Select/index.d.ts +12 -11
  314. package/dist/components/Select/index.d.ts.map +1 -1
  315. package/dist/components/Select/index.js +43 -29
  316. package/dist/components/Select/index.js.map +1 -1
  317. package/dist/components/Sidebar/Sidebar.module.scss.cjs +42 -42
  318. package/dist/components/Sidebar/Sidebar.module.scss.js +42 -42
  319. package/dist/components/Sidebar/index.cjs +73 -26
  320. package/dist/components/Sidebar/index.cjs.map +1 -1
  321. package/dist/components/Sidebar/index.d.ts +23 -35
  322. package/dist/components/Sidebar/index.d.ts.map +1 -1
  323. package/dist/components/Sidebar/index.js +73 -26
  324. package/dist/components/Sidebar/index.js.map +1 -1
  325. package/dist/components/Skeleton/index.cjs +6 -3
  326. package/dist/components/Skeleton/index.cjs.map +1 -1
  327. package/dist/components/Skeleton/index.d.ts +3 -7
  328. package/dist/components/Skeleton/index.d.ts.map +1 -1
  329. package/dist/components/Skeleton/index.js +6 -3
  330. package/dist/components/Skeleton/index.js.map +1 -1
  331. package/dist/components/Slider/Slider.module.scss.cjs +13 -10
  332. package/dist/components/Slider/Slider.module.scss.cjs.map +1 -1
  333. package/dist/components/Slider/Slider.module.scss.js +13 -10
  334. package/dist/components/Slider/Slider.module.scss.js.map +1 -1
  335. package/dist/components/Slider/index.cjs +33 -1
  336. package/dist/components/Slider/index.cjs.map +1 -1
  337. package/dist/components/Slider/index.d.ts +2 -0
  338. package/dist/components/Slider/index.d.ts.map +1 -1
  339. package/dist/components/Slider/index.js +33 -1
  340. package/dist/components/Slider/index.js.map +1 -1
  341. package/dist/components/Stack/index.cjs +12 -2
  342. package/dist/components/Stack/index.cjs.map +1 -1
  343. package/dist/components/Stack/index.d.ts +3 -2
  344. package/dist/components/Stack/index.d.ts.map +1 -1
  345. package/dist/components/Stack/index.js +12 -2
  346. package/dist/components/Stack/index.js.map +1 -1
  347. package/dist/components/Table/Table.module.scss.cjs +16 -16
  348. package/dist/components/Table/Table.module.scss.js +16 -16
  349. package/dist/components/Table/index.d.ts +10 -4
  350. package/dist/components/Table/index.d.ts.map +1 -1
  351. package/dist/components/TableOfContents/index.cjs +8 -5
  352. package/dist/components/TableOfContents/index.cjs.map +1 -1
  353. package/dist/components/TableOfContents/index.d.ts +2 -2
  354. package/dist/components/TableOfContents/index.d.ts.map +1 -1
  355. package/dist/components/TableOfContents/index.js +8 -5
  356. package/dist/components/TableOfContents/index.js.map +1 -1
  357. package/dist/components/Tabs/Tabs.module.scss.cjs +9 -9
  358. package/dist/components/Tabs/Tabs.module.scss.js +9 -9
  359. package/dist/components/Tabs/index.cjs +9 -6
  360. package/dist/components/Tabs/index.cjs.map +1 -1
  361. package/dist/components/Tabs/index.d.ts +4 -1
  362. package/dist/components/Tabs/index.d.ts.map +1 -1
  363. package/dist/components/Tabs/index.js +9 -6
  364. package/dist/components/Tabs/index.js.map +1 -1
  365. package/dist/components/Textarea/index.cjs +61 -43
  366. package/dist/components/Textarea/index.cjs.map +1 -1
  367. package/dist/components/Textarea/index.d.ts +9 -1
  368. package/dist/components/Textarea/index.d.ts.map +1 -1
  369. package/dist/components/Textarea/index.js +61 -43
  370. package/dist/components/Textarea/index.js.map +1 -1
  371. package/dist/components/Theme/index.cjs +3 -1
  372. package/dist/components/Theme/index.cjs.map +1 -1
  373. package/dist/components/Theme/index.d.ts +2 -4
  374. package/dist/components/Theme/index.d.ts.map +1 -1
  375. package/dist/components/Theme/index.js +3 -1
  376. package/dist/components/Theme/index.js.map +1 -1
  377. package/dist/components/ThinkingIndicator/ThinkingIndicator.module.scss.cjs +22 -22
  378. package/dist/components/ThinkingIndicator/ThinkingIndicator.module.scss.js +22 -22
  379. package/dist/components/Toast/Toast.module.scss.cjs +20 -20
  380. package/dist/components/Toast/Toast.module.scss.js +20 -20
  381. package/dist/components/Toast/index.cjs +15 -14
  382. package/dist/components/Toast/index.cjs.map +1 -1
  383. package/dist/components/Toast/index.d.ts +9 -5
  384. package/dist/components/Toast/index.d.ts.map +1 -1
  385. package/dist/components/Toast/index.js +15 -14
  386. package/dist/components/Toast/index.js.map +1 -1
  387. package/dist/components/Toggle/Toggle.module.scss.cjs +11 -11
  388. package/dist/components/Toggle/Toggle.module.scss.js +11 -11
  389. package/dist/components/Toggle/index.cjs +1 -1
  390. package/dist/components/Toggle/index.cjs.map +1 -1
  391. package/dist/components/Toggle/index.js +1 -1
  392. package/dist/components/Toggle/index.js.map +1 -1
  393. package/dist/components/ToggleGroup/ToggleGroup.module.scss.cjs +17 -17
  394. package/dist/components/ToggleGroup/ToggleGroup.module.scss.js +17 -17
  395. package/dist/components/ToggleGroup/index.cjs +27 -8
  396. package/dist/components/ToggleGroup/index.cjs.map +1 -1
  397. package/dist/components/ToggleGroup/index.d.ts +8 -3
  398. package/dist/components/ToggleGroup/index.d.ts.map +1 -1
  399. package/dist/components/ToggleGroup/index.js +27 -8
  400. package/dist/components/ToggleGroup/index.js.map +1 -1
  401. package/dist/components/Tooltip/Tooltip.module.scss.cjs +3 -3
  402. package/dist/components/Tooltip/Tooltip.module.scss.js +3 -3
  403. package/dist/components/Tooltip/index.cjs +32 -10
  404. package/dist/components/Tooltip/index.cjs.map +1 -1
  405. package/dist/components/Tooltip/index.d.ts +3 -1
  406. package/dist/components/Tooltip/index.d.ts.map +1 -1
  407. package/dist/components/Tooltip/index.js +32 -10
  408. package/dist/components/Tooltip/index.js.map +1 -1
  409. package/dist/components/VisuallyHidden/index.cjs +10 -2
  410. package/dist/components/VisuallyHidden/index.cjs.map +1 -1
  411. package/dist/components/VisuallyHidden/index.d.ts +1 -1
  412. package/dist/components/VisuallyHidden/index.d.ts.map +1 -1
  413. package/dist/components/VisuallyHidden/index.js +10 -2
  414. package/dist/components/VisuallyHidden/index.js.map +1 -1
  415. package/dist/datepicker.cjs +32 -11
  416. package/dist/datepicker.cjs.map +1 -1
  417. package/dist/datepicker.js +32 -11
  418. package/dist/datepicker.js.map +1 -1
  419. package/dist/index.cjs.map +1 -1
  420. package/dist/index.d.ts +2 -1
  421. package/dist/index.d.ts.map +1 -1
  422. package/dist/index.js.map +1 -1
  423. package/dist/markdown.cjs +5 -5
  424. package/dist/markdown.cjs.map +1 -1
  425. package/dist/markdown.js +5 -5
  426. package/dist/markdown.js.map +1 -1
  427. package/dist/table.cjs +19 -3
  428. package/dist/table.cjs.map +1 -1
  429. package/dist/table.js +19 -3
  430. package/dist/table.js.map +1 -1
  431. package/fragments.json +1 -1
  432. package/package.json +2 -2
  433. package/src/blocks/AccountSettings.block.ts +1 -1
  434. package/src/blocks/ActivityFeed.block.ts +1 -1
  435. package/src/blocks/ActivityFeedSkeleton.block.ts +1 -1
  436. package/src/blocks/BlogEditor.block.ts +1 -1
  437. package/src/blocks/ChatInterface.block.ts +1 -1
  438. package/src/blocks/ChatMessages.block.ts +1 -1
  439. package/src/blocks/CheckoutForm.block.ts +1 -1
  440. package/src/blocks/CommandPalette.block.ts +1 -1
  441. package/src/blocks/ContactForm.block.ts +1 -1
  442. package/src/blocks/DashboardLayout.block.ts +1 -1
  443. package/src/blocks/DashboardPage.block.ts +1 -1
  444. package/src/blocks/DashboardSkeleton.block.ts +1 -1
  445. package/src/blocks/DataTable.block.ts +1 -1
  446. package/src/blocks/EmptyState.block.ts +1 -1
  447. package/src/blocks/FAQSection.block.ts +1 -1
  448. package/src/blocks/FeatureGrid.block.ts +1 -1
  449. package/src/blocks/HeroSection.block.ts +1 -1
  450. package/src/blocks/LoginForm.block.ts +1 -1
  451. package/src/blocks/NavigationHeader.block.ts +1 -1
  452. package/src/blocks/PaginatedTable.block.ts +1 -1
  453. package/src/blocks/PricingComparison.block.ts +1 -1
  454. package/src/blocks/ProductCard.block.ts +1 -1
  455. package/src/blocks/RegistrationForm.block.ts +1 -1
  456. package/src/blocks/SettingsDrawer.block.ts +1 -1
  457. package/src/blocks/SettingsPanel.block.ts +1 -1
  458. package/src/blocks/ShoppingCart.block.ts +1 -1
  459. package/src/blocks/StatsCard.block.ts +1 -1
  460. package/src/blocks/StatsCardSkeleton.block.ts +1 -1
  461. package/src/blocks/TableSkeleton.block.ts +1 -1
  462. package/src/blocks/ThinkingStates.block.ts +1 -1
  463. package/src/components/Accordion/Accordion.fragment.tsx +7 -7
  464. package/src/components/Accordion/Accordion.module.scss +2 -2
  465. package/src/components/Accordion/Accordion.test.tsx +41 -5
  466. package/src/components/Accordion/index.tsx +41 -14
  467. package/src/components/Alert/Alert.fragment.tsx +5 -1
  468. package/src/components/Alert/Alert.module.scss +1 -1
  469. package/src/components/Alert/Alert.test.tsx +25 -0
  470. package/src/components/Alert/index.tsx +49 -30
  471. package/src/components/AppShell/AppShell.fragment.tsx +1 -1
  472. package/src/components/AppShell/AppShell.module.scss +5 -5
  473. package/src/components/AppShell/AppShell.test.tsx +12 -0
  474. package/src/components/AppShell/index.tsx +2 -0
  475. package/src/components/Avatar/Avatar.fragment.tsx +7 -1
  476. package/src/components/Avatar/Avatar.test.tsx +24 -2
  477. package/src/components/Avatar/index.tsx +13 -1
  478. package/src/components/Badge/Badge.fragment.tsx +16 -1
  479. package/src/components/Badge/Badge.test.tsx +8 -1
  480. package/src/components/Badge/index.tsx +7 -2
  481. package/src/components/BentoGrid/BentoGrid.fragment.tsx +3 -1
  482. package/src/components/BentoGrid/BentoGrid.module.scss +52 -16
  483. package/src/components/BentoGrid/BentoGrid.test.tsx +20 -0
  484. package/src/components/BentoGrid/index.tsx +9 -12
  485. package/src/components/Box/Box.fragment.tsx +3 -1
  486. package/src/components/Box/Box.test.tsx +14 -0
  487. package/src/components/Box/index.tsx +8 -2
  488. package/src/components/Breadcrumbs/Breadcrumbs.fragment.tsx +19 -1
  489. package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +13 -0
  490. package/src/components/Breadcrumbs/index.tsx +5 -1
  491. package/src/components/Button/Button.fragment.tsx +28 -6
  492. package/src/components/Button/Button.module.scss +3 -3
  493. package/src/components/Button/Button.test.tsx +11 -0
  494. package/src/components/Button/index.tsx +16 -6
  495. package/src/components/ButtonGroup/ButtonGroup.fragment.tsx +4 -2
  496. package/src/components/ButtonGroup/ButtonGroup.test.tsx +10 -0
  497. package/src/components/ButtonGroup/index.tsx +3 -3
  498. package/src/components/Card/Card.fragment.tsx +24 -9
  499. package/src/components/Card/Card.module.scss +8 -8
  500. package/src/components/Card/Card.test.tsx +4 -5
  501. package/src/components/Card/index.tsx +8 -38
  502. package/src/components/Chart/Chart.fragment.tsx +5 -3
  503. package/src/components/Chart/Chart.module.scss +1 -1
  504. package/src/components/Chart/index.tsx +12 -10
  505. package/src/components/Checkbox/Checkbox.fragment.tsx +27 -1
  506. package/src/components/Checkbox/Checkbox.module.scss +3 -3
  507. package/src/components/Checkbox/index.tsx +16 -3
  508. package/src/components/Chip/Chip.fragment.tsx +20 -3
  509. package/src/components/Chip/Chip.test.tsx +28 -0
  510. package/src/components/Chip/index.tsx +14 -6
  511. package/src/components/CodeBlock/CodeBlock.fragment.tsx +3 -1
  512. package/src/components/CodeBlock/CodeBlock.module.scss +9 -9
  513. package/src/components/CodeBlock/CodeBlock.test.tsx +21 -0
  514. package/src/components/CodeBlock/index.tsx +23 -9
  515. package/src/components/Collapsible/Collapsible.fragment.tsx +1 -1
  516. package/src/components/Collapsible/Collapsible.module.scss +1 -1
  517. package/src/components/Collapsible/Collapsible.test.tsx +41 -0
  518. package/src/components/Collapsible/index.tsx +53 -16
  519. package/src/components/ColorPicker/ColorPicker.fragment.tsx +1 -1
  520. package/src/components/Combobox/Combobox.fragment.tsx +63 -9
  521. package/src/components/Combobox/Combobox.module.scss +4 -7
  522. package/src/components/Combobox/Combobox.test.tsx +79 -3
  523. package/src/components/Combobox/index.tsx +140 -51
  524. package/src/components/Command/Command.fragment.tsx +3 -3
  525. package/src/components/Command/Command.module.scss +5 -5
  526. package/src/components/Command/Command.test.tsx +110 -0
  527. package/src/components/Command/index.tsx +66 -20
  528. package/src/components/ConversationList/ConversationList.fragment.tsx +4 -3
  529. package/src/components/ConversationList/ConversationList.module.scss +5 -5
  530. package/src/components/ConversationList/ConversationList.test.tsx +21 -0
  531. package/src/components/ConversationList/index.tsx +8 -4
  532. package/src/components/DataTable/DataTable.fragment.tsx +12 -2
  533. package/src/components/DataTable/DataTable.module.scss +3 -3
  534. package/src/components/DataTable/DataTable.test.tsx +34 -4
  535. package/src/components/DataTable/index.tsx +44 -6
  536. package/src/components/DatePicker/DatePicker.fragment.tsx +3 -1
  537. package/src/components/DatePicker/DatePicker.module.scss +1 -1
  538. package/src/components/DatePicker/DatePicker.test.tsx +96 -0
  539. package/src/components/DatePicker/index.tsx +38 -16
  540. package/src/components/Dialog/Dialog.fragment.tsx +28 -1
  541. package/src/components/Dialog/Dialog.module.scss +6 -6
  542. package/src/components/Dialog/Dialog.test.tsx +23 -0
  543. package/src/components/Dialog/index.tsx +38 -21
  544. package/src/components/Drawer/Drawer.fragment.tsx +4 -1
  545. package/src/components/Drawer/Drawer.module.scss +3 -3
  546. package/src/components/Drawer/Drawer.test.tsx +35 -0
  547. package/src/components/Drawer/index.tsx +29 -18
  548. package/src/components/Editor/Editor.fragment.tsx +10 -3
  549. package/src/components/Editor/Editor.module.scss +4 -4
  550. package/src/components/Editor/Editor.test.tsx +68 -1
  551. package/src/components/Editor/index.tsx +60 -9
  552. package/src/components/EmptyState/EmptyState.fragment.tsx +3 -1
  553. package/src/components/EmptyState/EmptyState.module.scss +3 -3
  554. package/src/components/EmptyState/EmptyState.test.tsx +18 -0
  555. package/src/components/EmptyState/index.tsx +16 -16
  556. package/src/components/Field/Field.fragment.tsx +1 -1
  557. package/src/components/Fieldset/Fieldset.fragment.tsx +3 -1
  558. package/src/components/Fieldset/Fieldset.test.tsx +14 -0
  559. package/src/components/Fieldset/index.tsx +3 -4
  560. package/src/components/Form/Form.fragment.tsx +12 -7
  561. package/src/components/Form/index.tsx +13 -17
  562. package/src/components/Grid/Grid.fragment.tsx +4 -3
  563. package/src/components/Grid/Grid.module.scss +3 -3
  564. package/src/components/Grid/index.tsx +11 -6
  565. package/src/components/Header/Header.fragment.tsx +31 -1
  566. package/src/components/Header/Header.module.scss +6 -6
  567. package/src/components/Header/Header.test.tsx +95 -1
  568. package/src/components/Header/index.tsx +95 -46
  569. package/src/components/Icon/Icon.fragment.tsx +21 -8
  570. package/src/components/Icon/Icon.test.tsx +27 -3
  571. package/src/components/Icon/index.tsx +39 -15
  572. package/src/components/Image/Image.fragment.tsx +15 -1
  573. package/src/components/Image/Image.test.tsx +32 -1
  574. package/src/components/Image/index.tsx +24 -4
  575. package/src/components/Input/Input.fragment.tsx +49 -1
  576. package/src/components/Input/Input.module.scss +4 -2
  577. package/src/components/Input/Input.test.tsx +3 -3
  578. package/src/components/Input/index.tsx +103 -37
  579. package/src/components/Link/Link.fragment.tsx +7 -6
  580. package/src/components/Link/Link.test.tsx +17 -1
  581. package/src/components/Link/index.tsx +22 -0
  582. package/src/components/List/List.fragment.tsx +1 -1
  583. package/src/components/Listbox/Listbox.fragment.tsx +3 -3
  584. package/src/components/Listbox/Listbox.module.scss +4 -4
  585. package/src/components/Listbox/Listbox.test.tsx +14 -0
  586. package/src/components/Listbox/index.tsx +12 -2
  587. package/src/components/Loading/Loading.fragment.tsx +1 -1
  588. package/src/components/Markdown/Markdown.fragment.tsx +5 -3
  589. package/src/components/Markdown/Markdown.module.scss +5 -5
  590. package/src/components/Markdown/Markdown.test.tsx +6 -0
  591. package/src/components/Markdown/index.tsx +12 -9
  592. package/src/components/Menu/Menu.fragment.tsx +19 -1
  593. package/src/components/Menu/Menu.module.scss +11 -11
  594. package/src/components/Menu/index.tsx +50 -33
  595. package/src/components/Message/Message.fragment.tsx +1 -1
  596. package/src/components/Message/Message.module.scss +3 -3
  597. package/src/components/NavigationMenu/NavigationMenu.fragment.tsx +10 -2
  598. package/src/components/NavigationMenu/NavigationMenu.module.scss +7 -7
  599. package/src/components/NavigationMenu/NavigationMenu.test.tsx +88 -4
  600. package/src/components/NavigationMenu/NavigationMenuContext.ts +17 -0
  601. package/src/components/NavigationMenu/index.tsx +119 -20
  602. package/src/components/NavigationMenu/useNavigationMenu.ts +4 -0
  603. package/src/components/Pagination/Pagination.fragment.tsx +4 -1
  604. package/src/components/Pagination/Pagination.test.tsx +39 -0
  605. package/src/components/Pagination/index.tsx +36 -10
  606. package/src/components/Popover/Popover.fragment.tsx +18 -1
  607. package/src/components/Popover/Popover.module.scss +13 -13
  608. package/src/components/Popover/Popover.test.tsx +23 -0
  609. package/src/components/Popover/index.tsx +44 -22
  610. package/src/components/Progress/Progress.fragment.tsx +3 -1
  611. package/src/components/Progress/Progress.test.tsx +8 -0
  612. package/src/components/Progress/index.tsx +9 -1
  613. package/src/components/Prompt/Prompt.fragment.tsx +4 -1
  614. package/src/components/Prompt/Prompt.module.scss +3 -3
  615. package/src/components/Prompt/Prompt.test.tsx +19 -0
  616. package/src/components/Prompt/index.tsx +24 -6
  617. package/src/components/RadioGroup/RadioGroup.fragment.tsx +31 -1
  618. package/src/components/RadioGroup/index.tsx +22 -3
  619. package/src/components/ScrollArea/ScrollArea.fragment.tsx +1 -1
  620. package/src/components/Select/Select.fragment.tsx +30 -3
  621. package/src/components/Select/Select.module.scss +3 -3
  622. package/src/components/Select/Select.test.tsx +41 -0
  623. package/src/components/Select/index.tsx +55 -44
  624. package/src/components/Separator/Separator.fragment.tsx +1 -1
  625. package/src/components/Sidebar/Sidebar.fragment.tsx +3 -1
  626. package/src/components/Sidebar/Sidebar.module.scss +20 -20
  627. package/src/components/Sidebar/Sidebar.test.tsx +108 -4
  628. package/src/components/Sidebar/index.tsx +93 -51
  629. package/src/components/Skeleton/Skeleton.fragment.tsx +3 -1
  630. package/src/components/Skeleton/Skeleton.test.tsx +12 -0
  631. package/src/components/Skeleton/index.tsx +6 -7
  632. package/src/components/Slider/Slider.fragment.tsx +21 -1
  633. package/src/components/Slider/Slider.module.scss +31 -0
  634. package/src/components/Slider/Slider.test.tsx +16 -0
  635. package/src/components/Slider/index.tsx +40 -1
  636. package/src/components/Stack/Stack.fragment.tsx +3 -1
  637. package/src/components/Stack/index.tsx +13 -6
  638. package/src/components/Table/Table.fragment.tsx +43 -2
  639. package/src/components/Table/Table.module.scss +2 -2
  640. package/src/components/Table/index.tsx +23 -5
  641. package/src/components/TableOfContents/TableOfContents.fragment.tsx +4 -2
  642. package/src/components/TableOfContents/TableOfContents.test.tsx +34 -9
  643. package/src/components/TableOfContents/index.tsx +9 -5
  644. package/src/components/Tabs/Tabs.fragment.tsx +33 -8
  645. package/src/components/Tabs/Tabs.module.scss +8 -8
  646. package/src/components/Tabs/index.tsx +22 -14
  647. package/src/components/Text/Text.fragment.tsx +1 -1
  648. package/src/components/Textarea/Textarea.fragment.tsx +27 -1
  649. package/src/components/Textarea/index.tsx +39 -14
  650. package/src/components/Theme/Theme.fragment.tsx +3 -1
  651. package/src/components/Theme/Theme.test.tsx +11 -0
  652. package/src/components/Theme/index.tsx +3 -3
  653. package/src/components/ThinkingIndicator/ThinkingIndicator.fragment.tsx +1 -1
  654. package/src/components/ThinkingIndicator/ThinkingIndicator.module.scss +1 -1
  655. package/src/components/Toast/Toast.fragment.tsx +6 -3
  656. package/src/components/Toast/Toast.module.scss +8 -6
  657. package/src/components/Toast/index.tsx +24 -20
  658. package/src/components/Toggle/Toggle.fragment.tsx +1 -1
  659. package/src/components/Toggle/Toggle.module.scss +61 -21
  660. package/src/components/Toggle/index.tsx +3 -3
  661. package/src/components/ToggleGroup/ToggleGroup.fragment.tsx +33 -8
  662. package/src/components/ToggleGroup/ToggleGroup.module.scss +3 -3
  663. package/src/components/ToggleGroup/index.tsx +29 -9
  664. package/src/components/Tooltip/Tooltip.fragment.tsx +16 -1
  665. package/src/components/Tooltip/Tooltip.module.scss +1 -1
  666. package/src/components/Tooltip/Tooltip.test.tsx +17 -0
  667. package/src/components/Tooltip/index.tsx +60 -31
  668. package/src/components/VisuallyHidden/VisuallyHidden.fragment.tsx +3 -1
  669. package/src/components/VisuallyHidden/VisuallyHidden.test.tsx +12 -0
  670. package/src/components/VisuallyHidden/index.tsx +7 -3
  671. package/src/index.ts +3 -2
  672. package/src/tokens/_computed.scss +1 -19
  673. package/src/tokens/_density.scss +0 -42
  674. package/src/tokens/_mixins.scss +4 -0
  675. package/src/tokens/_variables.scss +12 -114
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/components/AppShell/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './AppShell.module.scss';\nimport {\n SidebarProvider,\n Sidebar,\n useSidebar,\n type SidebarCollapsible,\n} from '../Sidebar';\n\n// ============================================\n// Types\n// ============================================\n\n/**\n * ```\n * 'default' 'sidebar' 'sidebar-floating'\n * ┌──────────────┐ ┌────┬─────────┐ ┌────┬─────────┐\n * │ Header │ │ │ Header │ │ │ Header │\n * ├────┬─────────┤ │Side├─────────┤ │Side├╌╌╌╌╌╌╌╌╌┤\n * │ │ │ │bar │ │ │bar │┌───────┐│\n * │Side│ Main │ │ │ Main │ │ ││ Main ││\n * │bar │ │ │ │ │ │ │└───────┘│\n * └────┴─────────┘ └────┴─────────┘ └────┴─────────┘\n * ```\n */\nexport type AppShellLayout = 'default' | 'sidebar' | 'sidebar-floating';\n\nexport interface AppShellProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /**\n * Layout mode:\n *\n * ```\n * 'default' 'sidebar' 'sidebar-floating'\n * ┌──────────────┐ ┌────┬─────────┐ ┌────┬─────────┐\n * │ Header │ │ │ Header │ │ │ Header │\n * ├────┬─────────┤ │Side├─────────┤ │Side├╌╌╌╌╌╌╌╌╌┤\n * │ │ │ │bar │ │ │bar │┌───────┐│\n * │Side│ Main │ │ │ Main │ │ ││ Main ││\n * │bar │ │ │ │ │ │ │└───────┘│\n * └────┴─────────┘ └────┴─────────┘ └────┴─────────┘\n * ```\n *\n * - `'default'`: Header spans full width, sidebar below (default)\n * - `'sidebar'`: Sidebar is full height, header sits beside it\n * - `'sidebar-floating'`: Like `sidebar` but main content floats with rounded corners and a distinct background\n */\n layout?: AppShellLayout;\n}\n\nexport interface AppShellHeaderProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Header height (default: '56px') */\n height?: string;\n}\n\nexport interface AppShellSidebarProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Width of expanded sidebar (default: '240px') */\n width?: string;\n /** Width when collapsed (default: '64px') */\n collapsedWidth?: string;\n /** Collapse behavior */\n collapsible?: SidebarCollapsible;\n /** Sidebar position */\n position?: 'left' | 'right';\n /** Default collapsed state */\n defaultCollapsed?: boolean;\n}\n\nexport interface AppShellMainProps extends React.HTMLAttributes<HTMLElement> {\n children: React.ReactNode;\n /** Content padding */\n padding?: 'none' | 'sm' | 'md' | 'lg';\n}\n\nexport interface AppShellAsideProps extends React.HTMLAttributes<HTMLElement> {\n children: React.ReactNode;\n /** Aside width (default: '280px') */\n width?: string;\n /** Control visibility */\n visible?: boolean;\n}\n\n// ============================================\n// Context\n// ============================================\n\ninterface AppShellContextValue {\n layout: AppShellLayout;\n headerHeight: string;\n sidebarWidth: string;\n sidebarCollapsedWidth: string;\n asideWidth: string;\n asideVisible: boolean;\n}\n\nconst AppShellContext = React.createContext<AppShellContextValue>({\n layout: 'default',\n headerHeight: '56px',\n sidebarWidth: '240px',\n sidebarCollapsedWidth: '64px',\n asideWidth: '280px',\n asideVisible: false,\n});\n\nfunction useAppShell() {\n return React.useContext(AppShellContext);\n}\n\n// ============================================\n// Hooks\n// ============================================\n\nfunction useIsMobile() {\n const [isMobile, setIsMobile] = React.useState(false);\n\n React.useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const mq = window.matchMedia('(max-width: 767px)');\n setIsMobile(mq.matches);\n\n const handler = (e: MediaQueryListEvent) => setIsMobile(e.matches);\n mq.addEventListener('change', handler);\n return () => mq.removeEventListener('change', handler);\n }, []);\n\n return isMobile;\n}\n\n// ============================================\n// Helper to extract config from children\n// ============================================\n\ninterface ExtractedConfig {\n headerHeight: string;\n sidebarWidth: string;\n sidebarCollapsedWidth: string;\n sidebarCollapsible: SidebarCollapsible;\n sidebarDefaultCollapsed: boolean;\n asideWidth: string;\n asideVisible: boolean;\n}\n\nfunction extractConfigFromChildren(children: React.ReactNode): ExtractedConfig {\n const config: ExtractedConfig = {\n headerHeight: '56px',\n sidebarWidth: '240px',\n sidebarCollapsedWidth: '64px',\n sidebarCollapsible: 'icon',\n sidebarDefaultCollapsed: false,\n asideWidth: '280px',\n asideVisible: false,\n };\n\n React.Children.forEach(children, child => {\n if (!React.isValidElement(child)) return;\n\n if (child.type === AppShellHeader) {\n const props = child.props as AppShellHeaderProps;\n if (props.height) config.headerHeight = props.height;\n }\n\n if (child.type === AppShellSidebar) {\n const props = child.props as AppShellSidebarProps;\n if (props.width) config.sidebarWidth = props.width;\n if (props.collapsedWidth) config.sidebarCollapsedWidth = props.collapsedWidth;\n if (props.collapsible) config.sidebarCollapsible = props.collapsible;\n if (props.defaultCollapsed !== undefined) config.sidebarDefaultCollapsed = props.defaultCollapsed;\n }\n\n if (child.type === AppShellAside) {\n const props = child.props as AppShellAsideProps;\n if (props.width) config.asideWidth = props.width;\n if (props.visible !== false) config.asideVisible = true;\n }\n });\n\n return config;\n}\n\n// ============================================\n// Internal component to apply CSS variables\n// ============================================\n\nfunction AppShellInner({\n children,\n className,\n layout,\n ...htmlProps\n}: {\n children: React.ReactNode;\n className?: string;\n layout: AppShellLayout;\n} & React.HTMLAttributes<HTMLDivElement>) {\n const appShell = useAppShell();\n const { collapsed, isMobile, collapsible } = useSidebar();\n\n const classes = [\n styles.root,\n (layout === 'sidebar' || layout === 'sidebar-floating') && styles.sidebarLayout,\n layout === 'sidebar-floating' && styles.sidebarFloatingLayout,\n className,\n ].filter(Boolean).join(' ');\n\n // Calculate actual sidebar width based on state\n const actualSidebarWidth = isMobile\n ? '0px'\n : (collapsible === 'icon' && collapsed)\n ? appShell.sidebarCollapsedWidth\n : (collapsible === 'offcanvas' && collapsed)\n ? '0px'\n : appShell.sidebarWidth;\n\n const style: React.CSSProperties = {\n '--appshell-header-height': appShell.headerHeight,\n '--appshell-sidebar-width': actualSidebarWidth,\n '--appshell-sidebar-expanded-width': appShell.sidebarWidth,\n '--appshell-sidebar-collapsed-width': appShell.sidebarCollapsedWidth,\n '--appshell-aside-width': appShell.asideVisible ? appShell.asideWidth : '0px',\n } as React.CSSProperties;\n\n return (\n <div {...htmlProps} className={classes} style={style} data-layout={layout} data-mobile={isMobile || undefined}>\n {children}\n </div>\n );\n}\n\n// ============================================\n// Components\n// ============================================\n\n/**\n * AppShell - Root layout wrapper\n * Automatically wraps children with SidebarProvider\n */\nfunction AppShellRoot({\n children,\n layout = 'default',\n className,\n ...htmlProps\n}: AppShellProps) {\n // Extract config from children using useMemo to avoid re-renders\n const config = React.useMemo(() => extractConfigFromChildren(children), [children]);\n\n const contextValue: AppShellContextValue = {\n layout,\n headerHeight: config.headerHeight,\n sidebarWidth: config.sidebarWidth,\n sidebarCollapsedWidth: config.sidebarCollapsedWidth,\n asideWidth: config.asideWidth,\n asideVisible: config.asideVisible,\n };\n\n return (\n <AppShellContext.Provider value={contextValue}>\n <SidebarProvider\n width={config.sidebarWidth}\n collapsedWidth={config.sidebarCollapsedWidth}\n collapsible={config.sidebarCollapsible}\n defaultCollapsed={config.sidebarDefaultCollapsed}\n >\n <AppShellInner className={className} layout={layout} {...htmlProps}>\n {children}\n </AppShellInner>\n </SidebarProvider>\n </AppShellContext.Provider>\n );\n}\n\n/**\n * AppShell.Header - Fixed header slot\n */\nfunction AppShellHeader({\n children,\n height = '56px',\n className,\n style: styleProp,\n ...htmlProps\n}: AppShellHeaderProps) {\n const { layout } = useAppShell();\n\n const classes = [\n styles.header,\n (layout === 'sidebar' || layout === 'sidebar-floating') && styles.headerSidebar,\n layout === 'sidebar-floating' && styles.headerFloating,\n className,\n ].filter(Boolean).join(' ');\n\n const style: React.CSSProperties = {\n '--header-height': height,\n ...styleProp,\n } as React.CSSProperties;\n\n return (\n <div {...htmlProps} className={classes} style={style}>\n {children}\n </div>\n );\n}\n\n/**\n * AppShell.Sidebar - Sidebar slot (delegates to Sidebar component)\n */\nfunction AppShellSidebar({\n children,\n width = '240px',\n collapsedWidth = '64px',\n collapsible = 'icon',\n position = 'left',\n defaultCollapsed = false,\n 'aria-label': ariaLabel,\n className,\n ...htmlProps\n}: AppShellSidebarProps) {\n const isMobile = useIsMobile();\n const { layout } = useAppShell();\n\n const classes = [\n styles.sidebar,\n (layout === 'sidebar' || layout === 'sidebar-floating') && styles.sidebarFullHeight,\n layout === 'sidebar-floating' && styles.sidebarFloating,\n className,\n ].filter(Boolean).join(' ');\n\n return (\n <div {...htmlProps} className={classes}>\n <Sidebar\n width={width}\n collapsedWidth={collapsedWidth}\n position={position}\n collapsible={collapsible}\n defaultCollapsed={defaultCollapsed}\n aria-label={ariaLabel}\n >\n {children}\n </Sidebar>\n {isMobile && <Sidebar.Overlay />}\n </div>\n );\n}\n\n/**\n * AppShell.Main - Scrollable main content area\n */\nfunction AppShellMain({\n children,\n padding = 'md',\n className,\n id = 'main-content',\n ...htmlProps\n}: AppShellMainProps) {\n const { layout } = useAppShell();\n\n const classes = [\n styles.main,\n padding !== 'none' && styles[`padding${padding.charAt(0).toUpperCase() + padding.slice(1)}`],\n layout === 'sidebar-floating' && styles.mainFloating,\n className,\n ].filter(Boolean).join(' ');\n\n return (\n <main {...htmlProps} className={classes} id={id}>\n {children}\n </main>\n );\n}\n\n/**\n * AppShell.Aside - Optional right sidebar panel\n */\nfunction AppShellAside({\n children,\n width = '280px',\n visible = true,\n className,\n style: styleProp,\n ...htmlProps\n}: AppShellAsideProps) {\n if (!visible) {\n return null;\n }\n\n const classes = [styles.aside, className].filter(Boolean).join(' ');\n\n const style: React.CSSProperties = {\n '--aside-width': width,\n ...styleProp,\n } as React.CSSProperties;\n\n return (\n <aside {...htmlProps} className={classes} style={style}>\n {children}\n </aside>\n );\n}\n\n// ============================================\n// Export compound component\n// ============================================\n\nexport const AppShell = Object.assign(AppShellRoot, {\n Header: AppShellHeader,\n Sidebar: AppShellSidebar,\n Main: AppShellMain,\n Aside: AppShellAside,\n});\n\nexport {\n AppShellRoot,\n AppShellHeader,\n AppShellSidebar,\n AppShellMain,\n AppShellAside,\n useAppShell,\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/AppShell/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './AppShell.module.scss';\nimport {\n SidebarProvider,\n Sidebar,\n useSidebar,\n type SidebarCollapsible,\n} from '../Sidebar';\n\n// ============================================\n// Types\n// ============================================\n\n/**\n * ```\n * 'default' 'sidebar' 'sidebar-floating'\n * ┌──────────────┐ ┌────┬─────────┐ ┌────┬─────────┐\n * │ Header │ │ │ Header │ │ │ Header │\n * ├────┬─────────┤ │Side├─────────┤ │Side├╌╌╌╌╌╌╌╌╌┤\n * │ │ │ │bar │ │ │bar │┌───────┐│\n * │Side│ Main │ │ │ Main │ │ ││ Main ││\n * │bar │ │ │ │ │ │ │└───────┘│\n * └────┴─────────┘ └────┴─────────┘ └────┴─────────┘\n * ```\n */\nexport type AppShellLayout = 'default' | 'sidebar' | 'sidebar-floating';\n\nexport interface AppShellProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /**\n * Layout mode:\n *\n * ```\n * 'default' 'sidebar' 'sidebar-floating'\n * ┌──────────────┐ ┌────┬─────────┐ ┌────┬─────────┐\n * │ Header │ │ │ Header │ │ │ Header │\n * ├────┬─────────┤ │Side├─────────┤ │Side├╌╌╌╌╌╌╌╌╌┤\n * │ │ │ │bar │ │ │bar │┌───────┐│\n * │Side│ Main │ │ │ Main │ │ ││ Main ││\n * │bar │ │ │ │ │ │ │└───────┘│\n * └────┴─────────┘ └────┴─────────┘ └────┴─────────┘\n * ```\n *\n * - `'default'`: Header spans full width, sidebar below (default)\n * - `'sidebar'`: Sidebar is full height, header sits beside it\n * - `'sidebar-floating'`: Like `sidebar` but main content floats with rounded corners and a distinct background\n */\n layout?: AppShellLayout;\n}\n\nexport interface AppShellHeaderProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Header height (default: '56px') */\n height?: string;\n}\n\nexport interface AppShellSidebarProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Width of expanded sidebar (default: '240px') */\n width?: string;\n /** Width when collapsed (default: '64px') */\n collapsedWidth?: string;\n /** Collapse behavior */\n collapsible?: SidebarCollapsible;\n /** Sidebar position */\n position?: 'left' | 'right';\n /** Default collapsed state */\n defaultCollapsed?: boolean;\n}\n\nexport interface AppShellMainProps extends React.HTMLAttributes<HTMLElement> {\n children: React.ReactNode;\n /** Content padding */\n padding?: 'none' | 'sm' | 'md' | 'lg';\n}\n\nexport interface AppShellAsideProps extends React.HTMLAttributes<HTMLElement> {\n children: React.ReactNode;\n /** Aside width (default: '280px') */\n width?: string;\n /** Control visibility */\n visible?: boolean;\n}\n\n// ============================================\n// Context\n// ============================================\n\ninterface AppShellContextValue {\n layout: AppShellLayout;\n headerHeight: string;\n sidebarWidth: string;\n sidebarCollapsedWidth: string;\n asideWidth: string;\n asideVisible: boolean;\n}\n\nconst AppShellContext = React.createContext<AppShellContextValue>({\n layout: 'default',\n headerHeight: '56px',\n sidebarWidth: '240px',\n sidebarCollapsedWidth: '64px',\n asideWidth: '280px',\n asideVisible: false,\n});\n\nfunction useAppShell() {\n return React.useContext(AppShellContext);\n}\n\n// ============================================\n// Hooks\n// ============================================\n\nfunction useIsMobile() {\n const [isMobile, setIsMobile] = React.useState(false);\n\n React.useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const mq = window.matchMedia('(max-width: 767px)');\n setIsMobile(mq.matches);\n\n const handler = (e: MediaQueryListEvent) => setIsMobile(e.matches);\n mq.addEventListener('change', handler);\n return () => mq.removeEventListener('change', handler);\n }, []);\n\n return isMobile;\n}\n\n// ============================================\n// Helper to extract config from children\n// ============================================\n\ninterface ExtractedConfig {\n headerHeight: string;\n sidebarWidth: string;\n sidebarCollapsedWidth: string;\n sidebarCollapsible: SidebarCollapsible;\n sidebarDefaultCollapsed: boolean;\n asideWidth: string;\n asideVisible: boolean;\n}\n\nfunction extractConfigFromChildren(children: React.ReactNode): ExtractedConfig {\n const config: ExtractedConfig = {\n headerHeight: '56px',\n sidebarWidth: '240px',\n sidebarCollapsedWidth: '64px',\n sidebarCollapsible: 'icon',\n sidebarDefaultCollapsed: false,\n asideWidth: '280px',\n asideVisible: false,\n };\n\n React.Children.forEach(children, child => {\n if (!React.isValidElement(child)) return;\n\n if (child.type === AppShellHeader) {\n const props = child.props as AppShellHeaderProps;\n if (props.height) config.headerHeight = props.height;\n }\n\n if (child.type === AppShellSidebar) {\n const props = child.props as AppShellSidebarProps;\n if (props.width) config.sidebarWidth = props.width;\n if (props.collapsedWidth) config.sidebarCollapsedWidth = props.collapsedWidth;\n if (props.collapsible) config.sidebarCollapsible = props.collapsible;\n if (props.defaultCollapsed !== undefined) config.sidebarDefaultCollapsed = props.defaultCollapsed;\n }\n\n if (child.type === AppShellAside) {\n const props = child.props as AppShellAsideProps;\n if (props.width) config.asideWidth = props.width;\n if (props.visible !== false) config.asideVisible = true;\n }\n });\n\n return config;\n}\n\n// ============================================\n// Internal component to apply CSS variables\n// ============================================\n\nfunction AppShellInner({\n children,\n className,\n layout,\n style: styleProp,\n ...htmlProps\n}: {\n children: React.ReactNode;\n className?: string;\n layout: AppShellLayout;\n} & React.HTMLAttributes<HTMLDivElement>) {\n const appShell = useAppShell();\n const { collapsed, isMobile, collapsible } = useSidebar();\n\n const classes = [\n styles.root,\n (layout === 'sidebar' || layout === 'sidebar-floating') && styles.sidebarLayout,\n layout === 'sidebar-floating' && styles.sidebarFloatingLayout,\n className,\n ].filter(Boolean).join(' ');\n\n // Calculate actual sidebar width based on state\n const actualSidebarWidth = isMobile\n ? '0px'\n : (collapsible === 'icon' && collapsed)\n ? appShell.sidebarCollapsedWidth\n : (collapsible === 'offcanvas' && collapsed)\n ? '0px'\n : appShell.sidebarWidth;\n\n const style: React.CSSProperties = {\n '--appshell-header-height': appShell.headerHeight,\n '--appshell-sidebar-width': actualSidebarWidth,\n '--appshell-sidebar-expanded-width': appShell.sidebarWidth,\n '--appshell-sidebar-collapsed-width': appShell.sidebarCollapsedWidth,\n '--appshell-aside-width': appShell.asideVisible ? appShell.asideWidth : '0px',\n ...styleProp,\n } as React.CSSProperties;\n\n return (\n <div {...htmlProps} className={classes} style={style} data-layout={layout} data-mobile={isMobile || undefined}>\n {children}\n </div>\n );\n}\n\n// ============================================\n// Components\n// ============================================\n\n/**\n * AppShell - Root layout wrapper\n * Automatically wraps children with SidebarProvider\n */\nfunction AppShellRoot({\n children,\n layout = 'default',\n className,\n ...htmlProps\n}: AppShellProps) {\n // Extract config from children using useMemo to avoid re-renders\n const config = React.useMemo(() => extractConfigFromChildren(children), [children]);\n\n const contextValue: AppShellContextValue = {\n layout,\n headerHeight: config.headerHeight,\n sidebarWidth: config.sidebarWidth,\n sidebarCollapsedWidth: config.sidebarCollapsedWidth,\n asideWidth: config.asideWidth,\n asideVisible: config.asideVisible,\n };\n\n return (\n <AppShellContext.Provider value={contextValue}>\n <SidebarProvider\n width={config.sidebarWidth}\n collapsedWidth={config.sidebarCollapsedWidth}\n collapsible={config.sidebarCollapsible}\n defaultCollapsed={config.sidebarDefaultCollapsed}\n >\n <AppShellInner className={className} layout={layout} {...htmlProps}>\n {children}\n </AppShellInner>\n </SidebarProvider>\n </AppShellContext.Provider>\n );\n}\n\n/**\n * AppShell.Header - Fixed header slot\n */\nfunction AppShellHeader({\n children,\n height = '56px',\n className,\n style: styleProp,\n ...htmlProps\n}: AppShellHeaderProps) {\n const { layout } = useAppShell();\n\n const classes = [\n styles.header,\n (layout === 'sidebar' || layout === 'sidebar-floating') && styles.headerSidebar,\n layout === 'sidebar-floating' && styles.headerFloating,\n className,\n ].filter(Boolean).join(' ');\n\n const style: React.CSSProperties = {\n '--header-height': height,\n ...styleProp,\n } as React.CSSProperties;\n\n return (\n <div {...htmlProps} className={classes} style={style}>\n {children}\n </div>\n );\n}\n\n/**\n * AppShell.Sidebar - Sidebar slot (delegates to Sidebar component)\n */\nfunction AppShellSidebar({\n children,\n width = '240px',\n collapsedWidth = '64px',\n collapsible = 'icon',\n position = 'left',\n defaultCollapsed = false,\n 'aria-label': ariaLabel,\n className,\n ...htmlProps\n}: AppShellSidebarProps) {\n const isMobile = useIsMobile();\n const { layout } = useAppShell();\n\n const classes = [\n styles.sidebar,\n (layout === 'sidebar' || layout === 'sidebar-floating') && styles.sidebarFullHeight,\n layout === 'sidebar-floating' && styles.sidebarFloating,\n className,\n ].filter(Boolean).join(' ');\n\n return (\n <div {...htmlProps} className={classes}>\n <Sidebar\n width={width}\n collapsedWidth={collapsedWidth}\n position={position}\n collapsible={collapsible}\n defaultCollapsed={defaultCollapsed}\n aria-label={ariaLabel}\n >\n {children}\n </Sidebar>\n {isMobile && <Sidebar.Overlay />}\n </div>\n );\n}\n\n/**\n * AppShell.Main - Scrollable main content area\n */\nfunction AppShellMain({\n children,\n padding = 'md',\n className,\n id = 'main-content',\n ...htmlProps\n}: AppShellMainProps) {\n const { layout } = useAppShell();\n\n const classes = [\n styles.main,\n padding !== 'none' && styles[`padding${padding.charAt(0).toUpperCase() + padding.slice(1)}`],\n layout === 'sidebar-floating' && styles.mainFloating,\n className,\n ].filter(Boolean).join(' ');\n\n return (\n <main {...htmlProps} className={classes} id={id}>\n {children}\n </main>\n );\n}\n\n/**\n * AppShell.Aside - Optional right sidebar panel\n */\nfunction AppShellAside({\n children,\n width = '280px',\n visible = true,\n className,\n style: styleProp,\n ...htmlProps\n}: AppShellAsideProps) {\n if (!visible) {\n return null;\n }\n\n const classes = [styles.aside, className].filter(Boolean).join(' ');\n\n const style: React.CSSProperties = {\n '--aside-width': width,\n ...styleProp,\n } as React.CSSProperties;\n\n return (\n <aside {...htmlProps} className={classes} style={style}>\n {children}\n </aside>\n );\n}\n\n// ============================================\n// Export compound component\n// ============================================\n\nexport const AppShell = Object.assign(AppShellRoot, {\n Header: AppShellHeader,\n Sidebar: AppShellSidebar,\n Main: AppShellMain,\n Aside: AppShellAside,\n});\n\nexport {\n AppShellRoot,\n AppShellHeader,\n AppShellSidebar,\n AppShellMain,\n AppShellAside,\n useAppShell,\n};\n"],"names":[],"mappings":"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"}
@@ -82,6 +82,7 @@ const AvatarBase = React__namespace.forwardRef(
82
82
  shape = "circle",
83
83
  color,
84
84
  imageStyle,
85
+ imageProps,
85
86
  className,
86
87
  style: styleProp,
87
88
  ...htmlProps
@@ -137,10 +138,17 @@ const AvatarBase = React__namespace.forwardRef(
137
138
  "img",
138
139
  {
139
140
  ref: imgRef,
141
+ ...imageProps,
140
142
  src,
141
143
  alt,
142
144
  className: Avatar_module.default.image,
143
- onError: () => setImageError(true),
145
+ onError: (event) => {
146
+ var _a;
147
+ (_a = imageProps == null ? void 0 : imageProps.onError) == null ? void 0 : _a.call(imageProps, event);
148
+ if (!event.defaultPrevented) {
149
+ setImageError(true);
150
+ }
151
+ },
144
152
  style: { ...imageStyle }
145
153
  }
146
154
  ),
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../src/components/Avatar/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Avatar.module.scss';\n\n// ============================================\n// Types\n// ============================================\n\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * Avatar for user photos, initials, or placeholder icons.\n * @see https://usefragments.com/components/avatar\n */\nexport interface AvatarProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'color'> {\n /** Image source URL */\n src?: string;\n /** Alt text for the image */\n alt?: string;\n /** Fallback initials (1-2 characters recommended) */\n initials?: string;\n /** Full name - used to generate initials if not provided */\n name?: string;\n /** Size variant */\n size?: AvatarSize;\n /** Custom avatar size (overrides size width/height) */\n customSize?: number | string;\n /** Shape variant */\n shape?: 'circle' | 'square';\n /** Custom background color for fallback */\n color?: string;\n /** Inline style for the underlying image element */\n imageStyle?: React.CSSProperties;\n}\n\nexport interface AvatarGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Maximum number of avatars to display */\n max?: number;\n /** Size for all avatars in the group */\n size?: AvatarSize;\n /** Children (Avatar components) */\n children: React.ReactNode;\n}\n\n// ============================================\n// Helper Functions\n// ============================================\n\nfunction getInitials(name: string): string {\n const parts = name.trim().split(/\\s+/);\n if (parts.length === 1) {\n return parts[0].charAt(0).toUpperCase();\n }\n return (parts[0].charAt(0) + parts[parts.length - 1].charAt(0)).toUpperCase();\n}\n\nfunction stringToColor(str: string): string {\n // Generate a consistent color from a string\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = str.charCodeAt(i) + ((hash << 5) - hash);\n }\n const hue = Math.abs(hash % 360);\n return `hsl(${hue}, 55%, 40%)`;\n}\n\n/**\n * Compute a contrast-safe text color (white or black) for a given HSL background.\n * Uses WCAG relative luminance to pick whichever gives higher contrast.\n */\nfunction getContrastTextColor(bgColor: string): string | undefined {\n const match = bgColor.match(/hsl\\((\\d+),\\s*(\\d+)%,\\s*(\\d+)%\\)/);\n if (!match) return undefined;\n\n const h = parseInt(match[1]);\n const s = parseInt(match[2]) / 100;\n const l = parseInt(match[3]) / 100;\n\n // HSL → RGB\n const c = (1 - Math.abs(2 * l - 1)) * s;\n const x = c * (1 - Math.abs((h / 60) % 2 - 1));\n const m = l - c / 2;\n let r = 0, g = 0, b = 0;\n if (h < 60) { r = c; g = x; }\n else if (h < 120) { r = x; g = c; }\n else if (h < 180) { g = c; b = x; }\n else if (h < 240) { g = x; b = c; }\n else if (h < 300) { r = x; b = c; }\n else { r = c; b = x; }\n r += m; g += m; b += m;\n\n // Relative luminance (sRGB → linear)\n const lin = (v: number) => v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n const lum = 0.2126 * lin(r) + 0.7152 * lin(g) + 0.0722 * lin(b);\n\n return lum > 0.179 ? '#000000' : '#ffffff';\n}\n\n// ============================================\n// Avatar Component\n// ============================================\n\nconst AvatarBase = React.forwardRef<HTMLDivElement, AvatarProps>(\n function AvatarBase(\n {\n src,\n alt = '',\n initials,\n name,\n size = 'md',\n customSize,\n shape = 'circle',\n color,\n imageStyle,\n className,\n style: styleProp,\n ...htmlProps\n },\n ref\n ) {\n const imgRef = React.useRef<HTMLImageElement>(null);\n const [imageError, setImageError] = React.useState(false);\n\n // Reset error state when src changes; check if already-loaded image failed\n React.useEffect(() => {\n setImageError(false);\n const img = imgRef.current;\n if (img && img.complete && img.naturalWidth === 0) {\n setImageError(true);\n }\n }, [src]);\n\n const showFallback = !src || imageError;\n const displayInitials = initials || (name ? getInitials(name) : '');\n const fallbackColor = color || (name ? stringToColor(name) : undefined);\n const fallbackLabel = alt || name;\n const hasFallbackLabel = showFallback && Boolean(fallbackLabel && fallbackLabel.trim().length > 0);\n\n const avatarClasses = [\n styles.avatar,\n styles[size],\n shape === 'square' && styles.square,\n className,\n ].filter(Boolean).join(' ');\n\n const style: React.CSSProperties = { ...styleProp };\n if (customSize !== undefined) {\n const resolvedSize = typeof customSize === 'number' ? `${customSize}px` : customSize;\n style.width = resolvedSize;\n style.height = resolvedSize;\n if (style.fontSize === undefined) {\n style.fontSize = `calc(${resolvedSize} * 0.4)`;\n }\n }\n\n if (showFallback && fallbackColor) {\n style.backgroundColor = fallbackColor;\n const textColor = getContrastTextColor(fallbackColor);\n if (textColor) {\n (style as Record<string, string>)['--avatar-initials-color'] = textColor;\n }\n }\n\n return (\n <div\n ref={ref}\n {...htmlProps}\n className={avatarClasses}\n style={style}\n role={hasFallbackLabel ? 'img' : undefined}\n aria-label={hasFallbackLabel ? fallbackLabel : undefined}\n aria-hidden={showFallback && !hasFallbackLabel ? true : undefined}\n >\n {!showFallback && (\n <img\n ref={imgRef}\n src={src}\n alt={alt}\n className={styles.image}\n onError={() => setImageError(true)}\n style={{ ...imageStyle }}\n />\n )}\n {showFallback && displayInitials && (\n <span className={styles.initials}>{displayInitials}</span>\n )}\n {showFallback && !displayInitials && (\n <svg\n className={styles.fallbackIcon}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z\" />\n </svg>\n )}\n </div>\n );\n }\n);\n\n// ============================================\n// Avatar Group Component\n// ============================================\n\nfunction AvatarGroup({\n max,\n size = 'md',\n children,\n className,\n ...htmlProps\n}: AvatarGroupProps) {\n const childArray = React.Children.toArray(children);\n const displayCount = max && max < childArray.length ? max : childArray.length;\n const overflowCount = max && childArray.length > max ? childArray.length - max : 0;\n\n const groupClasses = [styles.group, className].filter(Boolean).join(' ');\n\n return (\n <div {...htmlProps} className={groupClasses}>\n {childArray.slice(0, displayCount).map((child, index) => {\n if (React.isValidElement<AvatarProps>(child)) {\n return React.cloneElement(child, {\n key: index,\n size: child.props.size || size,\n className: [styles.groupItem, child.props.className].filter(Boolean).join(' '),\n });\n }\n return child;\n })}\n {overflowCount > 0 && (\n <div className={[styles.avatar, styles[size], styles.overflow].join(' ')}>\n <span className={styles.initials}>+{overflowCount}</span>\n </div>\n )}\n </div>\n );\n}\n\n// ============================================\n// Compound Component Export\n// ============================================\n\nexport const Avatar = Object.assign(AvatarBase, {\n Group: AvatarGroup,\n});\n"],"names":["React","AvatarBase","styles","jsxs","jsx"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../src/components/Avatar/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Avatar.module.scss';\n\n// ============================================\n// Types\n// ============================================\n\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * Avatar for user photos, initials, or placeholder icons.\n * @see https://usefragments.com/components/avatar\n */\nexport interface AvatarProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'color'> {\n /** Image source URL */\n src?: string;\n /** Alt text for the image */\n alt?: string;\n /** Fallback initials (1-2 characters recommended) */\n initials?: string;\n /** Full name - used to generate initials if not provided */\n name?: string;\n /** Size variant */\n size?: AvatarSize;\n /** Custom avatar size (overrides size width/height) */\n customSize?: number | string;\n /** Shape variant */\n shape?: 'circle' | 'square';\n /** Custom background color for fallback */\n color?: string;\n /** Inline style for the underlying image element */\n imageStyle?: React.CSSProperties;\n /** Additional props for the underlying img element */\n imageProps?: Omit<\n React.ImgHTMLAttributes<HTMLImageElement>,\n 'src' | 'alt' | 'className' | 'style'\n >;\n}\n\nexport interface AvatarGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Maximum number of avatars to display */\n max?: number;\n /** Size for all avatars in the group */\n size?: AvatarSize;\n /** Children (Avatar components) */\n children: React.ReactNode;\n}\n\n// ============================================\n// Helper Functions\n// ============================================\n\nfunction getInitials(name: string): string {\n const parts = name.trim().split(/\\s+/);\n if (parts.length === 1) {\n return parts[0].charAt(0).toUpperCase();\n }\n return (parts[0].charAt(0) + parts[parts.length - 1].charAt(0)).toUpperCase();\n}\n\nfunction stringToColor(str: string): string {\n // Generate a consistent color from a string\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = str.charCodeAt(i) + ((hash << 5) - hash);\n }\n const hue = Math.abs(hash % 360);\n return `hsl(${hue}, 55%, 40%)`;\n}\n\n/**\n * Compute a contrast-safe text color (white or black) for a given HSL background.\n * Uses WCAG relative luminance to pick whichever gives higher contrast.\n */\nfunction getContrastTextColor(bgColor: string): string | undefined {\n const match = bgColor.match(/hsl\\((\\d+),\\s*(\\d+)%,\\s*(\\d+)%\\)/);\n if (!match) return undefined;\n\n const h = parseInt(match[1]);\n const s = parseInt(match[2]) / 100;\n const l = parseInt(match[3]) / 100;\n\n // HSL → RGB\n const c = (1 - Math.abs(2 * l - 1)) * s;\n const x = c * (1 - Math.abs((h / 60) % 2 - 1));\n const m = l - c / 2;\n let r = 0, g = 0, b = 0;\n if (h < 60) { r = c; g = x; }\n else if (h < 120) { r = x; g = c; }\n else if (h < 180) { g = c; b = x; }\n else if (h < 240) { g = x; b = c; }\n else if (h < 300) { r = x; b = c; }\n else { r = c; b = x; }\n r += m; g += m; b += m;\n\n // Relative luminance (sRGB → linear)\n const lin = (v: number) => v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n const lum = 0.2126 * lin(r) + 0.7152 * lin(g) + 0.0722 * lin(b);\n\n return lum > 0.179 ? '#000000' : '#ffffff';\n}\n\n// ============================================\n// Avatar Component\n// ============================================\n\nconst AvatarBase = React.forwardRef<HTMLDivElement, AvatarProps>(\n function AvatarBase(\n {\n src,\n alt = '',\n initials,\n name,\n size = 'md',\n customSize,\n shape = 'circle',\n color,\n imageStyle,\n imageProps,\n className,\n style: styleProp,\n ...htmlProps\n },\n ref\n ) {\n const imgRef = React.useRef<HTMLImageElement>(null);\n const [imageError, setImageError] = React.useState(false);\n\n // Reset error state when src changes; check if already-loaded image failed\n React.useEffect(() => {\n setImageError(false);\n const img = imgRef.current;\n if (img && img.complete && img.naturalWidth === 0) {\n setImageError(true);\n }\n }, [src]);\n\n const showFallback = !src || imageError;\n const displayInitials = initials || (name ? getInitials(name) : '');\n const fallbackColor = color || (name ? stringToColor(name) : undefined);\n const fallbackLabel = alt || name;\n const hasFallbackLabel = showFallback && Boolean(fallbackLabel && fallbackLabel.trim().length > 0);\n\n const avatarClasses = [\n styles.avatar,\n styles[size],\n shape === 'square' && styles.square,\n className,\n ].filter(Boolean).join(' ');\n\n const style: React.CSSProperties = { ...styleProp };\n if (customSize !== undefined) {\n const resolvedSize = typeof customSize === 'number' ? `${customSize}px` : customSize;\n style.width = resolvedSize;\n style.height = resolvedSize;\n if (style.fontSize === undefined) {\n style.fontSize = `calc(${resolvedSize} * 0.4)`;\n }\n }\n\n if (showFallback && fallbackColor) {\n style.backgroundColor = fallbackColor;\n const textColor = getContrastTextColor(fallbackColor);\n if (textColor) {\n (style as Record<string, string>)['--avatar-initials-color'] = textColor;\n }\n }\n\n return (\n <div\n ref={ref}\n {...htmlProps}\n className={avatarClasses}\n style={style}\n role={hasFallbackLabel ? 'img' : undefined}\n aria-label={hasFallbackLabel ? fallbackLabel : undefined}\n aria-hidden={showFallback && !hasFallbackLabel ? true : undefined}\n >\n {!showFallback && (\n <img\n ref={imgRef}\n {...imageProps}\n src={src}\n alt={alt}\n className={styles.image}\n onError={(event) => {\n imageProps?.onError?.(event);\n if (!event.defaultPrevented) {\n setImageError(true);\n }\n }}\n style={{ ...imageStyle }}\n />\n )}\n {showFallback && displayInitials && (\n <span className={styles.initials}>{displayInitials}</span>\n )}\n {showFallback && !displayInitials && (\n <svg\n className={styles.fallbackIcon}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z\" />\n </svg>\n )}\n </div>\n );\n }\n);\n\n// ============================================\n// Avatar Group Component\n// ============================================\n\nfunction AvatarGroup({\n max,\n size = 'md',\n children,\n className,\n ...htmlProps\n}: AvatarGroupProps) {\n const childArray = React.Children.toArray(children);\n const displayCount = max && max < childArray.length ? max : childArray.length;\n const overflowCount = max && childArray.length > max ? childArray.length - max : 0;\n\n const groupClasses = [styles.group, className].filter(Boolean).join(' ');\n\n return (\n <div {...htmlProps} className={groupClasses}>\n {childArray.slice(0, displayCount).map((child, index) => {\n if (React.isValidElement<AvatarProps>(child)) {\n return React.cloneElement(child, {\n key: index,\n size: child.props.size || size,\n className: [styles.groupItem, child.props.className].filter(Boolean).join(' '),\n });\n }\n return child;\n })}\n {overflowCount > 0 && (\n <div className={[styles.avatar, styles[size], styles.overflow].join(' ')}>\n <span className={styles.initials}>+{overflowCount}</span>\n </div>\n )}\n </div>\n );\n}\n\n// ============================================\n// Compound Component Export\n// ============================================\n\nexport const Avatar = Object.assign(AvatarBase, {\n Group: AvatarGroup,\n});\n"],"names":["React","AvatarBase","styles","jsxs","jsx"],"mappings":"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"}
@@ -23,6 +23,8 @@ export interface AvatarProps extends Omit<React.HTMLAttributes<HTMLDivElement>,
23
23
  color?: string;
24
24
  /** Inline style for the underlying image element */
25
25
  imageStyle?: React.CSSProperties;
26
+ /** Additional props for the underlying img element */
27
+ imageProps?: Omit<React.ImgHTMLAttributes<HTMLImageElement>, 'src' | 'alt' | 'className' | 'style'>;
26
28
  }
27
29
  export interface AvatarGroupProps extends React.HTMLAttributes<HTMLDivElement> {
28
30
  /** Maximum number of avatars to display */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Avatar/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE1D;;;GAGG;AACH,MAAM,WAAW,WAAY,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IACtF,uBAAuB;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mBAAmB;IACnB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,uDAAuD;IACvD,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,oBAAoB;IACpB,KAAK,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC5B,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,UAAU,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAClC;AAED,MAAM,WAAW,gBAAiB,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IAC5E,2CAA2C;IAC3C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,mCAAmC;IACnC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAoKD,iBAAS,WAAW,CAAC,EACnB,GAAG,EACH,IAAW,EACX,QAAQ,EACR,SAAS,EACT,GAAG,SAAS,EACb,EAAE,gBAAgB,2CA0BlB;AAMD,eAAO,MAAM,MAAM;;CAEjB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Avatar/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE1D;;;GAGG;AACH,MAAM,WAAW,WAAY,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IACtF,uBAAuB;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mBAAmB;IACnB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,uDAAuD;IACvD,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,oBAAoB;IACpB,KAAK,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC5B,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,UAAU,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IACjC,sDAAsD;IACtD,UAAU,CAAC,EAAE,IAAI,CACf,KAAK,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,EACzC,KAAK,GAAG,KAAK,GAAG,WAAW,GAAG,OAAO,CACtC,CAAC;CACH;AAED,MAAM,WAAW,gBAAiB,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IAC5E,2CAA2C;IAC3C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,mCAAmC;IACnC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AA2KD,iBAAS,WAAW,CAAC,EACnB,GAAG,EACH,IAAW,EACX,QAAQ,EACR,SAAS,EACT,GAAG,SAAS,EACb,EAAE,gBAAgB,2CA0BlB;AAMD,eAAO,MAAM,MAAM;;CAEjB,CAAC"}
@@ -63,6 +63,7 @@ const AvatarBase = React.forwardRef(
63
63
  shape = "circle",
64
64
  color,
65
65
  imageStyle,
66
+ imageProps,
66
67
  className,
67
68
  style: styleProp,
68
69
  ...htmlProps
@@ -118,10 +119,17 @@ const AvatarBase = React.forwardRef(
118
119
  "img",
119
120
  {
120
121
  ref: imgRef,
122
+ ...imageProps,
121
123
  src,
122
124
  alt,
123
125
  className: styles.image,
124
- onError: () => setImageError(true),
126
+ onError: (event) => {
127
+ var _a;
128
+ (_a = imageProps == null ? void 0 : imageProps.onError) == null ? void 0 : _a.call(imageProps, event);
129
+ if (!event.defaultPrevented) {
130
+ setImageError(true);
131
+ }
132
+ },
125
133
  style: { ...imageStyle }
126
134
  }
127
135
  ),
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/components/Avatar/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Avatar.module.scss';\n\n// ============================================\n// Types\n// ============================================\n\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * Avatar for user photos, initials, or placeholder icons.\n * @see https://usefragments.com/components/avatar\n */\nexport interface AvatarProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'color'> {\n /** Image source URL */\n src?: string;\n /** Alt text for the image */\n alt?: string;\n /** Fallback initials (1-2 characters recommended) */\n initials?: string;\n /** Full name - used to generate initials if not provided */\n name?: string;\n /** Size variant */\n size?: AvatarSize;\n /** Custom avatar size (overrides size width/height) */\n customSize?: number | string;\n /** Shape variant */\n shape?: 'circle' | 'square';\n /** Custom background color for fallback */\n color?: string;\n /** Inline style for the underlying image element */\n imageStyle?: React.CSSProperties;\n}\n\nexport interface AvatarGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Maximum number of avatars to display */\n max?: number;\n /** Size for all avatars in the group */\n size?: AvatarSize;\n /** Children (Avatar components) */\n children: React.ReactNode;\n}\n\n// ============================================\n// Helper Functions\n// ============================================\n\nfunction getInitials(name: string): string {\n const parts = name.trim().split(/\\s+/);\n if (parts.length === 1) {\n return parts[0].charAt(0).toUpperCase();\n }\n return (parts[0].charAt(0) + parts[parts.length - 1].charAt(0)).toUpperCase();\n}\n\nfunction stringToColor(str: string): string {\n // Generate a consistent color from a string\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = str.charCodeAt(i) + ((hash << 5) - hash);\n }\n const hue = Math.abs(hash % 360);\n return `hsl(${hue}, 55%, 40%)`;\n}\n\n/**\n * Compute a contrast-safe text color (white or black) for a given HSL background.\n * Uses WCAG relative luminance to pick whichever gives higher contrast.\n */\nfunction getContrastTextColor(bgColor: string): string | undefined {\n const match = bgColor.match(/hsl\\((\\d+),\\s*(\\d+)%,\\s*(\\d+)%\\)/);\n if (!match) return undefined;\n\n const h = parseInt(match[1]);\n const s = parseInt(match[2]) / 100;\n const l = parseInt(match[3]) / 100;\n\n // HSL → RGB\n const c = (1 - Math.abs(2 * l - 1)) * s;\n const x = c * (1 - Math.abs((h / 60) % 2 - 1));\n const m = l - c / 2;\n let r = 0, g = 0, b = 0;\n if (h < 60) { r = c; g = x; }\n else if (h < 120) { r = x; g = c; }\n else if (h < 180) { g = c; b = x; }\n else if (h < 240) { g = x; b = c; }\n else if (h < 300) { r = x; b = c; }\n else { r = c; b = x; }\n r += m; g += m; b += m;\n\n // Relative luminance (sRGB → linear)\n const lin = (v: number) => v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n const lum = 0.2126 * lin(r) + 0.7152 * lin(g) + 0.0722 * lin(b);\n\n return lum > 0.179 ? '#000000' : '#ffffff';\n}\n\n// ============================================\n// Avatar Component\n// ============================================\n\nconst AvatarBase = React.forwardRef<HTMLDivElement, AvatarProps>(\n function AvatarBase(\n {\n src,\n alt = '',\n initials,\n name,\n size = 'md',\n customSize,\n shape = 'circle',\n color,\n imageStyle,\n className,\n style: styleProp,\n ...htmlProps\n },\n ref\n ) {\n const imgRef = React.useRef<HTMLImageElement>(null);\n const [imageError, setImageError] = React.useState(false);\n\n // Reset error state when src changes; check if already-loaded image failed\n React.useEffect(() => {\n setImageError(false);\n const img = imgRef.current;\n if (img && img.complete && img.naturalWidth === 0) {\n setImageError(true);\n }\n }, [src]);\n\n const showFallback = !src || imageError;\n const displayInitials = initials || (name ? getInitials(name) : '');\n const fallbackColor = color || (name ? stringToColor(name) : undefined);\n const fallbackLabel = alt || name;\n const hasFallbackLabel = showFallback && Boolean(fallbackLabel && fallbackLabel.trim().length > 0);\n\n const avatarClasses = [\n styles.avatar,\n styles[size],\n shape === 'square' && styles.square,\n className,\n ].filter(Boolean).join(' ');\n\n const style: React.CSSProperties = { ...styleProp };\n if (customSize !== undefined) {\n const resolvedSize = typeof customSize === 'number' ? `${customSize}px` : customSize;\n style.width = resolvedSize;\n style.height = resolvedSize;\n if (style.fontSize === undefined) {\n style.fontSize = `calc(${resolvedSize} * 0.4)`;\n }\n }\n\n if (showFallback && fallbackColor) {\n style.backgroundColor = fallbackColor;\n const textColor = getContrastTextColor(fallbackColor);\n if (textColor) {\n (style as Record<string, string>)['--avatar-initials-color'] = textColor;\n }\n }\n\n return (\n <div\n ref={ref}\n {...htmlProps}\n className={avatarClasses}\n style={style}\n role={hasFallbackLabel ? 'img' : undefined}\n aria-label={hasFallbackLabel ? fallbackLabel : undefined}\n aria-hidden={showFallback && !hasFallbackLabel ? true : undefined}\n >\n {!showFallback && (\n <img\n ref={imgRef}\n src={src}\n alt={alt}\n className={styles.image}\n onError={() => setImageError(true)}\n style={{ ...imageStyle }}\n />\n )}\n {showFallback && displayInitials && (\n <span className={styles.initials}>{displayInitials}</span>\n )}\n {showFallback && !displayInitials && (\n <svg\n className={styles.fallbackIcon}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z\" />\n </svg>\n )}\n </div>\n );\n }\n);\n\n// ============================================\n// Avatar Group Component\n// ============================================\n\nfunction AvatarGroup({\n max,\n size = 'md',\n children,\n className,\n ...htmlProps\n}: AvatarGroupProps) {\n const childArray = React.Children.toArray(children);\n const displayCount = max && max < childArray.length ? max : childArray.length;\n const overflowCount = max && childArray.length > max ? childArray.length - max : 0;\n\n const groupClasses = [styles.group, className].filter(Boolean).join(' ');\n\n return (\n <div {...htmlProps} className={groupClasses}>\n {childArray.slice(0, displayCount).map((child, index) => {\n if (React.isValidElement<AvatarProps>(child)) {\n return React.cloneElement(child, {\n key: index,\n size: child.props.size || size,\n className: [styles.groupItem, child.props.className].filter(Boolean).join(' '),\n });\n }\n return child;\n })}\n {overflowCount > 0 && (\n <div className={[styles.avatar, styles[size], styles.overflow].join(' ')}>\n <span className={styles.initials}>+{overflowCount}</span>\n </div>\n )}\n </div>\n );\n}\n\n// ============================================\n// Compound Component Export\n// ============================================\n\nexport const Avatar = Object.assign(AvatarBase, {\n Group: AvatarGroup,\n});\n"],"names":["AvatarBase"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/Avatar/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Avatar.module.scss';\n\n// ============================================\n// Types\n// ============================================\n\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * Avatar for user photos, initials, or placeholder icons.\n * @see https://usefragments.com/components/avatar\n */\nexport interface AvatarProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'color'> {\n /** Image source URL */\n src?: string;\n /** Alt text for the image */\n alt?: string;\n /** Fallback initials (1-2 characters recommended) */\n initials?: string;\n /** Full name - used to generate initials if not provided */\n name?: string;\n /** Size variant */\n size?: AvatarSize;\n /** Custom avatar size (overrides size width/height) */\n customSize?: number | string;\n /** Shape variant */\n shape?: 'circle' | 'square';\n /** Custom background color for fallback */\n color?: string;\n /** Inline style for the underlying image element */\n imageStyle?: React.CSSProperties;\n /** Additional props for the underlying img element */\n imageProps?: Omit<\n React.ImgHTMLAttributes<HTMLImageElement>,\n 'src' | 'alt' | 'className' | 'style'\n >;\n}\n\nexport interface AvatarGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Maximum number of avatars to display */\n max?: number;\n /** Size for all avatars in the group */\n size?: AvatarSize;\n /** Children (Avatar components) */\n children: React.ReactNode;\n}\n\n// ============================================\n// Helper Functions\n// ============================================\n\nfunction getInitials(name: string): string {\n const parts = name.trim().split(/\\s+/);\n if (parts.length === 1) {\n return parts[0].charAt(0).toUpperCase();\n }\n return (parts[0].charAt(0) + parts[parts.length - 1].charAt(0)).toUpperCase();\n}\n\nfunction stringToColor(str: string): string {\n // Generate a consistent color from a string\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = str.charCodeAt(i) + ((hash << 5) - hash);\n }\n const hue = Math.abs(hash % 360);\n return `hsl(${hue}, 55%, 40%)`;\n}\n\n/**\n * Compute a contrast-safe text color (white or black) for a given HSL background.\n * Uses WCAG relative luminance to pick whichever gives higher contrast.\n */\nfunction getContrastTextColor(bgColor: string): string | undefined {\n const match = bgColor.match(/hsl\\((\\d+),\\s*(\\d+)%,\\s*(\\d+)%\\)/);\n if (!match) return undefined;\n\n const h = parseInt(match[1]);\n const s = parseInt(match[2]) / 100;\n const l = parseInt(match[3]) / 100;\n\n // HSL → RGB\n const c = (1 - Math.abs(2 * l - 1)) * s;\n const x = c * (1 - Math.abs((h / 60) % 2 - 1));\n const m = l - c / 2;\n let r = 0, g = 0, b = 0;\n if (h < 60) { r = c; g = x; }\n else if (h < 120) { r = x; g = c; }\n else if (h < 180) { g = c; b = x; }\n else if (h < 240) { g = x; b = c; }\n else if (h < 300) { r = x; b = c; }\n else { r = c; b = x; }\n r += m; g += m; b += m;\n\n // Relative luminance (sRGB → linear)\n const lin = (v: number) => v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n const lum = 0.2126 * lin(r) + 0.7152 * lin(g) + 0.0722 * lin(b);\n\n return lum > 0.179 ? '#000000' : '#ffffff';\n}\n\n// ============================================\n// Avatar Component\n// ============================================\n\nconst AvatarBase = React.forwardRef<HTMLDivElement, AvatarProps>(\n function AvatarBase(\n {\n src,\n alt = '',\n initials,\n name,\n size = 'md',\n customSize,\n shape = 'circle',\n color,\n imageStyle,\n imageProps,\n className,\n style: styleProp,\n ...htmlProps\n },\n ref\n ) {\n const imgRef = React.useRef<HTMLImageElement>(null);\n const [imageError, setImageError] = React.useState(false);\n\n // Reset error state when src changes; check if already-loaded image failed\n React.useEffect(() => {\n setImageError(false);\n const img = imgRef.current;\n if (img && img.complete && img.naturalWidth === 0) {\n setImageError(true);\n }\n }, [src]);\n\n const showFallback = !src || imageError;\n const displayInitials = initials || (name ? getInitials(name) : '');\n const fallbackColor = color || (name ? stringToColor(name) : undefined);\n const fallbackLabel = alt || name;\n const hasFallbackLabel = showFallback && Boolean(fallbackLabel && fallbackLabel.trim().length > 0);\n\n const avatarClasses = [\n styles.avatar,\n styles[size],\n shape === 'square' && styles.square,\n className,\n ].filter(Boolean).join(' ');\n\n const style: React.CSSProperties = { ...styleProp };\n if (customSize !== undefined) {\n const resolvedSize = typeof customSize === 'number' ? `${customSize}px` : customSize;\n style.width = resolvedSize;\n style.height = resolvedSize;\n if (style.fontSize === undefined) {\n style.fontSize = `calc(${resolvedSize} * 0.4)`;\n }\n }\n\n if (showFallback && fallbackColor) {\n style.backgroundColor = fallbackColor;\n const textColor = getContrastTextColor(fallbackColor);\n if (textColor) {\n (style as Record<string, string>)['--avatar-initials-color'] = textColor;\n }\n }\n\n return (\n <div\n ref={ref}\n {...htmlProps}\n className={avatarClasses}\n style={style}\n role={hasFallbackLabel ? 'img' : undefined}\n aria-label={hasFallbackLabel ? fallbackLabel : undefined}\n aria-hidden={showFallback && !hasFallbackLabel ? true : undefined}\n >\n {!showFallback && (\n <img\n ref={imgRef}\n {...imageProps}\n src={src}\n alt={alt}\n className={styles.image}\n onError={(event) => {\n imageProps?.onError?.(event);\n if (!event.defaultPrevented) {\n setImageError(true);\n }\n }}\n style={{ ...imageStyle }}\n />\n )}\n {showFallback && displayInitials && (\n <span className={styles.initials}>{displayInitials}</span>\n )}\n {showFallback && !displayInitials && (\n <svg\n className={styles.fallbackIcon}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z\" />\n </svg>\n )}\n </div>\n );\n }\n);\n\n// ============================================\n// Avatar Group Component\n// ============================================\n\nfunction AvatarGroup({\n max,\n size = 'md',\n children,\n className,\n ...htmlProps\n}: AvatarGroupProps) {\n const childArray = React.Children.toArray(children);\n const displayCount = max && max < childArray.length ? max : childArray.length;\n const overflowCount = max && childArray.length > max ? childArray.length - max : 0;\n\n const groupClasses = [styles.group, className].filter(Boolean).join(' ');\n\n return (\n <div {...htmlProps} className={groupClasses}>\n {childArray.slice(0, displayCount).map((child, index) => {\n if (React.isValidElement<AvatarProps>(child)) {\n return React.cloneElement(child, {\n key: index,\n size: child.props.size || size,\n className: [styles.groupItem, child.props.className].filter(Boolean).join(' '),\n });\n }\n return child;\n })}\n {overflowCount > 0 && (\n <div className={[styles.avatar, styles[size], styles.overflow].join(' ')}>\n <span className={styles.initials}>+{overflowCount}</span>\n </div>\n )}\n </div>\n );\n}\n\n// ============================================\n// Compound Component Export\n// ============================================\n\nexport const Avatar = Object.assign(AvatarBase, {\n Group: AvatarGroup,\n});\n"],"names":["AvatarBase"],"mappings":";;;AAsDA,SAAS,YAAY,MAAsB;AACzC,QAAM,QAAQ,KAAK,KAAA,EAAO,MAAM,KAAK;AACrC,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,YAAA;AAAA,EAC5B;AACA,UAAQ,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,MAAM,MAAM,SAAS,CAAC,EAAE,OAAO,CAAC,GAAG,YAAA;AAClE;AAEA,SAAS,cAAc,KAAqB;AAE1C,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,WAAO,IAAI,WAAW,CAAC,MAAM,QAAQ,KAAK;AAAA,EAC5C;AACA,QAAM,MAAM,KAAK,IAAI,OAAO,GAAG;AAC/B,SAAO,OAAO,GAAG;AACnB;AAMA,SAAS,qBAAqB,SAAqC;AACjE,QAAM,QAAQ,QAAQ,MAAM,kCAAkC;AAC9D,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,IAAI,SAAS,MAAM,CAAC,CAAC;AAC3B,QAAM,IAAI,SAAS,MAAM,CAAC,CAAC,IAAI;AAC/B,QAAM,IAAI,SAAS,MAAM,CAAC,CAAC,IAAI;AAG/B,QAAM,KAAK,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK;AACtC,QAAM,IAAI,KAAK,IAAI,KAAK,IAAK,IAAI,KAAM,IAAI,CAAC;AAC5C,QAAM,IAAI,IAAI,IAAI;AAClB,MAAI,IAAI,GAAG,IAAI,GAAG,IAAI;AACtB,MAAI,IAAI,IAAI;AAAE,QAAI;AAAG,QAAI;AAAA,EAAG,WACnB,IAAI,KAAK;AAAE,QAAI;AAAG,QAAI;AAAA,EAAG,WACzB,IAAI,KAAK;AAAE,QAAI;AAAG,QAAI;AAAA,EAAG,WACzB,IAAI,KAAK;AAAE,QAAI;AAAG,QAAI;AAAA,EAAG,WACzB,IAAI,KAAK;AAAE,QAAI;AAAG,QAAI;AAAA,EAAG,OAC7B;AAAE,QAAI;AAAG,QAAI;AAAA,EAAG;AACrB,OAAK;AAAG,OAAK;AAAG,OAAK;AAGrB,QAAM,MAAM,CAAC,MAAc,KAAK,UAAU,IAAI,QAAQ,KAAK,KAAK,IAAI,SAAS,OAAO,GAAG;AACvF,QAAM,MAAM,SAAS,IAAI,CAAC,IAAI,SAAS,IAAI,CAAC,IAAI,SAAS,IAAI,CAAC;AAE9D,SAAO,MAAM,QAAQ,YAAY;AACnC;AAMA,MAAM,aAAa,MAAM;AAAA,EACvB,SAASA,YACP;AAAA,IACE;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,GAAG;AAAA,EAAA,GAEL,KACA;AACA,UAAM,SAAS,MAAM,OAAyB,IAAI;AAClD,UAAM,CAAC,YAAY,aAAa,IAAI,MAAM,SAAS,KAAK;AAGxD,UAAM,UAAU,MAAM;AACpB,oBAAc,KAAK;AACnB,YAAM,MAAM,OAAO;AACnB,UAAI,OAAO,IAAI,YAAY,IAAI,iBAAiB,GAAG;AACjD,sBAAc,IAAI;AAAA,MACpB;AAAA,IACF,GAAG,CAAC,GAAG,CAAC;AAER,UAAM,eAAe,CAAC,OAAO;AAC7B,UAAM,kBAAkB,aAAa,OAAO,YAAY,IAAI,IAAI;AAChE,UAAM,gBAAgB,UAAU,OAAO,cAAc,IAAI,IAAI;AAC7D,UAAM,gBAAgB,OAAO;AAC7B,UAAM,mBAAmB,gBAAgB,QAAQ,iBAAiB,cAAc,KAAA,EAAO,SAAS,CAAC;AAEjG,UAAM,gBAAgB;AAAA,MACpB,OAAO;AAAA,MACP,OAAO,IAAI;AAAA,MACX,UAAU,YAAY,OAAO;AAAA,MAC7B;AAAA,IAAA,EACA,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,UAAM,QAA6B,EAAE,GAAG,UAAA;AACxC,QAAI,eAAe,QAAW;AAC5B,YAAM,eAAe,OAAO,eAAe,WAAW,GAAG,UAAU,OAAO;AAC1E,YAAM,QAAQ;AACd,YAAM,SAAS;AACf,UAAI,MAAM,aAAa,QAAW;AAChC,cAAM,WAAW,QAAQ,YAAY;AAAA,MACvC;AAAA,IACF;AAEA,QAAI,gBAAgB,eAAe;AACjC,YAAM,kBAAkB;AACxB,YAAM,YAAY,qBAAqB,aAAa;AACpD,UAAI,WAAW;AACZ,cAAiC,yBAAyB,IAAI;AAAA,MACjE;AAAA,IACF;AAEA,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACC,GAAG;AAAA,QACJ,WAAW;AAAA,QACX;AAAA,QACA,MAAM,mBAAmB,QAAQ;AAAA,QACjC,cAAY,mBAAmB,gBAAgB;AAAA,QAC/C,eAAa,gBAAgB,CAAC,mBAAmB,OAAO;AAAA,QAEvD,UAAA;AAAA,UAAA,CAAC,gBACA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,KAAK;AAAA,cACJ,GAAG;AAAA,cACJ;AAAA,cACA;AAAA,cACA,WAAW,OAAO;AAAA,cAClB,SAAS,CAAC,UAAU;;AAClB,+DAAY,YAAZ,oCAAsB;AACtB,oBAAI,CAAC,MAAM,kBAAkB;AAC3B,gCAAc,IAAI;AAAA,gBACpB;AAAA,cACF;AAAA,cACA,OAAO,EAAE,GAAG,WAAA;AAAA,YAAW;AAAA,UAAA;AAAA,UAG1B,gBAAgB,mBACf,oBAAC,UAAK,WAAW,OAAO,UAAW,UAAA,iBAAgB;AAAA,UAEpD,gBAAgB,CAAC,mBAChB;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAW,OAAO;AAAA,cAClB,OAAM;AAAA,cACN,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,eAAY;AAAA,cAEZ,UAAA,oBAAC,QAAA,EAAK,GAAE,gHAAA,CAAgH;AAAA,YAAA;AAAA,UAAA;AAAA,QAC1H;AAAA,MAAA;AAAA,IAAA;AAAA,EAIR;AACF;AAMA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAqB;AACnB,QAAM,aAAa,MAAM,SAAS,QAAQ,QAAQ;AAClD,QAAM,eAAe,OAAO,MAAM,WAAW,SAAS,MAAM,WAAW;AACvE,QAAM,gBAAgB,OAAO,WAAW,SAAS,MAAM,WAAW,SAAS,MAAM;AAEjF,QAAM,eAAe,CAAC,OAAO,OAAO,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAEvE,SACE,qBAAC,OAAA,EAAK,GAAG,WAAW,WAAW,cAC5B,UAAA;AAAA,IAAA,WAAW,MAAM,GAAG,YAAY,EAAE,IAAI,CAAC,OAAO,UAAU;AACvD,UAAI,MAAM,eAA4B,KAAK,GAAG;AAC5C,eAAO,MAAM,aAAa,OAAO;AAAA,UAC/B,KAAK;AAAA,UACL,MAAM,MAAM,MAAM,QAAQ;AAAA,UAC1B,WAAW,CAAC,OAAO,WAAW,MAAM,MAAM,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,QAAA,CAC9E;AAAA,MACH;AACA,aAAO;AAAA,IACT,CAAC;AAAA,IACA,gBAAgB,KACf,oBAAC,OAAA,EAAI,WAAW,CAAC,OAAO,QAAQ,OAAO,IAAI,GAAG,OAAO,QAAQ,EAAE,KAAK,GAAG,GACrE,UAAA,qBAAC,QAAA,EAAK,WAAW,OAAO,UAAU,UAAA;AAAA,MAAA;AAAA,MAAE;AAAA,IAAA,EAAA,CAAc,EAAA,CACpD;AAAA,EAAA,GAEJ;AAEJ;AAMO,MAAM,SAAS,OAAO,OAAO,YAAY;AAAA,EAC9C,OAAO;AACT,CAAC;"}
@@ -29,19 +29,21 @@ const BadgeRoot = React__namespace.forwardRef(
29
29
  dot = false,
30
30
  icon,
31
31
  onRemove,
32
+ announce = false,
32
33
  className,
33
34
  "aria-label": ariaLabel,
35
+ role,
34
36
  ...htmlProps
35
37
  }, ref) {
36
38
  const classes = [Badge_module.default.badge, Badge_module.default[size], Badge_module.default[variant], className].filter(Boolean).join(" ");
37
- const effectiveAriaLabel = ariaLabel || (variant !== "default" && variant !== "outline" ? `${variant}: ${typeof children === "string" ? children : ""}` : void 0);
39
+ const effectiveAriaLabel = ariaLabel || (announce && variant !== "default" && variant !== "outline" ? `${variant}: ${typeof children === "string" ? children : ""}` : void 0);
38
40
  return /* @__PURE__ */ jsxRuntime.jsxs(
39
41
  "span",
40
42
  {
41
43
  ref,
42
44
  ...htmlProps,
43
45
  className: classes,
44
- role: effectiveAriaLabel ? "status" : void 0,
46
+ role: role ?? (announce ? "status" : void 0),
45
47
  "aria-label": effectiveAriaLabel,
46
48
  children: [
47
49
  dot && /* @__PURE__ */ jsxRuntime.jsx("span", { className: Badge_module.default.dot, "aria-hidden": "true" }),
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../src/components/Badge/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { Button as BaseButton } from '@base-ui/react/button';\nimport styles from './Badge.module.scss';\n\n/**\n * Badge for status indicators, labels, and counts.\n * @see https://usefragments.com/components/badge\n */\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n children: React.ReactNode;\n /** Visual style variant.\n * @default \"default\"\n * @see https://usefragments.com/components/badge#variants */\n variant?: 'default' | 'success' | 'warning' | 'error' | 'info' | 'outline';\n /** Badge size.\n * @default \"md\" */\n size?: 'sm' | 'md' | 'lg';\n /** Show a status dot before the label */\n dot?: boolean;\n /** Icon element rendered before the label */\n icon?: React.ReactNode;\n /** Makes the badge removable. Called when dismiss button is clicked. */\n onRemove?: () => void;\n}\n\nconst BadgeRoot = React.forwardRef<HTMLSpanElement, BadgeProps>(\n function Badge(\n {\n children,\n variant = 'default',\n size = 'md',\n dot = false,\n icon,\n onRemove,\n className,\n 'aria-label': ariaLabel,\n ...htmlProps\n },\n ref\n ) {\n const classes = [styles.badge, styles[size], styles[variant], className]\n .filter(Boolean)\n .join(' ');\n\n // For status badges, include the status in the aria-label if not provided\n const effectiveAriaLabel = ariaLabel || (\n variant !== 'default' && variant !== 'outline'\n ? `${variant}: ${typeof children === 'string' ? children : ''}`\n : undefined\n );\n\n return (\n <span\n ref={ref}\n {...htmlProps}\n className={classes}\n role={effectiveAriaLabel ? 'status' : undefined}\n aria-label={effectiveAriaLabel}\n >\n {dot && <span className={styles.dot} aria-hidden=\"true\" />}\n {icon && (\n <span className={styles.icon} aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <span>{children}</span>\n {onRemove && (\n <BaseButton\n onClick={onRemove}\n aria-label={`Remove ${typeof children === 'string' ? children : 'badge'}`}\n className={styles.remove}\n >\n &times;\n </BaseButton>\n )}\n </span>\n );\n }\n);\n\nexport const Badge = Object.assign(BadgeRoot, {\n Root: BadgeRoot,\n});\n"],"names":["React","Badge","styles","jsxs","jsx","BaseButton"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AA2BA,MAAM,YAAYA,iBAAM;AAAA,EACtB,SAASC,OACP;AAAA,IACE;AAAA,IACA,UAAU;AAAA,IACV,OAAO;AAAA,IACP,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,GAAG;AAAA,EAAA,GAEL,KACA;AACA,UAAM,UAAU,CAACC,aAAAA,QAAO,OAAOA,aAAAA,QAAO,IAAI,GAAGA,aAAAA,QAAO,OAAO,GAAG,SAAS,EACpE,OAAO,OAAO,EACd,KAAK,GAAG;AAGX,UAAM,qBAAqB,cACzB,YAAY,aAAa,YAAY,YACjC,GAAG,OAAO,KAAK,OAAO,aAAa,WAAW,WAAW,EAAE,KAC3D;AAGN,WACEC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACC,GAAG;AAAA,QACJ,WAAW;AAAA,QACX,MAAM,qBAAqB,WAAW;AAAA,QACtC,cAAY;AAAA,QAEX,UAAA;AAAA,UAAA,sCAAQ,QAAA,EAAK,WAAWD,aAAAA,QAAO,KAAK,eAAY,QAAO;AAAA,UACvD,uCACE,QAAA,EAAK,WAAWA,aAAAA,QAAO,MAAM,eAAY,QACvC,UAAA,KAAA,CACH;AAAA,UAEFE,+BAAC,UAAM,UAAS;AAAA,UACf,YACCA,2BAAAA;AAAAA,YAACC,OAAAA;AAAAA,YAAA;AAAA,cACC,SAAS;AAAA,cACT,cAAY,UAAU,OAAO,aAAa,WAAW,WAAW,OAAO;AAAA,cACvE,WAAWH,aAAAA,QAAO;AAAA,cACnB,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAED;AAAA,MAAA;AAAA,IAAA;AAAA,EAIR;AACF;AAEO,MAAM,QAAQ,OAAO,OAAO,WAAW;AAAA,EAC5C,MAAM;AACR,CAAC;;"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../src/components/Badge/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { Button as BaseButton } from '@base-ui/react/button';\nimport styles from './Badge.module.scss';\n\n/**\n * Badge for status indicators, labels, and counts.\n * @see https://usefragments.com/components/badge\n */\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n children: React.ReactNode;\n /** Visual style variant.\n * @default \"default\"\n * @see https://usefragments.com/components/badge#variants */\n variant?: 'default' | 'success' | 'warning' | 'error' | 'info' | 'outline';\n /** Badge size.\n * @default \"md\" */\n size?: 'sm' | 'md' | 'lg';\n /** Show a status dot before the label */\n dot?: boolean;\n /** Icon element rendered before the label */\n icon?: React.ReactNode;\n /** Makes the badge removable. Called when dismiss button is clicked. */\n onRemove?: () => void;\n /** Announce badge content as status to assistive tech (opt-in).\n * @default false */\n announce?: boolean;\n}\n\nconst BadgeRoot = React.forwardRef<HTMLSpanElement, BadgeProps>(\n function Badge(\n {\n children,\n variant = 'default',\n size = 'md',\n dot = false,\n icon,\n onRemove,\n announce = false,\n className,\n 'aria-label': ariaLabel,\n role,\n ...htmlProps\n },\n ref\n ) {\n const classes = [styles.badge, styles[size], styles[variant], className]\n .filter(Boolean)\n .join(' ');\n\n // For status badges, include the status in the aria-label if not provided\n const effectiveAriaLabel = ariaLabel || (\n announce && variant !== 'default' && variant !== 'outline'\n ? `${variant}: ${typeof children === 'string' ? children : ''}`\n : undefined\n );\n\n return (\n <span\n ref={ref}\n {...htmlProps}\n className={classes}\n role={role ?? (announce ? 'status' : undefined)}\n aria-label={effectiveAriaLabel}\n >\n {dot && <span className={styles.dot} aria-hidden=\"true\" />}\n {icon && (\n <span className={styles.icon} aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <span>{children}</span>\n {onRemove && (\n <BaseButton\n onClick={onRemove}\n aria-label={`Remove ${typeof children === 'string' ? children : 'badge'}`}\n className={styles.remove}\n >\n &times;\n </BaseButton>\n )}\n </span>\n );\n }\n);\n\nexport const Badge = Object.assign(BadgeRoot, {\n Root: BadgeRoot,\n});\n"],"names":["React","Badge","styles","jsxs","jsx","BaseButton"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AA8BA,MAAM,YAAYA,iBAAM;AAAA,EACtB,SAASC,OACP;AAAA,IACE;AAAA,IACA,UAAU;AAAA,IACV,OAAO;AAAA,IACP,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA,GAAG;AAAA,EAAA,GAEL,KACA;AACA,UAAM,UAAU,CAACC,aAAAA,QAAO,OAAOA,aAAAA,QAAO,IAAI,GAAGA,aAAAA,QAAO,OAAO,GAAG,SAAS,EACpE,OAAO,OAAO,EACd,KAAK,GAAG;AAGX,UAAM,qBAAqB,cACzB,YAAY,YAAY,aAAa,YAAY,YAC7C,GAAG,OAAO,KAAK,OAAO,aAAa,WAAW,WAAW,EAAE,KAC3D;AAGN,WACEC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACC,GAAG;AAAA,QACJ,WAAW;AAAA,QACX,MAAM,SAAS,WAAW,WAAW;AAAA,QACrC,cAAY;AAAA,QAEX,UAAA;AAAA,UAAA,sCAAQ,QAAA,EAAK,WAAWD,aAAAA,QAAO,KAAK,eAAY,QAAO;AAAA,UACvD,uCACE,QAAA,EAAK,WAAWA,aAAAA,QAAO,MAAM,eAAY,QACvC,UAAA,KAAA,CACH;AAAA,UAEFE,+BAAC,UAAM,UAAS;AAAA,UACf,YACCA,2BAAAA;AAAAA,YAACC,OAAAA;AAAAA,YAAA;AAAA,cACC,SAAS;AAAA,cACT,cAAY,UAAU,OAAO,aAAa,WAAW,WAAW,OAAO;AAAA,cACvE,WAAWH,aAAAA,QAAO;AAAA,cACnB,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAED;AAAA,MAAA;AAAA,IAAA;AAAA,EAIR;AACF;AAEO,MAAM,QAAQ,OAAO,OAAO,WAAW;AAAA,EAC5C,MAAM;AACR,CAAC;;"}
@@ -18,6 +18,9 @@ export interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {
18
18
  icon?: React.ReactNode;
19
19
  /** Makes the badge removable. Called when dismiss button is clicked. */
20
20
  onRemove?: () => void;
21
+ /** Announce badge content as status to assistive tech (opt-in).
22
+ * @default false */
23
+ announce?: boolean;
21
24
  }
22
25
  export declare const Badge: React.ForwardRefExoticComponent<BadgeProps & React.RefAttributes<HTMLSpanElement>> & {
23
26
  Root: React.ForwardRefExoticComponent<BadgeProps & React.RefAttributes<HTMLSpanElement>>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Badge/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;GAGG;AACH,MAAM,WAAW,UAAW,SAAQ,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC;IACvE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B;;iEAE6D;IAC7D,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IAC3E;uBACmB;IACnB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,yCAAyC;IACzC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,6CAA6C;IAC7C,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAyDD,eAAO,MAAM,KAAK;;CAEhB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Badge/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;GAGG;AACH,MAAM,WAAW,UAAW,SAAQ,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC;IACvE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B;;iEAE6D;IAC7D,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IAC3E;uBACmB;IACnB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,yCAAyC;IACzC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,6CAA6C;IAC7C,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB;wBACoB;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AA2DD,eAAO,MAAM,KAAK;;CAEhB,CAAC"}
@@ -10,19 +10,21 @@ const BadgeRoot = React.forwardRef(
10
10
  dot = false,
11
11
  icon,
12
12
  onRemove,
13
+ announce = false,
13
14
  className,
14
15
  "aria-label": ariaLabel,
16
+ role,
15
17
  ...htmlProps
16
18
  }, ref) {
17
19
  const classes = [styles.badge, styles[size], styles[variant], className].filter(Boolean).join(" ");
18
- const effectiveAriaLabel = ariaLabel || (variant !== "default" && variant !== "outline" ? `${variant}: ${typeof children === "string" ? children : ""}` : void 0);
20
+ const effectiveAriaLabel = ariaLabel || (announce && variant !== "default" && variant !== "outline" ? `${variant}: ${typeof children === "string" ? children : ""}` : void 0);
19
21
  return /* @__PURE__ */ jsxs(
20
22
  "span",
21
23
  {
22
24
  ref,
23
25
  ...htmlProps,
24
26
  className: classes,
25
- role: effectiveAriaLabel ? "status" : void 0,
27
+ role: role ?? (announce ? "status" : void 0),
26
28
  "aria-label": effectiveAriaLabel,
27
29
  children: [
28
30
  dot && /* @__PURE__ */ jsx("span", { className: styles.dot, "aria-hidden": "true" }),
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/components/Badge/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { Button as BaseButton } from '@base-ui/react/button';\nimport styles from './Badge.module.scss';\n\n/**\n * Badge for status indicators, labels, and counts.\n * @see https://usefragments.com/components/badge\n */\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n children: React.ReactNode;\n /** Visual style variant.\n * @default \"default\"\n * @see https://usefragments.com/components/badge#variants */\n variant?: 'default' | 'success' | 'warning' | 'error' | 'info' | 'outline';\n /** Badge size.\n * @default \"md\" */\n size?: 'sm' | 'md' | 'lg';\n /** Show a status dot before the label */\n dot?: boolean;\n /** Icon element rendered before the label */\n icon?: React.ReactNode;\n /** Makes the badge removable. Called when dismiss button is clicked. */\n onRemove?: () => void;\n}\n\nconst BadgeRoot = React.forwardRef<HTMLSpanElement, BadgeProps>(\n function Badge(\n {\n children,\n variant = 'default',\n size = 'md',\n dot = false,\n icon,\n onRemove,\n className,\n 'aria-label': ariaLabel,\n ...htmlProps\n },\n ref\n ) {\n const classes = [styles.badge, styles[size], styles[variant], className]\n .filter(Boolean)\n .join(' ');\n\n // For status badges, include the status in the aria-label if not provided\n const effectiveAriaLabel = ariaLabel || (\n variant !== 'default' && variant !== 'outline'\n ? `${variant}: ${typeof children === 'string' ? children : ''}`\n : undefined\n );\n\n return (\n <span\n ref={ref}\n {...htmlProps}\n className={classes}\n role={effectiveAriaLabel ? 'status' : undefined}\n aria-label={effectiveAriaLabel}\n >\n {dot && <span className={styles.dot} aria-hidden=\"true\" />}\n {icon && (\n <span className={styles.icon} aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <span>{children}</span>\n {onRemove && (\n <BaseButton\n onClick={onRemove}\n aria-label={`Remove ${typeof children === 'string' ? children : 'badge'}`}\n className={styles.remove}\n >\n &times;\n </BaseButton>\n )}\n </span>\n );\n }\n);\n\nexport const Badge = Object.assign(BadgeRoot, {\n Root: BadgeRoot,\n});\n"],"names":["Badge","BaseButton"],"mappings":";;;;AA2BA,MAAM,YAAY,MAAM;AAAA,EACtB,SAASA,OACP;AAAA,IACE;AAAA,IACA,UAAU;AAAA,IACV,OAAO;AAAA,IACP,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,GAAG;AAAA,EAAA,GAEL,KACA;AACA,UAAM,UAAU,CAAC,OAAO,OAAO,OAAO,IAAI,GAAG,OAAO,OAAO,GAAG,SAAS,EACpE,OAAO,OAAO,EACd,KAAK,GAAG;AAGX,UAAM,qBAAqB,cACzB,YAAY,aAAa,YAAY,YACjC,GAAG,OAAO,KAAK,OAAO,aAAa,WAAW,WAAW,EAAE,KAC3D;AAGN,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACC,GAAG;AAAA,QACJ,WAAW;AAAA,QACX,MAAM,qBAAqB,WAAW;AAAA,QACtC,cAAY;AAAA,QAEX,UAAA;AAAA,UAAA,2BAAQ,QAAA,EAAK,WAAW,OAAO,KAAK,eAAY,QAAO;AAAA,UACvD,4BACE,QAAA,EAAK,WAAW,OAAO,MAAM,eAAY,QACvC,UAAA,KAAA,CACH;AAAA,UAEF,oBAAC,UAAM,UAAS;AAAA,UACf,YACC;AAAA,YAACC;AAAAA,YAAA;AAAA,cACC,SAAS;AAAA,cACT,cAAY,UAAU,OAAO,aAAa,WAAW,WAAW,OAAO;AAAA,cACvE,WAAW,OAAO;AAAA,cACnB,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAED;AAAA,MAAA;AAAA,IAAA;AAAA,EAIR;AACF;AAEO,MAAM,QAAQ,OAAO,OAAO,WAAW;AAAA,EAC5C,MAAM;AACR,CAAC;"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/Badge/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { Button as BaseButton } from '@base-ui/react/button';\nimport styles from './Badge.module.scss';\n\n/**\n * Badge for status indicators, labels, and counts.\n * @see https://usefragments.com/components/badge\n */\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n children: React.ReactNode;\n /** Visual style variant.\n * @default \"default\"\n * @see https://usefragments.com/components/badge#variants */\n variant?: 'default' | 'success' | 'warning' | 'error' | 'info' | 'outline';\n /** Badge size.\n * @default \"md\" */\n size?: 'sm' | 'md' | 'lg';\n /** Show a status dot before the label */\n dot?: boolean;\n /** Icon element rendered before the label */\n icon?: React.ReactNode;\n /** Makes the badge removable. Called when dismiss button is clicked. */\n onRemove?: () => void;\n /** Announce badge content as status to assistive tech (opt-in).\n * @default false */\n announce?: boolean;\n}\n\nconst BadgeRoot = React.forwardRef<HTMLSpanElement, BadgeProps>(\n function Badge(\n {\n children,\n variant = 'default',\n size = 'md',\n dot = false,\n icon,\n onRemove,\n announce = false,\n className,\n 'aria-label': ariaLabel,\n role,\n ...htmlProps\n },\n ref\n ) {\n const classes = [styles.badge, styles[size], styles[variant], className]\n .filter(Boolean)\n .join(' ');\n\n // For status badges, include the status in the aria-label if not provided\n const effectiveAriaLabel = ariaLabel || (\n announce && variant !== 'default' && variant !== 'outline'\n ? `${variant}: ${typeof children === 'string' ? children : ''}`\n : undefined\n );\n\n return (\n <span\n ref={ref}\n {...htmlProps}\n className={classes}\n role={role ?? (announce ? 'status' : undefined)}\n aria-label={effectiveAriaLabel}\n >\n {dot && <span className={styles.dot} aria-hidden=\"true\" />}\n {icon && (\n <span className={styles.icon} aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <span>{children}</span>\n {onRemove && (\n <BaseButton\n onClick={onRemove}\n aria-label={`Remove ${typeof children === 'string' ? children : 'badge'}`}\n className={styles.remove}\n >\n &times;\n </BaseButton>\n )}\n </span>\n );\n }\n);\n\nexport const Badge = Object.assign(BadgeRoot, {\n Root: BadgeRoot,\n});\n"],"names":["Badge","BaseButton"],"mappings":";;;;AA8BA,MAAM,YAAY,MAAM;AAAA,EACtB,SAASA,OACP;AAAA,IACE;AAAA,IACA,UAAU;AAAA,IACV,OAAO;AAAA,IACP,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA,GAAG;AAAA,EAAA,GAEL,KACA;AACA,UAAM,UAAU,CAAC,OAAO,OAAO,OAAO,IAAI,GAAG,OAAO,OAAO,GAAG,SAAS,EACpE,OAAO,OAAO,EACd,KAAK,GAAG;AAGX,UAAM,qBAAqB,cACzB,YAAY,YAAY,aAAa,YAAY,YAC7C,GAAG,OAAO,KAAK,OAAO,aAAa,WAAW,WAAW,EAAE,KAC3D;AAGN,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACC,GAAG;AAAA,QACJ,WAAW;AAAA,QACX,MAAM,SAAS,WAAW,WAAW;AAAA,QACrC,cAAY;AAAA,QAEX,UAAA;AAAA,UAAA,2BAAQ,QAAA,EAAK,WAAW,OAAO,KAAK,eAAY,QAAO;AAAA,UACvD,4BACE,QAAA,EAAK,WAAW,OAAO,MAAM,eAAY,QACvC,UAAA,KAAA,CACH;AAAA,UAEF,oBAAC,UAAM,UAAS;AAAA,UACf,YACC;AAAA,YAACC;AAAAA,YAAA;AAAA,cACC,SAAS;AAAA,cACT,cAAY,UAAU,OAAO,aAAa,WAAW,WAAW,OAAO;AAAA,cACvE,WAAW,OAAO;AAAA,cACnB,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAED;AAAA,MAAA;AAAA,IAAA;AAAA,EAIR;AACF;AAEO,MAAM,QAAQ,OAAO,OAAO,WAAW;AAAA,EAC5C,MAAM;AACR,CAAC;"}
@@ -1,16 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
- const grid = "_grid_5fm9r_1";
4
- const columns2 = "_columns2_5fm9r_7";
5
- const columns3 = "_columns3_5fm9r_11";
6
- const columns4 = "_columns4_5fm9r_15";
7
- const gapNone = "_gapNone_5fm9r_32";
8
- const gapXs = "_gapXs_5fm9r_36";
9
- const gapSm = "_gapSm_5fm9r_40";
10
- const gapMd = "_gapMd_5fm9r_44";
11
- const gapLg = "_gapLg_5fm9r_48";
12
- const gapXl = "_gapXl_5fm9r_52";
13
- const item = "_item_5fm9r_56";
3
+ const grid = "_grid_svc6l_1";
4
+ const columns2 = "_columns2_svc6l_7";
5
+ const columns3 = "_columns3_svc6l_11";
6
+ const columns4 = "_columns4_svc6l_15";
7
+ const gapNone = "_gapNone_svc6l_32";
8
+ const gapXs = "_gapXs_svc6l_36";
9
+ const gapSm = "_gapSm_svc6l_40";
10
+ const gapMd = "_gapMd_svc6l_44";
11
+ const gapLg = "_gapLg_svc6l_48";
12
+ const gapXl = "_gapXl_svc6l_52";
13
+ const item = "_item_svc6l_56";
14
14
  const styles = {
15
15
  grid,
16
16
  columns2,
@@ -1,14 +1,14 @@
1
- const grid = "_grid_5fm9r_1";
2
- const columns2 = "_columns2_5fm9r_7";
3
- const columns3 = "_columns3_5fm9r_11";
4
- const columns4 = "_columns4_5fm9r_15";
5
- const gapNone = "_gapNone_5fm9r_32";
6
- const gapXs = "_gapXs_5fm9r_36";
7
- const gapSm = "_gapSm_5fm9r_40";
8
- const gapMd = "_gapMd_5fm9r_44";
9
- const gapLg = "_gapLg_5fm9r_48";
10
- const gapXl = "_gapXl_5fm9r_52";
11
- const item = "_item_5fm9r_56";
1
+ const grid = "_grid_svc6l_1";
2
+ const columns2 = "_columns2_svc6l_7";
3
+ const columns3 = "_columns3_svc6l_11";
4
+ const columns4 = "_columns4_svc6l_15";
5
+ const gapNone = "_gapNone_svc6l_32";
6
+ const gapXs = "_gapXs_svc6l_36";
7
+ const gapSm = "_gapSm_svc6l_40";
8
+ const gapMd = "_gapMd_svc6l_44";
9
+ const gapLg = "_gapLg_svc6l_48";
10
+ const gapXl = "_gapXl_svc6l_52";
11
+ const item = "_item_svc6l_56";
12
12
  const styles = {
13
13
  grid,
14
14
  columns2,
@@ -45,7 +45,8 @@ const BentoGrid = React__namespace.forwardRef(
45
45
  columns = 3,
46
46
  gap = "md",
47
47
  className,
48
- style
48
+ style,
49
+ ...htmlProps
49
50
  }, ref) {
50
51
  const classes = [
51
52
  BentoGrid_module.default.grid,
@@ -53,7 +54,7 @@ const BentoGrid = React__namespace.forwardRef(
53
54
  gapClasses[gap],
54
55
  className
55
56
  ].filter(Boolean).join(" ");
56
- return /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: classes, style, children });
57
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { ref, ...htmlProps, className: classes, style, children });
57
58
  }
58
59
  );
59
60
  const BentoGridItem = React__namespace.forwardRef(
@@ -61,16 +62,18 @@ const BentoGridItem = React__namespace.forwardRef(
61
62
  children,
62
63
  colSpan,
63
64
  rowSpan,
64
- className
65
+ className,
66
+ style,
67
+ ...htmlProps
65
68
  }, ref) {
66
69
  const spanVars = {
67
70
  ...getSpanVars(colSpan, "bento-col-span"),
68
71
  ...getSpanVars(rowSpan, "bento-row-span")
69
72
  };
70
73
  const hasVars = Object.keys(spanVars).length > 0;
71
- const inlineStyle = hasVars ? spanVars : void 0;
74
+ const inlineStyle = hasVars ? { ...spanVars, ...style } : style;
72
75
  const classes = [BentoGrid_module.default.item, className].filter(Boolean).join(" ");
73
- return /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: classes, style: inlineStyle, children });
76
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { ref, ...htmlProps, className: classes, style: inlineStyle, children });
74
77
  }
75
78
  );
76
79
  BentoGrid.Item = BentoGridItem;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../src/components/BentoGrid/index.tsx"],"sourcesContent":["import * as React from 'react';\nimport styles from './BentoGrid.module.scss';\n\n// ============================================\n// Types\n// ============================================\n\ntype SpanValue = 1 | 2 | 3;\n\nexport interface ResponsiveSpan {\n /** Default (mobile-first) */\n base?: SpanValue;\n /** ≥640px */\n sm?: SpanValue;\n /** ≥768px */\n md?: SpanValue;\n /** ≥1024px */\n lg?: SpanValue;\n /** ≥1280px */\n xl?: SpanValue;\n}\n\nexport interface BentoGridProps {\n children?: React.ReactNode;\n /** Number of columns (default: 3) — auto-collapses responsively */\n columns?: 2 | 3 | 4;\n /** Gap between grid items */\n gap?: 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n /** Additional class name */\n className?: string;\n /** Inline styles */\n style?: React.CSSProperties;\n}\n\nexport interface BentoGridItemProps {\n children?: React.ReactNode;\n /** Columns to span — number for all breakpoints, object for per-breakpoint */\n colSpan?: SpanValue | ResponsiveSpan;\n /** Rows to span — number for all breakpoints, object for per-breakpoint */\n rowSpan?: SpanValue | ResponsiveSpan;\n /** Additional class name */\n className?: string;\n}\n\n// ============================================\n// Helpers\n// ============================================\n\nconst gapClasses: Record<NonNullable<BentoGridProps['gap']>, string> = {\n none: styles.gapNone,\n xs: styles.gapXs,\n sm: styles.gapSm,\n md: styles.gapMd,\n lg: styles.gapLg,\n xl: styles.gapXl,\n};\n\nfunction getSpanVars(\n span: SpanValue | ResponsiveSpan | undefined,\n prefix: string\n): Record<string, number> {\n if (!span || span === 1) return {};\n if (typeof span === 'number') return { [`--${prefix}`]: span };\n const vars: Record<string, number> = {};\n if (span.base && span.base > 1) vars[`--${prefix}`] = span.base;\n if (span.sm) vars[`--${prefix}-sm`] = span.sm;\n if (span.md) vars[`--${prefix}-md`] = span.md;\n if (span.lg) vars[`--${prefix}-lg`] = span.lg;\n if (span.xl) vars[`--${prefix}-xl`] = span.xl;\n return vars;\n}\n\n// ============================================\n// BentoGrid Component\n// ============================================\n\nexport const BentoGrid = React.forwardRef<HTMLDivElement, BentoGridProps>(\n function BentoGrid(\n {\n children,\n columns = 3,\n gap = 'md',\n className,\n style,\n },\n ref\n ) {\n const classes = [\n styles.grid,\n styles[`columns${columns}`],\n gapClasses[gap],\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div ref={ref} className={classes} style={style}>\n {children}\n </div>\n );\n }\n) as BentoGridComponent;\n\n// ============================================\n// BentoGrid.Item Sub-component\n// ============================================\n\nconst BentoGridItem = React.forwardRef<HTMLDivElement, BentoGridItemProps>(\n function BentoGridItem(\n {\n children,\n colSpan,\n rowSpan,\n className,\n },\n ref\n ) {\n const spanVars = {\n ...getSpanVars(colSpan, 'bento-col-span'),\n ...getSpanVars(rowSpan, 'bento-row-span'),\n };\n\n const hasVars = Object.keys(spanVars).length > 0;\n const inlineStyle = hasVars\n ? (spanVars as unknown as React.CSSProperties)\n : undefined;\n\n const classes = [styles.item, className].filter(Boolean).join(' ');\n\n return (\n <div ref={ref} className={classes} style={inlineStyle}>\n {children}\n </div>\n );\n }\n);\n\n// ============================================\n// Compound component type\n// ============================================\n\ninterface BentoGridComponent\n extends React.ForwardRefExoticComponent<BentoGridProps & React.RefAttributes<HTMLDivElement>> {\n Item: typeof BentoGridItem;\n}\n\n(BentoGrid as BentoGridComponent).Item = BentoGridItem;\n"],"names":["styles","React","BentoGrid","BentoGridItem"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAgDA,MAAM,aAAiE;AAAA,EACrE,MAAMA,iBAAAA,QAAO;AAAA,EACb,IAAIA,iBAAAA,QAAO;AAAA,EACX,IAAIA,iBAAAA,QAAO;AAAA,EACX,IAAIA,iBAAAA,QAAO;AAAA,EACX,IAAIA,iBAAAA,QAAO;AAAA,EACX,IAAIA,iBAAAA,QAAO;AACb;AAEA,SAAS,YACP,MACA,QACwB;AACxB,MAAI,CAAC,QAAQ,SAAS,UAAU,CAAA;AAChC,MAAI,OAAO,SAAS,SAAU,QAAO,EAAE,CAAC,KAAK,MAAM,EAAE,GAAG,KAAA;AACxD,QAAM,OAA+B,CAAA;AACrC,MAAI,KAAK,QAAQ,KAAK,OAAO,QAAQ,KAAK,MAAM,EAAE,IAAI,KAAK;AAC3D,MAAI,KAAK,GAAI,MAAK,KAAK,MAAM,KAAK,IAAI,KAAK;AAC3C,MAAI,KAAK,GAAI,MAAK,KAAK,MAAM,KAAK,IAAI,KAAK;AAC3C,MAAI,KAAK,GAAI,MAAK,KAAK,MAAM,KAAK,IAAI,KAAK;AAC3C,MAAI,KAAK,GAAI,MAAK,KAAK,MAAM,KAAK,IAAI,KAAK;AAC3C,SAAO;AACT;AAMO,MAAM,YAAYC,iBAAM;AAAA,EAC7B,SAASC,WACP;AAAA,IACE;AAAA,IACA,UAAU;AAAA,IACV,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EAAA,GAEF,KACA;AACA,UAAM,UAAU;AAAA,MACdF,iBAAAA,QAAO;AAAA,MACPA,iBAAAA,QAAO,UAAU,OAAO,EAAE;AAAA,MAC1B,WAAW,GAAG;AAAA,MACd;AAAA,IAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,0CACG,OAAA,EAAI,KAAU,WAAW,SAAS,OAChC,UACH;AAAA,EAEJ;AACF;AAMA,MAAM,gBAAgBC,iBAAM;AAAA,EAC1B,SAASE,eACP;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,GAEF,KACA;AACA,UAAM,WAAW;AAAA,MACf,GAAG,YAAY,SAAS,gBAAgB;AAAA,MACxC,GAAG,YAAY,SAAS,gBAAgB;AAAA,IAAA;AAG1C,UAAM,UAAU,OAAO,KAAK,QAAQ,EAAE,SAAS;AAC/C,UAAM,cAAc,UACf,WACD;AAEJ,UAAM,UAAU,CAACH,iBAAAA,QAAO,MAAM,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAEjE,0CACG,OAAA,EAAI,KAAU,WAAW,SAAS,OAAO,aACvC,UACH;AAAA,EAEJ;AACF;AAWC,UAAiC,OAAO;;"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../src/components/BentoGrid/index.tsx"],"sourcesContent":["import * as React from 'react';\nimport styles from './BentoGrid.module.scss';\n\n// ============================================\n// Types\n// ============================================\n\ntype SpanValue = 1 | 2 | 3;\n\nexport interface ResponsiveSpan {\n /** Default (mobile-first) */\n base?: SpanValue;\n /** ≥640px */\n sm?: SpanValue;\n /** ≥768px */\n md?: SpanValue;\n /** ≥1024px */\n lg?: SpanValue;\n /** ≥1280px */\n xl?: SpanValue;\n}\n\nexport interface BentoGridProps extends React.HTMLAttributes<HTMLDivElement> {\n children?: React.ReactNode;\n /** Number of columns (default: 3) — auto-collapses responsively */\n columns?: 2 | 3 | 4;\n /** Gap between grid items */\n gap?: 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n}\n\nexport interface BentoGridItemProps extends React.HTMLAttributes<HTMLDivElement> {\n children?: React.ReactNode;\n /** Columns to span — number for all breakpoints, object for per-breakpoint */\n colSpan?: SpanValue | ResponsiveSpan;\n /** Rows to span — number for all breakpoints, object for per-breakpoint */\n rowSpan?: SpanValue | ResponsiveSpan;\n}\n\n// ============================================\n// Helpers\n// ============================================\n\nconst gapClasses: Record<NonNullable<BentoGridProps['gap']>, string> = {\n none: styles.gapNone,\n xs: styles.gapXs,\n sm: styles.gapSm,\n md: styles.gapMd,\n lg: styles.gapLg,\n xl: styles.gapXl,\n};\n\nfunction getSpanVars(\n span: SpanValue | ResponsiveSpan | undefined,\n prefix: string\n): Record<string, number> {\n if (!span || span === 1) return {};\n if (typeof span === 'number') return { [`--${prefix}`]: span };\n const vars: Record<string, number> = {};\n if (span.base && span.base > 1) vars[`--${prefix}`] = span.base;\n if (span.sm) vars[`--${prefix}-sm`] = span.sm;\n if (span.md) vars[`--${prefix}-md`] = span.md;\n if (span.lg) vars[`--${prefix}-lg`] = span.lg;\n if (span.xl) vars[`--${prefix}-xl`] = span.xl;\n return vars;\n}\n\n// ============================================\n// BentoGrid Component\n// ============================================\n\nexport const BentoGrid = React.forwardRef<HTMLDivElement, BentoGridProps>(\n function BentoGrid(\n {\n children,\n columns = 3,\n gap = 'md',\n className,\n style,\n ...htmlProps\n },\n ref\n ) {\n const classes = [\n styles.grid,\n styles[`columns${columns}`],\n gapClasses[gap],\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div ref={ref} {...htmlProps} className={classes} style={style}>\n {children}\n </div>\n );\n }\n) as BentoGridComponent;\n\n// ============================================\n// BentoGrid.Item Sub-component\n// ============================================\n\nconst BentoGridItem = React.forwardRef<HTMLDivElement, BentoGridItemProps>(\n function BentoGridItem(\n {\n children,\n colSpan,\n rowSpan,\n className,\n style,\n ...htmlProps\n },\n ref\n ) {\n const spanVars = {\n ...getSpanVars(colSpan, 'bento-col-span'),\n ...getSpanVars(rowSpan, 'bento-row-span'),\n };\n\n const hasVars = Object.keys(spanVars).length > 0;\n const inlineStyle = hasVars\n ? ({ ...(spanVars as unknown as React.CSSProperties), ...style } as React.CSSProperties)\n : style;\n\n const classes = [styles.item, className].filter(Boolean).join(' ');\n\n return (\n <div ref={ref} {...htmlProps} className={classes} style={inlineStyle}>\n {children}\n </div>\n );\n }\n);\n\n// ============================================\n// Compound component type\n// ============================================\n\ninterface BentoGridComponent\n extends React.ForwardRefExoticComponent<BentoGridProps & React.RefAttributes<HTMLDivElement>> {\n Item: typeof BentoGridItem;\n}\n\n(BentoGrid as BentoGridComponent).Item = BentoGridItem;\n"],"names":["styles","React","BentoGrid","jsx","BentoGridItem"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA0CA,MAAM,aAAiE;AAAA,EACrE,MAAMA,iBAAAA,QAAO;AAAA,EACb,IAAIA,iBAAAA,QAAO;AAAA,EACX,IAAIA,iBAAAA,QAAO;AAAA,EACX,IAAIA,iBAAAA,QAAO;AAAA,EACX,IAAIA,iBAAAA,QAAO;AAAA,EACX,IAAIA,iBAAAA,QAAO;AACb;AAEA,SAAS,YACP,MACA,QACwB;AACxB,MAAI,CAAC,QAAQ,SAAS,UAAU,CAAA;AAChC,MAAI,OAAO,SAAS,SAAU,QAAO,EAAE,CAAC,KAAK,MAAM,EAAE,GAAG,KAAA;AACxD,QAAM,OAA+B,CAAA;AACrC,MAAI,KAAK,QAAQ,KAAK,OAAO,QAAQ,KAAK,MAAM,EAAE,IAAI,KAAK;AAC3D,MAAI,KAAK,GAAI,MAAK,KAAK,MAAM,KAAK,IAAI,KAAK;AAC3C,MAAI,KAAK,GAAI,MAAK,KAAK,MAAM,KAAK,IAAI,KAAK;AAC3C,MAAI,KAAK,GAAI,MAAK,KAAK,MAAM,KAAK,IAAI,KAAK;AAC3C,MAAI,KAAK,GAAI,MAAK,KAAK,MAAM,KAAK,IAAI,KAAK;AAC3C,SAAO;AACT;AAMO,MAAM,YAAYC,iBAAM;AAAA,EAC7B,SAASC,WACP;AAAA,IACE;AAAA,IACA,UAAU;AAAA,IACV,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EAAA,GAEL,KACA;AACA,UAAM,UAAU;AAAA,MACdF,iBAAAA,QAAO;AAAA,MACPA,iBAAAA,QAAO,UAAU,OAAO,EAAE;AAAA,MAC1B,WAAW,GAAG;AAAA,MACd;AAAA,IAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,WACEG,2BAAAA,IAAC,SAAI,KAAW,GAAG,WAAW,WAAW,SAAS,OAC/C,UACH;AAAA,EAEJ;AACF;AAMA,MAAM,gBAAgBF,iBAAM;AAAA,EAC1B,SAASG,eACP;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EAAA,GAEL,KACA;AACA,UAAM,WAAW;AAAA,MACf,GAAG,YAAY,SAAS,gBAAgB;AAAA,MACxC,GAAG,YAAY,SAAS,gBAAgB;AAAA,IAAA;AAG1C,UAAM,UAAU,OAAO,KAAK,QAAQ,EAAE,SAAS;AAC/C,UAAM,cAAc,UACf,EAAE,GAAI,UAA6C,GAAG,UACvD;AAEJ,UAAM,UAAU,CAACJ,iBAAAA,QAAO,MAAM,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAEjE,WACEG,+BAAC,SAAI,KAAW,GAAG,WAAW,WAAW,SAAS,OAAO,aACtD,SAAA,CACH;AAAA,EAEJ;AACF;AAWC,UAAiC,OAAO;;"}
@@ -12,25 +12,19 @@ export interface ResponsiveSpan {
12
12
  /** ≥1280px */
13
13
  xl?: SpanValue;
14
14
  }
15
- export interface BentoGridProps {
15
+ export interface BentoGridProps extends React.HTMLAttributes<HTMLDivElement> {
16
16
  children?: React.ReactNode;
17
17
  /** Number of columns (default: 3) — auto-collapses responsively */
18
18
  columns?: 2 | 3 | 4;
19
19
  /** Gap between grid items */
20
20
  gap?: 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl';
21
- /** Additional class name */
22
- className?: string;
23
- /** Inline styles */
24
- style?: React.CSSProperties;
25
21
  }
26
- export interface BentoGridItemProps {
22
+ export interface BentoGridItemProps extends React.HTMLAttributes<HTMLDivElement> {
27
23
  children?: React.ReactNode;
28
24
  /** Columns to span — number for all breakpoints, object for per-breakpoint */
29
25
  colSpan?: SpanValue | ResponsiveSpan;
30
26
  /** Rows to span — number for all breakpoints, object for per-breakpoint */
31
27
  rowSpan?: SpanValue | ResponsiveSpan;
32
- /** Additional class name */
33
- className?: string;
34
28
  }
35
29
  export declare const BentoGrid: BentoGridComponent;
36
30
  declare const BentoGridItem: React.ForwardRefExoticComponent<BentoGridItemProps & React.RefAttributes<HTMLDivElement>>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/BentoGrid/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,KAAK,SAAS,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAE3B,MAAM,WAAW,cAAc;IAC7B,6BAA6B;IAC7B,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,aAAa;IACb,EAAE,CAAC,EAAE,SAAS,CAAC;IACf,aAAa;IACb,EAAE,CAAC,EAAE,SAAS,CAAC;IACf,cAAc;IACd,EAAE,CAAC,EAAE,SAAS,CAAC;IACf,cAAc;IACd,EAAE,CAAC,EAAE,SAAS,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,mEAAmE;IACnE,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpB,6BAA6B;IAC7B,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAChD,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,8EAA8E;IAC9E,OAAO,CAAC,EAAE,SAAS,GAAG,cAAc,CAAC;IACrC,2EAA2E;IAC3E,OAAO,CAAC,EAAE,SAAS,GAAG,cAAc,CAAC;IACrC,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAkCD,eAAO,MAAM,SAAS,EA0BjB,kBAAkB,CAAC;AAMxB,QAAA,MAAM,aAAa,2FA4BlB,CAAC;AAMF,UAAU,kBACR,SAAQ,KAAK,CAAC,yBAAyB,CAAC,cAAc,GAAG,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;IAC7F,IAAI,EAAE,OAAO,aAAa,CAAC;CAC5B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/BentoGrid/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,KAAK,SAAS,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAE3B,MAAM,WAAW,cAAc;IAC7B,6BAA6B;IAC7B,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,aAAa;IACb,EAAE,CAAC,EAAE,SAAS,CAAC;IACf,aAAa;IACb,EAAE,CAAC,EAAE,SAAS,CAAC;IACf,cAAc;IACd,EAAE,CAAC,EAAE,SAAS,CAAC;IACf,cAAc;IACd,EAAE,CAAC,EAAE,SAAS,CAAC;CAChB;AAED,MAAM,WAAW,cAAe,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IAC1E,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,mEAAmE;IACnE,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpB,6BAA6B;IAC7B,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;CACjD;AAED,MAAM,WAAW,kBAAmB,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IAC9E,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,8EAA8E;IAC9E,OAAO,CAAC,EAAE,SAAS,GAAG,cAAc,CAAC;IACrC,2EAA2E;IAC3E,OAAO,CAAC,EAAE,SAAS,GAAG,cAAc,CAAC;CACtC;AAkCD,eAAO,MAAM,SAAS,EA2BjB,kBAAkB,CAAC;AAMxB,QAAA,MAAM,aAAa,2FA8BlB,CAAC;AAMF,UAAU,kBACR,SAAQ,KAAK,CAAC,yBAAyB,CAAC,cAAc,GAAG,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;IAC7F,IAAI,EAAE,OAAO,aAAa,CAAC;CAC5B"}