@fabio.caffarello/react-design-system 1.7.0 → 1.8.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 (460) hide show
  1. package/README.md +48 -3
  2. package/dist/docs/components/ComponentStatusTable.d.ts +11 -0
  3. package/dist/ui/atoms/Accordion/Accordion.d.ts +34 -0
  4. package/dist/ui/atoms/Accordion/Accordion.stories.d.ts +11 -0
  5. package/dist/ui/atoms/Accordion/Accordion.test.d.ts +1 -0
  6. package/dist/ui/atoms/Accordion/index.d.ts +2 -0
  7. package/dist/ui/atoms/Avatar/Avatar.d.ts +30 -0
  8. package/dist/ui/atoms/Avatar/Avatar.stories.d.ts +13 -0
  9. package/dist/ui/atoms/Avatar/Avatar.test.d.ts +1 -0
  10. package/dist/ui/atoms/Avatar/AvatarGroup.d.ts +26 -0
  11. package/dist/ui/atoms/Avatar/index.d.ts +9 -0
  12. package/dist/ui/atoms/Badge/Badge.d.ts +14 -6
  13. package/dist/ui/atoms/Badge/Badge.stories.d.ts +8 -9
  14. package/dist/ui/atoms/BoxWrapper/BoxWrapper.d.ts +3 -3
  15. package/dist/ui/atoms/BoxWrapper/BoxWrapper.test.d.ts +1 -0
  16. package/dist/ui/atoms/Button/Button.d.ts +32 -10
  17. package/dist/ui/atoms/Button/Button.stories.d.ts +7 -0
  18. package/dist/ui/atoms/Button/Button.test.d.ts +1 -0
  19. package/dist/ui/atoms/Checkbox/Checkbox.d.ts +2 -1
  20. package/dist/ui/atoms/Collapsible/Collapsible.stories.d.ts +2 -0
  21. package/dist/ui/atoms/Info/Info.d.ts +2 -3
  22. package/dist/ui/atoms/Info/Info.test.d.ts +1 -0
  23. package/dist/ui/atoms/Input/Input.d.ts +14 -4
  24. package/dist/ui/atoms/Input/Input.stories.d.ts +6 -0
  25. package/dist/ui/atoms/Popover/Popover.d.ts +35 -0
  26. package/dist/ui/atoms/Popover/Popover.stories.d.ts +11 -0
  27. package/dist/ui/atoms/Popover/Popover.test.d.ts +1 -0
  28. package/dist/ui/atoms/Popover/index.d.ts +2 -0
  29. package/dist/ui/atoms/Progress/Progress.d.ts +33 -0
  30. package/dist/ui/atoms/Progress/Progress.stories.d.ts +12 -0
  31. package/dist/ui/atoms/Progress/Progress.test.d.ts +1 -0
  32. package/dist/ui/atoms/Select/Select.d.ts +18 -6
  33. package/dist/ui/atoms/Select/Select.stories.d.ts +11 -8
  34. package/dist/ui/atoms/Separator/Separator.d.ts +23 -0
  35. package/dist/ui/atoms/Separator/Separator.stories.d.ts +10 -0
  36. package/dist/ui/atoms/Separator/Separator.test.d.ts +1 -0
  37. package/dist/ui/atoms/Separator/index.d.ts +2 -0
  38. package/dist/ui/atoms/Skeleton/Skeleton.d.ts +1 -1
  39. package/dist/ui/atoms/Skeleton/Skeleton.stories.d.ts +24 -0
  40. package/dist/ui/atoms/Slider/Slider.d.ts +45 -0
  41. package/dist/ui/atoms/Slider/Slider.stories.d.ts +13 -0
  42. package/dist/ui/atoms/Slider/Slider.test.d.ts +1 -0
  43. package/dist/ui/atoms/Slider/index.d.ts +2 -0
  44. package/dist/ui/atoms/Spinner/Spinner.d.ts +22 -0
  45. package/dist/ui/atoms/Spinner/Spinner.stories.d.ts +9 -0
  46. package/dist/ui/atoms/Spinner/Spinner.test.d.ts +1 -0
  47. package/dist/ui/atoms/Switch/Switch.d.ts +28 -0
  48. package/dist/ui/atoms/Switch/Switch.stories.d.ts +11 -0
  49. package/dist/ui/atoms/Switch/Switch.test.d.ts +1 -0
  50. package/dist/ui/atoms/Switch/index.d.ts +2 -0
  51. package/dist/ui/atoms/Tooltip/Tooltip.d.ts +2 -1
  52. package/dist/ui/atoms/Tooltip/Tooltip.stories.d.ts +17 -0
  53. package/dist/ui/atoms/index.d.ts +20 -3
  54. package/dist/ui/index.d.ts +6 -1
  55. package/dist/ui/molecules/Card/Card.d.ts +6 -2
  56. package/dist/ui/molecules/Card/Card.stories.d.ts +2 -0
  57. package/dist/ui/molecules/ColorPicker/ColorPicker.d.ts +28 -0
  58. package/dist/ui/molecules/ColorPicker/ColorPicker.stories.d.ts +12 -0
  59. package/dist/ui/molecules/ColorPicker/ColorPicker.test.d.ts +1 -0
  60. package/dist/ui/molecules/ColorPicker/index.d.ts +2 -0
  61. package/dist/ui/molecules/DatePicker/DatePicker.d.ts +74 -0
  62. package/dist/ui/molecules/DatePicker/DatePicker.stories.d.ts +12 -0
  63. package/dist/ui/molecules/DatePicker/DatePicker.test.d.ts +1 -0
  64. package/dist/ui/molecules/DatePicker/DatePickerCalendar.d.ts +6 -0
  65. package/dist/ui/molecules/DatePicker/DatePickerContext.d.ts +28 -0
  66. package/dist/ui/molecules/DatePicker/DatePickerInput.d.ts +9 -0
  67. package/dist/ui/molecules/DatePicker/DatePickerProvider.d.ts +23 -0
  68. package/dist/ui/molecules/DatePicker/index.d.ts +14 -0
  69. package/dist/ui/molecules/Dropdown/Dropdown.d.ts +2 -1
  70. package/dist/ui/molecules/Dropdown/Dropdown.stories.d.ts +13 -0
  71. package/dist/ui/molecules/EmptyState/EmptyState.stories.d.ts +22 -0
  72. package/dist/ui/molecules/FileUpload/FileUpload.d.ts +37 -0
  73. package/dist/ui/molecules/FileUpload/FileUpload.stories.d.ts +12 -0
  74. package/dist/ui/molecules/FileUpload/FileUpload.test.d.ts +1 -0
  75. package/dist/ui/molecules/FileUpload/index.d.ts +2 -0
  76. package/dist/ui/molecules/Form/Form.d.ts +29 -4
  77. package/dist/ui/molecules/Form/Form.stories.d.ts +2 -0
  78. package/dist/ui/molecules/Form/FormContext.d.ts +17 -0
  79. package/dist/ui/molecules/Form/FormField.d.ts +36 -0
  80. package/dist/ui/molecules/Form/FormProvider.d.ts +14 -0
  81. package/dist/ui/molecules/Form/index.d.ts +13 -0
  82. package/dist/ui/molecules/Form/useFormFieldArray.d.ts +28 -0
  83. package/dist/ui/molecules/InputWithLabel/InputWithLabel.test.d.ts +1 -0
  84. package/dist/ui/molecules/Rating/Rating.d.ts +33 -0
  85. package/dist/ui/molecules/Rating/Rating.stories.d.ts +13 -0
  86. package/dist/ui/molecules/Rating/Rating.test.d.ts +1 -0
  87. package/dist/ui/molecules/Rating/index.d.ts +2 -0
  88. package/dist/ui/molecules/SearchInput/SearchInput.d.ts +24 -0
  89. package/dist/ui/molecules/SearchInput/SearchInput.stories.d.ts +10 -0
  90. package/dist/ui/molecules/SearchInput/SearchInput.test.d.ts +1 -0
  91. package/dist/ui/molecules/SearchInput/index.d.ts +2 -0
  92. package/dist/ui/molecules/SidebarHeader/SidebarHeader.test.d.ts +1 -0
  93. package/dist/ui/molecules/TableActions/TableActions.d.ts +31 -0
  94. package/dist/ui/molecules/TableActions/TableActions.stories.d.ts +7 -0
  95. package/dist/ui/molecules/TableActions/TableActions.test.d.ts +1 -0
  96. package/dist/ui/molecules/TableFilters/TableFilters.d.ts +37 -0
  97. package/dist/ui/molecules/TableFilters/TableFilters.stories.d.ts +7 -0
  98. package/dist/ui/molecules/TableFilters/TableFilters.test.d.ts +1 -0
  99. package/dist/ui/molecules/TablePagination/TablePagination.d.ts +29 -0
  100. package/dist/ui/molecules/TablePagination/TablePagination.stories.d.ts +8 -0
  101. package/dist/ui/molecules/TablePagination/TablePagination.test.d.ts +1 -0
  102. package/dist/ui/molecules/Tabs/Tabs.d.ts +15 -0
  103. package/dist/ui/molecules/Tabs/Tabs.stories.d.ts +10 -0
  104. package/dist/ui/molecules/Tabs/Tabs.test.d.ts +1 -0
  105. package/dist/ui/molecules/Tabs/TabsContent.d.ts +14 -0
  106. package/dist/ui/molecules/Tabs/TabsContext.d.ts +18 -0
  107. package/dist/ui/molecules/Tabs/TabsList.d.ts +12 -0
  108. package/dist/ui/molecules/Tabs/TabsProvider.d.ts +16 -0
  109. package/dist/ui/molecules/Tabs/TabsTrigger.d.ts +13 -0
  110. package/dist/ui/molecules/Tabs/index.d.ts +17 -0
  111. package/dist/ui/molecules/TimePicker/TimePicker.d.ts +29 -0
  112. package/dist/ui/molecules/TimePicker/TimePicker.stories.d.ts +12 -0
  113. package/dist/ui/molecules/TimePicker/TimePicker.test.d.ts +1 -0
  114. package/dist/ui/molecules/TimePicker/index.d.ts +2 -0
  115. package/dist/ui/molecules/index.d.ts +13 -5
  116. package/dist/ui/organisms/CommandPalette/CommandPalette.d.ts +37 -0
  117. package/dist/ui/organisms/CommandPalette/CommandPalette.stories.d.ts +11 -0
  118. package/dist/ui/organisms/CommandPalette/CommandPalette.test.d.ts +1 -0
  119. package/dist/ui/organisms/CommandPalette/index.d.ts +2 -0
  120. package/dist/ui/organisms/DataGrid/DataGrid.d.ts +84 -0
  121. package/dist/ui/organisms/DataGrid/DataGrid.stories.d.ts +14 -0
  122. package/dist/ui/organisms/DataGrid/DataGrid.test.d.ts +1 -0
  123. package/dist/ui/organisms/DataGrid/index.d.ts +2 -0
  124. package/dist/ui/organisms/Dialog/AlertDialog.d.ts +34 -0
  125. package/dist/ui/organisms/Dialog/Dialog.d.ts +58 -0
  126. package/dist/ui/organisms/Dialog/Dialog.stories.d.ts +13 -0
  127. package/dist/ui/organisms/Dialog/Dialog.test.d.ts +1 -0
  128. package/dist/ui/organisms/Dialog/DialogClose.d.ts +8 -0
  129. package/dist/ui/organisms/Dialog/DialogContent.d.ts +8 -0
  130. package/dist/ui/organisms/Dialog/DialogContext.d.ts +10 -0
  131. package/dist/ui/organisms/Dialog/DialogDescription.d.ts +4 -0
  132. package/dist/ui/organisms/Dialog/DialogFooter.d.ts +5 -0
  133. package/dist/ui/organisms/Dialog/DialogHeader.d.ts +5 -0
  134. package/dist/ui/organisms/Dialog/DialogProvider.d.ts +10 -0
  135. package/dist/ui/organisms/Dialog/DialogTitle.d.ts +5 -0
  136. package/dist/ui/organisms/Dialog/DialogTrigger.d.ts +6 -0
  137. package/dist/ui/organisms/Dialog/index.d.ts +22 -0
  138. package/dist/ui/organisms/Sidebar/Sidebar.d.ts +7 -4
  139. package/dist/ui/organisms/Sidebar/SidebarGroup/SidebarGroup.d.ts +27 -0
  140. package/dist/ui/organisms/Sidebar/SidebarGroup/SidebarGroup.stories.d.ts +11 -0
  141. package/dist/ui/organisms/Sidebar/SidebarGroup/SidebarGroup.test.d.ts +1 -0
  142. package/dist/ui/organisms/Sidebar/SidebarHeader/SidebarHeader.d.ts +19 -0
  143. package/dist/ui/organisms/Sidebar/SidebarHeader/SidebarHeader.test.d.ts +1 -0
  144. package/dist/ui/organisms/Sidebar/SidebarItem/SidebarItem.d.ts +23 -0
  145. package/dist/ui/organisms/Sidebar/SidebarItem/SidebarItem.stories.d.ts +10 -0
  146. package/dist/ui/organisms/Sidebar/SidebarItem/SidebarItem.test.d.ts +1 -0
  147. package/dist/ui/organisms/Sidebar/index.d.ts +8 -0
  148. package/dist/ui/organisms/Stepper/Stepper.d.ts +40 -0
  149. package/dist/ui/organisms/Stepper/Stepper.stories.d.ts +12 -0
  150. package/dist/ui/organisms/Stepper/Stepper.test.d.ts +1 -0
  151. package/dist/ui/organisms/Stepper/index.d.ts +2 -0
  152. package/dist/ui/organisms/Table/Table.d.ts +84 -16
  153. package/dist/ui/organisms/Table/Table.stories.d.ts +15 -0
  154. package/dist/ui/organisms/Table/TableActions/TableActions.d.ts +31 -0
  155. package/dist/ui/organisms/Table/TableActions/TableActions.stories.d.ts +7 -0
  156. package/dist/ui/organisms/Table/TableActions/TableActions.test.d.ts +1 -0
  157. package/dist/ui/organisms/Table/TableActions.d.ts +13 -0
  158. package/dist/ui/organisms/Table/TableBody.d.ts +12 -0
  159. package/dist/ui/organisms/Table/TableCell.d.ts +14 -0
  160. package/dist/ui/organisms/Table/TableContext.d.ts +75 -0
  161. package/dist/ui/organisms/Table/TableEmptyState.d.ts +11 -0
  162. package/dist/ui/organisms/Table/TableFilters/TableFilters.d.ts +37 -0
  163. package/dist/ui/organisms/Table/TableFilters/TableFilters.stories.d.ts +7 -0
  164. package/dist/ui/organisms/Table/TableFilters/TableFilters.test.d.ts +1 -0
  165. package/dist/ui/organisms/Table/TableFilters.d.ts +12 -0
  166. package/dist/ui/organisms/Table/TableHeader.d.ts +10 -0
  167. package/dist/ui/organisms/Table/TableHeaderCell.d.ts +18 -0
  168. package/dist/ui/organisms/Table/TableHeaderRow.d.ts +10 -0
  169. package/dist/ui/organisms/Table/TablePagination/TablePagination.d.ts +29 -0
  170. package/dist/ui/organisms/Table/TablePagination/TablePagination.stories.d.ts +8 -0
  171. package/dist/ui/organisms/Table/TablePagination/TablePagination.test.d.ts +1 -0
  172. package/dist/ui/organisms/Table/TablePagination.d.ts +14 -0
  173. package/dist/ui/organisms/Table/TableProvider.d.ts +55 -0
  174. package/dist/ui/organisms/Table/TableRow.d.ts +14 -0
  175. package/dist/ui/organisms/Table/TableTypes.d.ts +8 -0
  176. package/dist/ui/organisms/Table/index.d.ts +30 -0
  177. package/dist/ui/organisms/Table/useColumnResizing.d.ts +39 -0
  178. package/dist/ui/organisms/Table/useVirtualScrolling.d.ts +35 -0
  179. package/dist/ui/organisms/Timeline/Timeline.d.ts +34 -0
  180. package/dist/ui/organisms/Timeline/Timeline.stories.d.ts +12 -0
  181. package/dist/ui/organisms/Timeline/Timeline.test.d.ts +1 -0
  182. package/dist/ui/organisms/Timeline/index.d.ts +2 -0
  183. package/dist/ui/organisms/Toast/Toast.d.ts +8 -0
  184. package/dist/ui/organisms/Toast/Toast.stories.d.ts +14 -0
  185. package/dist/ui/organisms/Toast/Toast.test.d.ts +1 -0
  186. package/dist/ui/organisms/Toast/ToastContainer.d.ts +5 -0
  187. package/dist/ui/organisms/Toast/ToastContext.d.ts +21 -0
  188. package/dist/ui/organisms/Toast/ToastProvider.d.ts +7 -0
  189. package/dist/ui/organisms/Toast/index.d.ts +15 -0
  190. package/dist/ui/organisms/Toast/useToast.d.ts +35 -0
  191. package/dist/ui/organisms/index.d.ts +12 -2
  192. package/dist/ui/providers/AdvancedThemeProvider.d.ts +52 -0
  193. package/dist/ui/providers/index.d.ts +9 -0
  194. package/dist/ui/themes/ThemeBuilder.d.ts +28 -0
  195. package/dist/ui/themes/ThemeRegistry.d.ts +55 -0
  196. package/dist/ui/themes/index.d.ts +9 -0
  197. package/dist/ui/themes/types.d.ts +48 -0
  198. package/dist/ui/themes/utils.d.ts +21 -0
  199. package/dist/ui/tokens/TokenVisualizations.d.ts +41 -0
  200. package/dist/ui/tokens/animations.d.ts +65 -0
  201. package/dist/ui/tokens/borders.d.ts +61 -0
  202. package/dist/ui/tokens/gradients.d.ts +55 -0
  203. package/dist/ui/tokens/index.d.ts +31 -0
  204. package/dist/ui/tokens/opacity.d.ts +51 -0
  205. package/dist/ui/tokens/radius.d.ts +45 -0
  206. package/dist/ui/tokens/shadows.d.ts +42 -0
  207. package/dist/ui/tokens/themes/dark.d.ts +26 -26
  208. package/dist/ui/tokens/themes/light.d.ts +26 -26
  209. package/dist/ui/tokens/tokens.factory.d.ts +42 -0
  210. package/dist/ui/tokens/z-index.d.ts +44 -0
  211. package/dist/ui/utils/index.d.ts +6 -0
  212. package/package.json +50 -6
  213. package/src/docs/Accessibility.mdx +402 -0
  214. package/src/docs/BestPractices.mdx +315 -0
  215. package/src/docs/ComponentComposition.mdx +381 -0
  216. package/src/docs/ComponentStatus.mdx +177 -0
  217. package/src/docs/DesignSystem.mdx +121 -0
  218. package/src/docs/GettingStarted.mdx +284 -0
  219. package/src/docs/MigrationGuide.mdx +297 -0
  220. package/src/docs/Performance.mdx +206 -0
  221. package/src/docs/components/ComponentStatusTable.tsx +184 -0
  222. package/src/setupTests.ts +32 -0
  223. package/src/ui/atoms/Accordion/Accordion.stories.tsx +147 -0
  224. package/src/ui/atoms/Accordion/Accordion.test.tsx +86 -0
  225. package/src/ui/atoms/Accordion/Accordion.tsx +147 -0
  226. package/src/ui/atoms/Accordion/index.ts +2 -0
  227. package/src/ui/atoms/Avatar/Avatar.stories.tsx +226 -0
  228. package/src/ui/atoms/Avatar/Avatar.test.tsx +233 -0
  229. package/src/ui/atoms/Avatar/Avatar.tsx +128 -0
  230. package/src/ui/atoms/Avatar/AvatarGroup.tsx +96 -0
  231. package/src/ui/atoms/Avatar/index.ts +11 -0
  232. package/src/ui/atoms/Badge/Badge.stories.tsx +65 -56
  233. package/src/ui/atoms/Badge/Badge.test.tsx +27 -50
  234. package/src/ui/atoms/Badge/Badge.tsx +70 -27
  235. package/src/ui/atoms/BoxWrapper/BoxWrapper.stories.tsx +1 -1
  236. package/src/ui/atoms/BoxWrapper/BoxWrapper.test.tsx +27 -0
  237. package/src/ui/atoms/BoxWrapper/BoxWrapper.tsx +5 -2
  238. package/src/ui/atoms/Button/Button.stories.tsx +130 -1
  239. package/src/ui/atoms/Button/Button.test.tsx +233 -0
  240. package/src/ui/atoms/Button/Button.tsx +160 -53
  241. package/src/ui/atoms/Checkbox/Checkbox.tsx +14 -1
  242. package/src/ui/atoms/Collapsible/Collapsible.stories.tsx +47 -1
  243. package/src/ui/atoms/Collapsible/Collapsible.test.tsx +36 -24
  244. package/src/ui/atoms/Collapsible/Collapsible.tsx +9 -1
  245. package/src/ui/atoms/ErrorMessage/ErrorMessage.stories.tsx +1 -1
  246. package/src/ui/atoms/Info/Info.stories.tsx +1 -1
  247. package/src/ui/atoms/Info/Info.test.tsx +45 -0
  248. package/src/ui/atoms/Info/Info.tsx +2 -2
  249. package/src/ui/atoms/Input/Input.stories.tsx +80 -0
  250. package/src/ui/atoms/Input/Input.test.tsx +190 -36
  251. package/src/ui/atoms/Input/Input.tsx +144 -25
  252. package/src/ui/atoms/Label/Label.stories.tsx +1 -1
  253. package/src/ui/atoms/NavLink/NavLink.stories.tsx +1 -1
  254. package/src/ui/atoms/Popover/Popover.stories.tsx +157 -0
  255. package/src/ui/atoms/Popover/Popover.test.tsx +80 -0
  256. package/src/ui/atoms/Popover/Popover.tsx +256 -0
  257. package/src/ui/atoms/Popover/index.ts +2 -0
  258. package/src/ui/atoms/Progress/Progress.css +17 -0
  259. package/src/ui/atoms/Progress/Progress.stories.tsx +170 -0
  260. package/src/ui/atoms/Progress/Progress.test.tsx +134 -0
  261. package/src/ui/atoms/Progress/Progress.tsx +138 -0
  262. package/src/ui/atoms/Radio/Radio.tsx +1 -1
  263. package/src/ui/atoms/Select/Select.stories.tsx +93 -58
  264. package/src/ui/atoms/Select/Select.test.tsx +162 -46
  265. package/src/ui/atoms/Select/Select.tsx +142 -44
  266. package/src/ui/atoms/Separator/Separator.stories.tsx +88 -0
  267. package/src/ui/atoms/Separator/Separator.test.tsx +34 -0
  268. package/src/ui/atoms/Separator/Separator.tsx +81 -0
  269. package/src/ui/atoms/Separator/index.ts +2 -0
  270. package/src/ui/atoms/Skeleton/Skeleton.stories.tsx +62 -0
  271. package/src/ui/atoms/Skeleton/Skeleton.tsx +19 -2
  272. package/src/ui/atoms/Slider/Slider.stories.tsx +205 -0
  273. package/src/ui/atoms/Slider/Slider.test.tsx +53 -0
  274. package/src/ui/atoms/Slider/Slider.tsx +307 -0
  275. package/src/ui/atoms/Slider/index.ts +2 -0
  276. package/src/ui/atoms/Spinner/Spinner.stories.tsx +56 -0
  277. package/src/ui/atoms/Spinner/Spinner.test.tsx +35 -0
  278. package/src/ui/atoms/Spinner/Spinner.tsx +88 -0
  279. package/src/ui/atoms/Switch/Switch.stories.tsx +182 -0
  280. package/src/ui/atoms/Switch/Switch.test.tsx +90 -0
  281. package/src/ui/atoms/Switch/Switch.tsx +181 -0
  282. package/src/ui/atoms/Switch/index.ts +2 -0
  283. package/src/ui/atoms/Text/Text.stories.tsx +1 -1
  284. package/src/ui/atoms/Text/Text.test.tsx +48 -32
  285. package/src/ui/atoms/Textarea/Textarea.stories.tsx +1 -1
  286. package/src/ui/atoms/Tooltip/Tooltip.stories.tsx +44 -0
  287. package/src/ui/atoms/Tooltip/Tooltip.tsx +94 -6
  288. package/src/ui/atoms/index.ts +27 -4
  289. package/src/ui/index.ts +6 -1
  290. package/src/ui/molecules/Breadcrumb/Breadcrumb.stories.tsx +1 -1
  291. package/src/ui/molecules/Breadcrumb/Breadcrumb.tsx +1 -1
  292. package/src/ui/molecules/Card/Card.stories.tsx +49 -1
  293. package/src/ui/molecules/Card/Card.tsx +40 -5
  294. package/src/ui/molecules/ColorPicker/ColorPicker.stories.tsx +156 -0
  295. package/src/ui/molecules/ColorPicker/ColorPicker.test.tsx +47 -0
  296. package/src/ui/molecules/ColorPicker/ColorPicker.tsx +271 -0
  297. package/src/ui/molecules/ColorPicker/index.ts +2 -0
  298. package/src/ui/molecules/DatePicker/DatePicker.mdx +150 -0
  299. package/src/ui/molecules/DatePicker/DatePicker.stories.tsx +188 -0
  300. package/src/ui/molecules/DatePicker/DatePicker.test.tsx +381 -0
  301. package/src/ui/molecules/DatePicker/DatePicker.tsx +231 -0
  302. package/src/ui/molecules/DatePicker/DatePickerCalendar.tsx +277 -0
  303. package/src/ui/molecules/DatePicker/DatePickerContext.tsx +39 -0
  304. package/src/ui/molecules/DatePicker/DatePickerInput.tsx +147 -0
  305. package/src/ui/molecules/DatePicker/DatePickerProvider.tsx +100 -0
  306. package/src/ui/molecules/DatePicker/index.ts +16 -0
  307. package/src/ui/molecules/Dropdown/Dropdown.stories.tsx +50 -8
  308. package/src/ui/molecules/Dropdown/Dropdown.test.tsx +272 -12
  309. package/src/ui/molecules/Dropdown/Dropdown.tsx +176 -10
  310. package/src/ui/molecules/EmptyState/EmptyState.stories.tsx +24 -2
  311. package/src/ui/molecules/EmptyState/EmptyState.tsx +9 -3
  312. package/src/ui/molecules/FileUpload/FileUpload.stories.tsx +177 -0
  313. package/src/ui/molecules/FileUpload/FileUpload.test.tsx +114 -0
  314. package/src/ui/molecules/FileUpload/FileUpload.tsx +312 -0
  315. package/src/ui/molecules/FileUpload/index.ts +2 -0
  316. package/src/ui/molecules/Form/Form.mdx +145 -0
  317. package/src/ui/molecules/Form/Form.stories.tsx +121 -1
  318. package/src/ui/molecules/Form/Form.test.tsx +1 -3
  319. package/src/ui/molecules/Form/Form.tsx +95 -15
  320. package/src/ui/molecules/Form/FormContext.tsx +35 -0
  321. package/src/ui/molecules/Form/FormField.tsx +83 -0
  322. package/src/ui/molecules/Form/FormProvider.tsx +34 -0
  323. package/src/ui/molecules/Form/index.ts +21 -0
  324. package/src/ui/molecules/Form/useFormFieldArray.ts +46 -0
  325. package/src/ui/molecules/InputWithLabel/InputWithLabel.stories.tsx +1 -1
  326. package/src/ui/molecules/InputWithLabel/InputWithLabel.test.tsx +44 -0
  327. package/src/ui/molecules/InputWithLabel/InputWithLabel.tsx +3 -1
  328. package/src/ui/molecules/NavbarGroup/NavbarGroup.stories.tsx +1 -1
  329. package/src/ui/molecules/Pagination/Pagination.stories.tsx +1 -1
  330. package/src/ui/molecules/Rating/Rating.stories.tsx +206 -0
  331. package/src/ui/molecules/Rating/Rating.test.tsx +60 -0
  332. package/src/ui/molecules/Rating/Rating.tsx +173 -0
  333. package/src/ui/molecules/Rating/index.ts +2 -0
  334. package/src/ui/molecules/SearchInput/SearchInput.stories.tsx +146 -0
  335. package/src/ui/molecules/SearchInput/SearchInput.test.tsx +82 -0
  336. package/src/ui/molecules/SearchInput/SearchInput.tsx +133 -0
  337. package/src/ui/molecules/SearchInput/index.ts +2 -0
  338. package/src/ui/molecules/Tabs/Tabs.stories.tsx +229 -0
  339. package/src/ui/molecules/Tabs/Tabs.test.tsx +497 -0
  340. package/src/ui/molecules/Tabs/Tabs.tsx +58 -0
  341. package/src/ui/molecules/Tabs/TabsContent.tsx +50 -0
  342. package/src/ui/molecules/Tabs/TabsContext.tsx +36 -0
  343. package/src/ui/molecules/Tabs/TabsList.tsx +98 -0
  344. package/src/ui/molecules/Tabs/TabsProvider.tsx +53 -0
  345. package/src/ui/molecules/Tabs/TabsTrigger.tsx +111 -0
  346. package/src/ui/molecules/Tabs/index.ts +23 -0
  347. package/src/ui/molecules/TimePicker/TimePicker.stories.tsx +145 -0
  348. package/src/ui/molecules/TimePicker/TimePicker.test.tsx +41 -0
  349. package/src/ui/molecules/TimePicker/TimePicker.tsx +264 -0
  350. package/src/ui/molecules/TimePicker/index.ts +2 -0
  351. package/src/ui/molecules/index.ts +20 -7
  352. package/src/ui/organisms/CommandPalette/CommandPalette.stories.tsx +218 -0
  353. package/src/ui/organisms/CommandPalette/CommandPalette.test.tsx +85 -0
  354. package/src/ui/organisms/CommandPalette/CommandPalette.tsx +333 -0
  355. package/src/ui/organisms/CommandPalette/index.ts +2 -0
  356. package/src/ui/organisms/DataGrid/DataGrid.stories.tsx +196 -0
  357. package/src/ui/organisms/DataGrid/DataGrid.test.tsx +53 -0
  358. package/src/ui/organisms/DataGrid/DataGrid.tsx +294 -0
  359. package/src/ui/organisms/DataGrid/index.ts +2 -0
  360. package/src/ui/organisms/Dialog/AlertDialog.tsx +92 -0
  361. package/src/ui/organisms/Dialog/Dialog.mdx +200 -0
  362. package/src/ui/organisms/Dialog/Dialog.stories.tsx +226 -0
  363. package/src/ui/organisms/Dialog/Dialog.test.tsx +435 -0
  364. package/src/ui/organisms/Dialog/Dialog.tsx +79 -0
  365. package/src/ui/organisms/Dialog/DialogClose.tsx +45 -0
  366. package/src/ui/organisms/Dialog/DialogContent.tsx +149 -0
  367. package/src/ui/organisms/Dialog/DialogContext.tsx +25 -0
  368. package/src/ui/organisms/Dialog/DialogDescription.tsx +28 -0
  369. package/src/ui/organisms/Dialog/DialogFooter.tsx +18 -0
  370. package/src/ui/organisms/Dialog/DialogHeader.tsx +18 -0
  371. package/src/ui/organisms/Dialog/DialogProvider.tsx +73 -0
  372. package/src/ui/organisms/Dialog/DialogTitle.tsx +31 -0
  373. package/src/ui/organisms/Dialog/DialogTrigger.tsx +34 -0
  374. package/src/ui/organisms/Dialog/index.ts +24 -0
  375. package/src/ui/organisms/LoginBox/LoginBox.stories.tsx +1 -1
  376. package/src/ui/organisms/Modal/Modal.stories.tsx +2 -2
  377. package/src/ui/organisms/Modal/Modal.test.tsx +1 -1
  378. package/src/ui/organisms/Sidebar/Sidebar.stories.tsx +1 -1
  379. package/src/ui/organisms/Sidebar/Sidebar.test.tsx +5 -3
  380. package/src/ui/organisms/Sidebar/Sidebar.tsx +21 -6
  381. package/src/ui/{molecules → organisms/Sidebar}/SidebarGroup/SidebarGroup.stories.tsx +2 -2
  382. package/src/ui/{molecules → organisms/Sidebar}/SidebarGroup/SidebarGroup.test.tsx +32 -9
  383. package/src/ui/{molecules → organisms/Sidebar}/SidebarGroup/SidebarGroup.tsx +7 -7
  384. package/src/ui/organisms/Sidebar/SidebarHeader/SidebarHeader.test.tsx +66 -0
  385. package/src/ui/{molecules → organisms/Sidebar}/SidebarHeader/SidebarHeader.tsx +1 -2
  386. package/src/ui/{atoms → organisms/Sidebar}/SidebarItem/SidebarItem.stories.tsx +1 -1
  387. package/src/ui/{atoms → organisms/Sidebar}/SidebarItem/SidebarItem.test.tsx +9 -8
  388. package/src/ui/{atoms → organisms/Sidebar}/SidebarItem/SidebarItem.tsx +9 -3
  389. package/src/ui/organisms/Sidebar/index.ts +13 -0
  390. package/src/ui/organisms/Stepper/Stepper.stories.tsx +253 -0
  391. package/src/ui/organisms/Stepper/Stepper.test.tsx +76 -0
  392. package/src/ui/organisms/Stepper/Stepper.tsx +323 -0
  393. package/src/ui/organisms/Stepper/index.ts +2 -0
  394. package/src/ui/organisms/Table/Table.mdx +154 -0
  395. package/src/ui/organisms/Table/Table.stories.tsx +614 -4
  396. package/src/ui/organisms/Table/Table.test.tsx +86 -4
  397. package/src/ui/organisms/Table/Table.tsx +215 -99
  398. package/src/ui/organisms/Table/TableActions/TableActions.stories.tsx +88 -0
  399. package/src/ui/organisms/Table/TableActions/TableActions.test.tsx +64 -0
  400. package/src/ui/organisms/Table/TableActions/TableActions.tsx +71 -0
  401. package/src/ui/organisms/Table/TableActions.tsx +46 -0
  402. package/src/ui/organisms/Table/TableBody.tsx +137 -0
  403. package/src/ui/organisms/Table/TableCell.tsx +36 -0
  404. package/src/ui/organisms/Table/TableContext.tsx +111 -0
  405. package/src/ui/organisms/Table/TableEmptyState.tsx +51 -0
  406. package/src/ui/organisms/Table/TableFilters/TableFilters.stories.tsx +111 -0
  407. package/src/ui/organisms/Table/TableFilters/TableFilters.test.tsx +104 -0
  408. package/src/ui/organisms/Table/TableFilters/TableFilters.tsx +191 -0
  409. package/src/ui/organisms/Table/TableFilters.tsx +39 -0
  410. package/src/ui/organisms/Table/TableHeader.tsx +29 -0
  411. package/src/ui/organisms/Table/TableHeaderCell.tsx +142 -0
  412. package/src/ui/organisms/Table/TableHeaderRow.tsx +72 -0
  413. package/src/ui/organisms/Table/TablePagination/TablePagination.stories.tsx +87 -0
  414. package/src/ui/organisms/Table/TablePagination/TablePagination.test.tsx +90 -0
  415. package/src/ui/organisms/Table/TablePagination/TablePagination.tsx +207 -0
  416. package/src/ui/organisms/Table/TablePagination.tsx +48 -0
  417. package/src/ui/organisms/Table/TableProvider.tsx +429 -0
  418. package/src/ui/organisms/Table/TableRow.tsx +85 -0
  419. package/src/ui/organisms/Table/TableTypes.ts +11 -0
  420. package/src/ui/organisms/Table/index.ts +55 -0
  421. package/src/ui/organisms/Table/useColumnResizing.ts +134 -0
  422. package/src/ui/organisms/Table/useVirtualScrolling.ts +116 -0
  423. package/src/ui/organisms/Timeline/Timeline.stories.tsx +230 -0
  424. package/src/ui/organisms/Timeline/Timeline.test.tsx +47 -0
  425. package/src/ui/organisms/Timeline/Timeline.tsx +179 -0
  426. package/src/ui/organisms/Timeline/index.ts +2 -0
  427. package/src/ui/organisms/Toast/Toast.stories.tsx +169 -0
  428. package/src/ui/organisms/Toast/Toast.test.tsx +537 -0
  429. package/src/ui/organisms/Toast/Toast.tsx +144 -0
  430. package/src/ui/organisms/Toast/ToastContainer.tsx +54 -0
  431. package/src/ui/organisms/Toast/ToastContext.tsx +38 -0
  432. package/src/ui/organisms/Toast/ToastProvider.tsx +56 -0
  433. package/src/ui/organisms/Toast/index.ts +17 -0
  434. package/src/ui/organisms/Toast/useToast.ts +70 -0
  435. package/src/ui/organisms/index.ts +17 -2
  436. package/src/ui/providers/AdvancedThemeProvider.tsx +229 -0
  437. package/src/ui/providers/index.ts +14 -0
  438. package/src/ui/themes/README.md +281 -0
  439. package/src/ui/themes/ThemeBuilder.ts +149 -0
  440. package/src/ui/themes/ThemeRegistry.ts +187 -0
  441. package/src/ui/themes/index.ts +20 -0
  442. package/src/ui/themes/types.ts +53 -0
  443. package/src/ui/themes/utils.ts +70 -0
  444. package/src/ui/tokens/README.md +212 -0
  445. package/src/ui/tokens/TokenVisualizations.tsx +273 -0
  446. package/src/ui/tokens/Tokens.mdx +348 -0
  447. package/src/ui/tokens/animations.ts +157 -0
  448. package/src/ui/tokens/borders.ts +121 -0
  449. package/src/ui/tokens/gradients.ts +154 -0
  450. package/src/ui/tokens/index.ts +57 -0
  451. package/src/ui/tokens/opacity.ts +107 -0
  452. package/src/ui/tokens/radius.ts +107 -0
  453. package/src/ui/tokens/shadows.ts +92 -0
  454. package/src/ui/tokens/tokens.factory.ts +124 -0
  455. package/src/ui/tokens/z-index.ts +113 -0
  456. package/src/ui/utils/index.ts +10 -0
  457. package/src/App.css +0 -42
  458. package/src/App.tsx +0 -35
  459. package/src/index.css +0 -68
  460. package/src/main.tsx +0 -15
