@nofinite/nui 1.1.2 → 2.0.2

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 (405) hide show
  1. package/README.md +61 -48
  2. package/dist/components/accordion/Accordion.cjs +1 -1
  3. package/dist/components/accordion/Accordion.cjs.map +1 -1
  4. package/dist/components/accordion/Accordion.js +64 -43
  5. package/dist/components/accordion/Accordion.js.map +1 -1
  6. package/dist/components/alert/Alert.cjs +1 -1
  7. package/dist/components/alert/Alert.cjs.map +1 -1
  8. package/dist/components/alert/Alert.js +39 -25
  9. package/dist/components/alert/Alert.js.map +1 -1
  10. package/dist/components/avatar/Avatar.cjs +1 -1
  11. package/dist/components/avatar/Avatar.cjs.map +1 -1
  12. package/dist/components/avatar/Avatar.js +58 -44
  13. package/dist/components/avatar/Avatar.js.map +1 -1
  14. package/dist/components/avatar/AvatarGroup.cjs +1 -1
  15. package/dist/components/avatar/AvatarGroup.cjs.map +1 -1
  16. package/dist/components/avatar/AvatarGroup.js +34 -25
  17. package/dist/components/avatar/AvatarGroup.js.map +1 -1
  18. package/dist/components/badge/Badge.cjs +1 -1
  19. package/dist/components/badge/Badge.cjs.map +1 -1
  20. package/dist/components/badge/Badge.js +43 -68
  21. package/dist/components/badge/Badge.js.map +1 -1
  22. package/dist/components/badge/BadgeGroup.cjs +1 -1
  23. package/dist/components/badge/BadgeGroup.cjs.map +1 -1
  24. package/dist/components/badge/BadgeGroup.js +20 -10
  25. package/dist/components/badge/BadgeGroup.js.map +1 -1
  26. package/dist/components/breadcrumbs/Breadcrumbs.cjs +1 -1
  27. package/dist/components/breadcrumbs/Breadcrumbs.cjs.map +1 -1
  28. package/dist/components/breadcrumbs/Breadcrumbs.js +59 -39
  29. package/dist/components/breadcrumbs/Breadcrumbs.js.map +1 -1
  30. package/dist/components/button/Button.cjs +1 -1
  31. package/dist/components/button/Button.cjs.map +1 -1
  32. package/dist/components/button/Button.js +52 -17
  33. package/dist/components/button/Button.js.map +1 -1
  34. package/dist/components/card/Card.cjs +1 -1
  35. package/dist/components/card/Card.cjs.map +1 -1
  36. package/dist/components/card/Card.js +44 -41
  37. package/dist/components/card/Card.js.map +1 -1
  38. package/dist/components/checkbox/Checkbox.cjs +1 -1
  39. package/dist/components/checkbox/Checkbox.cjs.map +1 -1
  40. package/dist/components/checkbox/Checkbox.js +59 -40
  41. package/dist/components/checkbox/Checkbox.js.map +1 -1
  42. package/dist/components/chip/Chip.cjs +1 -1
  43. package/dist/components/chip/Chip.cjs.map +1 -1
  44. package/dist/components/chip/Chip.js +67 -47
  45. package/dist/components/chip/Chip.js.map +1 -1
  46. package/dist/components/combobox/Combobox.cjs +1 -1
  47. package/dist/components/combobox/Combobox.cjs.map +1 -1
  48. package/dist/components/combobox/Combobox.js +123 -108
  49. package/dist/components/combobox/Combobox.js.map +1 -1
  50. package/dist/components/commandpalette/CommandPalette.cjs +1 -1
  51. package/dist/components/commandpalette/CommandPalette.cjs.map +1 -1
  52. package/dist/components/commandpalette/CommandPalette.js +96 -73
  53. package/dist/components/commandpalette/CommandPalette.js.map +1 -1
  54. package/dist/components/contextmenu/ContextMenu.cjs +1 -1
  55. package/dist/components/contextmenu/ContextMenu.cjs.map +1 -1
  56. package/dist/components/contextmenu/ContextMenu.js +79 -58
  57. package/dist/components/contextmenu/ContextMenu.js.map +1 -1
  58. package/dist/components/datagrid/DataGrid.cjs +1 -1
  59. package/dist/components/datagrid/DataGrid.cjs.map +1 -1
  60. package/dist/components/datagrid/DataGrid.js +184 -202
  61. package/dist/components/datagrid/DataGrid.js.map +1 -1
  62. package/dist/components/datepicker/DatePicker.cjs +1 -1
  63. package/dist/components/datepicker/DatePicker.cjs.map +1 -1
  64. package/dist/components/datepicker/DatePicker.js +197 -164
  65. package/dist/components/datepicker/DatePicker.js.map +1 -1
  66. package/dist/components/daterangepicker/DateRangePicker.cjs +1 -1
  67. package/dist/components/daterangepicker/DateRangePicker.cjs.map +1 -1
  68. package/dist/components/daterangepicker/DateRangePicker.js +254 -213
  69. package/dist/components/daterangepicker/DateRangePicker.js.map +1 -1
  70. package/dist/components/dialog/DialogProvider.cjs +2 -0
  71. package/dist/components/dialog/DialogProvider.cjs.map +1 -0
  72. package/dist/components/dialog/DialogProvider.js +71 -0
  73. package/dist/components/dialog/DialogProvider.js.map +1 -0
  74. package/dist/components/dialog/dialogStore.cjs +2 -0
  75. package/dist/components/dialog/dialogStore.cjs.map +1 -0
  76. package/dist/components/dialog/dialogStore.js +60 -0
  77. package/dist/components/dialog/dialogStore.js.map +1 -0
  78. package/dist/components/drawer/Drawer.cjs +1 -1
  79. package/dist/components/drawer/Drawer.cjs.map +1 -1
  80. package/dist/components/drawer/Drawer.js +69 -47
  81. package/dist/components/drawer/Drawer.js.map +1 -1
  82. package/dist/components/dropdown/Dropdown.cjs +1 -1
  83. package/dist/components/dropdown/Dropdown.cjs.map +1 -1
  84. package/dist/components/dropdown/Dropdown.js +134 -108
  85. package/dist/components/dropdown/Dropdown.js.map +1 -1
  86. package/dist/components/fileuploader/FileUploader.cjs +1 -1
  87. package/dist/components/fileuploader/FileUploader.cjs.map +1 -1
  88. package/dist/components/fileuploader/FileUploader.js +96 -61
  89. package/dist/components/fileuploader/FileUploader.js.map +1 -1
  90. package/dist/components/hovercard/HoverCard.cjs +1 -1
  91. package/dist/components/hovercard/HoverCard.cjs.map +1 -1
  92. package/dist/components/hovercard/HoverCard.js +124 -69
  93. package/dist/components/hovercard/HoverCard.js.map +1 -1
  94. package/dist/components/input/Input.cjs +1 -1
  95. package/dist/components/input/Input.cjs.map +1 -1
  96. package/dist/components/input/Input.js +62 -37
  97. package/dist/components/input/Input.js.map +1 -1
  98. package/dist/components/layout/Container.cjs +1 -1
  99. package/dist/components/layout/Container.cjs.map +1 -1
  100. package/dist/components/layout/Container.js +21 -30
  101. package/dist/components/layout/Container.js.map +1 -1
  102. package/dist/components/layout/Flex.cjs +1 -1
  103. package/dist/components/layout/Flex.cjs.map +1 -1
  104. package/dist/components/layout/Flex.js +36 -19
  105. package/dist/components/layout/Flex.js.map +1 -1
  106. package/dist/components/layout/Grid.cjs +1 -1
  107. package/dist/components/layout/Grid.cjs.map +1 -1
  108. package/dist/components/layout/Grid.js +30 -18
  109. package/dist/components/layout/Grid.js.map +1 -1
  110. package/dist/components/link/Link.cjs +2 -0
  111. package/dist/components/link/Link.cjs.map +1 -0
  112. package/dist/components/link/Link.js +41 -0
  113. package/dist/components/link/Link.js.map +1 -0
  114. package/dist/components/megamenu/MegaMenu.cjs +1 -1
  115. package/dist/components/megamenu/MegaMenu.cjs.map +1 -1
  116. package/dist/components/megamenu/MegaMenu.js +107 -38
  117. package/dist/components/megamenu/MegaMenu.js.map +1 -1
  118. package/dist/components/modal/Modal.cjs +1 -1
  119. package/dist/components/modal/Modal.cjs.map +1 -1
  120. package/dist/components/modal/Modal.js +91 -83
  121. package/dist/components/modal/Modal.js.map +1 -1
  122. package/dist/components/multiselect/MultiSelect.cjs +2 -0
  123. package/dist/components/multiselect/MultiSelect.cjs.map +1 -0
  124. package/dist/components/multiselect/MultiSelect.js +176 -0
  125. package/dist/components/multiselect/MultiSelect.js.map +1 -0
  126. package/dist/components/nuiprovider/NUIProvider.cjs +2 -0
  127. package/dist/components/nuiprovider/NUIProvider.cjs.map +1 -0
  128. package/dist/components/nuiprovider/NUIProvider.js +36 -0
  129. package/dist/components/nuiprovider/NUIProvider.js.map +1 -0
  130. package/dist/components/pagination/Pagination.cjs +1 -1
  131. package/dist/components/pagination/Pagination.cjs.map +1 -1
  132. package/dist/components/pagination/Pagination.js +74 -41
  133. package/dist/components/pagination/Pagination.js.map +1 -1
  134. package/dist/components/popover/Popover.cjs +1 -1
  135. package/dist/components/popover/Popover.cjs.map +1 -1
  136. package/dist/components/popover/Popover.js +99 -100
  137. package/dist/components/popover/Popover.js.map +1 -1
  138. package/dist/components/progress/Progress.cjs +1 -1
  139. package/dist/components/progress/Progress.cjs.map +1 -1
  140. package/dist/components/progress/Progress.js +44 -22
  141. package/dist/components/progress/Progress.js.map +1 -1
  142. package/dist/components/radiogroup/RadioGroup.cjs +1 -1
  143. package/dist/components/radiogroup/RadioGroup.cjs.map +1 -1
  144. package/dist/components/radiogroup/RadioGroup.js +69 -74
  145. package/dist/components/radiogroup/RadioGroup.js.map +1 -1
  146. package/dist/components/rating/Rating.cjs +1 -1
  147. package/dist/components/rating/Rating.cjs.map +1 -1
  148. package/dist/components/rating/Rating.js +72 -33
  149. package/dist/components/rating/Rating.js.map +1 -1
  150. package/dist/components/resizable/Resizable.cjs +2 -0
  151. package/dist/components/resizable/Resizable.cjs.map +1 -0
  152. package/dist/components/resizable/Resizable.js +134 -0
  153. package/dist/components/resizable/Resizable.js.map +1 -0
  154. package/dist/components/select/Select.cjs +1 -1
  155. package/dist/components/select/Select.cjs.map +1 -1
  156. package/dist/components/select/Select.js +114 -113
  157. package/dist/components/select/Select.js.map +1 -1
  158. package/dist/components/skeleton/Skeleton.cjs +1 -1
  159. package/dist/components/skeleton/Skeleton.cjs.map +1 -1
  160. package/dist/components/skeleton/Skeleton.js +90 -67
  161. package/dist/components/skeleton/Skeleton.js.map +1 -1
  162. package/dist/components/slider/Slider.cjs +1 -1
  163. package/dist/components/slider/Slider.cjs.map +1 -1
  164. package/dist/components/slider/Slider.js +85 -82
  165. package/dist/components/slider/Slider.js.map +1 -1
  166. package/dist/components/spinner/Spinner.cjs +1 -1
  167. package/dist/components/spinner/Spinner.cjs.map +1 -1
  168. package/dist/components/spinner/Spinner.js +60 -17
  169. package/dist/components/spinner/Spinner.js.map +1 -1
  170. package/dist/components/stepper/Stepper.cjs +1 -5
  171. package/dist/components/stepper/Stepper.cjs.map +1 -1
  172. package/dist/components/stepper/Stepper.js +65 -39
  173. package/dist/components/stepper/Stepper.js.map +1 -1
  174. package/dist/components/switch/Switch.cjs +1 -1
  175. package/dist/components/switch/Switch.cjs.map +1 -1
  176. package/dist/components/switch/Switch.js +89 -62
  177. package/dist/components/switch/Switch.js.map +1 -1
  178. package/dist/components/table/Table.cjs +1 -1
  179. package/dist/components/table/Table.cjs.map +1 -1
  180. package/dist/components/table/Table.js +62 -35
  181. package/dist/components/table/Table.js.map +1 -1
  182. package/dist/components/tabs/Tabs.cjs +1 -1
  183. package/dist/components/tabs/Tabs.cjs.map +1 -1
  184. package/dist/components/tabs/Tabs.js +110 -50
  185. package/dist/components/tabs/Tabs.js.map +1 -1
  186. package/dist/components/textarea/Textarea.cjs +1 -1
  187. package/dist/components/textarea/Textarea.cjs.map +1 -1
  188. package/dist/components/textarea/Textarea.js +63 -58
  189. package/dist/components/textarea/Textarea.js.map +1 -1
  190. package/dist/components/timepicker/TimePicker.cjs +2 -0
  191. package/dist/components/timepicker/TimePicker.cjs.map +1 -0
  192. package/dist/components/timepicker/TimePicker.js +159 -0
  193. package/dist/components/timepicker/TimePicker.js.map +1 -0
  194. package/dist/components/timerangepicker/TimeRangePicker.cjs +2 -0
  195. package/dist/components/timerangepicker/TimeRangePicker.cjs.map +1 -0
  196. package/dist/components/timerangepicker/TimeRangePicker.js +208 -0
  197. package/dist/components/timerangepicker/TimeRangePicker.js.map +1 -0
  198. package/dist/components/toast/Toast.cjs +1 -1
  199. package/dist/components/toast/Toast.cjs.map +1 -1
  200. package/dist/components/toast/Toast.js +91 -38
  201. package/dist/components/toast/Toast.js.map +1 -1
  202. package/dist/components/tooltip/Tooltip.cjs +1 -1
  203. package/dist/components/tooltip/Tooltip.cjs.map +1 -1
  204. package/dist/components/tooltip/Tooltip.js +72 -56
  205. package/dist/components/tooltip/Tooltip.js.map +1 -1
  206. package/dist/components/treeview/TreeView.cjs +1 -1
  207. package/dist/components/treeview/TreeView.cjs.map +1 -1
  208. package/dist/components/treeview/TreeView.js +120 -90
  209. package/dist/components/treeview/TreeView.js.map +1 -1
  210. package/dist/components/virtuallist/VirtualList.cjs +1 -1
  211. package/dist/components/virtuallist/VirtualList.cjs.map +1 -1
  212. package/dist/components/virtuallist/VirtualList.js +52 -34
  213. package/dist/components/virtuallist/VirtualList.js.map +1 -1
  214. package/dist/index.cjs +1 -1
  215. package/dist/index.css +1 -0
  216. package/dist/index.js +120 -106
  217. package/dist/index.js.map +1 -1
  218. package/dist/package.json +49 -6
  219. package/dist/types/components/accordion/Accordion.d.ts +7 -3
  220. package/dist/types/components/accordion/Accordion.d.ts.map +1 -1
  221. package/dist/types/components/alert/Alert.d.ts +18 -5
  222. package/dist/types/components/alert/Alert.d.ts.map +1 -1
  223. package/dist/types/components/avatar/Avatar.d.ts +12 -8
  224. package/dist/types/components/avatar/Avatar.d.ts.map +1 -1
  225. package/dist/types/components/avatar/AvatarGroup.d.ts +11 -4
  226. package/dist/types/components/avatar/AvatarGroup.d.ts.map +1 -1
  227. package/dist/types/components/badge/Badge.d.ts +19 -11
  228. package/dist/types/components/badge/Badge.d.ts.map +1 -1
  229. package/dist/types/components/badge/BadgeGroup.d.ts +7 -4
  230. package/dist/types/components/badge/BadgeGroup.d.ts.map +1 -1
  231. package/dist/types/components/breadcrumbs/Breadcrumbs.d.ts +14 -6
  232. package/dist/types/components/breadcrumbs/Breadcrumbs.d.ts.map +1 -1
  233. package/dist/types/components/button/Button.d.ts +25 -10
  234. package/dist/types/components/button/Button.d.ts.map +1 -1
  235. package/dist/types/components/card/Card.d.ts +12 -21
  236. package/dist/types/components/card/Card.d.ts.map +1 -1
  237. package/dist/types/components/checkbox/Checkbox.d.ts +12 -7
  238. package/dist/types/components/checkbox/Checkbox.d.ts.map +1 -1
  239. package/dist/types/components/chip/Chip.d.ts +14 -11
  240. package/dist/types/components/chip/Chip.d.ts.map +1 -1
  241. package/dist/types/components/combobox/Combobox.d.ts +15 -4
  242. package/dist/types/components/combobox/Combobox.d.ts.map +1 -1
  243. package/dist/types/components/commandpalette/CommandPalette.d.ts +12 -3
  244. package/dist/types/components/commandpalette/CommandPalette.d.ts.map +1 -1
  245. package/dist/types/components/contextmenu/ContextMenu.d.ts +14 -6
  246. package/dist/types/components/contextmenu/ContextMenu.d.ts.map +1 -1
  247. package/dist/types/components/datagrid/DataGrid.d.ts +16 -4
  248. package/dist/types/components/datagrid/DataGrid.d.ts.map +1 -1
  249. package/dist/types/components/datepicker/DatePicker.d.ts +13 -1
  250. package/dist/types/components/datepicker/DatePicker.d.ts.map +1 -1
  251. package/dist/types/components/daterangepicker/DateRangePicker.d.ts +3 -1
  252. package/dist/types/components/daterangepicker/DateRangePicker.d.ts.map +1 -1
  253. package/dist/types/components/dialog/DialogProvider.d.ts +2 -0
  254. package/dist/types/components/dialog/DialogProvider.d.ts.map +1 -0
  255. package/dist/types/components/dialog/dialogStore.d.ts +42 -0
  256. package/dist/types/components/dialog/dialogStore.d.ts.map +1 -0
  257. package/dist/types/components/drawer/Drawer.d.ts +18 -4
  258. package/dist/types/components/drawer/Drawer.d.ts.map +1 -1
  259. package/dist/types/components/dropdown/Dropdown.d.ts +21 -16
  260. package/dist/types/components/dropdown/Dropdown.d.ts.map +1 -1
  261. package/dist/types/components/fileuploader/FileUploader.d.ts +22 -3
  262. package/dist/types/components/fileuploader/FileUploader.d.ts.map +1 -1
  263. package/dist/types/components/hovercard/HoverCard.d.ts +45 -5
  264. package/dist/types/components/hovercard/HoverCard.d.ts.map +1 -1
  265. package/dist/types/components/input/Input.d.ts +20 -10
  266. package/dist/types/components/input/Input.d.ts.map +1 -1
  267. package/dist/types/components/layout/Container.d.ts +8 -4
  268. package/dist/types/components/layout/Container.d.ts.map +1 -1
  269. package/dist/types/components/layout/Flex.d.ts +27 -10
  270. package/dist/types/components/layout/Flex.d.ts.map +1 -1
  271. package/dist/types/components/layout/Grid.d.ts +11 -5
  272. package/dist/types/components/layout/Grid.d.ts.map +1 -1
  273. package/dist/types/components/link/Link.d.ts +22 -0
  274. package/dist/types/components/link/Link.d.ts.map +1 -0
  275. package/dist/types/components/megamenu/MegaMenu.d.ts +8 -11
  276. package/dist/types/components/megamenu/MegaMenu.d.ts.map +1 -1
  277. package/dist/types/components/modal/Modal.d.ts +8 -7
  278. package/dist/types/components/modal/Modal.d.ts.map +1 -1
  279. package/dist/types/components/multiselect/MultiSelect.d.ts +33 -0
  280. package/dist/types/components/multiselect/MultiSelect.d.ts.map +1 -0
  281. package/dist/types/components/nuiprovider/NUIProvider.d.ts +29 -0
  282. package/dist/types/components/nuiprovider/NUIProvider.d.ts.map +1 -0
  283. package/dist/types/components/pagination/Pagination.d.ts +17 -3
  284. package/dist/types/components/pagination/Pagination.d.ts.map +1 -1
  285. package/dist/types/components/popover/Popover.d.ts +54 -16
  286. package/dist/types/components/popover/Popover.d.ts.map +1 -1
  287. package/dist/types/components/progress/Progress.d.ts +17 -7
  288. package/dist/types/components/progress/Progress.d.ts.map +1 -1
  289. package/dist/types/components/radiogroup/RadioGroup.d.ts +15 -10
  290. package/dist/types/components/radiogroup/RadioGroup.d.ts.map +1 -1
  291. package/dist/types/components/rating/Rating.d.ts +24 -10
  292. package/dist/types/components/rating/Rating.d.ts.map +1 -1
  293. package/dist/types/components/resizable/Resizable.d.ts +24 -0
  294. package/dist/types/components/resizable/Resizable.d.ts.map +1 -0
  295. package/dist/types/components/select/Select.d.ts +17 -8
  296. package/dist/types/components/select/Select.d.ts.map +1 -1
  297. package/dist/types/components/skeleton/Skeleton.d.ts +37 -36
  298. package/dist/types/components/skeleton/Skeleton.d.ts.map +1 -1
  299. package/dist/types/components/slider/Slider.d.ts +15 -4
  300. package/dist/types/components/slider/Slider.d.ts.map +1 -1
  301. package/dist/types/components/spinner/Spinner.d.ts +14 -4
  302. package/dist/types/components/spinner/Spinner.d.ts.map +1 -1
  303. package/dist/types/components/stepper/Stepper.d.ts +17 -3
  304. package/dist/types/components/stepper/Stepper.d.ts.map +1 -1
  305. package/dist/types/components/switch/Switch.d.ts +20 -5
  306. package/dist/types/components/switch/Switch.d.ts.map +1 -1
  307. package/dist/types/components/table/Table.d.ts +24 -4
  308. package/dist/types/components/table/Table.d.ts.map +1 -1
  309. package/dist/types/components/tabs/Tabs.d.ts +25 -12
  310. package/dist/types/components/tabs/Tabs.d.ts.map +1 -1
  311. package/dist/types/components/textarea/Textarea.d.ts +8 -5
  312. package/dist/types/components/textarea/Textarea.d.ts.map +1 -1
  313. package/dist/types/components/timepicker/TimePicker.d.ts +26 -0
  314. package/dist/types/components/timepicker/TimePicker.d.ts.map +1 -0
  315. package/dist/types/components/timerangepicker/TimeRangePicker.d.ts +32 -0
  316. package/dist/types/components/timerangepicker/TimeRangePicker.d.ts.map +1 -0
  317. package/dist/types/components/toast/Toast.d.ts +23 -7
  318. package/dist/types/components/toast/Toast.d.ts.map +1 -1
  319. package/dist/types/components/tooltip/Tooltip.d.ts +13 -2
  320. package/dist/types/components/tooltip/Tooltip.d.ts.map +1 -1
  321. package/dist/types/components/treeview/TreeView.d.ts +20 -6
  322. package/dist/types/components/treeview/TreeView.d.ts.map +1 -1
  323. package/dist/types/components/virtuallist/VirtualList.d.ts +12 -16
  324. package/dist/types/components/virtuallist/VirtualList.d.ts.map +1 -1
  325. package/dist/types/index.d.ts +8 -4
  326. package/dist/types/index.d.ts.map +1 -1
  327. package/dist/types/utils/cn/cn.d.ts +19 -0
  328. package/dist/types/utils/cn/cn.d.ts.map +1 -0
  329. package/dist/types/utils/generateid/generateId.d.ts +7 -0
  330. package/dist/types/utils/generateid/generateId.d.ts.map +1 -1
  331. package/dist/types/utils/index.d.ts +2 -0
  332. package/dist/types/utils/index.d.ts.map +1 -1
  333. package/dist/types/utils/inertmanager/inertManager.d.ts +13 -0
  334. package/dist/types/utils/inertmanager/inertManager.d.ts.map +1 -1
  335. package/dist/types/utils/keyboardnav/keyboardNav.d.ts +17 -6
  336. package/dist/types/utils/keyboardnav/keyboardNav.d.ts.map +1 -1
  337. package/dist/types/utils/onclickoutside/onClickOutside.d.ts +9 -1
  338. package/dist/types/utils/onclickoutside/onClickOutside.d.ts.map +1 -1
  339. package/dist/types/utils/portal/portal.d.ts +14 -1
  340. package/dist/types/utils/portal/portal.d.ts.map +1 -1
  341. package/dist/types/utils/restorefocus/restoreFocus.d.ts +8 -4
  342. package/dist/types/utils/restorefocus/restoreFocus.d.ts.map +1 -1
  343. package/dist/types/utils/scrolllock/scrollLock.d.ts +10 -2
  344. package/dist/types/utils/scrolllock/scrollLock.d.ts.map +1 -1
  345. package/dist/types/utils/slot/slot.d.ts +12 -0
  346. package/dist/types/utils/slot/slot.d.ts.map +1 -0
  347. package/dist/types/utils/trapfocus/trapFocus.d.ts +6 -2
  348. package/dist/types/utils/trapfocus/trapFocus.d.ts.map +1 -1
  349. package/dist/utils/cn/cn.cjs +2 -0
  350. package/dist/utils/cn/cn.cjs.map +1 -0
  351. package/dist/utils/cn/cn.js +21 -0
  352. package/dist/utils/cn/cn.js.map +1 -0
  353. package/dist/utils/inertmanager/inertManager.cjs.map +1 -1
  354. package/dist/utils/inertmanager/inertManager.js.map +1 -1
  355. package/dist/utils/onclickoutside/onClickOutside.cjs +1 -1
  356. package/dist/utils/onclickoutside/onClickOutside.cjs.map +1 -1
  357. package/dist/utils/onclickoutside/onClickOutside.js +10 -6
  358. package/dist/utils/onclickoutside/onClickOutside.js.map +1 -1
  359. package/dist/utils/portal/portal.cjs.map +1 -1
  360. package/dist/utils/portal/portal.js.map +1 -1
  361. package/dist/utils/restorefocus/restoreFocus.cjs.map +1 -1
  362. package/dist/utils/restorefocus/restoreFocus.js.map +1 -1
  363. package/dist/utils/scrolllock/scrollLock.cjs.map +1 -1
  364. package/dist/utils/scrolllock/scrollLock.js +7 -0
  365. package/dist/utils/scrolllock/scrollLock.js.map +1 -1
  366. package/dist/utils/slot/slot.cjs +2 -0
  367. package/dist/utils/slot/slot.cjs.map +1 -0
  368. package/dist/utils/slot/slot.js +57 -0
  369. package/dist/utils/slot/slot.js.map +1 -0
  370. package/dist/utils/trapfocus/trapFocus.cjs.map +1 -1
  371. package/dist/utils/trapfocus/trapFocus.js.map +1 -1
  372. package/package.json +49 -6
  373. package/dist/components/layout/HStack.cjs +0 -2
  374. package/dist/components/layout/HStack.cjs.map +0 -1
  375. package/dist/components/layout/HStack.js +0 -9
  376. package/dist/components/layout/HStack.js.map +0 -1
  377. package/dist/components/layout/Stack.cjs +0 -2
  378. package/dist/components/layout/Stack.cjs.map +0 -1
  379. package/dist/components/layout/Stack.js +0 -9
  380. package/dist/components/layout/Stack.js.map +0 -1
  381. package/dist/styles/nui.css +0 -1
  382. package/dist/theme/NUIProvider.cjs +0 -2
  383. package/dist/theme/NUIProvider.cjs.map +0 -1
  384. package/dist/theme/NUIProvider.js +0 -34
  385. package/dist/theme/NUIProvider.js.map +0 -1
  386. package/dist/theme/useTheme.cjs +0 -2
  387. package/dist/theme/useTheme.cjs.map +0 -1
  388. package/dist/theme/useTheme.js +0 -9
  389. package/dist/theme/useTheme.js.map +0 -1
  390. package/dist/types/components/layout/HStack.d.ts +0 -8
  391. package/dist/types/components/layout/HStack.d.ts.map +0 -1
  392. package/dist/types/components/layout/Stack.d.ts +0 -8
  393. package/dist/types/components/layout/Stack.d.ts.map +0 -1
  394. package/dist/types/theme/NUIProvider.d.ts +0 -14
  395. package/dist/types/theme/NUIProvider.d.ts.map +0 -1
  396. package/dist/types/theme/useTheme.d.ts +0 -11
  397. package/dist/types/theme/useTheme.d.ts.map +0 -1
  398. package/dist/utils/generateid/generateId.cjs +0 -2
  399. package/dist/utils/generateid/generateId.cjs.map +0 -1
  400. package/dist/utils/generateid/generateId.js +0 -7
  401. package/dist/utils/generateid/generateId.js.map +0 -1
  402. package/dist/utils/keyboardnav/keyboardNav.cjs +0 -2
  403. package/dist/utils/keyboardnav/keyboardNav.cjs.map +0 -1
  404. package/dist/utils/keyboardnav/keyboardNav.js +0 -10
  405. package/dist/utils/keyboardnav/keyboardNav.js.map +0 -1
