@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
@@ -1,47 +1,63 @@
1
- import { render } from "@testing-library/react";
2
-
3
- import Text from "./Text";
4
-
5
- describe("UI / atom / Text", () => {
6
- const TEXT = "Test";
7
-
8
- it("should render properly", () => {
9
- const { getByText } = render(<Text>{TEXT}</Text>);
10
-
11
- expect(getByText(TEXT)).toBeInTheDocument();
1
+ import { describe, it, expect } from 'vitest';
2
+ import { render, screen } from '@testing-library/react';
3
+ import Text from './Text';
4
+
5
+ describe('Text', () => {
6
+ it('renders text content', () => {
7
+ render(<Text>Hello World</Text>);
8
+ expect(screen.getByText('Hello World')).toBeInTheDocument();
12
9
  });
13
10
 
14
- it("should change the tag accordingly", () => {
15
- const heading = render(<Text variant="heading">{TEXT}</Text>);
16
- const regular = render(<Text>{TEXT}</Text>);
17
- const listItem = render(<Text variant="list">{TEXT}</Text>);
18
-
19
- expect(heading.container.querySelector("h2")).toBeInTheDocument();
20
- expect(regular.container.querySelector("p")).toBeInTheDocument();
21
- expect(listItem.container.querySelector("li")).toBeInTheDocument();
11
+ it('renders as paragraph by default', () => {
12
+ const { container } = render(<Text>Content</Text>);
13
+ const text = container.querySelector('p');
14
+ expect(text).toBeInTheDocument();
22
15
  });
23
16
 
24
- it("should force the tag accordingly", () => {
25
- const { container } = render(<Text as="h1">{TEXT}</Text>);
17
+ it('renders as heading when variant is heading', () => {
18
+ const { container } = render(<Text variant="heading">Heading</Text>);
19
+ const text = container.querySelector('h2');
20
+ expect(text).toBeInTheDocument();
21
+ });
26
22
 
27
- expect(container.querySelector("h1")).toBeInTheDocument();
23
+ it('renders as list item when variant is list', () => {
24
+ const { container } = render(<Text variant="list">List item</Text>);
25
+ const text = container.querySelector('li');
26
+ expect(text).toBeInTheDocument();
28
27
  });
29
28
 
30
- it("should make the text bold", () => {
31
- const { container } = render(<Text bold>{TEXT}</Text>);
29
+ it('renders as custom element when as prop is provided', () => {
30
+ const { container } = render(<Text as="span">Content</Text>);
31
+ const text = container.querySelector('span');
32
+ expect(text).toBeInTheDocument();
33
+ });
32
34
 
33
- expect(container.querySelector(".font-bold")).toBeInTheDocument();
35
+ it('applies bold class when bold prop is true', () => {
36
+ const { container } = render(<Text bold>Bold text</Text>);
37
+ const text = container.querySelector('p');
38
+ expect(text).toHaveClass('font-bold');
34
39
  });
35
40
 
36
- it("should make the text italic", () => {
37
- const { container } = render(<Text italic>{TEXT}</Text>);
41
+ it('applies italic class when italic prop is true', () => {
42
+ const { container } = render(<Text italic>Italic text</Text>);
43
+ const text = container.querySelector('p');
44
+ expect(text).toHaveClass('italic');
45
+ });
38
46
 
39
- expect(container.querySelector(".italic")).toBeInTheDocument();
47
+ it('applies color class when color prop is provided', () => {
48
+ const { container } = render(<Text color="red-500">Colored text</Text>);
49
+ const text = container.querySelector('p');
50
+ expect(text).toHaveClass('text-red-500');
40
51
  });
41
52
 
42
- it("should change the color", () => {
43
- const { container } = render(<Text color="red-500">{TEXT}</Text>);
53
+ it('applies custom className', () => {
54
+ const { container } = render(<Text className="custom-class">Content</Text>);
55
+ const text = container.querySelector('p');
56
+ expect(text).toHaveClass('custom-class');
57
+ });
44
58
 
45
- expect(container.querySelector(".text-red-500")).toBeInTheDocument();
59
+ it('passes through HTML attributes', () => {
60
+ render(<Text data-testid="text">Content</Text>);
61
+ expect(screen.getByTestId('text')).toBeInTheDocument();
46
62
  });
47
- });
63
+ });
@@ -2,7 +2,7 @@ import type { Meta, StoryObj } from "@storybook/react";
2
2
  import Textarea from "./Textarea";
3
3
 
4
4
  const meta: Meta<typeof Textarea> = {
5
- title: "UI/Atoms/Textarea",
5
+ title: "Atoms/Textarea",
6
6
  component: Textarea,
7
7
  parameters: {
8
8
  docs: {
@@ -7,12 +7,26 @@ const meta = {
7
7
  component: Tooltip,
8
8
  parameters: {
9
9
  layout: "centered",
10
+ docs: {
11
+ description: {
12
+ component: "A tooltip component that displays additional information on hover or focus. Supports keyboard navigation and includes proper ARIA attributes. Tooltips appear immediately on focus (no delay) for better keyboard accessibility.",
13
+ },
14
+ },
10
15
  },
11
16
  tags: ["autodocs"],
12
17
  argTypes: {
13
18
  position: {
14
19
  control: "select",
15
20
  options: ["top", "bottom", "left", "right"],
21
+ description: "Position of the tooltip relative to the trigger element",
22
+ },
23
+ delay: {
24
+ control: "number",
25
+ description: "Delay in milliseconds before showing tooltip on hover (not applied on focus)",
26
+ },
27
+ 'aria-label': {
28
+ control: "text",
29
+ description: "Accessible label for screen readers",
16
30
  },
17
31
  },
18
32
  } satisfies Meta<typeof Tooltip>;
@@ -58,3 +72,33 @@ export const Right: Story = {
58
72
  position: "right",
59
73
  },
60
74
  };
75
+
76
+ export const WithCustomDelay: Story = {
77
+ args: {
78
+ content: "This tooltip has a 500ms delay",
79
+ children: <Button>Hover me (wait 500ms)</Button>,
80
+ delay: 500,
81
+ },
82
+ };
83
+
84
+ export const KeyboardAccessible: Story = {
85
+ args: {
86
+ content: "Press Tab to focus and see tooltip immediately",
87
+ children: <Button>Focus me with Tab</Button>,
88
+ },
89
+ parameters: {
90
+ docs: {
91
+ description: {
92
+ story: "Tab to focus the button. The tooltip appears immediately without delay for keyboard users.",
93
+ },
94
+ },
95
+ },
96
+ };
97
+
98
+ export const WithAriaLabel: Story = {
99
+ args: {
100
+ content: "Additional information",
101
+ children: <Button>Button with tooltip</Button>,
102
+ 'aria-label': "Button that shows additional information on hover",
103
+ },
104
+ };
@@ -1,13 +1,14 @@
1
1
  'use client';
2
2
 
3
- import type { HTMLAttributes, ReactNode } from "react";
4
- import { useState } from "react";
3
+ import type { HTMLAttributes, ReactNode, KeyboardEvent, FocusEvent, ReactElement } from "react";
4
+ import { useState, useRef, useEffect, cloneElement, isValidElement } from "react";
5
5
 
6
6
  export interface TooltipProps extends HTMLAttributes<HTMLDivElement> {
7
7
  content: string;
8
8
  children: ReactNode;
9
9
  position?: "top" | "bottom" | "left" | "right";
10
10
  delay?: number;
11
+ 'aria-label'?: string;
11
12
  }
12
13
 
13
14
  /**
@@ -29,10 +30,16 @@ export default function Tooltip({
29
30
  position = "top",
30
31
  delay = 200,
31
32
  className = "",
33
+ 'aria-label': _ariaLabel,
32
34
  ...props
33
35
  }: TooltipProps) {
34
36
  const [isVisible, setIsVisible] = useState(false);
35
- const [timeoutId, setTimeoutId] = useState<number | null>(null);
37
+ const [timeoutId, setTimeoutId] = useState<NodeJS.Timeout | null>(null);
38
+ const tooltipRef = useRef<HTMLDivElement>(null);
39
+ const triggerRef = useRef<HTMLElement | null>(null);
40
+
41
+ // Generate unique ID for tooltip
42
+ const tooltipId = `tooltip-${Math.random().toString(36).substr(2, 9)}`;
36
43
 
37
44
  const handleMouseEnter = () => {
38
45
  const id = setTimeout(() => {
@@ -49,6 +56,43 @@ export default function Tooltip({
49
56
  setIsVisible(false);
50
57
  };
51
58
 
59
+ const handleFocus = () => {
60
+ // Show tooltip immediately on focus (no delay for keyboard users)
61
+ setIsVisible(true);
62
+ };
63
+
64
+ const handleBlur = () => {
65
+ setIsVisible(false);
66
+ };
67
+
68
+ const handleKeyDown = (e: KeyboardEvent) => {
69
+ if (e.key === 'Escape') {
70
+ setIsVisible(false);
71
+ triggerRef.current?.blur();
72
+ }
73
+ };
74
+
75
+ // Close tooltip when clicking outside
76
+ useEffect(() => {
77
+ if (!isVisible) return;
78
+
79
+ const handleClickOutside = (event: MouseEvent) => {
80
+ if (
81
+ tooltipRef.current &&
82
+ !tooltipRef.current.contains(event.target as Node) &&
83
+ triggerRef.current &&
84
+ !triggerRef.current.contains(event.target as Node)
85
+ ) {
86
+ setIsVisible(false);
87
+ }
88
+ };
89
+
90
+ document.addEventListener('mousedown', handleClickOutside);
91
+ return () => {
92
+ document.removeEventListener('mousedown', handleClickOutside);
93
+ };
94
+ }, [isVisible]);
95
+
52
96
  const positionClasses: Record<NonNullable<TooltipProps["position"]>, string> = {
53
97
  top: "bottom-full left-1/2 transform -translate-x-1/2 mb-2",
54
98
  bottom: "top-full left-1/2 transform -translate-x-1/2 mt-2",
@@ -63,22 +107,66 @@ export default function Tooltip({
63
107
  right: "right-full top-1/2 transform -translate-y-1/2 border-r-gray-900",
64
108
  };
65
109
 
110
+ // Clone children to add accessibility props
111
+ const childrenWithProps = isValidElement(children)
112
+ ? (() => {
113
+ const childElement = children as ReactElement<HTMLAttributes<HTMLElement> & { ref?: React.Ref<HTMLElement> }>;
114
+ const existingProps = childElement.props;
115
+ const existingRef = existingProps.ref;
116
+
117
+ return cloneElement(childElement, {
118
+ ref: (node: HTMLElement | null) => {
119
+ triggerRef.current = node;
120
+ // Preserve existing ref if any
121
+ if (typeof existingRef === 'function') {
122
+ existingRef(node);
123
+ } else if (existingRef && typeof existingRef === 'object' && 'current' in existingRef) {
124
+ (existingRef as React.MutableRefObject<HTMLElement | null>).current = node;
125
+ }
126
+ },
127
+ 'aria-describedby': isVisible ? tooltipId : existingProps['aria-describedby'],
128
+ onMouseEnter: (e: React.MouseEvent<HTMLElement>) => {
129
+ handleMouseEnter();
130
+ existingProps.onMouseEnter?.(e);
131
+ },
132
+ onMouseLeave: (e: React.MouseEvent<HTMLElement>) => {
133
+ handleMouseLeave();
134
+ existingProps.onMouseLeave?.(e);
135
+ },
136
+ onFocus: (e: FocusEvent<HTMLElement>) => {
137
+ handleFocus();
138
+ existingProps.onFocus?.(e);
139
+ },
140
+ onBlur: (e: FocusEvent<HTMLElement>) => {
141
+ handleBlur();
142
+ existingProps.onBlur?.(e);
143
+ },
144
+ onKeyDown: (e: KeyboardEvent<HTMLElement>) => {
145
+ handleKeyDown(e);
146
+ existingProps.onKeyDown?.(e);
147
+ },
148
+ } as Partial<typeof existingProps>);
149
+ })()
150
+ : children;
151
+
66
152
  return (
67
153
  <div
68
154
  className={`relative inline-block ${className}`}
69
- onMouseEnter={handleMouseEnter}
70
- onMouseLeave={handleMouseLeave}
71
155
  {...props}
72
156
  >
73
- {children}
157
+ {childrenWithProps}
74
158
  {isVisible && (
75
159
  <div
160
+ ref={tooltipRef}
161
+ id={tooltipId}
76
162
  className={`absolute z-50 px-2 py-1 text-xs text-white bg-gray-900 rounded shadow-lg whitespace-nowrap ${positionClasses[position]}`}
77
163
  role="tooltip"
164
+ aria-live="polite"
78
165
  >
79
166
  {content}
80
167
  <div
81
168
  className={`absolute w-0 h-0 border-4 border-transparent ${arrowClasses[position]}`}
169
+ aria-hidden="true"
82
170
  />
83
171
  </div>
84
172
  )}
@@ -1,17 +1,21 @@
1
1
  export { default as Info } from "./Info/Info";
2
+ export type { InfoProps } from "./Info/Info";
2
3
 
3
4
  export { default as Text } from "./Text/Text";
4
5
 
5
6
  export { default as Input } from "./Input/Input";
6
- export type { InputProps } from "./Input/Input";
7
+ export type { InputProps, InputSize, InputVariant, InputState } from "./Input/Input";
7
8
 
8
9
  export { default as Button } from "./Button/Button";
10
+ export type { ButtonProps, ButtonVariant, ButtonSize } from "./Button/Button";
9
11
 
10
12
  export { default as BoxWrapper } from "./BoxWrapper/BoxWrapper";
13
+ export type { BoxWrapperProps } from "./BoxWrapper/BoxWrapper";
11
14
 
12
15
  export { default as Badge } from "./Badge/Badge";
13
16
 
14
17
  export { default as Select } from "./Select/Select";
18
+ export type { SelectProps, SelectOption, SelectOptionGroup, SelectSize } from "./Select/Select";
15
19
 
16
20
  export { default as Textarea } from "./Textarea/Textarea";
17
21
 
@@ -25,11 +29,10 @@ export { default as Tooltip } from "./Tooltip/Tooltip";
25
29
  export type { TooltipProps } from "./Tooltip/Tooltip";
26
30
 
27
31
  export { default as Skeleton } from "./Skeleton/Skeleton";
32
+ export { default as Spinner } from "./Spinner/Spinner";
33
+ export type { SpinnerProps, SpinnerSize, SpinnerVariant } from "./Spinner/Spinner";
28
34
  export type { SkeletonProps } from "./Skeleton/Skeleton";
29
35
 
30
- export { default as SidebarItem } from "./SidebarItem/SidebarItem";
31
- export type { SidebarItemProps } from "./SidebarItem/SidebarItem";
32
-
33
36
  export { default as Collapsible } from "./Collapsible/Collapsible";
34
37
  export type { CollapsibleProps } from "./Collapsible/Collapsible";
35
38
 
@@ -38,3 +41,23 @@ export type { CheckboxProps } from "./Checkbox/Checkbox";
38
41
 
39
42
  export { default as Radio } from "./Radio/Radio";
40
43
  export type { RadioProps } from "./Radio/Radio";
44
+
45
+ export { default as Progress } from "./Progress/Progress";
46
+ export type { ProgressProps, ProgressVariant, ProgressSize } from "./Progress/Progress";
47
+
48
+ export { default as Switch } from "./Switch/Switch";
49
+ export type { SwitchProps, SwitchSize } from "./Switch/Switch";
50
+
51
+ export { default as Separator } from "./Separator/Separator";
52
+ export type { SeparatorProps, SeparatorOrientation, SeparatorVariant } from "./Separator/Separator";
53
+
54
+ export { default as Accordion } from "./Accordion/Accordion";
55
+ export type { AccordionProps, AccordionItem, AccordionType } from "./Accordion/Accordion";
56
+
57
+ export { default as Slider } from "./Slider/Slider";
58
+ export type { SliderProps, SliderVariant, SliderSize } from "./Slider/Slider";
59
+
60
+ export { default as Popover } from "./Popover/Popover";
61
+ export type { PopoverProps, PopoverPlacement } from "./Popover/Popover";
62
+
63
+ export * from "./Avatar";
package/src/ui/index.ts CHANGED
@@ -9,10 +9,15 @@ export * from "./tokens/breakpoints";
9
9
  export * from "./tokens/tokens.factory";
10
10
  export * from "./tokens/themes/light";
11
11
  export * from "./tokens/themes/dark";
12
- export * from "./providers/ThemeProvider";
12
+ export * from "./providers";
13
+ export * from "./themes";
13
14
 
14
15
  // Export helper functions for convenience
15
16
  export { getSpacingClass, getSpacing } from "./tokens/spacing";
16
17
  export { getTypographyClasses, getTypography } from "./tokens/typography";
17
18
  export { getColorClass, getColor } from "./tokens/colors";
18
19
  export { getBreakpoint, getMediaQuery } from "./tokens/breakpoints";
20
+ export { getAnimationClass, getAnimation, getTransitionClass } from "./tokens/animations";
21
+ export { getZIndexClass, getZIndex } from "./tokens/z-index";
22
+ export { getOpacityClass, getOpacity } from "./tokens/opacity";
23
+ export { getGradientClass, getGradient } from "./tokens/gradients";
@@ -2,7 +2,7 @@ import type { Meta, StoryObj } from "@storybook/react";
2
2
  import Breadcrumb from "./Breadcrumb";
3
3
 
4
4
  const meta: Meta<typeof Breadcrumb> = {
5
- title: "UI/Molecules/Breadcrumb",
5
+ title: "Molecules/Breadcrumb",
6
6
  component: Breadcrumb,
7
7
  parameters: {
8
8
  docs: {
@@ -49,7 +49,7 @@ export default function Breadcrumb({
49
49
  ].filter(Boolean).join(" ");
50
50
 
51
51
  return (
52
- <nav aria-label="Breadcrumb" className={classes} {...(props as any)}>
52
+ <nav aria-label="Breadcrumb" className={classes} {...props}>
53
53
  <ol className="flex items-center space-x-2">
54
54
  {items.map((item, index) => {
55
55
  const isLast = index === items.length - 1;
@@ -3,7 +3,7 @@ import Card from "./Card";
3
3
  import { Text, Button } from "../../atoms";
4
4
 
5
5
  const meta: Meta<typeof Card> = {
6
- title: "UI/Molecules/Card",
6
+ title: "Molecules/Card",
7
7
  component: Card,
8
8
  parameters: {
9
9
  docs: {
@@ -23,6 +23,18 @@ const meta: Meta<typeof Card> = {
23
23
  options: ["none", "small", "medium", "large"],
24
24
  description: "Padding size",
25
25
  },
26
+ onClick: {
27
+ control: false,
28
+ description: "Click handler. When provided, card becomes interactive with keyboard support.",
29
+ },
30
+ 'aria-label': {
31
+ control: "text",
32
+ description: "Accessible label for interactive cards",
33
+ },
34
+ 'aria-labelledby': {
35
+ control: "text",
36
+ description: "ID of element that labels the card",
37
+ },
26
38
  },
27
39
  };
28
40
 
@@ -114,4 +126,40 @@ export const NoPadding: StoryObj<typeof Card> = {
114
126
  },
115
127
  };
116
128
 
129
+ export const Interactive: StoryObj<typeof Card> = {
130
+ args: {
131
+ variant: "hover",
132
+ onClick: () => alert("Card clicked!"),
133
+ 'aria-label': "Clickable card example",
134
+ children: (
135
+ <>
136
+ <Text as="h3" className="text-lg font-semibold mb-2">Interactive Card</Text>
137
+ <Text as="p" className="text-gray-600">This card is clickable. Press Enter or Space when focused to activate.</Text>
138
+ </>
139
+ ),
140
+ },
141
+ parameters: {
142
+ docs: {
143
+ description: {
144
+ story: "Interactive cards support keyboard navigation. Tab to focus, then press Enter or Space to activate.",
145
+ },
146
+ },
147
+ },
148
+ };
149
+
150
+ export const WithAriaLabel: StoryObj<typeof Card> = {
151
+ args: {
152
+ variant: "hover",
153
+ onClick: () => alert("Card clicked!"),
154
+ 'aria-label': "Product card: Premium Plan - $99/month",
155
+ children: (
156
+ <>
157
+ <Text as="h3" className="text-lg font-semibold mb-2">Premium Plan</Text>
158
+ <Text as="p" className="text-gray-600 mb-2">$99/month</Text>
159
+ <Text as="p" className="text-sm text-gray-500">Includes all features</Text>
160
+ </>
161
+ ),
162
+ },
163
+ };
164
+
117
165
  export default meta;
@@ -1,8 +1,12 @@
1
+ import { memo, useMemo, useCallback } from 'react';
1
2
  import type { HTMLAttributes } from "react";
2
3
 
3
4
  interface Props extends HTMLAttributes<HTMLDivElement> {
4
5
  variant?: "default" | "hover" | "selected";
5
6
  padding?: "none" | "small" | "medium" | "large";
7
+ onClick?: () => void;
8
+ 'aria-label'?: string;
9
+ 'aria-labelledby'?: string;
6
10
  }
7
11
 
8
12
  /**
@@ -11,6 +15,7 @@ interface Props extends HTMLAttributes<HTMLDivElement> {
11
15
  * A versatile card component for displaying content in containers.
12
16
  * Follows Atomic Design principles as a Molecule component.
13
17
  * Can be used to replace BoxWrapper in many cases with more flexibility.
18
+ * Optimized with React.memo to prevent unnecessary re-renders.
14
19
  *
15
20
  * @example
16
21
  * ```tsx
@@ -20,10 +25,13 @@ interface Props extends HTMLAttributes<HTMLDivElement> {
20
25
  * </Card>
21
26
  * ```
22
27
  */
23
- export default function Card({
28
+ const Card = memo(function Card({
24
29
  variant = "default",
25
30
  padding = "medium",
26
31
  className = "",
32
+ onClick,
33
+ 'aria-label': ariaLabel,
34
+ 'aria-labelledby': ariaLabelledBy,
27
35
  children,
28
36
  ...props
29
37
  }: Props) {
@@ -48,16 +56,43 @@ export default function Card({
48
56
  large: "p-6",
49
57
  };
50
58
 
51
- const classes = [
59
+ const isInteractive = useMemo(() =>
60
+ onClick !== undefined || variant === "hover",
61
+ [onClick, variant]
62
+ );
63
+ const role = isInteractive ? "button" : undefined;
64
+ const tabIndex = isInteractive ? 0 : undefined;
65
+
66
+ const classes = useMemo(() => [
52
67
  ...baseClasses,
53
68
  variantClasses[variant],
54
69
  paddingClasses[padding],
55
70
  className,
56
- ].filter(Boolean).join(" ");
71
+ ].filter(Boolean).join(" "), [variant, padding, className]);
72
+
73
+ const handleKeyDown = useCallback((e: React.KeyboardEvent<HTMLDivElement>) => {
74
+ if (isInteractive && (e.key === 'Enter' || e.key === ' ')) {
75
+ e.preventDefault();
76
+ onClick?.();
77
+ }
78
+ }, [isInteractive, onClick]);
57
79
 
58
80
  return (
59
- <div className={classes} {...props}>
81
+ <div
82
+ className={classes}
83
+ role={role}
84
+ tabIndex={tabIndex}
85
+ onClick={onClick}
86
+ onKeyDown={handleKeyDown}
87
+ aria-label={ariaLabel}
88
+ aria-labelledby={ariaLabelledBy}
89
+ {...props}
90
+ >
60
91
  {children}
61
92
  </div>
62
93
  );
63
- }
94
+ });
95
+
96
+ Card.displayName = 'Card';
97
+
98
+ export default Card;