@pattern-stack/frontend-patterns 0.0.1

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 (400) hide show
  1. package/README.md +310 -0
  2. package/dist/atoms/composed/Accordion/Accordion.d.ts +20 -0
  3. package/dist/atoms/composed/Accordion/Accordion.d.ts.map +1 -0
  4. package/dist/atoms/composed/Accordion/index.d.ts +2 -0
  5. package/dist/atoms/composed/Accordion/index.d.ts.map +1 -0
  6. package/dist/atoms/composed/Alert/Alert.d.ts +25 -0
  7. package/dist/atoms/composed/Alert/Alert.d.ts.map +1 -0
  8. package/dist/atoms/composed/Alert/index.d.ts +2 -0
  9. package/dist/atoms/composed/Alert/index.d.ts.map +1 -0
  10. package/dist/atoms/composed/Breadcrumb/Breadcrumb.d.ts +17 -0
  11. package/dist/atoms/composed/Breadcrumb/Breadcrumb.d.ts.map +1 -0
  12. package/dist/atoms/composed/Breadcrumb/index.d.ts +2 -0
  13. package/dist/atoms/composed/Breadcrumb/index.d.ts.map +1 -0
  14. package/dist/atoms/composed/Chart/Chart.d.ts +37 -0
  15. package/dist/atoms/composed/Chart/Chart.d.ts.map +1 -0
  16. package/dist/atoms/composed/Chart/index.d.ts +3 -0
  17. package/dist/atoms/composed/Chart/index.d.ts.map +1 -0
  18. package/dist/atoms/composed/ColorSwatch/ColorSwatch.d.ts +19 -0
  19. package/dist/atoms/composed/ColorSwatch/ColorSwatch.d.ts.map +1 -0
  20. package/dist/atoms/composed/ColorSwatch/index.d.ts +2 -0
  21. package/dist/atoms/composed/ColorSwatch/index.d.ts.map +1 -0
  22. package/dist/atoms/composed/DarkModeToggle.d.ts +4 -0
  23. package/dist/atoms/composed/DarkModeToggle.d.ts.map +1 -0
  24. package/dist/atoms/composed/DataBadge/DataBadge.d.ts +13 -0
  25. package/dist/atoms/composed/DataBadge/DataBadge.d.ts.map +1 -0
  26. package/dist/atoms/composed/DataBadge/index.d.ts +2 -0
  27. package/dist/atoms/composed/DataBadge/index.d.ts.map +1 -0
  28. package/dist/atoms/composed/DataTable/DataTable.d.ts +28 -0
  29. package/dist/atoms/composed/DataTable/DataTable.d.ts.map +1 -0
  30. package/dist/atoms/composed/DataTable/TableCellWithTooltip.d.ts +10 -0
  31. package/dist/atoms/composed/DataTable/TableCellWithTooltip.d.ts.map +1 -0
  32. package/dist/atoms/composed/DataTable/index.d.ts +3 -0
  33. package/dist/atoms/composed/DataTable/index.d.ts.map +1 -0
  34. package/dist/atoms/composed/DateTimePicker/DateTimePicker.d.ts +45 -0
  35. package/dist/atoms/composed/DateTimePicker/DateTimePicker.d.ts.map +1 -0
  36. package/dist/atoms/composed/DateTimePicker/index.d.ts +3 -0
  37. package/dist/atoms/composed/DateTimePicker/index.d.ts.map +1 -0
  38. package/dist/atoms/composed/DetailedCard/DetailedCard.d.ts +30 -0
  39. package/dist/atoms/composed/DetailedCard/DetailedCard.d.ts.map +1 -0
  40. package/dist/atoms/composed/DetailedCard/index.d.ts +3 -0
  41. package/dist/atoms/composed/DetailedCard/index.d.ts.map +1 -0
  42. package/dist/atoms/composed/EmptyState/EmptyState.d.ts +18 -0
  43. package/dist/atoms/composed/EmptyState/EmptyState.d.ts.map +1 -0
  44. package/dist/atoms/composed/EmptyState/index.d.ts +2 -0
  45. package/dist/atoms/composed/EmptyState/index.d.ts.map +1 -0
  46. package/dist/atoms/composed/FileUpload/FileUpload.d.ts +46 -0
  47. package/dist/atoms/composed/FileUpload/FileUpload.d.ts.map +1 -0
  48. package/dist/atoms/composed/FileUpload/index.d.ts +3 -0
  49. package/dist/atoms/composed/FileUpload/index.d.ts.map +1 -0
  50. package/dist/atoms/composed/FormField/FormField.d.ts +23 -0
  51. package/dist/atoms/composed/FormField/FormField.d.ts.map +1 -0
  52. package/dist/atoms/composed/FormField/index.d.ts +2 -0
  53. package/dist/atoms/composed/FormField/index.d.ts.map +1 -0
  54. package/dist/atoms/composed/GlobalSearch/GlobalSearch.d.ts +8 -0
  55. package/dist/atoms/composed/GlobalSearch/GlobalSearch.d.ts.map +1 -0
  56. package/dist/atoms/composed/GlobalSearch/index.d.ts +2 -0
  57. package/dist/atoms/composed/GlobalSearch/index.d.ts.map +1 -0
  58. package/dist/atoms/composed/IconBadge/IconBadge.d.ts +16 -0
  59. package/dist/atoms/composed/IconBadge/IconBadge.d.ts.map +1 -0
  60. package/dist/atoms/composed/IconBadge/index.d.ts +3 -0
  61. package/dist/atoms/composed/IconBadge/index.d.ts.map +1 -0
  62. package/dist/atoms/composed/Modal/Modal.d.ts +18 -0
  63. package/dist/atoms/composed/Modal/Modal.d.ts.map +1 -0
  64. package/dist/atoms/composed/Modal/index.d.ts +3 -0
  65. package/dist/atoms/composed/Modal/index.d.ts.map +1 -0
  66. package/dist/atoms/composed/PaletteSwitcher.d.ts +7 -0
  67. package/dist/atoms/composed/PaletteSwitcher.d.ts.map +1 -0
  68. package/dist/atoms/composed/ProgressBar/ProgressBar.d.ts +25 -0
  69. package/dist/atoms/composed/ProgressBar/ProgressBar.d.ts.map +1 -0
  70. package/dist/atoms/composed/ProgressBar/index.d.ts +2 -0
  71. package/dist/atoms/composed/ProgressBar/index.d.ts.map +1 -0
  72. package/dist/atoms/composed/StatCard/StatCard.d.ts +21 -0
  73. package/dist/atoms/composed/StatCard/StatCard.d.ts.map +1 -0
  74. package/dist/atoms/composed/StatCard/index.d.ts +2 -0
  75. package/dist/atoms/composed/StatCard/index.d.ts.map +1 -0
  76. package/dist/atoms/composed/StyleGuide.d.ts +3 -0
  77. package/dist/atoms/composed/StyleGuide.d.ts.map +1 -0
  78. package/dist/atoms/composed/Toast/Toast.d.ts +40 -0
  79. package/dist/atoms/composed/Toast/Toast.d.ts.map +1 -0
  80. package/dist/atoms/composed/Toast/index.d.ts +2 -0
  81. package/dist/atoms/composed/Toast/index.d.ts.map +1 -0
  82. package/dist/atoms/composed/Tooltip/Tooltip.d.ts +16 -0
  83. package/dist/atoms/composed/Tooltip/Tooltip.d.ts.map +1 -0
  84. package/dist/atoms/composed/Tooltip/index.d.ts +2 -0
  85. package/dist/atoms/composed/Tooltip/index.d.ts.map +1 -0
  86. package/dist/atoms/composed/UserAvatar/UserAvatar.d.ts +8 -0
  87. package/dist/atoms/composed/UserAvatar/UserAvatar.d.ts.map +1 -0
  88. package/dist/atoms/composed/UserAvatar/index.d.ts +2 -0
  89. package/dist/atoms/composed/UserAvatar/index.d.ts.map +1 -0
  90. package/dist/atoms/composed/UserMenu/UserMenu.d.ts +8 -0
  91. package/dist/atoms/composed/UserMenu/UserMenu.d.ts.map +1 -0
  92. package/dist/atoms/composed/UserMenu/index.d.ts +2 -0
  93. package/dist/atoms/composed/UserMenu/index.d.ts.map +1 -0
  94. package/dist/atoms/composed/index.d.ts +25 -0
  95. package/dist/atoms/composed/index.d.ts.map +1 -0
  96. package/dist/atoms/hooks/useApi.d.ts +25 -0
  97. package/dist/atoms/hooks/useApi.d.ts.map +1 -0
  98. package/dist/atoms/hooks/useHealth.d.ts +19 -0
  99. package/dist/atoms/hooks/useHealth.d.ts.map +1 -0
  100. package/dist/atoms/index.d.ts +9 -0
  101. package/dist/atoms/index.d.ts.map +1 -0
  102. package/dist/atoms/services/api/client.d.ts +20 -0
  103. package/dist/atoms/services/api/client.d.ts.map +1 -0
  104. package/dist/atoms/services/auth-service.d.ts +24 -0
  105. package/dist/atoms/services/auth-service.d.ts.map +1 -0
  106. package/dist/atoms/services/health.d.ts +7 -0
  107. package/dist/atoms/services/health.d.ts.map +1 -0
  108. package/dist/atoms/services/index.d.ts +4 -0
  109. package/dist/atoms/services/index.d.ts.map +1 -0
  110. package/dist/atoms/shared/config/constants.d.ts +15 -0
  111. package/dist/atoms/shared/config/constants.d.ts.map +1 -0
  112. package/dist/atoms/shared/config/dashboard-sizes.d.ts +83 -0
  113. package/dist/atoms/shared/config/dashboard-sizes.d.ts.map +1 -0
  114. package/dist/atoms/shared/config/environment.d.ts +10 -0
  115. package/dist/atoms/shared/config/environment.d.ts.map +1 -0
  116. package/dist/atoms/shared/index.d.ts +4 -0
  117. package/dist/atoms/shared/index.d.ts.map +1 -0
  118. package/dist/atoms/types/auth.d.ts +56 -0
  119. package/dist/atoms/types/auth.d.ts.map +1 -0
  120. package/dist/atoms/types/generated.d.ts +1469 -0
  121. package/dist/atoms/types/generated.d.ts.map +1 -0
  122. package/dist/atoms/types/index.d.ts +4 -0
  123. package/dist/atoms/types/index.d.ts.map +1 -0
  124. package/dist/atoms/types/loading.d.ts +26 -0
  125. package/dist/atoms/types/loading.d.ts.map +1 -0
  126. package/dist/atoms/ui/Badge.d.ts +10 -0
  127. package/dist/atoms/ui/Badge.d.ts.map +1 -0
  128. package/dist/atoms/ui/ErrorBoundary.d.ts +18 -0
  129. package/dist/atoms/ui/ErrorBoundary.d.ts.map +1 -0
  130. package/dist/atoms/ui/Select.d.ts +28 -0
  131. package/dist/atoms/ui/Select.d.ts.map +1 -0
  132. package/dist/atoms/ui/Switch.d.ts +9 -0
  133. package/dist/atoms/ui/Switch.d.ts.map +1 -0
  134. package/dist/atoms/ui/Tabs.d.ts +30 -0
  135. package/dist/atoms/ui/Tabs.d.ts.map +1 -0
  136. package/dist/atoms/ui/avatar.d.ts +7 -0
  137. package/dist/atoms/ui/avatar.d.ts.map +1 -0
  138. package/dist/atoms/ui/button.d.ts +14 -0
  139. package/dist/atoms/ui/button.d.ts.map +1 -0
  140. package/dist/atoms/ui/card.d.ts +12 -0
  141. package/dist/atoms/ui/card.d.ts.map +1 -0
  142. package/dist/atoms/ui/dropdown-menu.d.ts +28 -0
  143. package/dist/atoms/ui/dropdown-menu.d.ts.map +1 -0
  144. package/dist/atoms/ui/index.d.ts +15 -0
  145. package/dist/atoms/ui/index.d.ts.map +1 -0
  146. package/dist/atoms/ui/input.d.ts +5 -0
  147. package/dist/atoms/ui/input.d.ts.map +1 -0
  148. package/dist/atoms/ui/label.d.ts +6 -0
  149. package/dist/atoms/ui/label.d.ts.map +1 -0
  150. package/dist/atoms/ui/skeleton.d.ts +3 -0
  151. package/dist/atoms/ui/skeleton.d.ts.map +1 -0
  152. package/dist/atoms/ui/spinner.d.ts +14 -0
  153. package/dist/atoms/ui/spinner.d.ts.map +1 -0
  154. package/dist/atoms/ui/table.d.ts +11 -0
  155. package/dist/atoms/ui/table.d.ts.map +1 -0
  156. package/dist/atoms/utils/animations.d.ts +65 -0
  157. package/dist/atoms/utils/animations.d.ts.map +1 -0
  158. package/dist/atoms/utils/tooltip-helpers.d.ts +71 -0
  159. package/dist/atoms/utils/tooltip-helpers.d.ts.map +1 -0
  160. package/dist/atoms/utils/utils.d.ts +4 -0
  161. package/dist/atoms/utils/utils.d.ts.map +1 -0
  162. package/dist/features/auth/components/LoginForm.d.ts +2 -0
  163. package/dist/features/auth/components/LoginForm.d.ts.map +1 -0
  164. package/dist/features/auth/components/LogoutButton.d.ts +2 -0
  165. package/dist/features/auth/components/LogoutButton.d.ts.map +1 -0
  166. package/dist/features/auth/components/ProtectedRoute.d.ts +10 -0
  167. package/dist/features/auth/components/ProtectedRoute.d.ts.map +1 -0
  168. package/dist/features/auth/components/index.d.ts +4 -0
  169. package/dist/features/auth/components/index.d.ts.map +1 -0
  170. package/dist/features/auth/hooks/index.d.ts +3 -0
  171. package/dist/features/auth/hooks/index.d.ts.map +1 -0
  172. package/dist/features/auth/hooks/useAuth.d.ts +10 -0
  173. package/dist/features/auth/hooks/useAuth.d.ts.map +1 -0
  174. package/dist/features/auth/hooks/usePermissions.d.ts +13 -0
  175. package/dist/features/auth/hooks/usePermissions.d.ts.map +1 -0
  176. package/dist/features/auth/index.d.ts +3 -0
  177. package/dist/features/auth/index.d.ts.map +1 -0
  178. package/dist/features/index.d.ts +2 -0
  179. package/dist/features/index.d.ts.map +1 -0
  180. package/dist/frontend-patterns.css +567 -0
  181. package/dist/index.d.ts +10 -0
  182. package/dist/index.d.ts.map +1 -0
  183. package/dist/index.es.js +10152 -0
  184. package/dist/index.es.js.map +1 -0
  185. package/dist/index.js +10170 -0
  186. package/dist/index.js.map +1 -0
  187. package/dist/molecules/forms/FormGroup.d.ts +17 -0
  188. package/dist/molecules/forms/FormGroup.d.ts.map +1 -0
  189. package/dist/molecules/forms/SearchInput.d.ts +36 -0
  190. package/dist/molecules/forms/SearchInput.d.ts.map +1 -0
  191. package/dist/molecules/forms/index.d.ts +3 -0
  192. package/dist/molecules/forms/index.d.ts.map +1 -0
  193. package/dist/molecules/index.d.ts +4 -0
  194. package/dist/molecules/index.d.ts.map +1 -0
  195. package/dist/molecules/layout/AppHeader/AppHeader.d.ts +7 -0
  196. package/dist/molecules/layout/AppHeader/AppHeader.d.ts.map +1 -0
  197. package/dist/molecules/layout/AppHeader/index.d.ts +2 -0
  198. package/dist/molecules/layout/AppHeader/index.d.ts.map +1 -0
  199. package/dist/molecules/layout/AppLayout.d.ts +2 -0
  200. package/dist/molecules/layout/AppLayout.d.ts.map +1 -0
  201. package/dist/molecules/layout/PageTemplate.d.ts +19 -0
  202. package/dist/molecules/layout/PageTemplate.d.ts.map +1 -0
  203. package/dist/molecules/layout/SectionHeader/SectionHeader.d.ts +24 -0
  204. package/dist/molecules/layout/SectionHeader/SectionHeader.d.ts.map +1 -0
  205. package/dist/molecules/layout/SectionHeader/index.d.ts +2 -0
  206. package/dist/molecules/layout/SectionHeader/index.d.ts.map +1 -0
  207. package/dist/molecules/layout/ShowcaseSection.d.ts +22 -0
  208. package/dist/molecules/layout/ShowcaseSection.d.ts.map +1 -0
  209. package/dist/molecules/layout/Sidebar.d.ts +6 -0
  210. package/dist/molecules/layout/Sidebar.d.ts.map +1 -0
  211. package/dist/molecules/layout/SidebarButton/SidebarButton.d.ts +13 -0
  212. package/dist/molecules/layout/SidebarButton/SidebarButton.d.ts.map +1 -0
  213. package/dist/molecules/layout/SidebarButton/index.d.ts +2 -0
  214. package/dist/molecules/layout/SidebarButton/index.d.ts.map +1 -0
  215. package/dist/molecules/layout/SidebarContext.d.ts +12 -0
  216. package/dist/molecules/layout/SidebarContext.d.ts.map +1 -0
  217. package/dist/molecules/layout/index.d.ts +8 -0
  218. package/dist/molecules/layout/index.d.ts.map +1 -0
  219. package/dist/molecules/navigation/NavMenu.d.ts +20 -0
  220. package/dist/molecules/navigation/NavMenu.d.ts.map +1 -0
  221. package/dist/molecules/navigation/Pagination.d.ts +14 -0
  222. package/dist/molecules/navigation/Pagination.d.ts.map +1 -0
  223. package/dist/molecules/navigation/index.d.ts +3 -0
  224. package/dist/molecules/navigation/index.d.ts.map +1 -0
  225. package/dist/organisms/index.d.ts +2 -0
  226. package/dist/organisms/index.d.ts.map +1 -0
  227. package/dist/organisms/showcase/ComponentShowcasePage.d.ts +3 -0
  228. package/dist/organisms/showcase/ComponentShowcasePage.d.ts.map +1 -0
  229. package/dist/templates/AuthTemplate.d.ts +68 -0
  230. package/dist/templates/AuthTemplate.d.ts.map +1 -0
  231. package/dist/templates/ComponentShowcaseTemplate.d.ts +53 -0
  232. package/dist/templates/ComponentShowcaseTemplate.d.ts.map +1 -0
  233. package/dist/templates/DashboardTemplate.d.ts +62 -0
  234. package/dist/templates/DashboardTemplate.d.ts.map +1 -0
  235. package/dist/templates/DataTemplate.d.ts +78 -0
  236. package/dist/templates/DataTemplate.d.ts.map +1 -0
  237. package/dist/templates/admin/AdminCRUDTemplate.d.ts +105 -0
  238. package/dist/templates/admin/AdminCRUDTemplate.d.ts.map +1 -0
  239. package/dist/templates/admin/AdminDashboardTemplate.d.ts +89 -0
  240. package/dist/templates/admin/AdminDashboardTemplate.d.ts.map +1 -0
  241. package/dist/templates/admin/AdminDetailTemplate.d.ts +132 -0
  242. package/dist/templates/admin/AdminDetailTemplate.d.ts.map +1 -0
  243. package/dist/templates/admin/index.d.ts +4 -0
  244. package/dist/templates/admin/index.d.ts.map +1 -0
  245. package/dist/templates/factory.d.ts +28 -0
  246. package/dist/templates/factory.d.ts.map +1 -0
  247. package/dist/templates/index.d.ts +7 -0
  248. package/dist/templates/index.d.ts.map +1 -0
  249. package/package.json +118 -0
  250. package/src/App.css +42 -0
  251. package/src/App.tsx +54 -0
  252. package/src/__tests__/README.md +221 -0
  253. package/src/__tests__/atoms/hooks/simple-hooks.test.ts +44 -0
  254. package/src/__tests__/atoms/ui/button.test.tsx +68 -0
  255. package/src/__tests__/atoms/utils/simple.test.ts +18 -0
  256. package/src/__tests__/atoms/utils/utils.test.ts +77 -0
  257. package/src/__tests__/features/auth/simple-auth.test.tsx +40 -0
  258. package/src/__tests__/molecules/layout/simple-layout.test.tsx +81 -0
  259. package/src/__tests__/organisms/showcase/simple-showcase.test.tsx +167 -0
  260. package/src/__tests__/setup.ts +51 -0
  261. package/src/__tests__/utils.tsx +123 -0
  262. package/src/atoms/composed/Accordion/Accordion.tsx +271 -0
  263. package/src/atoms/composed/Accordion/index.ts +1 -0
  264. package/src/atoms/composed/Alert/Alert.tsx +132 -0
  265. package/src/atoms/composed/Alert/index.ts +1 -0
  266. package/src/atoms/composed/Breadcrumb/Breadcrumb.tsx +83 -0
  267. package/src/atoms/composed/Breadcrumb/index.ts +1 -0
  268. package/src/atoms/composed/Chart/Chart.tsx +425 -0
  269. package/src/atoms/composed/Chart/index.ts +2 -0
  270. package/src/atoms/composed/ColorSwatch/ColorSwatch.tsx +72 -0
  271. package/src/atoms/composed/ColorSwatch/index.ts +1 -0
  272. package/src/atoms/composed/DarkModeToggle.tsx +66 -0
  273. package/src/atoms/composed/DataBadge/DataBadge.tsx +81 -0
  274. package/src/atoms/composed/DataBadge/index.ts +1 -0
  275. package/src/atoms/composed/DataTable/DataTable.tsx +394 -0
  276. package/src/atoms/composed/DataTable/TableCellWithTooltip.tsx +41 -0
  277. package/src/atoms/composed/DataTable/index.ts +2 -0
  278. package/src/atoms/composed/DateTimePicker/DateTimePicker.tsx +611 -0
  279. package/src/atoms/composed/DateTimePicker/index.ts +2 -0
  280. package/src/atoms/composed/DetailedCard/DetailedCard.tsx +181 -0
  281. package/src/atoms/composed/DetailedCard/index.ts +2 -0
  282. package/src/atoms/composed/EmptyState/EmptyState.tsx +90 -0
  283. package/src/atoms/composed/EmptyState/index.ts +1 -0
  284. package/src/atoms/composed/FileUpload/FileUpload.tsx +477 -0
  285. package/src/atoms/composed/FileUpload/index.ts +2 -0
  286. package/src/atoms/composed/FormField/FormField.tsx +92 -0
  287. package/src/atoms/composed/FormField/index.ts +1 -0
  288. package/src/atoms/composed/GlobalSearch/GlobalSearch.tsx +37 -0
  289. package/src/atoms/composed/GlobalSearch/index.ts +1 -0
  290. package/src/atoms/composed/IconBadge/IconBadge.tsx +95 -0
  291. package/src/atoms/composed/IconBadge/index.ts +2 -0
  292. package/src/atoms/composed/Modal/Modal.tsx +223 -0
  293. package/src/atoms/composed/Modal/index.ts +2 -0
  294. package/src/atoms/composed/PaletteSwitcher.tsx +386 -0
  295. package/src/atoms/composed/ProgressBar/ProgressBar.tsx +116 -0
  296. package/src/atoms/composed/ProgressBar/index.ts +1 -0
  297. package/src/atoms/composed/StatCard/StatCard.tsx +219 -0
  298. package/src/atoms/composed/StatCard/index.ts +1 -0
  299. package/src/atoms/composed/StyleGuide.tsx +717 -0
  300. package/src/atoms/composed/Toast/Toast.tsx +219 -0
  301. package/src/atoms/composed/Toast/index.ts +1 -0
  302. package/src/atoms/composed/Tooltip/Tooltip.tsx +213 -0
  303. package/src/atoms/composed/Tooltip/index.ts +1 -0
  304. package/src/atoms/composed/UserAvatar/UserAvatar.tsx +139 -0
  305. package/src/atoms/composed/UserAvatar/index.ts +1 -0
  306. package/src/atoms/composed/UserMenu/UserMenu.tsx +16 -0
  307. package/src/atoms/composed/UserMenu/index.ts +1 -0
  308. package/src/atoms/composed/index.ts +29 -0
  309. package/src/atoms/hooks/useApi.ts +80 -0
  310. package/src/atoms/hooks/useHealth.ts +17 -0
  311. package/src/atoms/index.ts +13 -0
  312. package/src/atoms/services/api/client.ts +134 -0
  313. package/src/atoms/services/auth-service.ts +248 -0
  314. package/src/atoms/services/health.ts +15 -0
  315. package/src/atoms/services/index.ts +3 -0
  316. package/src/atoms/shared/config/constants.ts +17 -0
  317. package/src/atoms/shared/config/dashboard-sizes.ts +111 -0
  318. package/src/atoms/shared/config/environment.ts +10 -0
  319. package/src/atoms/shared/index.ts +4 -0
  320. package/src/atoms/shared/styles/color-palettes.css +566 -0
  321. package/src/atoms/types/auth.ts +62 -0
  322. package/src/atoms/types/generated.ts +1469 -0
  323. package/src/atoms/types/index.ts +4 -0
  324. package/src/atoms/types/loading.ts +28 -0
  325. package/src/atoms/ui/Badge.tsx +30 -0
  326. package/src/atoms/ui/ErrorBoundary.tsx +59 -0
  327. package/src/atoms/ui/Select.tsx +53 -0
  328. package/src/atoms/ui/Switch.tsx +42 -0
  329. package/src/atoms/ui/Tabs.tsx +118 -0
  330. package/src/atoms/ui/avatar.tsx +48 -0
  331. package/src/atoms/ui/button.tsx +70 -0
  332. package/src/atoms/ui/card.tsx +76 -0
  333. package/src/atoms/ui/dropdown-menu.tsx +199 -0
  334. package/src/atoms/ui/index.ts +39 -0
  335. package/src/atoms/ui/input.tsx +23 -0
  336. package/src/atoms/ui/label.tsx +23 -0
  337. package/src/atoms/ui/skeleton.tsx +13 -0
  338. package/src/atoms/ui/spinner.tsx +49 -0
  339. package/src/atoms/ui/table.tsx +116 -0
  340. package/src/atoms/utils/animations.ts +135 -0
  341. package/src/atoms/utils/tooltip-helpers.ts +140 -0
  342. package/src/atoms/utils/utils.ts +9 -0
  343. package/src/features/auth/components/LoginForm.tsx +168 -0
  344. package/src/features/auth/components/LogoutButton.tsx +19 -0
  345. package/src/features/auth/components/ProtectedRoute.tsx +60 -0
  346. package/src/features/auth/components/index.ts +4 -0
  347. package/src/features/auth/hooks/index.ts +2 -0
  348. package/src/features/auth/hooks/useAuth.tsx +205 -0
  349. package/src/features/auth/hooks/usePermissions.ts +35 -0
  350. package/src/features/auth/index.ts +2 -0
  351. package/src/features/index.ts +2 -0
  352. package/src/index.css +704 -0
  353. package/src/index.ts +13 -0
  354. package/src/main.tsx +48 -0
  355. package/src/molecules/.gitkeep +0 -0
  356. package/src/molecules/forms/FormGroup.tsx +75 -0
  357. package/src/molecules/forms/SearchInput.tsx +259 -0
  358. package/src/molecules/forms/index.ts +4 -0
  359. package/src/molecules/index.ts +4 -0
  360. package/src/molecules/layout/AppHeader/AppHeader.tsx +42 -0
  361. package/src/molecules/layout/AppHeader/index.ts +1 -0
  362. package/src/molecules/layout/AppLayout.tsx +29 -0
  363. package/src/molecules/layout/PageTemplate.tsx +87 -0
  364. package/src/molecules/layout/SectionHeader/SectionHeader.tsx +87 -0
  365. package/src/molecules/layout/SectionHeader/index.ts +1 -0
  366. package/src/molecules/layout/ShowcaseSection.tsx +57 -0
  367. package/src/molecules/layout/Sidebar.tsx +144 -0
  368. package/src/molecules/layout/SidebarButton/SidebarButton.tsx +99 -0
  369. package/src/molecules/layout/SidebarButton/index.ts +1 -0
  370. package/src/molecules/layout/SidebarContext.tsx +31 -0
  371. package/src/molecules/layout/index.ts +7 -0
  372. package/src/molecules/navigation/NavMenu.tsx +188 -0
  373. package/src/molecules/navigation/Pagination.tsx +172 -0
  374. package/src/molecules/navigation/index.ts +4 -0
  375. package/src/organisms/index.ts +5 -0
  376. package/src/organisms/showcase/ComponentShowcasePage.tsx +2496 -0
  377. package/src/organisms/showcase/index.ts +1 -0
  378. package/src/pages/AdminShowcase/AdminCRUDShowcase.tsx +242 -0
  379. package/src/pages/AdminShowcase/AdminDashboardShowcase.tsx +171 -0
  380. package/src/pages/AdminShowcase/AdminDetailShowcase.tsx +385 -0
  381. package/src/pages/AdminShowcase/index.tsx +3 -0
  382. package/src/pages/ComponentShowcase/BadgesShowcase.tsx +188 -0
  383. package/src/pages/ComponentShowcase/CardsShowcase.tsx +392 -0
  384. package/src/pages/ComponentShowcase/PalettesShowcase.tsx +207 -0
  385. package/src/pages/ComponentShowcase/StatesShowcase.tsx +485 -0
  386. package/src/pages/ComponentShowcase/TablesShowcase.tsx +134 -0
  387. package/src/pages/ComponentShowcase/TypographyShowcase.tsx +255 -0
  388. package/src/pages/ComponentShowcase/index.tsx +188 -0
  389. package/src/pages/index.ts +2 -0
  390. package/src/templates/AuthTemplate.tsx +216 -0
  391. package/src/templates/ComponentShowcaseTemplate.tsx +173 -0
  392. package/src/templates/DashboardTemplate.tsx +232 -0
  393. package/src/templates/DataTemplate.tsx +319 -0
  394. package/src/templates/admin/AdminCRUDTemplate.tsx +630 -0
  395. package/src/templates/admin/AdminDashboardTemplate.tsx +351 -0
  396. package/src/templates/admin/AdminDetailTemplate.tsx +563 -0
  397. package/src/templates/admin/index.ts +29 -0
  398. package/src/templates/factory.tsx +169 -0
  399. package/src/templates/index.ts +37 -0
  400. package/src/vite-env.d.ts +1 -0