@@ -0,0 +1,128 @@
1
+ 'use client';
2
+
3
+ import { useState, type HTMLAttributes, ReactNode } from 'react';
4
+ import { getColorClass, getRadiusClass } from '../../tokens';
5
+
6
+ export type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
7
+
8
+ export interface AvatarProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {
9
+ src?: string;
10
+ alt?: string;
11
+ fallback?: string | ReactNode;
12
+ size?: AvatarSize;
13
+ variant?: 'circle' | 'square' | 'rounded';
14
+ 'aria-label'?: string;
15
+ }
16
+
17
+ /**
18
+ * Avatar Component
19
+ *
20
+ * A versatile avatar component for displaying user profile images or initials.
21
+ * Supports fallback display when image fails to load or is not provided.
22
+ * Fully accessible with ARIA attributes.
23
+ *
24
+ * @example
25
+ * ```tsx
26
+ * // With image
27
+ * <Avatar src="/user.jpg" alt="John Doe" />
28
+ *
29
+ * // With fallback initials
30
+ * <Avatar fallback="JD" alt="John Doe" />
31
+ *
32
+ * // Custom size
33
+ * <Avatar src="/user.jpg" size="lg" />
34
+ * ```
35
+ */
36
+ export default function Avatar({
37
+ src,
38
+ alt,
39
+ fallback,
40
+ size = 'md',
41
+ variant = 'circle',
42
+ 'aria-label': ariaLabel,
43
+ className = '',
44
+ ...props
45
+ }: AvatarProps) {
46
+ const [imageError, setImageError] = useState(false);
47
+ const [imageLoaded, setImageLoaded] = useState(false);
48
+
49
+ const sizeClasses: Record<AvatarSize, string> = {
50
+ xs: 'h-6 w-6 text-xs',
51
+ sm: 'h-8 w-8 text-sm',
52
+ md: 'h-10 w-10 text-base',
53
+ lg: 'h-12 w-12 text-lg',
54
+ xl: 'h-16 w-16 text-xl',
55
+ };
56
+
57
+ const variantClasses = {
58
+ circle: getRadiusClass('full'),
59
+ square: getRadiusClass('none'),
60
+ rounded: getRadiusClass('md'),
61
+ };
62
+
63
+ const showFallback = !src || imageError;
64
+ const displayFallback = typeof fallback === 'string'
65
+ ? fallback.toUpperCase().slice(0, 2)
66
+ : fallback;
67
+
68
+ const defaultAriaLabel = ariaLabel || alt || 'User avatar';
69
+
70
+ return (
71
+ <div
72
+ className={`
73
+ relative
74
+ inline-flex
75
+ items-center
76
+ justify-center
77
+ flex-shrink-0
78
+ ${sizeClasses[size]}
79
+ ${variantClasses[variant]}
80
+ ${getColorClass('neutral', 'light', 'bg')}
81
+ ${getColorClass('neutral', 'dark', 'text')}
82
+ font-medium
83
+ overflow-hidden
84
+ ${className}
85
+ `}
86
+ role="img"
87
+ aria-label={defaultAriaLabel}
88
+ {...props}
89
+ >
90
+ {!showFallback && src && (
91
+ <img
92
+ src={src}
93
+ alt={alt || ''}
94
+ className={`
95
+ w-full
96
+ h-full
97
+ object-cover
98
+ ${variantClasses[variant]}
99
+ ${!imageLoaded ? 'opacity-0' : 'opacity-100'}
100
+ transition-opacity
101
+ duration-200
102
+ `}
103
+ onLoad={() => setImageLoaded(true)}
104
+ onError={() => {
105
+ setImageError(true);
106
+ setImageLoaded(false);
107
+ }}
108
+ aria-hidden="true"
109
+ />
110
+ )}
111
+ {showFallback && (
112
+ <span
113
+ className={`
114
+ flex
115
+ items-center
116
+ justify-center
117
+ w-full
118
+ h-full
119
+ ${variantClasses[variant]}
120
+ `}
121
+ aria-hidden="true"
122
+ >
123
+ {displayFallback || '?'}
124
+ </span>
125
+ )}
126
+ </div>
127
+ );
128
+ }
@@ -0,0 +1,96 @@
1
+ 'use client';
2
+
3
+ import { Children, type HTMLAttributes, ReactNode, isValidElement, cloneElement } from 'react';
4
+ import Avatar, { type AvatarProps } from './Avatar';
5
+
6
+ export interface AvatarGroupProps extends HTMLAttributes<HTMLDivElement> {
7
+ children: ReactNode;
8
+ max?: number; // Maximum number of avatars to show before collapsing
9
+ size?: AvatarProps['size'];
10
+ variant?: AvatarProps['variant'];
11
+ spacing?: 'none' | 'sm' | 'md' | 'lg'; // Negative margin between avatares
12
+ }
13
+
14
+ /**
15
+ * AvatarGroup Component
16
+ *
17
+ * Container for displaying multiple avatars in a group.
18
+ * Supports collapsing when there are too many avatars.
19
+ *
20
+ * @example
21
+ * ```tsx
22
+ * <AvatarGroup max={3}>
23
+ * <Avatar src="/user1.jpg" alt="User 1" />
24
+ * <Avatar src="/user2.jpg" alt="User 2" />
25
+ * <Avatar src="/user3.jpg" alt="User 3" />
26
+ * <Avatar src="/user4.jpg" alt="User 4" />
27
+ * </AvatarGroup>
28
+ * ```
29
+ */
30
+ export function AvatarGroup({
31
+ children,
32
+ max = 3,
33
+ size = 'md',
34
+ variant = 'circle',
35
+ spacing = 'md',
36
+ className = '',
37
+ ...props
38
+ }: AvatarGroupProps) {
39
+ const spacingClasses = {
40
+ none: '',
41
+ sm: '-space-x-1',
42
+ md: '-space-x-2',
43
+ lg: '-space-x-3',
44
+ };
45
+
46
+ // Convert children to array and filter out null/undefined
47
+ const avatars = Children.toArray(children).filter(Boolean);
48
+ const visibleAvatars = avatars.slice(0, max);
49
+ const remainingCount = avatars.length - max;
50
+
51
+ return (
52
+ <div
53
+ className={`
54
+ flex
55
+ items-center
56
+ ${spacingClasses[spacing]}
57
+ ${className}
58
+ `}
59
+ role="group"
60
+ aria-label={`${avatars.length} avatars`}
61
+ {...props}
62
+ >
63
+ {visibleAvatars.map((avatar, index) => {
64
+ // Clone avatar with consistent size and variant if needed
65
+ let avatarElement = avatar;
66
+ if (isValidElement(avatar) && avatar.type === Avatar) {
67
+ const avatarProps = avatar.props as AvatarProps;
68
+ avatarElement = cloneElement(avatar as React.ReactElement<AvatarProps>, {
69
+ size: avatarProps.size || size,
70
+ variant: avatarProps.variant || variant,
71
+ });
72
+ }
73
+
74
+ return (
75
+ <div
76
+ key={index}
77
+ className="ring-2 ring-white"
78
+ style={{ zIndex: avatars.length - index }}
79
+ >
80
+ {avatarElement}
81
+ </div>
82
+ );
83
+ })}
84
+ {remainingCount > 0 && (
85
+ <Avatar
86
+ size={size}
87
+ variant={variant}
88
+ fallback={`+${remainingCount}`}
89
+ aria-label={`${remainingCount} more avatars`}
90
+ className="ring-2 ring-white"
91
+ style={{ zIndex: 0 }}
92
+ />
93
+ )}
94
+ </div>
95
+ );
96
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Avatar Components
3
+ *
4
+ * Avatar component with fallback, sizes, and group support.
5
+ */
6
+
7
+ export { default as Avatar } from './Avatar';
8
+ export type { AvatarProps, AvatarSize } from './Avatar';
9
+
10
+ export { AvatarGroup } from './AvatarGroup';
11
+ export type { AvatarGroupProps } from './AvatarGroup';
@@ -1,86 +1,95 @@
1
- import type { Meta, StoryObj } from "@storybook/react";
2
- import Badge from "./Badge";
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import Badge from './Badge';
3
3
 
4
4
  const meta: Meta<typeof Badge> = {
5
- title: "UI/Atoms/Badge",
5
+ title: 'Atoms/Badge',
6
6
  component: Badge,
7
- parameters: {
8
- docs: {
9
- description: {
10
- component: "A versatile badge component for displaying status, priority, and other labels. Supports multiple variants: success, warning, error, info, and neutral.",
11
- },
12
- },
13
- },
7
+ tags: ['autodocs'],
14
8
  argTypes: {
15
9
  variant: {
16
- control: "select",
17
- options: ["success", "warning", "error", "info", "neutral"],
18
- description: "Visual variant of the badge",
10
+ control: 'select',
11
+ options: ['success', 'warning', 'error', 'info', 'neutral', 'primary', 'secondary'],
19
12
  },
20
- children: {
21
- control: "text",
22
- description: "Content to display inside the badge",
13
+ size: {
14
+ control: 'select',
15
+ options: ['sm', 'md', 'lg'],
16
+ },
17
+ style: {
18
+ control: 'select',
19
+ options: ['solid', 'outline'],
23
20
  },
24
21
  },
25
22
  };
26
23
 
27
- export const Success: StoryObj<typeof Badge> = {
28
- args: {
29
- children: "Success",
30
- variant: "success",
31
- },
32
- };
33
-
34
- export const Warning: StoryObj<typeof Badge> = {
35
- args: {
36
- children: "Warning",
37
- variant: "warning",
38
- },
39
- };
40
-
41
- export const Error: StoryObj<typeof Badge> = {
42
- args: {
43
- children: "Error",
44
- variant: "error",
45
- },
46
- };
47
-
48
- export const Info: StoryObj<typeof Badge> = {
49
- args: {
50
- children: "Info",
51
- variant: "info",
52
- },
53
- };
24
+ export default meta;
25
+ type Story = StoryObj<typeof Badge>;
54
26
 
55
- export const Neutral: StoryObj<typeof Badge> = {
27
+ export const Default: Story = {
56
28
  args: {
57
- children: "Neutral",
58
- variant: "neutral",
29
+ children: 'Badge',
59
30
  },
60
31
  };
61
32
 
62
- export const AllVariants: StoryObj<typeof Badge> = {
33
+ export const Variants: Story = {
63
34
  render: () => (
64
- <div className="flex gap-2 flex-wrap">
35
+ <div className="flex flex-wrap gap-2">
65
36
  <Badge variant="success">Success</Badge>
66
37
  <Badge variant="warning">Warning</Badge>
67
38
  <Badge variant="error">Error</Badge>
68
39
  <Badge variant="info">Info</Badge>
69
40
  <Badge variant="neutral">Neutral</Badge>
41
+ <Badge variant="primary">Primary</Badge>
42
+ <Badge variant="secondary">Secondary</Badge>
70
43
  </div>
71
44
  ),
72
45
  };
73
46
 
74
- export const WithCustomContent: StoryObj<typeof Badge> = {
47
+ export const Sizes: Story = {
75
48
  render: () => (
76
- <div className="flex gap-2 flex-wrap">
77
- <Badge variant="success">Active</Badge>
78
- <Badge variant="error">Critical</Badge>
79
- <Badge variant="warning">Pending</Badge>
80
- <Badge variant="info">New</Badge>
81
- <Badge variant="neutral">Draft</Badge>
49
+ <div className="flex items-center gap-2">
50
+ <Badge size="sm">Small</Badge>
51
+ <Badge size="md">Medium</Badge>
52
+ <Badge size="lg">Large</Badge>
82
53
  </div>
83
54
  ),
84
55
  };
85
56
 
86
- export default meta;
57
+ export const Styles: Story = {
58
+ render: () => (
59
+ <div className="flex flex-wrap gap-2">
60
+ <Badge variant="success" style="solid">Solid</Badge>
61
+ <Badge variant="success" style="outline">Outline</Badge>
62
+ <Badge variant="error" style="solid">Solid</Badge>
63
+ <Badge variant="error" style="outline">Outline</Badge>
64
+ <Badge variant="info" style="solid">Solid</Badge>
65
+ <Badge variant="info" style="outline">Outline</Badge>
66
+ </div>
67
+ ),
68
+ };
69
+
70
+ export const AllCombinations: Story = {
71
+ render: () => (
72
+ <div className="space-y-4">
73
+ <div>
74
+ <h3 className="text-sm font-medium mb-2">Solid Style</h3>
75
+ <div className="flex flex-wrap gap-2">
76
+ <Badge variant="success" size="sm">Success</Badge>
77
+ <Badge variant="warning" size="md">Warning</Badge>
78
+ <Badge variant="error" size="lg">Error</Badge>
79
+ <Badge variant="info" size="md">Info</Badge>
80
+ <Badge variant="primary" size="md">Primary</Badge>
81
+ </div>
82
+ </div>
83
+ <div>
84
+ <h3 className="text-sm font-medium mb-2">Outline Style</h3>
85
+ <div className="flex flex-wrap gap-2">
86
+ <Badge variant="success" style="outline" size="sm">Success</Badge>
87
+ <Badge variant="warning" style="outline" size="md">Warning</Badge>
88
+ <Badge variant="error" style="outline" size="lg">Error</Badge>
89
+ <Badge variant="info" style="outline" size="md">Info</Badge>
90
+ <Badge variant="primary" style="outline" size="md">Primary</Badge>
91
+ </div>
92
+ </div>
93
+ </div>
94
+ ),
95
+ };
@@ -1,63 +1,40 @@
1
- import { describe, it, expect } from "vitest";
2
- import { render, screen } from "@testing-library/react";
3
- import Badge from "./Badge";
1
+ import { describe, it, expect } from 'vitest';
2
+ import { render, screen } from '@testing-library/react';
3
+ import Badge from './Badge';
4
4
 
5
- describe("Badge", () => {
6
- it("renders with default variant", () => {
7
- render(<Badge>Test Badge</Badge>);
8
- const badge = screen.getByText("Test Badge");
9
- expect(badge).toBeInTheDocument();
10
- expect(badge).toHaveClass("bg-gray-100");
11
- });
12
-
13
- it("renders with success variant", () => {
14
- render(<Badge variant="success">Success</Badge>);
15
- const badge = screen.getByText("Success");
16
- expect(badge).toHaveClass("bg-green-100", "text-green-800", "border-green-500");
17
- });
18
-
19
- it("renders with warning variant", () => {
20
- render(<Badge variant="warning">Warning</Badge>);
21
- const badge = screen.getByText("Warning");
22
- expect(badge).toHaveClass("bg-yellow-100", "text-yellow-800", "border-yellow-500");
5
+ describe('Badge', () => {
6
+ it('renders badge with text', () => {
7
+ render(<Badge>Status</Badge>);
8
+ expect(screen.getByText('Status')).toBeInTheDocument();
23
9
  });
24
10
 
25
- it("renders with error variant", () => {
26
- render(<Badge variant="error">Error</Badge>);
27
- const badge = screen.getByText("Error");
28
- expect(badge).toHaveClass("bg-red-100", "text-red-800", "border-red-500");
11
+ it('applies variant classes', () => {
12
+ const { container } = render(<Badge variant="success">Active</Badge>);
13
+ const badge = container.querySelector('span');
14
+ expect(badge).toHaveClass('bg-green-300');
29
15
  });
30
16
 
31
- it("renders with info variant", () => {
32
- render(<Badge variant="info">Info</Badge>);
33
- const badge = screen.getByText("Info");
34
- expect(badge).toHaveClass("bg-blue-100", "text-blue-800", "border-blue-500");
17
+ it('applies size classes', () => {
18
+ const { container } = render(<Badge size="sm">Small</Badge>);
19
+ const badge = container.querySelector('span');
20
+ expect(badge).toHaveClass('px-1.5', 'py-0.5', 'text-xs');
35
21
  });
36
22
 
37
- it("renders with neutral variant", () => {
38
- render(<Badge variant="neutral">Neutral</Badge>);
39
- const badge = screen.getByText("Neutral");
40
- expect(badge).toHaveClass("bg-gray-100", "text-gray-800", "border-gray-500");
23
+ it('applies outline style', () => {
24
+ const { container } = render(<Badge variant="success" style="outline">Outline</Badge>);
25
+ const badge = container.querySelector('span');
26
+ expect(badge).toHaveClass('bg-transparent');
41
27
  });
42
28
 
43
- it("applies custom className", () => {
44
- render(<Badge className="custom-class">Test</Badge>);
45
- const badge = screen.getByText("Test");
46
- expect(badge).toHaveClass("custom-class");
47
- });
48
-
49
- it("has accessible role and aria-label for string children", () => {
50
- render(<Badge>Accessible Badge</Badge>);
51
- const badge = screen.getByRole("status");
52
- expect(badge).toHaveAttribute("aria-label", "Accessible Badge");
29
+ it('has correct aria-label when children is string', () => {
30
+ render(<Badge>Status</Badge>);
31
+ const badge = screen.getByLabelText('Status');
32
+ expect(badge).toBeInTheDocument();
53
33
  });
54
34
 
55
- it("renders with custom children", () => {
56
- render(
57
- <Badge>
58
- <span>Custom Content</span>
59
- </Badge>
60
- );
61
- expect(screen.getByText("Custom Content")).toBeInTheDocument();
35
+ it('has role="status"', () => {
36
+ render(<Badge>Status</Badge>);
37
+ const badge = screen.getByRole('status');
38
+ expect(badge).toBeInTheDocument();
62
39
  });
63
40
  });
@@ -1,7 +1,18 @@
1
- import type { HTMLAttributes } from "react";
1
+ 'use client';
2
2
 
3
- interface Props extends HTMLAttributes<HTMLSpanElement> {
4
- variant?: "success" | "warning" | "error" | "info" | "neutral";
3
+ import { memo, useMemo } from 'react';
4
+ import type { HTMLAttributes, ReactNode } from 'react';
5
+ import { getColorClass } from '../../tokens/colors';
6
+
7
+ export type BadgeVariant = 'success' | 'warning' | 'error' | 'info' | 'neutral' | 'primary' | 'secondary';
8
+ export type BadgeSize = 'sm' | 'md' | 'lg';
9
+ export type BadgeStyle = 'solid' | 'outline';
10
+
11
+ export interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {
12
+ variant?: BadgeVariant;
13
+ size?: BadgeSize;
14
+ style?: BadgeStyle;
15
+ children: ReactNode;
5
16
  }
6
17
 
7
18
  /**
@@ -9,52 +20,84 @@ interface Props extends HTMLAttributes<HTMLSpanElement> {
9
20
  *
10
21
  * A versatile badge component for displaying status, priority, and other labels.
11
22
  * Follows Atomic Design principles as an Atom component.
23
+ * Uses tokens for consistent theming.
12
24
  *
13
25
  * @example
14
26
  * ```tsx
15
27
  * <Badge variant="success">Active</Badge>
16
- * <Badge variant="error">Critical</Badge>
28
+ * <Badge variant="error" size="lg">Critical</Badge>
29
+ * <Badge variant="info" style="outline">New</Badge>
17
30
  * ```
18
31
  */
19
- export default function Badge({
20
- variant = "neutral",
21
- className = "",
32
+ const Badge = memo(function Badge({
33
+ variant = 'neutral',
34
+ size = 'md',
35
+ style = 'solid',
36
+ className = '',
22
37
  children,
23
38
  ...props
24
- }: Props) {
39
+ }: BadgeProps) {
25
40
  const baseClasses = [
26
- "inline-flex",
27
- "items-center",
28
- "px-2",
29
- "py-1",
30
- "rounded",
31
- "text-xs",
32
- "font-medium",
33
- "border",
41
+ 'inline-flex',
42
+ 'items-center',
43
+ 'justify-center',
44
+ 'font-medium',
45
+ 'rounded-md',
46
+ 'border',
34
47
  ];
35
48
 
36
- const variantClasses: Record<NonNullable<Props["variant"]>, string> = {
37
- success: "bg-green-100 text-green-800 border-green-500",
38
- warning: "bg-yellow-100 text-yellow-800 border-yellow-500",
39
- error: "bg-red-100 text-red-800 border-red-500",
40
- info: "bg-blue-100 text-blue-800 border-blue-500",
41
- neutral: "bg-gray-100 text-gray-800 border-gray-500",
49
+ // Size classes
50
+ const sizeClasses: Record<BadgeSize, string> = {
51
+ sm: 'px-1.5 py-0.5 text-xs',
52
+ md: 'px-2 py-1 text-xs',
53
+ lg: 'px-2.5 py-1.5 text-sm',
42
54
  };
43
55
 
44
- const classes = [
56
+ // Map variant to color role
57
+ const variantToColorRole: Record<BadgeVariant, 'primary' | 'secondary' | 'success' | 'warning' | 'error' | 'info' | 'neutral'> = {
58
+ success: 'success',
59
+ warning: 'warning',
60
+ error: 'error',
61
+ info: 'info',
62
+ neutral: 'neutral',
63
+ primary: 'primary',
64
+ secondary: 'secondary',
65
+ };
66
+
67
+ const colorRole = variantToColorRole[variant];
68
+
69
+ // Style classes
70
+ const styleClasses = style === 'outline'
71
+ ? [
72
+ 'bg-transparent',
73
+ getColorClass(colorRole, 'DEFAULT', 'border'),
74
+ getColorClass(colorRole, 'DEFAULT', 'text'),
75
+ ]
76
+ : [
77
+ getColorClass(colorRole, 'light', 'bg'),
78
+ getColorClass(colorRole, 'dark', 'text'),
79
+ getColorClass(colorRole, 'DEFAULT', 'border'),
80
+ ];
81
+
82
+ const classes = useMemo(() => [
45
83
  ...baseClasses,
46
- variantClasses[variant as NonNullable<Props["variant"]>],
84
+ sizeClasses[size],
85
+ ...styleClasses,
47
86
  className,
48
- ].filter(Boolean).join(" ");
87
+ ].filter(Boolean).join(' '), [size, styleClasses, className]);
49
88
 
50
89
  return (
51
90
  <span
52
91
  role="status"
53
- aria-label={typeof children === "string" ? children : undefined}
92
+ aria-label={typeof children === 'string' ? children : undefined}
54
93
  className={classes}
55
94
  {...props}
56
95
  >
57
96
  {children}
58
97
  </span>
59
98
  );
60
- }
99
+ });
100
+
101
+ Badge.displayName = 'Badge';
102
+
103
+ export default Badge;
@@ -2,7 +2,7 @@ import type { Meta, StoryObj } from "@storybook/react";
2
2
  import BoxWrapper from "./BoxWrapper";
3
3
 
4
4
  const meta: Meta<typeof BoxWrapper> = {
5
- title: "UI/Atoms/BoxWrapper",
5
+ title: "Atoms/BoxWrapper",
6
6
  component: BoxWrapper,
7
7
  };
8
8
 
@@ -0,0 +1,27 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { render, screen } from '@testing-library/react';
3
+ import BoxWrapper from './BoxWrapper';
4
+
5
+ describe('BoxWrapper', () => {
6
+ it('renders children', () => {
7
+ render(<BoxWrapper>Test content</BoxWrapper>);
8
+ expect(screen.getByText('Test content')).toBeInTheDocument();
9
+ });
10
+
11
+ it('applies default classes', () => {
12
+ const { container } = render(<BoxWrapper>Content</BoxWrapper>);
13
+ const wrapper = container.firstChild as HTMLElement;
14
+ expect(wrapper).toHaveClass('p-large', 'bg-bg', 'rounded', 'shadow-card');
15
+ });
16
+
17
+ it('applies custom className', () => {
18
+ const { container } = render(<BoxWrapper className="custom-class">Content</BoxWrapper>);
19
+ const wrapper = container.firstChild as HTMLElement;
20
+ expect(wrapper).toHaveClass('custom-class');
21
+ });
22
+
23
+ it('passes through HTML attributes', () => {
24
+ render(<BoxWrapper data-testid="box">Content</BoxWrapper>);
25
+ expect(screen.getByTestId('box')).toBeInTheDocument();
26
+ });
27
+ });
@@ -1,8 +1,11 @@
1
+ import React from "react";
1
2
  import type { HTMLAttributes } from "react";
2
3
 
3
- type Props = HTMLAttributes<HTMLDivElement>;
4
+ export interface BoxWrapperProps extends HTMLAttributes<HTMLDivElement> {
5
+ className?: string;
6
+ }
4
7
 
5
- export default function BoxWrapper({ className, ...props }: Props) {
8
+ export default function BoxWrapper({ className, ...props }: BoxWrapperProps): React.JSX.Element {
6
9
  const classNames = [className, "p-large", "bg-bg", "rounded", "shadow-card"];
7
10
 
8
11
  return <div className={classNames.join(" ")} {...props} />;