package/README.md CHANGED
@@ -1,48 +1,61 @@
1
- <div align="center">
2
-
3
- # NUI
4
-
5
- **A robust, accessible, and lightweight React component library designed for modern web applications.**
6
-
7
- [![npm](https://img.shields.io/npm/v/@nofinite/nui?style=flat-square&color=3b82f6)](https://www.npmjs.com/package/@nofinite/nui)
8
- [![License](https://img.shields.io/npm/l/@nofinite/nui?style=flat-square&color=3b82f6)](LICENSE)
9
- [![Bundle Size](https://img.shields.io/bundlephobia/minzip/@nofinite/nui?style=flat-square&color=3b82f6)](https://bundlephobia.com/package/@nofinite/nui)
10
- [![TypeScript](https://img.shields.io/badge/TypeScript-Yes-3b82f6?style=flat-square)](https://www.typescriptlang.org/)
11
-
12
- </div>
13
-
14
- ---
15
-
16
- ## Overview
17
-
18
- NUI provides a set of accessible, production-ready components to help you build modern web applications faster. It handles the complex details—like focus management and accessibility—so you can focus on building your product.
19
-
20
- * **Accessible:** WAI-ARIA compliant out of the box.
21
- * **Type-Safe:** Built with TypeScript for a great developer experience.
22
- * **Lightweight:** Modular design with zero heavy dependencies.
23
-
24
- ---
25
-
26
- ## Installation
27
-
28
- ```bash
29
- # pnpm
30
- pnpm add @nofinite/nui
31
-
32
- # npm
33
- npm install @nofinite/nui
34
-
35
- # yarn
36
- yarn add @nofinite/nui
37
- ```
38
-
39
- ## Documentation
40
-
41
- For full setup guides, component examples, and API references, [read documentation](https://opensource.nofinite.com/docs/nui).
42
-
43
- ## License
44
-
45
- This project is licensed under the
46
- [Apache License, Version 2.0](./LICENSE).
47
-
48
- Feel free to use, modify, and share this project in your applications, products, and services. Attribution is welcome and appreciated, but never required.
1
+ <div align="center">
2
+
3
+ # NUI
4
+
5
+ **A robust, accessible, and lightweight React component library designed for modern web applications.**
6
+
7
+ <p align="center">
8
+ <a href="https://www.typescriptlang.org/">
9
+ <img alt="TypeScript" src="https://img.shields.io/badge/TypeScript-Strict-3178C6?style=for-the-badge&logo=typescript&logoColor=white">
10
+ </a>
11
+
12
+ <a href="https://opensource.nofinite.com/docs/nui">
13
+ <img alt="Documentation" src="https://img.shields.io/badge/Docs-OpenSource-%23000133?style=for-the-badge&labelColor=slategray">
14
+ </a>
15
+
16
+ <a href="./LICENSE">
17
+ <img alt="License" src="https://img.shields.io/badge/License-Apache%202.0-%23000133?style=for-the-badge&labelColor=slategray">
18
+ </a>
19
+
20
+ <a href="https://www.npmjs.com/package/@nofinite/nui">
21
+ <img alt="NPM Version" src="https://img.shields.io/npm/v/%40nofinite%2Fnui?style=for-the-badge&logo=npm&logoColor=white&labelColor=slategray&color=%23000133">
22
+ </a>
23
+ </p>
24
+
25
+ </div>
26
+
27
+ ---
28
+
29
+ ## Overview
30
+
31
+ NUI provides a set of accessible, production-ready components to help you build modern web applications faster. It handles the complex details—like focus management and accessibility—so you can focus on building your product.
32
+
33
+ * **Accessible:** WAI-ARIA compliant out of the box.
34
+ * **Type-Safe:** Built with TypeScript for a great developer experience.
35
+ * **Lightweight:** Modular design with zero heavy dependencies.
36
+
37
+ ---
38
+
39
+ ## Installation
40
+
41
+ ```bash
42
+ # pnpm
43
+ pnpm add @nofinite/nui
44
+
45
+ # npm
46
+ npm install @nofinite/nui
47
+
48
+ # yarn
49
+ yarn add @nofinite/nui
50
+ ```
51
+
52
+ ## Documentation
53
+
54
+ For full setup guides, component examples, and API references, [read documentation](https://opensource.nofinite.com/docs/nui).
55
+
56
+ ## License
57
+
58
+ This project is licensed under the
59
+ [Apache License, Version 2.0](./LICENSE).
60
+
61
+ Feel free to use, modify, and share this project in your applications, products, and services. Attribution is welcome and appreciated, but never required.
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("react/jsx-runtime"),p=require("react");;/* empty css */function x({items:s,defaultOpenId:i,multiple:d=!1,className:l=""}){const[t,u]=p.useState(i?[i]:[]),c=e=>t.includes(e),a=e=>{u(n=>d?c(e)?n.filter(r=>r!==e):[...n,e]:c(e)?[]:[e])};return o.jsx("div",{className:`ui-accordion ${l}`,children:s.map(e=>{const n=c(e.id);return o.jsxs("div",{className:"ui-accordion-item",children:[o.jsxs("button",{className:"ui-accordion-header","aria-expanded":n,"aria-controls":`panel-${e.id}`,id:`accordion-${e.id}`,onClick:()=>a(e.id),onKeyDown:r=>{(r.key==="Enter"||r.key===" ")&&(r.preventDefault(),a(e.id))},children:[e.title,o.jsx("span",{children:n?"":"+"})]}),o.jsx("div",{id:`panel-${e.id}`,role:"region","aria-labelledby":`accordion-${e.id}`,className:`ui-accordion-panel ${n?"ui-accordion-panel--open":""}`,children:n&&o.jsx("div",{style:{padding:"8px 0",color:"var(--color-text)"},children:e.content})})]},e.id)})})}exports.Accordion=x;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),h=require("react");;/* empty css */const p=require("../../utils/cn/cn.cjs");function _({items:r,defaultOpenId:i,multiple:s=!1,className:a=""}){const[d,t]=h.useState(i?[i]:[]),c=n=>d.includes(n),l=n=>{t(o=>s?c(n)?o.filter(u=>u!==n):[...o,n]:c(n)?[]:[n])};return e.jsx("div",{className:p.cn("nui-accordion",a),children:r.map(n=>{const o=c(n.id);return e.jsxs("div",{className:"nui-accordion__item","data-state":o?"open":"closed",children:[e.jsxs("button",{className:"nui-accordion__header","aria-expanded":o,"aria-controls":`panel-${n.id}`,id:`accordion-${n.id}`,onClick:()=>l(n.id),children:[e.jsx("span",{className:"nui-accordion__title",children:n.title}),e.jsx("svg",{className:"nui-accordion__icon",width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:e.jsx("path",{d:"m6 9 6 6 6-6"})})]}),e.jsx("div",{id:`panel-${n.id}`,role:"region","aria-labelledby":`accordion-${n.id}`,className:"nui-accordion__panel",children:e.jsx("div",{className:"nui-accordion__content",children:n.content})})]},n.id)})})}exports.Accordion=_;
2
2
  //# sourceMappingURL=Accordion.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Accordion.cjs","sources":["../../../src/components/accordion/Accordion.tsx"],"sourcesContent":["/**\r\n * Accordion.tsx\r\n * ---------------\r\n * Fully accessible WAI-ARIA accordion.\r\n * Single-component API.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\n\r\nimport './Accordion.css';\r\n\r\nexport interface AccordionItem {\r\n id: string;\r\n title: string;\r\n content: React.ReactNode;\r\n}\r\n\r\ninterface AccordionProps {\r\n /** List of accordion sections */\r\n items: AccordionItem[];\r\n\r\n /** Default opened item ID (optional) */\r\n defaultOpenId?: string;\r\n\r\n /** Allow multiple open panels? Default: false */\r\n multiple?: boolean;\r\n\r\n className?: string;\r\n}\r\n\r\nexport function Accordion({\r\n items,\r\n defaultOpenId,\r\n multiple = false,\r\n className = '',\r\n}: AccordionProps) {\r\n const [openIds, setOpenIds] = useState<string[]>(\r\n defaultOpenId ? [defaultOpenId] : []\r\n );\r\n\r\n const isOpen = (id: string) => openIds.includes(id);\r\n\r\n const toggle = (id: string) => {\r\n setOpenIds((prev) => {\r\n if (multiple) {\r\n return isOpen(id) ? prev.filter((x) => x !== id) : [...prev, id];\r\n } else {\r\n return isOpen(id) ? [] : [id];\r\n }\r\n });\r\n };\r\n\r\n return (\r\n <div className={`ui-accordion ${className}`}>\r\n {items.map((item) => {\r\n const open = isOpen(item.id);\r\n\r\n return (\r\n <div key={item.id} className=\"ui-accordion-item\">\r\n {/* HEADER BUTTON */}\r\n <button\r\n className=\"ui-accordion-header\"\r\n aria-expanded={open}\r\n aria-controls={`panel-${item.id}`}\r\n id={`accordion-${item.id}`}\r\n onClick={() => toggle(item.id)}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n toggle(item.id);\r\n }\r\n }}\r\n >\r\n {item.title}\r\n <span>{open ? '–' : '+'}</span>\r\n </button>\r\n\r\n {/* PANEL */}\r\n <div\r\n id={`panel-${item.id}`}\r\n role=\"region\"\r\n aria-labelledby={`accordion-${item.id}`}\r\n className={`ui-accordion-panel ${\r\n open ? 'ui-accordion-panel--open' : ''\r\n }`}\r\n >\r\n {open && (\r\n <div style={{ padding: '8px 0', color: 'var(--color-text)' }}>\r\n {item.content}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n}\r\n"],"names":["Accordion","items","defaultOpenId","multiple","className","openIds","setOpenIds","useState","isOpen","id","toggle","prev","x","jsx","item","open","jsxs","e"],"mappings":"uKA8BO,SAASA,EAAU,CACxB,MAAAC,EACA,cAAAC,EACA,SAAAC,EAAW,GACX,UAAAC,EAAY,EACd,EAAmB,CACjB,KAAM,CAACC,EAASC,CAAU,EAAIC,EAAAA,SAC5BL,EAAgB,CAACA,CAAa,EAAI,CAAA,CAAC,EAG/BM,EAAUC,GAAeJ,EAAQ,SAASI,CAAE,EAE5CC,EAAUD,GAAe,CAC7BH,EAAYK,GACNR,EACKK,EAAOC,CAAE,EAAIE,EAAK,OAAQC,GAAMA,IAAMH,CAAE,EAAI,CAAC,GAAGE,EAAMF,CAAE,EAExDD,EAAOC,CAAE,EAAI,CAAA,EAAK,CAACA,CAAE,CAE/B,CACH,EAEA,OACEI,MAAC,OAAI,UAAW,gBAAgBT,CAAS,GACtC,SAAAH,EAAM,IAAKa,GAAS,CACnB,MAAMC,EAAOP,EAAOM,EAAK,EAAE,EAE3B,OACEE,EAAAA,KAAC,MAAA,CAAkB,UAAU,oBAE3B,SAAA,CAAAA,EAAAA,KAAC,SAAA,CACC,UAAU,sBACV,gBAAeD,EACf,gBAAe,SAASD,EAAK,EAAE,GAC/B,GAAI,aAAaA,EAAK,EAAE,GACxB,QAAS,IAAMJ,EAAOI,EAAK,EAAE,EAC7B,UAAYG,GAAM,EACZA,EAAE,MAAQ,SAAWA,EAAE,MAAQ,OACjCA,EAAE,eAAA,EACFP,EAAOI,EAAK,EAAE,EAElB,EAEC,SAAA,CAAAA,EAAK,MACND,EAAAA,IAAC,OAAA,CAAM,SAAAE,EAAO,IAAM,GAAA,CAAI,CAAA,CAAA,CAAA,EAI1BF,EAAAA,IAAC,MAAA,CACC,GAAI,SAASC,EAAK,EAAE,GACpB,KAAK,SACL,kBAAiB,aAAaA,EAAK,EAAE,GACrC,UAAW,sBACTC,EAAO,2BAA6B,EACtC,GAEC,SAAAA,GACCF,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,QAAS,QAAS,MAAO,mBAAA,EACpC,SAAAC,EAAK,OAAA,CACR,CAAA,CAAA,CAEJ,CAAA,EAjCQA,EAAK,EAkCf,CAEJ,CAAC,CAAA,CACH,CAEJ"}
1
+ {"version":3,"file":"Accordion.cjs","sources":["../../../src/components/accordion/Accordion.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useState } from 'react';\nimport { cn } from '../../utils';\nimport './Accordion.css';\n\nexport interface AccordionItem {\n id: string;\n title: string;\n content: React.ReactNode;\n}\n\ninterface AccordionProps {\n items: AccordionItem[];\n /** ID of the item that should be open by default */\n defaultOpenId?: string;\n /** If true, allows multiple accordion panels to remain open simultaneously */\n multiple?: boolean;\n className?: string;\n}\n\n/**\n * Accordion Component\n * * A progressively disclosed content container.\n * Implements the WAI-ARIA Accordion pattern for screen reader and keyboard accessibility.\n */\nexport function Accordion({\n items,\n defaultOpenId,\n multiple = false,\n className = '',\n}: AccordionProps) {\n // Initialize state. We use an array even for single-select to maintain a consistent state signature.\n const [openIds, setOpenIds] = useState<string[]>(\n defaultOpenId ? [defaultOpenId] : []\n );\n\n const isOpen = (id: string) => openIds.includes(id);\n\n const toggle = (id: string) => {\n setOpenIds((prev) => {\n if (multiple) {\n // Toggle the specific ID in/out of the array for multiple mode\n return isOpen(id) ? prev.filter((x) => x !== id) : [...prev, id];\n } else {\n // Replace the array entirely for single mode\n return isOpen(id) ? [] : [id];\n }\n });\n };\n\n return (\n <div className={cn(\"nui-accordion\", className)}>\n {items.map((item) => {\n const open = isOpen(item.id);\n\n return (\n <div \n key={item.id} \n className=\"nui-accordion__item\"\n // Expose state to the DOM for CSS attribute selectors (e.g., [data-state=\"open\"])\n // This enables CSS-only animations and styling without JS overhead.\n data-state={open ? 'open' : 'closed'}\n >\n {/* HEADER\n Native <button> is used to ensure out-of-the-box keyboard support.\n Browsers natively translate 'Enter' and 'Space' keydowns on buttons to 'click' events,\n making custom keyboard listeners redundant.\n */}\n <button\n className=\"nui-accordion__header\"\n aria-expanded={open}\n aria-controls={`panel-${item.id}`}\n id={`accordion-${item.id}`}\n onClick={() => toggle(item.id)}\n >\n <span className=\"nui-accordion__title\">{item.title}</span>\n {/* Chevron Icon: aria-hidden=\"true\" prevents screen readers from announcing it */}\n <svg \n className=\"nui-accordion__icon\" \n width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" \n fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\"/>\n </svg>\n </button>\n\n {/* PANEL\n Rendered conditionally via CSS (not JS) to allow for enter/exit CSS grid animations.\n aria-labelledby binds the panel context directly to the triggering button.\n */}\n <div\n id={`panel-${item.id}`}\n role=\"region\"\n aria-labelledby={`accordion-${item.id}`}\n className=\"nui-accordion__panel\"\n >\n <div className=\"nui-accordion__content\">\n {item.content}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\n}"],"names":["Accordion","items","defaultOpenId","multiple","className","openIds","setOpenIds","useState","isOpen","id","toggle","prev","x","jsx","cn","item","open","jsxs"],"mappings":"gNA0BO,SAASA,EAAU,CACxB,MAAAC,EACA,cAAAC,EACA,SAAAC,EAAW,GACX,UAAAC,EAAY,EACd,EAAmB,CAEjB,KAAM,CAACC,EAASC,CAAU,EAAIC,EAAAA,SAC5BL,EAAgB,CAACA,CAAa,EAAI,CAAA,CAAC,EAG/BM,EAAUC,GAAeJ,EAAQ,SAASI,CAAE,EAE5CC,EAAUD,GAAe,CAC7BH,EAAYK,GACNR,EAEKK,EAAOC,CAAE,EAAIE,EAAK,OAAQC,GAAMA,IAAMH,CAAE,EAAI,CAAC,GAAGE,EAAMF,CAAE,EAGxDD,EAAOC,CAAE,EAAI,CAAA,EAAK,CAACA,CAAE,CAE/B,CACH,EAEA,OACEI,MAAC,MAAA,CAAI,UAAWC,EAAAA,GAAG,gBAAiBV,CAAS,EAC1C,SAAAH,EAAM,IAAKc,GAAS,CACnB,MAAMC,EAAOR,EAAOO,EAAK,EAAE,EAE3B,OACEE,EAAAA,KAAC,MAAA,CAEC,UAAU,sBAGV,aAAYD,EAAO,OAAS,SAO5B,SAAA,CAAAC,EAAAA,KAAC,SAAA,CACC,UAAU,wBACV,gBAAeD,EACf,gBAAe,SAASD,EAAK,EAAE,GAC/B,GAAI,aAAaA,EAAK,EAAE,GACxB,QAAS,IAAML,EAAOK,EAAK,EAAE,EAE7B,SAAA,CAAAF,EAAAA,IAAC,OAAA,CAAK,UAAU,uBAAwB,SAAAE,EAAK,MAAM,EAEnDF,EAAAA,IAAC,MAAA,CACC,UAAU,sBACV,MAAM,KAAK,OAAO,KAAK,QAAQ,YAC/B,KAAK,OAAO,OAAO,eAAe,YAAY,IAAI,cAAc,QAAQ,eAAe,QACvF,cAAY,OAEZ,SAAAA,EAAAA,IAAC,OAAA,CAAK,EAAE,cAAA,CAAc,CAAA,CAAA,CACxB,CAAA,CAAA,EAOFA,EAAAA,IAAC,MAAA,CACC,GAAI,SAASE,EAAK,EAAE,GACpB,KAAK,SACL,kBAAiB,aAAaA,EAAK,EAAE,GACrC,UAAU,uBAEV,SAAAF,EAAAA,IAAC,MAAA,CAAI,UAAU,yBACZ,WAAK,OAAA,CACR,CAAA,CAAA,CACF,CAAA,EA3CKE,EAAK,EAAA,CA8ChB,CAAC,CAAA,CACH,CAEJ"}
@@ -1,51 +1,72 @@
1
- import { jsx as e, jsxs as d } from "react/jsx-runtime";
2
- import { useState as f } from "react";
1
+ import { jsx as o, jsxs as c } from "react/jsx-runtime";
2
+ import { useState as h } from "react";
3
3
  /* empty css */
4
- function v({
5
- items: l,
6
- defaultOpenId: i,
7
- multiple: s = !1,
8
- className: t = ""
4
+ import { cn as _ } from "../../utils/cn/cn.js";
5
+ function k({
6
+ items: a,
7
+ defaultOpenId: r,
8
+ multiple: d = !1,
9
+ className: s = ""
9
10
  }) {
10
- const [p, u] = f(
11
- i ? [i] : []
12
- ), c = (n) => p.includes(n), a = (n) => {
13
- u((o) => s ? c(n) ? o.filter((r) => r !== n) : [...o, n] : c(n) ? [] : [n]);
11
+ const [t, l] = h(
12
+ r ? [r] : []
13
+ ), e = (n) => t.includes(n), u = (n) => {
14
+ l((i) => d ? e(n) ? i.filter((p) => p !== n) : [...i, n] : e(n) ? [] : [n]);
14
15
  };
15
- return /* @__PURE__ */ e("div", { className: `ui-accordion ${t}`, children: l.map((n) => {
16
- const o = c(n.id);
17
- return /* @__PURE__ */ d("div", { className: "ui-accordion-item", children: [
18
- /* @__PURE__ */ d(
19
- "button",
20
- {
21
- className: "ui-accordion-header",
22
- "aria-expanded": o,
23
- "aria-controls": `panel-${n.id}`,
24
- id: `accordion-${n.id}`,
25
- onClick: () => a(n.id),
26
- onKeyDown: (r) => {
27
- (r.key === "Enter" || r.key === " ") && (r.preventDefault(), a(n.id));
28
- },
29
- children: [
30
- n.title,
31
- /* @__PURE__ */ e("span", { children: o ? "–" : "+" })
32
- ]
33
- }
34
- ),
35
- /* @__PURE__ */ e(
36
- "div",
37
- {
38
- id: `panel-${n.id}`,
39
- role: "region",
40
- "aria-labelledby": `accordion-${n.id}`,
41
- className: `ui-accordion-panel ${o ? "ui-accordion-panel--open" : ""}`,
42
- children: o && /* @__PURE__ */ e("div", { style: { padding: "8px 0", color: "var(--color-text)" }, children: n.content })
43
- }
44
- )
45
- ] }, n.id);
16
+ return /* @__PURE__ */ o("div", { className: _("nui-accordion", s), children: a.map((n) => {
17
+ const i = e(n.id);
18
+ return /* @__PURE__ */ c(
19
+ "div",
20
+ {
21
+ className: "nui-accordion__item",
22
+ "data-state": i ? "open" : "closed",
23
+ children: [
24
+ /* @__PURE__ */ c(
25
+ "button",
26
+ {
27
+ className: "nui-accordion__header",
28
+ "aria-expanded": i,
29
+ "aria-controls": `panel-${n.id}`,
30
+ id: `accordion-${n.id}`,
31
+ onClick: () => u(n.id),
32
+ children: [
33
+ /* @__PURE__ */ o("span", { className: "nui-accordion__title", children: n.title }),
34
+ /* @__PURE__ */ o(
35
+ "svg",
36
+ {
37
+ className: "nui-accordion__icon",
38
+ width: "20",
39
+ height: "20",
40
+ viewBox: "0 0 24 24",
41
+ fill: "none",
42
+ stroke: "currentColor",
43
+ strokeWidth: "2",
44
+ strokeLinecap: "round",
45
+ strokeLinejoin: "round",
46
+ "aria-hidden": "true",
47
+ children: /* @__PURE__ */ o("path", { d: "m6 9 6 6 6-6" })
48
+ }
49
+ )
50
+ ]
51
+ }
52
+ ),
53
+ /* @__PURE__ */ o(
54
+ "div",
55
+ {
56
+ id: `panel-${n.id}`,
57
+ role: "region",
58
+ "aria-labelledby": `accordion-${n.id}`,
59
+ className: "nui-accordion__panel",
60
+ children: /* @__PURE__ */ o("div", { className: "nui-accordion__content", children: n.content })
61
+ }
62
+ )
63
+ ]
64
+ },
65
+ n.id
66
+ );
46
67
  }) });
47
68
  }
48
69
  export {
49
- v as Accordion
70
+ k as Accordion
50
71
  };
51
72
  //# sourceMappingURL=Accordion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Accordion.js","sources":["../../../src/components/accordion/Accordion.tsx"],"sourcesContent":["/**\r\n * Accordion.tsx\r\n * ---------------\r\n * Fully accessible WAI-ARIA accordion.\r\n * Single-component API.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\n\r\nimport './Accordion.css';\r\n\r\nexport interface AccordionItem {\r\n id: string;\r\n title: string;\r\n content: React.ReactNode;\r\n}\r\n\r\ninterface AccordionProps {\r\n /** List of accordion sections */\r\n items: AccordionItem[];\r\n\r\n /** Default opened item ID (optional) */\r\n defaultOpenId?: string;\r\n\r\n /** Allow multiple open panels? Default: false */\r\n multiple?: boolean;\r\n\r\n className?: string;\r\n}\r\n\r\nexport function Accordion({\r\n items,\r\n defaultOpenId,\r\n multiple = false,\r\n className = '',\r\n}: AccordionProps) {\r\n const [openIds, setOpenIds] = useState<string[]>(\r\n defaultOpenId ? [defaultOpenId] : []\r\n );\r\n\r\n const isOpen = (id: string) => openIds.includes(id);\r\n\r\n const toggle = (id: string) => {\r\n setOpenIds((prev) => {\r\n if (multiple) {\r\n return isOpen(id) ? prev.filter((x) => x !== id) : [...prev, id];\r\n } else {\r\n return isOpen(id) ? [] : [id];\r\n }\r\n });\r\n };\r\n\r\n return (\r\n <div className={`ui-accordion ${className}`}>\r\n {items.map((item) => {\r\n const open = isOpen(item.id);\r\n\r\n return (\r\n <div key={item.id} className=\"ui-accordion-item\">\r\n {/* HEADER BUTTON */}\r\n <button\r\n className=\"ui-accordion-header\"\r\n aria-expanded={open}\r\n aria-controls={`panel-${item.id}`}\r\n id={`accordion-${item.id}`}\r\n onClick={() => toggle(item.id)}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n toggle(item.id);\r\n }\r\n }}\r\n >\r\n {item.title}\r\n <span>{open ? '–' : '+'}</span>\r\n </button>\r\n\r\n {/* PANEL */}\r\n <div\r\n id={`panel-${item.id}`}\r\n role=\"region\"\r\n aria-labelledby={`accordion-${item.id}`}\r\n className={`ui-accordion-panel ${\r\n open ? 'ui-accordion-panel--open' : ''\r\n }`}\r\n >\r\n {open && (\r\n <div style={{ padding: '8px 0', color: 'var(--color-text)' }}>\r\n {item.content}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n}\r\n"],"names":["Accordion","items","defaultOpenId","multiple","className","openIds","setOpenIds","useState","isOpen","id","toggle","prev","x","jsx","item","open","jsxs","e"],"mappings":";;;AA8BO,SAASA,EAAU;AAAA,EACxB,OAAAC;AAAA,EACA,eAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,WAAAC,IAAY;AACd,GAAmB;AACjB,QAAM,CAACC,GAASC,CAAU,IAAIC;AAAA,IAC5BL,IAAgB,CAACA,CAAa,IAAI,CAAA;AAAA,EAAC,GAG/BM,IAAS,CAACC,MAAeJ,EAAQ,SAASI,CAAE,GAE5CC,IAAS,CAACD,MAAe;AAC7B,IAAAH,EAAW,CAACK,MACNR,IACKK,EAAOC,CAAE,IAAIE,EAAK,OAAO,CAACC,MAAMA,MAAMH,CAAE,IAAI,CAAC,GAAGE,GAAMF,CAAE,IAExDD,EAAOC,CAAE,IAAI,CAAA,IAAK,CAACA,CAAE,CAE/B;AAAA,EACH;AAEA,SACE,gBAAAI,EAAC,SAAI,WAAW,gBAAgBT,CAAS,IACtC,UAAAH,EAAM,IAAI,CAACa,MAAS;AACnB,UAAMC,IAAOP,EAAOM,EAAK,EAAE;AAE3B,WACE,gBAAAE,EAAC,OAAA,EAAkB,WAAU,qBAE3B,UAAA;AAAA,MAAA,gBAAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,iBAAeD;AAAA,UACf,iBAAe,SAASD,EAAK,EAAE;AAAA,UAC/B,IAAI,aAAaA,EAAK,EAAE;AAAA,UACxB,SAAS,MAAMJ,EAAOI,EAAK,EAAE;AAAA,UAC7B,WAAW,CAACG,MAAM;AAChB,aAAIA,EAAE,QAAQ,WAAWA,EAAE,QAAQ,SACjCA,EAAE,eAAA,GACFP,EAAOI,EAAK,EAAE;AAAA,UAElB;AAAA,UAEC,UAAA;AAAA,YAAAA,EAAK;AAAA,YACN,gBAAAD,EAAC,QAAA,EAAM,UAAAE,IAAO,MAAM,IAAA,CAAI;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAI1B,gBAAAF;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,IAAI,SAASC,EAAK,EAAE;AAAA,UACpB,MAAK;AAAA,UACL,mBAAiB,aAAaA,EAAK,EAAE;AAAA,UACrC,WAAW,sBACTC,IAAO,6BAA6B,EACtC;AAAA,UAEC,UAAAA,KACC,gBAAAF,EAAC,OAAA,EAAI,OAAO,EAAE,SAAS,SAAS,OAAO,oBAAA,GACpC,UAAAC,EAAK,QAAA,CACR;AAAA,QAAA;AAAA,MAAA;AAAA,IAEJ,EAAA,GAjCQA,EAAK,EAkCf;AAAA,EAEJ,CAAC,EAAA,CACH;AAEJ;"}
1
+ {"version":3,"file":"Accordion.js","sources":["../../../src/components/accordion/Accordion.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useState } from 'react';\nimport { cn } from '../../utils';\nimport './Accordion.css';\n\nexport interface AccordionItem {\n id: string;\n title: string;\n content: React.ReactNode;\n}\n\ninterface AccordionProps {\n items: AccordionItem[];\n /** ID of the item that should be open by default */\n defaultOpenId?: string;\n /** If true, allows multiple accordion panels to remain open simultaneously */\n multiple?: boolean;\n className?: string;\n}\n\n/**\n * Accordion Component\n * * A progressively disclosed content container.\n * Implements the WAI-ARIA Accordion pattern for screen reader and keyboard accessibility.\n */\nexport function Accordion({\n items,\n defaultOpenId,\n multiple = false,\n className = '',\n}: AccordionProps) {\n // Initialize state. We use an array even for single-select to maintain a consistent state signature.\n const [openIds, setOpenIds] = useState<string[]>(\n defaultOpenId ? [defaultOpenId] : []\n );\n\n const isOpen = (id: string) => openIds.includes(id);\n\n const toggle = (id: string) => {\n setOpenIds((prev) => {\n if (multiple) {\n // Toggle the specific ID in/out of the array for multiple mode\n return isOpen(id) ? prev.filter((x) => x !== id) : [...prev, id];\n } else {\n // Replace the array entirely for single mode\n return isOpen(id) ? [] : [id];\n }\n });\n };\n\n return (\n <div className={cn(\"nui-accordion\", className)}>\n {items.map((item) => {\n const open = isOpen(item.id);\n\n return (\n <div \n key={item.id} \n className=\"nui-accordion__item\"\n // Expose state to the DOM for CSS attribute selectors (e.g., [data-state=\"open\"])\n // This enables CSS-only animations and styling without JS overhead.\n data-state={open ? 'open' : 'closed'}\n >\n {/* HEADER\n Native <button> is used to ensure out-of-the-box keyboard support.\n Browsers natively translate 'Enter' and 'Space' keydowns on buttons to 'click' events,\n making custom keyboard listeners redundant.\n */}\n <button\n className=\"nui-accordion__header\"\n aria-expanded={open}\n aria-controls={`panel-${item.id}`}\n id={`accordion-${item.id}`}\n onClick={() => toggle(item.id)}\n >\n <span className=\"nui-accordion__title\">{item.title}</span>\n {/* Chevron Icon: aria-hidden=\"true\" prevents screen readers from announcing it */}\n <svg \n className=\"nui-accordion__icon\" \n width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" \n fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\"/>\n </svg>\n </button>\n\n {/* PANEL\n Rendered conditionally via CSS (not JS) to allow for enter/exit CSS grid animations.\n aria-labelledby binds the panel context directly to the triggering button.\n */}\n <div\n id={`panel-${item.id}`}\n role=\"region\"\n aria-labelledby={`accordion-${item.id}`}\n className=\"nui-accordion__panel\"\n >\n <div className=\"nui-accordion__content\">\n {item.content}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\n}"],"names":["Accordion","items","defaultOpenId","multiple","className","openIds","setOpenIds","useState","isOpen","id","toggle","prev","x","jsx","cn","item","open","jsxs"],"mappings":";;;;AA0BO,SAASA,EAAU;AAAA,EACxB,OAAAC;AAAA,EACA,eAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,WAAAC,IAAY;AACd,GAAmB;AAEjB,QAAM,CAACC,GAASC,CAAU,IAAIC;AAAA,IAC5BL,IAAgB,CAACA,CAAa,IAAI,CAAA;AAAA,EAAC,GAG/BM,IAAS,CAACC,MAAeJ,EAAQ,SAASI,CAAE,GAE5CC,IAAS,CAACD,MAAe;AAC7B,IAAAH,EAAW,CAACK,MACNR,IAEKK,EAAOC,CAAE,IAAIE,EAAK,OAAO,CAACC,MAAMA,MAAMH,CAAE,IAAI,CAAC,GAAGE,GAAMF,CAAE,IAGxDD,EAAOC,CAAE,IAAI,CAAA,IAAK,CAACA,CAAE,CAE/B;AAAA,EACH;AAEA,SACE,gBAAAI,EAAC,OAAA,EAAI,WAAWC,EAAG,iBAAiBV,CAAS,GAC1C,UAAAH,EAAM,IAAI,CAACc,MAAS;AACnB,UAAMC,IAAOR,EAAOO,EAAK,EAAE;AAE3B,WACE,gBAAAE;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WAAU;AAAA,QAGV,cAAYD,IAAO,SAAS;AAAA,QAO5B,UAAA;AAAA,UAAA,gBAAAC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,iBAAeD;AAAA,cACf,iBAAe,SAASD,EAAK,EAAE;AAAA,cAC/B,IAAI,aAAaA,EAAK,EAAE;AAAA,cACxB,SAAS,MAAML,EAAOK,EAAK,EAAE;AAAA,cAE7B,UAAA;AAAA,gBAAA,gBAAAF,EAAC,QAAA,EAAK,WAAU,wBAAwB,UAAAE,EAAK,OAAM;AAAA,gBAEnD,gBAAAF;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAU;AAAA,oBACV,OAAM;AAAA,oBAAK,QAAO;AAAA,oBAAK,SAAQ;AAAA,oBAC/B,MAAK;AAAA,oBAAO,QAAO;AAAA,oBAAe,aAAY;AAAA,oBAAI,eAAc;AAAA,oBAAQ,gBAAe;AAAA,oBACvF,eAAY;AAAA,oBAEZ,UAAA,gBAAAA,EAAC,QAAA,EAAK,GAAE,eAAA,CAAc;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACxB;AAAA,YAAA;AAAA,UAAA;AAAA,UAOF,gBAAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,IAAI,SAASE,EAAK,EAAE;AAAA,cACpB,MAAK;AAAA,cACL,mBAAiB,aAAaA,EAAK,EAAE;AAAA,cACrC,WAAU;AAAA,cAEV,UAAA,gBAAAF,EAAC,OAAA,EAAI,WAAU,0BACZ,YAAK,QAAA,CACR;AAAA,YAAA;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,MA3CKE,EAAK;AAAA,IAAA;AAAA,EA8ChB,CAAC,EAAA,CACH;AAEJ;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime");;/* empty css */function c({type:r="info",title:l,children:t,closable:s=!1,onClose:a,className:i=""}){const n=r==="error"||r==="warning"?"alert":"status";return e.jsxs("div",{className:`ui-alert ui-alert--${r} ${i}`,role:n,children:[e.jsxs("div",{className:"ui-alert-content",children:[l&&e.jsx("div",{className:"ui-alert-title",children:l}),t]}),s&&e.jsx("button",{type:"button",className:"ui-alert-close","aria-label":"Close alert",onClick:a,children:"×"})]})}exports.Alert=c;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime");;/* empty css */const c=require("../../utils/cn/cn.cjs");function u({variant:r="info",title:n,children:t,closable:s=!1,onClose:i,className:l,...o}){const a=r==="error"||r==="warning"?"alert":"status";return e.jsxs("div",{className:c.cn("nui-alert",l),"data-variant":r,role:a,...o,children:[e.jsxs("div",{className:"nui-alert__content",children:[n&&e.jsx("div",{className:"nui-alert__title",children:n}),e.jsx("div",{className:"nui-alert__description",children:t})]}),s&&e.jsx("button",{type:"button",className:"nui-alert__close","aria-label":"Close alert",onClick:i,children:e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]})}exports.Alert=u;
2
2
  //# sourceMappingURL=Alert.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Alert.cjs","sources":["../../../src/components/alert/Alert.tsx"],"sourcesContent":["/**\r\n * Alert.tsx\r\n * ----------\r\n * WCAG-compliant alert component.\r\n *\r\n * - Uses correct roles:\r\n * type=\"error\"/\"warning\" role=\"alert\" (urgent)\r\n * type=\"info\"/\"success\" role=\"status\" (non-urgent)\r\n *\r\n * - Supports:\r\n * - title\r\n * - closable\r\n * - variants\r\n * - icons (optional)\r\n */\r\n\r\nimport React from 'react';\r\nimport './Alert.css';\r\n\r\ntype AlertType = 'info' | 'success' | 'warning' | 'error';\r\n\r\ninterface AlertProps {\r\n type?: AlertType;\r\n title?: string;\r\n children?: React.ReactNode;\r\n closable?: boolean;\r\n onClose?: () => void;\r\n className?: string;\r\n}\r\n\r\nexport function Alert({\r\n type = 'info',\r\n title,\r\n children,\r\n closable = false,\r\n onClose,\r\n className = '',\r\n}: AlertProps) {\r\n // WCAG rule:\r\n // - errors & warnings = role=\"alert\"\r\n // - info & success = role=\"status\"\r\n const role = type === 'error' || type === 'warning' ? 'alert' : 'status';\r\n\r\n return (\r\n <div className={`ui-alert ui-alert--${type} ${className}`} role={role}>\r\n <div className=\"ui-alert-content\">\r\n {title && <div className=\"ui-alert-title\">{title}</div>}\r\n {children}\r\n </div>\r\n\r\n {closable && (\r\n <button\r\n type=\"button\"\r\n className=\"ui-alert-close\"\r\n aria-label=\"Close alert\"\r\n onClick={onClose}\r\n >\r\n ×\r\n </button>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["Alert","type","title","children","closable","onClose","className","role","jsxs","jsx"],"mappings":"gJA8BO,SAASA,EAAM,CACpB,KAAAC,EAAO,OACP,MAAAC,EACA,SAAAC,EACA,SAAAC,EAAW,GACX,QAAAC,EACA,UAAAC,EAAY,EACd,EAAe,CAIb,MAAMC,EAAON,IAAS,SAAWA,IAAS,UAAY,QAAU,SAEhE,OACEO,OAAC,OAAI,UAAW,sBAAsBP,CAAI,IAAIK,CAAS,GAAI,KAAAC,EACzD,SAAA,CAAAC,EAAAA,KAAC,MAAA,CAAI,UAAU,mBACZ,SAAA,CAAAN,GAASO,EAAAA,IAAC,MAAA,CAAI,UAAU,iBAAkB,SAAAP,EAAM,EAChDC,CAAA,EACH,EAECC,GACCK,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAU,iBACV,aAAW,cACX,QAASJ,EACV,SAAA,GAAA,CAAA,CAED,EAEJ,CAEJ"}
1
+ {"version":3,"file":"Alert.cjs","sources":["../../../src/components/alert/Alert.tsx"],"sourcesContent":["import React from 'react';\nimport { cn } from '../../utils';\nimport './Alert.css';\n\ntype AlertVariant = 'info' | 'success' | 'warning' | 'error';\n\n/**\n * We Omit 'title' from the standard HTML attributes because the native HTML 'title' \n * expects a string (for native tooltips). We override it here to accept ReactNode, \n * allowing for rich text, icons, or custom JSX inside the alert's title area.\n */\ninterface AlertProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n variant?: AlertVariant;\n title?: React.ReactNode;\n children?: React.ReactNode;\n /** Determines if the close icon button is rendered */\n closable?: boolean;\n /** Callback fired when the close button is clicked. \n * Note: The component is controlled; it does not unmount itself. \n */\n onClose?: () => void;\n className?: string;\n}\n\n/**\n * Alert Component\n * * Used to communicate important messages to the user.\n */\nexport function Alert({\n variant = 'info',\n title,\n children,\n closable = false,\n onClose,\n className,\n ...props\n}: AlertProps) {\n // * Accessibility routing: \n // 'error' and 'warning' are high-priority interruptions, mapped to role=\"alert\".\n // 'info' and 'success' are low-priority updates, mapped to role=\"status\" \n // so screen readers don't aggressively interrupt the user.\n const role = variant === 'error' || variant === 'warning' ? 'alert' : 'status';\n\n return (\n <div \n className={cn(\"nui-alert\", className)} \n data-variant={variant}\n role={role}\n {...props}\n >\n <div className=\"nui-alert__content\">\n {title && <div className=\"nui-alert__title\">{title}</div>}\n <div className=\"nui-alert__description\">{children}</div>\n </div>\n\n {closable && (\n <button\n type=\"button\"\n className=\"nui-alert__close\"\n aria-label=\"Close alert\"\n onClick={onClose}\n >\n {/* SVG Close Icon: aria-hidden is not needed because the button has an aria-label */}\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n </button>\n )}\n </div>\n );\n}"],"names":["Alert","variant","title","children","closable","onClose","className","props","role","jsxs","cn","jsx"],"mappings":"yLA4BO,SAASA,EAAM,CACpB,QAAAC,EAAU,OACV,MAAAC,EACA,SAAAC,EACA,SAAAC,EAAW,GACX,QAAAC,EACA,UAAAC,EACA,GAAGC,CACL,EAAe,CAKb,MAAMC,EAAOP,IAAY,SAAWA,IAAY,UAAY,QAAU,SAEtE,OACEQ,EAAAA,KAAC,MAAA,CACC,UAAWC,EAAAA,GAAG,YAAaJ,CAAS,EACpC,eAAcL,EACd,KAAAO,EACC,GAAGD,EAEJ,SAAA,CAAAE,EAAAA,KAAC,MAAA,CAAI,UAAU,qBACZ,SAAA,CAAAP,GAASS,EAAAA,IAAC,MAAA,CAAI,UAAU,mBAAoB,SAAAT,EAAM,EACnDS,EAAAA,IAAC,MAAA,CAAI,UAAU,yBAA0B,SAAAR,CAAA,CAAS,CAAA,EACpD,EAECC,GACCO,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAU,mBACV,aAAW,cACX,QAASN,EAGT,gBAAC,MAAA,CAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,KAAK,OAAO,OAAO,eAAe,YAAY,IAAI,cAAc,QAAQ,eAAe,QACrI,SAAA,CAAAM,EAAAA,IAAC,OAAA,CAAK,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,IAAA,CAAK,EACpCA,EAAAA,IAAC,QAAK,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAA,CAAK,CAAA,CAAA,CACtC,CAAA,CAAA,CACF,CAAA,CAAA,CAIR"}
@@ -1,32 +1,46 @@
1
- import { jsxs as l, jsx as a } from "react/jsx-runtime";
1
+ import { jsxs as i, jsx as e } from "react/jsx-runtime";
2
2
  /* empty css */
3
- function d({
4
- type: e = "info",
5
- title: r,
3
+ import { cn as d } from "../../utils/cn/cn.js";
4
+ function x({
5
+ variant: r = "info",
6
+ title: n,
6
7
  children: t,
7
- closable: i = !1,
8
- onClose: s,
9
- className: n = ""
8
+ closable: l = !1,
9
+ onClose: o,
10
+ className: s,
11
+ ...a
10
12
  }) {
11
- const o = e === "error" || e === "warning" ? "alert" : "status";
12
- return /* @__PURE__ */ l("div", { className: `ui-alert ui-alert--${e} ${n}`, role: o, children: [
13
- /* @__PURE__ */ l("div", { className: "ui-alert-content", children: [
14
- r && /* @__PURE__ */ a("div", { className: "ui-alert-title", children: r }),
15
- t
16
- ] }),
17
- i && /* @__PURE__ */ a(
18
- "button",
19
- {
20
- type: "button",
21
- className: "ui-alert-close",
22
- "aria-label": "Close alert",
23
- onClick: s,
24
- children: "×"
25
- }
26
- )
27
- ] });
13
+ const c = r === "error" || r === "warning" ? "alert" : "status";
14
+ return /* @__PURE__ */ i(
15
+ "div",
16
+ {
17
+ className: d("nui-alert", s),
18
+ "data-variant": r,
19
+ role: c,
20
+ ...a,
21
+ children: [
22
+ /* @__PURE__ */ i("div", { className: "nui-alert__content", children: [
23
+ n && /* @__PURE__ */ e("div", { className: "nui-alert__title", children: n }),
24
+ /* @__PURE__ */ e("div", { className: "nui-alert__description", children: t })
25
+ ] }),
26
+ l && /* @__PURE__ */ e(
27
+ "button",
28
+ {
29
+ type: "button",
30
+ className: "nui-alert__close",
31
+ "aria-label": "Close alert",
32
+ onClick: o,
33
+ children: /* @__PURE__ */ i("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
34
+ /* @__PURE__ */ e("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
35
+ /* @__PURE__ */ e("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
36
+ ] })
37
+ }
38
+ )
39
+ ]
40
+ }
41
+ );
28
42
  }
29
43
  export {
30
- d as Alert
44
+ x as Alert
31
45
  };
32
46
  //# sourceMappingURL=Alert.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Alert.js","sources":["../../../src/components/alert/Alert.tsx"],"sourcesContent":["/**\r\n * Alert.tsx\r\n * ----------\r\n * WCAG-compliant alert component.\r\n *\r\n * - Uses correct roles:\r\n * type=\"error\"/\"warning\" role=\"alert\" (urgent)\r\n * type=\"info\"/\"success\" role=\"status\" (non-urgent)\r\n *\r\n * - Supports:\r\n * - title\r\n * - closable\r\n * - variants\r\n * - icons (optional)\r\n */\r\n\r\nimport React from 'react';\r\nimport './Alert.css';\r\n\r\ntype AlertType = 'info' | 'success' | 'warning' | 'error';\r\n\r\ninterface AlertProps {\r\n type?: AlertType;\r\n title?: string;\r\n children?: React.ReactNode;\r\n closable?: boolean;\r\n onClose?: () => void;\r\n className?: string;\r\n}\r\n\r\nexport function Alert({\r\n type = 'info',\r\n title,\r\n children,\r\n closable = false,\r\n onClose,\r\n className = '',\r\n}: AlertProps) {\r\n // WCAG rule:\r\n // - errors & warnings = role=\"alert\"\r\n // - info & success = role=\"status\"\r\n const role = type === 'error' || type === 'warning' ? 'alert' : 'status';\r\n\r\n return (\r\n <div className={`ui-alert ui-alert--${type} ${className}`} role={role}>\r\n <div className=\"ui-alert-content\">\r\n {title && <div className=\"ui-alert-title\">{title}</div>}\r\n {children}\r\n </div>\r\n\r\n {closable && (\r\n <button\r\n type=\"button\"\r\n className=\"ui-alert-close\"\r\n aria-label=\"Close alert\"\r\n onClick={onClose}\r\n >\r\n ×\r\n </button>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["Alert","type","title","children","closable","onClose","className","role","jsxs","jsx"],"mappings":";;AA8BO,SAASA,EAAM;AAAA,EACpB,MAAAC,IAAO;AAAA,EACP,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,SAAAC;AAAA,EACA,WAAAC,IAAY;AACd,GAAe;AAIb,QAAMC,IAAON,MAAS,WAAWA,MAAS,YAAY,UAAU;AAEhE,SACE,gBAAAO,EAAC,SAAI,WAAW,sBAAsBP,CAAI,IAAIK,CAAS,IAAI,MAAAC,GACzD,UAAA;AAAA,IAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,oBACZ,UAAA;AAAA,MAAAN,KAAS,gBAAAO,EAAC,OAAA,EAAI,WAAU,kBAAkB,UAAAP,GAAM;AAAA,MAChDC;AAAA,IAAA,GACH;AAAA,IAECC,KACC,gBAAAK;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,cAAW;AAAA,QACX,SAASJ;AAAA,QACV,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAED,GAEJ;AAEJ;"}
1
+ {"version":3,"file":"Alert.js","sources":["../../../src/components/alert/Alert.tsx"],"sourcesContent":["import React from 'react';\nimport { cn } from '../../utils';\nimport './Alert.css';\n\ntype AlertVariant = 'info' | 'success' | 'warning' | 'error';\n\n/**\n * We Omit 'title' from the standard HTML attributes because the native HTML 'title' \n * expects a string (for native tooltips). We override it here to accept ReactNode, \n * allowing for rich text, icons, or custom JSX inside the alert's title area.\n */\ninterface AlertProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n variant?: AlertVariant;\n title?: React.ReactNode;\n children?: React.ReactNode;\n /** Determines if the close icon button is rendered */\n closable?: boolean;\n /** Callback fired when the close button is clicked. \n * Note: The component is controlled; it does not unmount itself. \n */\n onClose?: () => void;\n className?: string;\n}\n\n/**\n * Alert Component\n * * Used to communicate important messages to the user.\n */\nexport function Alert({\n variant = 'info',\n title,\n children,\n closable = false,\n onClose,\n className,\n ...props\n}: AlertProps) {\n // * Accessibility routing: \n // 'error' and 'warning' are high-priority interruptions, mapped to role=\"alert\".\n // 'info' and 'success' are low-priority updates, mapped to role=\"status\" \n // so screen readers don't aggressively interrupt the user.\n const role = variant === 'error' || variant === 'warning' ? 'alert' : 'status';\n\n return (\n <div \n className={cn(\"nui-alert\", className)} \n data-variant={variant}\n role={role}\n {...props}\n >\n <div className=\"nui-alert__content\">\n {title && <div className=\"nui-alert__title\">{title}</div>}\n <div className=\"nui-alert__description\">{children}</div>\n </div>\n\n {closable && (\n <button\n type=\"button\"\n className=\"nui-alert__close\"\n aria-label=\"Close alert\"\n onClick={onClose}\n >\n {/* SVG Close Icon: aria-hidden is not needed because the button has an aria-label */}\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n </button>\n )}\n </div>\n );\n}"],"names":["Alert","variant","title","children","closable","onClose","className","props","role","jsxs","cn","jsx"],"mappings":";;;AA4BO,SAASA,EAAM;AAAA,EACpB,SAAAC,IAAU;AAAA,EACV,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,SAAAC;AAAA,EACA,WAAAC;AAAA,EACA,GAAGC;AACL,GAAe;AAKb,QAAMC,IAAOP,MAAY,WAAWA,MAAY,YAAY,UAAU;AAEtE,SACE,gBAAAQ;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC,EAAG,aAAaJ,CAAS;AAAA,MACpC,gBAAcL;AAAA,MACd,MAAAO;AAAA,MACC,GAAGD;AAAA,MAEJ,UAAA;AAAA,QAAA,gBAAAE,EAAC,OAAA,EAAI,WAAU,sBACZ,UAAA;AAAA,UAAAP,KAAS,gBAAAS,EAAC,OAAA,EAAI,WAAU,oBAAoB,UAAAT,GAAM;AAAA,UACnD,gBAAAS,EAAC,OAAA,EAAI,WAAU,0BAA0B,UAAAR,EAAA,CAAS;AAAA,QAAA,GACpD;AAAA,QAECC,KACC,gBAAAO;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,cAAW;AAAA,YACX,SAASN;AAAA,YAGT,4BAAC,OAAA,EAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SACrI,UAAA;AAAA,cAAA,gBAAAM,EAAC,QAAA,EAAK,IAAG,MAAK,IAAG,KAAI,IAAG,KAAI,IAAG,KAAA,CAAK;AAAA,cACpC,gBAAAA,EAAC,UAAK,IAAG,KAAI,IAAG,KAAI,IAAG,MAAK,IAAG,KAAA,CAAK;AAAA,YAAA,EAAA,CACtC;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAAA;AAIR;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("react/jsx-runtime"),f=require("react");;/* empty css */function h(e){if(!e)return"";const r=e.trim().split(" ");return r.length===1?r[0].charAt(0).toUpperCase():(r[0][0]+r[1][0]).toUpperCase()}function x({src:e,alt:r,name:i,size:l="md",shape:u="circle",status:t,loading:s=!1,className:c="",fallbackIcon:n}){const[p,v]=f.useState(!1),o=h(i),d=["ui-avatar",`ui-avatar--${l}`,`ui-avatar--${u}`,s&&"ui-avatar-loading",c].filter(Boolean).join(" "),j=e&&!p&&!s;return a.jsxs("div",{className:d,"aria-label":r||i,children:[j?a.jsx("img",{src:e,alt:r||i||"avatar",onError:()=>v(!0)}):o?a.jsx("span",{children:o}):n?a.jsx("span",{children:n}):a.jsx("span",{children:"?"}),t&&a.jsx("span",{className:["ui-avatar-status",t&&`ui-avatar-status--${t}`].filter(Boolean).join(" "),"aria-label":t})]})}exports.Avatar=x;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("react/jsx-runtime"),p=require("react");;/* empty css */const j=require("../../utils/cn/cn.cjs");function x(e){if(!e)return"";const r=e.trim().split(/\s+/);return r.length===0?"":r.length===1?r[0].substring(0,2).toUpperCase():(r[0][0]+r[r.length-1][0]).toUpperCase()}function f({src:e,alt:r,name:t,size:n="md",shape:o="circle",status:s,fallbackIcon:c,loading:i,className:l,...u}){const[d,h]=p.useState(!1),v=x(t),g=e&&!d&&!i;return a.jsxs("div",{className:j.cn("nui-avatar",i&&"nui-avatar--loading",l),"data-size":n,"data-shape":o,role:"img","aria-label":r||t||"Avatar",...u,children:[g?a.jsx("img",{src:e,alt:r||t,className:"nui-avatar__image",onError:()=>h(!0)}):a.jsx("div",{className:"nui-avatar__fallback","aria-hidden":"true",children:!i&&(v||c||a.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[a.jsx("path",{d:"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"}),a.jsx("circle",{cx:"12",cy:"7",r:"4"})]}))}),s&&a.jsx("span",{className:"nui-avatar__status","data-status":s,role:"status","aria-label":s})]})}exports.Avatar=f;
2
2
  //# sourceMappingURL=Avatar.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Avatar.cjs","sources":["../../../src/components/avatar/Avatar.tsx"],"sourcesContent":["/**\r\n * Avatar.tsx\r\n * Enterprise-grade Avatar component.\r\n */\r\nimport React, { useState } from 'react';\r\nimport './Avatar.css';\r\n\r\ntype AvatarSize = 'sm' | 'md' | 'lg' | 'xl';\r\ntype AvatarShape = 'circle' | 'rounded' | 'square';\r\ntype Status = 'online' | 'offline' | 'busy' | undefined;\r\n\r\ninterface AvatarProps {\r\n src?: string;\r\n alt?: string;\r\n name?: string; // For initials fallback\r\n size?: AvatarSize;\r\n shape?: AvatarShape;\r\n status?: Status;\r\n loading?: boolean; // skeleton\r\n className?: string;\r\n fallbackIcon?: React.ReactNode;\r\n}\r\n\r\nfunction getInitials(name?: string): string {\r\n if (!name) return '';\r\n const parts = name.trim().split(' ');\r\n if (parts.length === 1) return parts[0].charAt(0).toUpperCase();\r\n return (parts[0][0] + parts[1][0]).toUpperCase();\r\n}\r\n\r\nexport function Avatar({\r\n src,\r\n alt,\r\n name,\r\n size = 'md',\r\n shape = 'circle',\r\n status,\r\n loading = false,\r\n className = '',\r\n fallbackIcon,\r\n}: AvatarProps) {\r\n const [errored, setErrored] = useState(false);\r\n const initials = getInitials(name);\r\n\r\n const classes = [\r\n 'ui-avatar',\r\n `ui-avatar--${size}`,\r\n `ui-avatar--${shape}`,\r\n loading && 'ui-avatar-loading',\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n const showImage = src && !errored && !loading;\r\n\r\n return (\r\n <div className={classes} aria-label={alt || name}>\r\n {showImage ? (\r\n <img\r\n src={src}\r\n alt={alt || name || 'avatar'}\r\n onError={() => setErrored(true)}\r\n />\r\n ) : initials ? (\r\n <span>{initials}</span>\r\n ) : fallbackIcon ? (\r\n <span>{fallbackIcon}</span>\r\n ) : (\r\n <span>?</span>\r\n )}\r\n\r\n {status && (\r\n <span\r\n className={[\r\n 'ui-avatar-status',\r\n status && `ui-avatar-status--${status}`,\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n aria-label={status}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["getInitials","name","parts","Avatar","src","alt","size","shape","status","loading","className","fallbackIcon","errored","setErrored","useState","initials","classes","showImage","jsx"],"mappings":"oKAuBA,SAASA,EAAYC,EAAuB,CAC1C,GAAI,CAACA,EAAM,MAAO,GAClB,MAAMC,EAAQD,EAAK,KAAA,EAAO,MAAM,GAAG,EACnC,OAAIC,EAAM,SAAW,EAAUA,EAAM,CAAC,EAAE,OAAO,CAAC,EAAE,YAAA,GAC1CA,EAAM,CAAC,EAAE,CAAC,EAAIA,EAAM,CAAC,EAAE,CAAC,GAAG,YAAA,CACrC,CAEO,SAASC,EAAO,CACrB,IAAAC,EACA,IAAAC,EACA,KAAAJ,EACA,KAAAK,EAAO,KACP,MAAAC,EAAQ,SACR,OAAAC,EACA,QAAAC,EAAU,GACV,UAAAC,EAAY,GACZ,aAAAC,CACF,EAAgB,CACd,KAAM,CAACC,EAASC,CAAU,EAAIC,EAAAA,SAAS,EAAK,EACtCC,EAAWf,EAAYC,CAAI,EAE3Be,EAAU,CACd,YACA,cAAcV,CAAI,GAClB,cAAcC,CAAK,GACnBE,GAAW,oBACXC,CAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG,EAELO,EAAYb,GAAO,CAACQ,GAAW,CAACH,EAEtC,cACG,MAAA,CAAI,UAAWO,EAAS,aAAYX,GAAOJ,EACzC,SAAA,CAAAgB,EACCC,EAAAA,IAAC,MAAA,CACC,IAAAd,EACA,IAAKC,GAAOJ,GAAQ,SACpB,QAAS,IAAMY,EAAW,EAAI,CAAA,CAAA,EAE9BE,EACFG,EAAAA,IAAC,OAAA,CAAM,SAAAH,CAAA,CAAS,EACdJ,EACFO,EAAAA,IAAC,OAAA,CAAM,SAAAP,CAAA,CAAa,EAEpBO,EAAAA,IAAC,QAAK,SAAA,IAAC,EAGRV,GACCU,EAAAA,IAAC,OAAA,CACC,UAAW,CACT,mBACAV,GAAU,qBAAqBA,CAAM,EAAA,EAEpC,OAAO,OAAO,EACd,KAAK,GAAG,EACX,aAAYA,CAAA,CAAA,CACd,EAEJ,CAEJ"}
1
+ {"version":3,"file":"Avatar.cjs","sources":["../../../src/components/avatar/Avatar.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useState } from 'react';\nimport { cn } from '../../utils';\nimport './Avatar.css';\n\nexport type AvatarSize = 'sm' | 'md' | 'lg' | 'xl';\nexport type AvatarShape = 'circle' | 'rounded' | 'square';\nexport type AvatarStatus = 'online' | 'offline' | 'busy' | 'away';\n\nexport interface AvatarProps extends React.HTMLAttributes<HTMLDivElement> {\n src?: string;\n alt?: string;\n name?: string;\n size?: AvatarSize;\n shape?: AvatarShape;\n status?: AvatarStatus;\n fallbackIcon?: React.ReactNode; \n loading?: boolean; \n className?: string;\n}\n\n/**\n * Utility to extract initials from a name string.\n * Handles single words and multi-word names appropriately.\n */\nfunction getInitials(name?: string): string {\n if (!name) return '';\n const parts = name.trim().split(/\\s+/);\n if (parts.length === 0) return '';\n if (parts.length === 1) return parts[0].substring(0, 2).toUpperCase();\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n}\n\n/**\n * Avatar Component\n * * A visual representation of a user or entity.\n * Implements a strict fallback sequence: Image -> Initials -> Fallback Icon -> Default Icon.\n */\nexport function Avatar({\n src,\n alt,\n name,\n size = 'md',\n shape = 'circle',\n status,\n fallbackIcon, \n loading, \n className,\n ...props \n}: AvatarProps) {\n // * Native error handling: We track if the image fails to load via the native onError event\n // to seamlessly trigger the fallback UI without needing complex fetch checks.\n const [hasError, setHasError] = useState(false);\n const initials = getInitials(name);\n \n // If loading is true, we force the fallback/skeleton state by hiding the image\n const showImage = src && !hasError && !loading;\n\n return (\n <div\n className={cn(\n \"nui-avatar\", \n loading && \"nui-avatar--loading\", \n className\n )}\n data-size={size}\n data-shape={shape}\n role=\"img\"\n aria-label={alt || name || \"Avatar\"}\n {...props} \n >\n {showImage ? (\n <img\n src={src}\n alt={alt || name}\n className=\"nui-avatar__image\"\n onError={() => setHasError(true)}\n />\n ) : (\n <div className=\"nui-avatar__fallback\" aria-hidden=\"true\">\n {/* Fallback Waterfall Logic */}\n {!loading && (initials || fallbackIcon || (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\"></path>\n <circle cx=\"12\" cy=\"7\" r=\"4\"></circle>\n </svg>\n ))}\n </div>\n )}\n\n {status && (\n <span \n className=\"nui-avatar__status\" \n data-status={status} \n role=\"status\"\n aria-label={status}\n />\n )}\n </div>\n );\n}"],"names":["getInitials","name","parts","Avatar","src","alt","size","shape","status","fallbackIcon","loading","className","props","hasError","setHasError","useState","initials","showImage","jsxs","cn","jsx"],"mappings":"6MA0BA,SAASA,EAAYC,EAAuB,CAC1C,GAAI,CAACA,EAAM,MAAO,GAClB,MAAMC,EAAQD,EAAK,KAAA,EAAO,MAAM,KAAK,EACrC,OAAIC,EAAM,SAAW,EAAU,GAC3BA,EAAM,SAAW,EAAUA,EAAM,CAAC,EAAE,UAAU,EAAG,CAAC,EAAE,YAAA,GAChDA,EAAM,CAAC,EAAE,CAAC,EAAIA,EAAMA,EAAM,OAAS,CAAC,EAAE,CAAC,GAAG,YAAA,CACpD,CAOO,SAASC,EAAO,CACrB,IAAAC,EACA,IAAAC,EACA,KAAAJ,EACA,KAAAK,EAAO,KACP,MAAAC,EAAQ,SACR,OAAAC,EACA,aAAAC,EACA,QAAAC,EACA,UAAAC,EACA,GAAGC,CACL,EAAgB,CAGd,KAAM,CAACC,EAAUC,CAAW,EAAIC,EAAAA,SAAS,EAAK,EACxCC,EAAWhB,EAAYC,CAAI,EAG3BgB,EAAYb,GAAO,CAACS,GAAY,CAACH,EAEvC,OACEQ,EAAAA,KAAC,MAAA,CACC,UAAWC,EAAAA,GACT,aACAT,GAAW,sBACXC,CAAA,EAEF,YAAWL,EACX,aAAYC,EACZ,KAAK,MACL,aAAYF,GAAOJ,GAAQ,SAC1B,GAAGW,EAEH,SAAA,CAAAK,EACCG,EAAAA,IAAC,MAAA,CACC,IAAAhB,EACA,IAAKC,GAAOJ,EACZ,UAAU,oBACV,QAAS,IAAMa,EAAY,EAAI,CAAA,CAAA,EAGjCM,EAAAA,IAAC,MAAA,CAAI,UAAU,uBAAuB,cAAY,OAE/C,SAAA,CAACV,IAAYM,GAAYP,GACxBS,EAAAA,KAAC,MAAA,CAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,KAAK,OAAO,OAAO,eAAe,YAAY,IAAI,cAAc,QAAQ,eAAe,QACrI,SAAA,CAAAE,EAAAA,IAAC,OAAA,CAAK,EAAE,2CAAA,CAA4C,QACnD,SAAA,CAAO,GAAG,KAAK,GAAG,IAAI,EAAE,GAAA,CAAI,CAAA,CAAA,CAC/B,EAAA,CAEJ,EAGDZ,GACCY,EAAAA,IAAC,OAAA,CACC,UAAU,qBACV,cAAaZ,EACb,KAAK,SACL,aAAYA,CAAA,CAAA,CACd,CAAA,CAAA,CAIR"}
@@ -1,51 +1,65 @@
1
- import { jsxs as v, jsx as t } from "react/jsx-runtime";
2
- import { useState as d } from "react";
1
+ import { jsxs as n, jsx as t } from "react/jsx-runtime";
2
+ import { useState as f } from "react";
3
3
  /* empty css */
4
- function h(r) {
5
- if (!r) return "";
6
- const a = r.trim().split(" ");
7
- return a.length === 1 ? a[0].charAt(0).toUpperCase() : (a[0][0] + a[1][0]).toUpperCase();
4
+ import { cn as g } from "../../utils/cn/cn.js";
5
+ function _(a) {
6
+ if (!a) return "";
7
+ const r = a.trim().split(/\s+/);
8
+ return r.length === 0 ? "" : r.length === 1 ? r[0].substring(0, 2).toUpperCase() : (r[0][0] + r[r.length - 1][0]).toUpperCase();
8
9
  }
9
- function w({
10
- src: r,
11
- alt: a,
12
- name: i,
13
- size: l = "md",
14
- shape: c = "circle",
15
- status: e,
16
- loading: s = !1,
17
- className: p = "",
18
- fallbackIcon: o
10
+ function j({
11
+ src: a,
12
+ alt: r,
13
+ name: e,
14
+ size: o = "md",
15
+ shape: l = "circle",
16
+ status: i,
17
+ fallbackIcon: c,
18
+ loading: s,
19
+ className: u,
20
+ ...d
19
21
  }) {
20
- const [u, f] = d(!1), n = h(i), m = [
21
- "ui-avatar",
22
- `ui-avatar--${l}`,
23
- `ui-avatar--${c}`,
24
- s && "ui-avatar-loading",
25
- p
26
- ].filter(Boolean).join(" ");
27
- return /* @__PURE__ */ v("div", { className: m, "aria-label": a || i, children: [
28
- r && !u && !s ? /* @__PURE__ */ t(
29
- "img",
30
- {
31
- src: r,
32
- alt: a || i || "avatar",
33
- onError: () => f(!0)
34
- }
35
- ) : n ? /* @__PURE__ */ t("span", { children: n }) : o ? /* @__PURE__ */ t("span", { children: o }) : /* @__PURE__ */ t("span", { children: "?" }),
36
- e && /* @__PURE__ */ t(
37
- "span",
38
- {
39
- className: [
40
- "ui-avatar-status",
41
- e && `ui-avatar-status--${e}`
42
- ].filter(Boolean).join(" "),
43
- "aria-label": e
44
- }
45
- )
46
- ] });
22
+ const [h, p] = f(!1), m = _(e), v = a && !h && !s;
23
+ return /* @__PURE__ */ n(
24
+ "div",
25
+ {
26
+ className: g(
27
+ "nui-avatar",
28
+ s && "nui-avatar--loading",
29
+ u
30
+ ),
31
+ "data-size": o,
32
+ "data-shape": l,
33
+ role: "img",
34
+ "aria-label": r || e || "Avatar",
35
+ ...d,
36
+ children: [
37
+ v ? /* @__PURE__ */ t(
38
+ "img",
39
+ {
40
+ src: a,
41
+ alt: r || e,
42
+ className: "nui-avatar__image",
43
+ onError: () => p(!0)
44
+ }
45
+ ) : /* @__PURE__ */ t("div", { className: "nui-avatar__fallback", "aria-hidden": "true", children: !s && (m || c || /* @__PURE__ */ n("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
46
+ /* @__PURE__ */ t("path", { d: "M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2" }),
47
+ /* @__PURE__ */ t("circle", { cx: "12", cy: "7", r: "4" })
48
+ ] })) }),
49
+ i && /* @__PURE__ */ t(
50
+ "span",
51
+ {
52
+ className: "nui-avatar__status",
53
+ "data-status": i,
54
+ role: "status",
55
+ "aria-label": i
56
+ }
57
+ )
58
+ ]
59
+ }
60
+ );
47
61
  }
48
62
  export {
49
- w as Avatar
63
+ j as Avatar
50
64
  };
51
65
  //# sourceMappingURL=Avatar.js.map