@@ -0,0 +1,199 @@
1
+ import * as React from "react"
2
+ import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"
3
+ import { Check, ChevronRight, Circle } from "lucide-react"
4
+
5
+ import { cn } from '../utils/utils'
6
+
7
+ const DropdownMenu = DropdownMenuPrimitive.Root
8
+
9
+ const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger
10
+
11
+ const DropdownMenuGroup = DropdownMenuPrimitive.Group
12
+
13
+ const DropdownMenuPortal = DropdownMenuPrimitive.Portal
14
+
15
+ const DropdownMenuSub = DropdownMenuPrimitive.Sub
16
+
17
+ const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup
18
+
19
+ const DropdownMenuSubTrigger = React.forwardRef<
20
+ React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,
21
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {
22
+ inset?: boolean
23
+ }
24
+ >(({ className, inset, children, ...props }, ref) => (
25
+ <DropdownMenuPrimitive.SubTrigger
26
+ ref={ref}
27
+ className={cn(
28
+ "flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent",
29
+ inset && "pl-8",
30
+ className
31
+ )}
32
+ {...props}
33
+ >
34
+ {children}
35
+ <ChevronRight className="ml-auto h-4 w-4" />
36
+ </DropdownMenuPrimitive.SubTrigger>
37
+ ))
38
+ DropdownMenuSubTrigger.displayName =
39
+ DropdownMenuPrimitive.SubTrigger.displayName
40
+
41
+ const DropdownMenuSubContent = React.forwardRef<
42
+ React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,
43
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>
44
+ >(({ className, ...props }, ref) => (
45
+ <DropdownMenuPrimitive.SubContent
46
+ ref={ref}
47
+ className={cn(
48
+ "z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
49
+ className
50
+ )}
51
+ {...props}
52
+ />
53
+ ))
54
+ DropdownMenuSubContent.displayName =
55
+ DropdownMenuPrimitive.SubContent.displayName
56
+
57
+ const DropdownMenuContent = React.forwardRef<
58
+ React.ElementRef<typeof DropdownMenuPrimitive.Content>,
59
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>
60
+ >(({ className, sideOffset = 4, ...props }, ref) => (
61
+ <DropdownMenuPrimitive.Portal>
62
+ <DropdownMenuPrimitive.Content
63
+ ref={ref}
64
+ sideOffset={sideOffset}
65
+ className={cn(
66
+ "z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md",
67
+ "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
68
+ className
69
+ )}
70
+ {...props}
71
+ />
72
+ </DropdownMenuPrimitive.Portal>
73
+ ))
74
+ DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName
75
+
76
+ const DropdownMenuItem = React.forwardRef<
77
+ React.ElementRef<typeof DropdownMenuPrimitive.Item>,
78
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {
79
+ inset?: boolean
80
+ }
81
+ >(({ className, inset, ...props }, ref) => (
82
+ <DropdownMenuPrimitive.Item
83
+ ref={ref}
84
+ className={cn(
85
+ "relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
86
+ inset && "pl-8",
87
+ className
88
+ )}
89
+ {...props}
90
+ />
91
+ ))
92
+ DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName
93
+
94
+ const DropdownMenuCheckboxItem = React.forwardRef<
95
+ React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,
96
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>
97
+ >(({ className, children, checked, ...props }, ref) => (
98
+ <DropdownMenuPrimitive.CheckboxItem
99
+ ref={ref}
100
+ className={cn(
101
+ "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
102
+ className
103
+ )}
104
+ checked={checked}
105
+ {...props}
106
+ >
107
+ <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
108
+ <DropdownMenuPrimitive.ItemIndicator>
109
+ <Check className="h-4 w-4" />
110
+ </DropdownMenuPrimitive.ItemIndicator>
111
+ </span>
112
+ {children}
113
+ </DropdownMenuPrimitive.CheckboxItem>
114
+ ))
115
+ DropdownMenuCheckboxItem.displayName =
116
+ DropdownMenuPrimitive.CheckboxItem.displayName
117
+
118
+ const DropdownMenuRadioItem = React.forwardRef<
119
+ React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,
120
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>
121
+ >(({ className, children, ...props }, ref) => (
122
+ <DropdownMenuPrimitive.RadioItem
123
+ ref={ref}
124
+ className={cn(
125
+ "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
126
+ className
127
+ )}
128
+ {...props}
129
+ >
130
+ <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
131
+ <DropdownMenuPrimitive.ItemIndicator>
132
+ <Circle className="h-2 w-2 fill-current" />
133
+ </DropdownMenuPrimitive.ItemIndicator>
134
+ </span>
135
+ {children}
136
+ </DropdownMenuPrimitive.RadioItem>
137
+ ))
138
+ DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName
139
+
140
+ const DropdownMenuLabel = React.forwardRef<
141
+ React.ElementRef<typeof DropdownMenuPrimitive.Label>,
142
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {
143
+ inset?: boolean
144
+ }
145
+ >(({ className, inset, ...props }, ref) => (
146
+ <DropdownMenuPrimitive.Label
147
+ ref={ref}
148
+ className={cn(
149
+ "px-2 py-1.5 text-sm font-semibold",
150
+ inset && "pl-8",
151
+ className
152
+ )}
153
+ {...props}
154
+ />
155
+ ))
156
+ DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName
157
+
158
+ const DropdownMenuSeparator = React.forwardRef<
159
+ React.ElementRef<typeof DropdownMenuPrimitive.Separator>,
160
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>
161
+ >(({ className, ...props }, ref) => (
162
+ <DropdownMenuPrimitive.Separator
163
+ ref={ref}
164
+ className={cn("-mx-1 my-1 h-px bg-muted", className)}
165
+ {...props}
166
+ />
167
+ ))
168
+ DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName
169
+
170
+ const DropdownMenuShortcut = ({
171
+ className,
172
+ ...props
173
+ }: React.HTMLAttributes<HTMLSpanElement>) => {
174
+ return (
175
+ <span
176
+ className={cn("ml-auto text-xs tracking-widest opacity-60", className)}
177
+ {...props}
178
+ />
179
+ )
180
+ }
181
+ DropdownMenuShortcut.displayName = "DropdownMenuShortcut"
182
+
183
+ export {
184
+ DropdownMenu,
185
+ DropdownMenuTrigger,
186
+ DropdownMenuContent,
187
+ DropdownMenuItem,
188
+ DropdownMenuCheckboxItem,
189
+ DropdownMenuRadioItem,
190
+ DropdownMenuLabel,
191
+ DropdownMenuSeparator,
192
+ DropdownMenuShortcut,
193
+ DropdownMenuGroup,
194
+ DropdownMenuPortal,
195
+ DropdownMenuSub,
196
+ DropdownMenuSubContent,
197
+ DropdownMenuSubTrigger,
198
+ DropdownMenuRadioGroup,
199
+ }
@@ -0,0 +1,39 @@
1
+ // Export shared UI components here
2
+ export { ErrorBoundary } from './ErrorBoundary';
3
+
4
+ // Export ShadCN UI components (local)
5
+ export { Button } from './button';
6
+ export { Card, CardContent, CardDescription, CardHeader, CardTitle, CardFooter } from './card';
7
+ export { Input } from './input';
8
+ export { Label } from './label';
9
+ export { Table, TableBody, TableCaption, TableCell, TableHead, TableHeader, TableRow, TableFooter } from './table';
10
+
11
+ // Export custom components
12
+ export { Badge } from './Badge';
13
+ export { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from './Select';
14
+ export { Switch } from './Switch';
15
+ export { Tabs, TabsContent, TabsList, TabsTrigger } from './Tabs';
16
+ export { Avatar, AvatarImage, AvatarFallback } from './avatar';
17
+ export {
18
+ DropdownMenu,
19
+ DropdownMenuTrigger,
20
+ DropdownMenuContent,
21
+ DropdownMenuItem,
22
+ DropdownMenuCheckboxItem,
23
+ DropdownMenuRadioItem,
24
+ DropdownMenuLabel,
25
+ DropdownMenuSeparator,
26
+ DropdownMenuShortcut,
27
+ DropdownMenuGroup,
28
+ DropdownMenuPortal,
29
+ DropdownMenuSub,
30
+ DropdownMenuSubContent,
31
+ DropdownMenuSubTrigger,
32
+ DropdownMenuRadioGroup
33
+ } from './dropdown-menu';
34
+
35
+ // Export skeleton component
36
+ export { Skeleton } from './skeleton';
37
+
38
+ // Export loading components
39
+ export { Spinner, Loading } from './spinner';
@@ -0,0 +1,23 @@
1
+ import * as React from "react"
2
+ import { cn } from '../utils/utils'
3
+
4
+ export type InputProps = React.InputHTMLAttributes<HTMLInputElement>
5
+
6
+ const Input = React.forwardRef<HTMLInputElement, InputProps>(
7
+ ({ className, type, ...props }, ref) => {
8
+ return (
9
+ <input
10
+ type={type}
11
+ className={cn(
12
+ "flex h-10 w-full rounded border border-border bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus:border-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/20 focus-visible:ring-offset-0 disabled:cursor-not-allowed disabled:opacity-50 transition-all",
13
+ className
14
+ )}
15
+ ref={ref}
16
+ {...props}
17
+ />
18
+ )
19
+ }
20
+ )
21
+ Input.displayName = "Input"
22
+
23
+ export { Input }
@@ -0,0 +1,23 @@
1
+ import * as React from "react"
2
+ import * as LabelPrimitive from "@radix-ui/react-label"
3
+ import { cva, type VariantProps } from "class-variance-authority"
4
+ import { cn } from '../utils/utils'
5
+
6
+ const labelVariants = cva(
7
+ "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
8
+ )
9
+
10
+ const Label = React.forwardRef<
11
+ React.ElementRef<typeof LabelPrimitive.Root>,
12
+ React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &
13
+ VariantProps<typeof labelVariants>
14
+ >(({ className, ...props }, ref) => (
15
+ <LabelPrimitive.Root
16
+ ref={ref}
17
+ className={cn(labelVariants(), className)}
18
+ {...props}
19
+ />
20
+ ))
21
+ Label.displayName = LabelPrimitive.Root.displayName
22
+
23
+ export { Label }
@@ -0,0 +1,13 @@
1
+ import { cn } from '../utils/utils'
2
+
3
+ function Skeleton({ className, ...props }: React.ComponentProps<"div">) {
4
+ return (
5
+ <div
6
+ data-slot="skeleton"
7
+ className={cn("bg-accent animate-pulse rounded-md", className)}
8
+ {...props}
9
+ />
10
+ )
11
+ }
12
+
13
+ export { Skeleton }
@@ -0,0 +1,49 @@
1
+ import React from 'react';
2
+ import { cn } from '../utils/utils';
3
+ import { Loader2 } from 'lucide-react';
4
+
5
+ interface SpinnerProps {
6
+ size?: 'sm' | 'md' | 'lg';
7
+ className?: string;
8
+ }
9
+
10
+ const sizeMap = {
11
+ sm: 'w-4 h-4',
12
+ md: 'w-6 h-6',
13
+ lg: 'w-8 h-8'
14
+ };
15
+
16
+ export const Spinner: React.FC<SpinnerProps> = ({
17
+ size = 'md',
18
+ className
19
+ }) => {
20
+ return (
21
+ <Loader2
22
+ className={cn(
23
+ 'animate-spin text-muted-foreground',
24
+ sizeMap[size],
25
+ className
26
+ )}
27
+ />
28
+ );
29
+ };
30
+
31
+ // Alternative loading component for inline use
32
+ interface LoadingProps {
33
+ text?: string;
34
+ size?: 'sm' | 'md' | 'lg';
35
+ className?: string;
36
+ }
37
+
38
+ export const Loading: React.FC<LoadingProps> = ({
39
+ text = 'Loading...',
40
+ size = 'md',
41
+ className
42
+ }) => {
43
+ return (
44
+ <div className={cn('flex items-center gap-2 text-muted-foreground', className)}>
45
+ <Spinner size={size} />
46
+ <span className="text-sm">{text}</span>
47
+ </div>
48
+ );
49
+ };
@@ -0,0 +1,116 @@
1
+ import * as React from "react"
2
+ import { cn } from '../utils/utils'
3
+
4
+ const Table = React.forwardRef<
5
+ HTMLTableElement,
6
+ React.HTMLAttributes<HTMLTableElement>
7
+ >(({ className, ...props }, ref) => (
8
+ <div className="relative w-full overflow-auto">
9
+ <table
10
+ ref={ref}
11
+ className={cn("w-full caption-bottom text-sm", className)}
12
+ {...props}
13
+ />
14
+ </div>
15
+ ))
16
+ Table.displayName = "Table"
17
+
18
+ const TableHeader = React.forwardRef<
19
+ HTMLTableSectionElement,
20
+ React.HTMLAttributes<HTMLTableSectionElement>
21
+ >(({ className, ...props }, ref) => (
22
+ <thead ref={ref} className={cn("[&_tr]:border-b", className)} {...props} />
23
+ ))
24
+ TableHeader.displayName = "TableHeader"
25
+
26
+ const TableBody = React.forwardRef<
27
+ HTMLTableSectionElement,
28
+ React.HTMLAttributes<HTMLTableSectionElement>
29
+ >(({ className, ...props }, ref) => (
30
+ <tbody
31
+ ref={ref}
32
+ className={cn("[&_tr:last-child]:border-0", className)}
33
+ {...props}
34
+ />
35
+ ))
36
+ TableBody.displayName = "TableBody"
37
+
38
+ const TableFooter = React.forwardRef<
39
+ HTMLTableSectionElement,
40
+ React.HTMLAttributes<HTMLTableSectionElement>
41
+ >(({ className, ...props }, ref) => (
42
+ <tfoot
43
+ ref={ref}
44
+ className={cn(
45
+ "border-t bg-muted/50 font-medium [&>tr]:last:border-b-0",
46
+ className
47
+ )}
48
+ {...props}
49
+ />
50
+ ))
51
+ TableFooter.displayName = "TableFooter"
52
+
53
+ const TableRow = React.forwardRef<
54
+ HTMLTableRowElement,
55
+ React.HTMLAttributes<HTMLTableRowElement>
56
+ >(({ className, ...props }, ref) => (
57
+ <tr
58
+ ref={ref}
59
+ className={cn(
60
+ "border-b border-gray-100 transition-all duration-150 hover:bg-gray-50/50 data-[state=selected]:bg-gray-100",
61
+ className
62
+ )}
63
+ {...props}
64
+ />
65
+ ))
66
+ TableRow.displayName = "TableRow"
67
+
68
+ const TableHead = React.forwardRef<
69
+ HTMLTableCellElement,
70
+ React.ThHTMLAttributes<HTMLTableCellElement>
71
+ >(({ className, ...props }, ref) => (
72
+ <th
73
+ ref={ref}
74
+ className={cn(
75
+ "h-12 px-4 text-left align-middle font-semibold text-gray-700 text-xs uppercase tracking-wider [&:has([role=checkbox])]:pr-0",
76
+ className
77
+ )}
78
+ {...props}
79
+ />
80
+ ))
81
+ TableHead.displayName = "TableHead"
82
+
83
+ const TableCell = React.forwardRef<
84
+ HTMLTableCellElement,
85
+ React.TdHTMLAttributes<HTMLTableCellElement>
86
+ >(({ className, ...props }, ref) => (
87
+ <td
88
+ ref={ref}
89
+ className={cn("p-4 align-middle [&:has([role=checkbox])]:pr-0", className)}
90
+ {...props}
91
+ />
92
+ ))
93
+ TableCell.displayName = "TableCell"
94
+
95
+ const TableCaption = React.forwardRef<
96
+ HTMLTableCaptionElement,
97
+ React.HTMLAttributes<HTMLTableCaptionElement>
98
+ >(({ className, ...props }, ref) => (
99
+ <caption
100
+ ref={ref}
101
+ className={cn("mt-4 text-sm text-muted-foreground", className)}
102
+ {...props}
103
+ />
104
+ ))
105
+ TableCaption.displayName = "TableCaption"
106
+
107
+ export {
108
+ Table,
109
+ TableHeader,
110
+ TableBody,
111
+ TableFooter,
112
+ TableHead,
113
+ TableRow,
114
+ TableCell,
115
+ TableCaption,
116
+ }
@@ -0,0 +1,135 @@
1
+ import { cva, type VariantProps } from 'class-variance-authority';
2
+
3
+ /**
4
+ * Centralized animation variants system for consistent interactions across components.
5
+ *
6
+ * Based on analysis of successful patterns:
7
+ * - DataBadge: scale + shadow effects work well (tactile feel)
8
+ * - Tab hover: needs consistency in timing
9
+ * - Overall: standardize timing and easing
10
+ */
11
+
12
+ export const interactionVariants = cva(
13
+ // Base transition classes applied to all interactive elements
14
+ 'transition-all ease-out',
15
+ {
16
+ variants: {
17
+ /**
18
+ * Animation type based on component purpose and successful patterns
19
+ */
20
+ type: {
21
+ /**
22
+ * Subtle: minimal hover effects for navigation elements
23
+ * Used for: secondary buttons, nav links, subtle interactive elements
24
+ */
25
+ subtle: 'duration-200 hover:bg-accent/50 hover:text-accent-foreground',
26
+
27
+ /**
28
+ * Tactile: badges, chips with satisfying scale + shadow feedback
29
+ * Used for: DataBadge, chips, small interactive elements
30
+ * PRESERVE: This pattern works well and should be maintained
31
+ */
32
+ tactile: 'duration-200 hover:scale-105 active:scale-95 shadow hover:shadow-md',
33
+
34
+ /**
35
+ * Card: cards and major content blocks with elevation
36
+ * Used for: content cards, major clickable areas
37
+ */
38
+ card: 'duration-300 hover:shadow-lg hover:-translate-y-0.5',
39
+
40
+ /**
41
+ * Button: primary actions with clear feedback
42
+ * Used for: primary buttons, call-to-action elements
43
+ */
44
+ button: 'duration-200 hover:scale-[1.02] active:scale-[0.98] hover:shadow-md',
45
+
46
+ /**
47
+ * Tab: header navigation tabs with tactile feedback
48
+ * UPDATED: Removed scale and border changes to prevent layout jitter
49
+ */
50
+ tab: 'duration-200 hover:shadow-sm hover:bg-accent/30',
51
+ },
52
+
53
+ /**
54
+ * Size affects the scale intensity for different component sizes
55
+ */
56
+ size: {
57
+ sm: '', // Default scaling
58
+ md: '', // Default scaling
59
+ lg: 'hover:scale-[1.03] active:scale-[0.97]', // Reduced scaling for larger elements
60
+ xl: 'hover:scale-[1.02] active:scale-[0.98]', // Minimal scaling for very large elements
61
+ },
62
+
63
+ /**
64
+ * Timing variants for special cases
65
+ */
66
+ timing: {
67
+ instant: 'duration-100',
68
+ fast: 'duration-150',
69
+ normal: 'duration-200',
70
+ slow: 'duration-300',
71
+ slower: 'duration-500',
72
+ },
73
+
74
+ /**
75
+ * Disable animations for accessibility or performance
76
+ */
77
+ disabled: {
78
+ true: 'transition-none',
79
+ false: '',
80
+ }
81
+ },
82
+ defaultVariants: {
83
+ type: 'subtle',
84
+ size: 'md',
85
+ timing: 'normal',
86
+ disabled: false,
87
+ },
88
+ }
89
+ );
90
+
91
+ export type InteractionVariants = VariantProps<typeof interactionVariants>;
92
+
93
+ /**
94
+ * Helper function to get animation classes
95
+ * @param variants - Animation variant configuration
96
+ * @returns Tailwind classes for the animation
97
+ */
98
+ export const getAnimationClasses = (variants?: InteractionVariants) => {
99
+ return interactionVariants(variants);
100
+ };
101
+
102
+ /**
103
+ * Predefined animation configurations for common use cases
104
+ */
105
+ export const animationPresets = {
106
+ // Preserve successful DataBadge pattern
107
+ dataBadge: { type: 'tactile' as const, timing: 'normal' as const },
108
+
109
+ // Improved tab pattern to match tactile feel
110
+ tab: { type: 'tab' as const, timing: 'normal' as const },
111
+
112
+ // Other common patterns
113
+ button: { type: 'button' as const, timing: 'normal' as const },
114
+ card: { type: 'card' as const, timing: 'slow' as const },
115
+ subtle: { type: 'subtle' as const, timing: 'normal' as const },
116
+
117
+ // Size-specific presets
118
+ smallTactile: { type: 'tactile' as const, size: 'sm' as const },
119
+ largeTactile: { type: 'tactile' as const, size: 'lg' as const },
120
+ } as const;
121
+
122
+ /**
123
+ * Legacy class combinations for migration reference
124
+ * These can be replaced with the new animation system
125
+ */
126
+ export const legacyPatterns = {
127
+ // Current DataBadge: 'hover:scale-105 active:scale-95 shadow hover:shadow'
128
+ dataBadgeLegacy: 'transition-all hover:scale-105 active:scale-95 shadow hover:shadow',
129
+
130
+ // Current TabsTrigger: 'hover:scale-105 active:scale-95 hover:shadow transition-all duration-150'
131
+ tabTriggerLegacy: 'transition-all duration-150 hover:scale-105 active:scale-95 hover:shadow',
132
+
133
+ // Current TabsList: 'hover:shadow-md transition-all duration-200'
134
+ tabsListLegacy: 'transition-all duration-200 hover:shadow-md',
135
+ } as const;