@12-apps/ui 1.0.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 (633) hide show
  1. package/components-catalog.md +806 -0
  2. package/components-guidelines.md +347 -0
  3. package/dist/index.cjs +2 -0
  4. package/dist/index.cjs.map +1 -0
  5. package/dist/index.d.cts +2 -0
  6. package/dist/index.d.ts +2 -0
  7. package/dist/index.js +1 -0
  8. package/dist/index.js.map +1 -0
  9. package/eslint.config.js +77 -0
  10. package/package.json +247 -0
  11. package/src/__tests__/package-wiring.test.ts +37 -0
  12. package/src/__tests__/setup.ts +1 -0
  13. package/src/__tests__/social-login-button.test.tsx +186 -0
  14. package/src/__tests__/user-avatar.test.tsx +195 -0
  15. package/src/button.tsx +22 -0
  16. package/src/components/command/__tests__/command.test.tsx +112 -0
  17. package/src/components/data-display/Alert/Alert.md +209 -0
  18. package/src/components/data-display/Alert/Alert.stories.tsx +561 -0
  19. package/src/components/data-display/Alert/Alert.test.stories.tsx +709 -0
  20. package/src/components/data-display/Alert/Alert.tsx +449 -0
  21. package/src/components/data-display/Alert/Alert.types.ts +79 -0
  22. package/src/components/data-display/Alert/index.ts +2 -0
  23. package/src/components/data-display/AlertDialog/AlertDialog.md +408 -0
  24. package/src/components/data-display/AlertDialog/AlertDialog.stories.tsx +360 -0
  25. package/src/components/data-display/AlertDialog/AlertDialog.test.stories.tsx +753 -0
  26. package/src/components/data-display/AlertDialog/AlertDialog.tsx +273 -0
  27. package/src/components/data-display/AlertDialog/AlertDialog.types.ts +74 -0
  28. package/src/components/data-display/AlertDialog/index.ts +2 -0
  29. package/src/components/data-display/AsyncStateContainer/AsyncStateContainer.stories.tsx +230 -0
  30. package/src/components/data-display/AsyncStateContainer/AsyncStateContainer.test.stories.tsx +270 -0
  31. package/src/components/data-display/AsyncStateContainer/AsyncStateContainer.tsx +116 -0
  32. package/src/components/data-display/AsyncStateContainer/AsyncStateContainer.types.ts +70 -0
  33. package/src/components/data-display/AsyncStateContainer/index.ts +2 -0
  34. package/src/components/data-display/Avatar/Avatar.md +568 -0
  35. package/src/components/data-display/Avatar/Avatar.stories.tsx +718 -0
  36. package/src/components/data-display/Avatar/Avatar.test.stories.tsx +820 -0
  37. package/src/components/data-display/Avatar/Avatar.tsx +507 -0
  38. package/src/components/data-display/Avatar/Avatar.types.ts +88 -0
  39. package/src/components/data-display/Avatar/index.ts +2 -0
  40. package/src/components/data-display/Badge/Badge.md +469 -0
  41. package/src/components/data-display/Badge/Badge.stories.tsx +1136 -0
  42. package/src/components/data-display/Badge/Badge.test.stories.tsx +1193 -0
  43. package/src/components/data-display/Badge/Badge.tsx +606 -0
  44. package/src/components/data-display/Badge/Badge.types.ts +118 -0
  45. package/src/components/data-display/Badge/index.ts +2 -0
  46. package/src/components/data-display/Banner/Banner.stories.tsx +524 -0
  47. package/src/components/data-display/Banner/Banner.test.stories.tsx +503 -0
  48. package/src/components/data-display/Banner/Banner.tsx +350 -0
  49. package/src/components/data-display/Banner/Banner.types.ts +41 -0
  50. package/src/components/data-display/Banner/banner.md +141 -0
  51. package/src/components/data-display/Banner/index.ts +2 -0
  52. package/src/components/data-display/Carousel/Carousel.md +815 -0
  53. package/src/components/data-display/Carousel/Carousel.stories.tsx +607 -0
  54. package/src/components/data-display/Carousel/Carousel.test.stories.tsx +691 -0
  55. package/src/components/data-display/Carousel/Carousel.tsx +765 -0
  56. package/src/components/data-display/Carousel/Carousel.types.ts +79 -0
  57. package/src/components/data-display/Carousel/index.ts +8 -0
  58. package/src/components/data-display/Chart/Chart.md +352 -0
  59. package/src/components/data-display/Chart/Chart.stories.tsx +568 -0
  60. package/src/components/data-display/Chart/Chart.test.stories.tsx +174 -0
  61. package/src/components/data-display/Chart/Chart.tsx +520 -0
  62. package/src/components/data-display/Chart/Chart.types.ts +65 -0
  63. package/src/components/data-display/Chart/index.ts +2 -0
  64. package/src/components/data-display/Chip/Chip.stories.tsx +251 -0
  65. package/src/components/data-display/Chip/Chip.test.stories.tsx +263 -0
  66. package/src/components/data-display/Chip/Chip.tsx +134 -0
  67. package/src/components/data-display/Chip/Chip.types.ts +51 -0
  68. package/src/components/data-display/Chip/chip.md +395 -0
  69. package/src/components/data-display/Chip/index.ts +2 -0
  70. package/src/components/data-display/DataGrid/DataGrid.md +602 -0
  71. package/src/components/data-display/DataGrid/DataGrid.stories.tsx +515 -0
  72. package/src/components/data-display/DataGrid/DataGrid.test.stories.tsx +659 -0
  73. package/src/components/data-display/DataGrid/DataGrid.tsx +743 -0
  74. package/src/components/data-display/DataGrid/DataGrid.types.ts +171 -0
  75. package/src/components/data-display/DataGrid/index.ts +21 -0
  76. package/src/components/data-display/DateTimeDisplay/DateTimeDisplay.tsx +197 -0
  77. package/src/components/data-display/DateTimeDisplay/DateTimeDisplay.types.ts +46 -0
  78. package/src/components/data-display/DateTimeDisplay/index.ts +2 -0
  79. package/src/components/data-display/DescriptionItem/DescriptionItem.md +226 -0
  80. package/src/components/data-display/DescriptionItem/DescriptionItem.stories.tsx +254 -0
  81. package/src/components/data-display/DescriptionItem/DescriptionItem.tsx +100 -0
  82. package/src/components/data-display/DescriptionItem/DescriptionItem.types.ts +1 -0
  83. package/src/components/data-display/DescriptionItem/index.ts +2 -0
  84. package/src/components/data-display/EmptyState/EmptyState.md +265 -0
  85. package/src/components/data-display/EmptyState/EmptyState.stories.tsx +282 -0
  86. package/src/components/data-display/EmptyState/EmptyState.test.stories.tsx +441 -0
  87. package/src/components/data-display/EmptyState/EmptyState.tsx +180 -0
  88. package/src/components/data-display/EmptyState/EmptyState.types.ts +31 -0
  89. package/src/components/data-display/EmptyState/index.ts +2 -0
  90. package/src/components/data-display/ErrorState/ErrorState.stories.tsx +110 -0
  91. package/src/components/data-display/ErrorState/ErrorState.test.stories.tsx +133 -0
  92. package/src/components/data-display/ErrorState/ErrorState.tsx +118 -0
  93. package/src/components/data-display/ErrorState/ErrorState.types.ts +45 -0
  94. package/src/components/data-display/ErrorState/index.ts +2 -0
  95. package/src/components/data-display/HoverCard/HoverCard.md +389 -0
  96. package/src/components/data-display/HoverCard/HoverCard.stories.tsx +648 -0
  97. package/src/components/data-display/HoverCard/HoverCard.test.stories.tsx +929 -0
  98. package/src/components/data-display/HoverCard/HoverCard.tsx +657 -0
  99. package/src/components/data-display/HoverCard/HoverCard.types.ts +116 -0
  100. package/src/components/data-display/HoverCard/index.ts +2 -0
  101. package/src/components/data-display/InteractiveTooltip/InteractiveTooltip.md +532 -0
  102. package/src/components/data-display/InteractiveTooltip/InteractiveTooltip.stories.tsx +411 -0
  103. package/src/components/data-display/InteractiveTooltip/InteractiveTooltip.tsx +245 -0
  104. package/src/components/data-display/InteractiveTooltip/InteractiveTooltip.types.ts +64 -0
  105. package/src/components/data-display/InteractiveTooltip/index.ts +2 -0
  106. package/src/components/data-display/LazyImage/LazyImage.md +356 -0
  107. package/src/components/data-display/LazyImage/LazyImage.stories.tsx +387 -0
  108. package/src/components/data-display/LazyImage/LazyImage.tsx +323 -0
  109. package/src/components/data-display/LazyImage/LazyImage.types.ts +205 -0
  110. package/src/components/data-display/LazyImage/index.ts +2 -0
  111. package/src/components/data-display/Lightbox/Lightbox.stories.tsx +315 -0
  112. package/src/components/data-display/Lightbox/Lightbox.test.stories.tsx +605 -0
  113. package/src/components/data-display/Lightbox/Lightbox.tsx +666 -0
  114. package/src/components/data-display/Lightbox/Lightbox.types.ts +49 -0
  115. package/src/components/data-display/Lightbox/index.ts +2 -0
  116. package/src/components/data-display/Lightbox/lightbox.md +298 -0
  117. package/src/components/data-display/LoadingState/LoadingState.stories.tsx +124 -0
  118. package/src/components/data-display/LoadingState/LoadingState.test.stories.tsx +99 -0
  119. package/src/components/data-display/LoadingState/LoadingState.tsx +103 -0
  120. package/src/components/data-display/LoadingState/LoadingState.types.ts +37 -0
  121. package/src/components/data-display/LoadingState/index.ts +2 -0
  122. package/src/components/data-display/MapPreview/MapPreview.md +154 -0
  123. package/src/components/data-display/MapPreview/MapPreview.stories.tsx +458 -0
  124. package/src/components/data-display/MapPreview/MapPreview.test.stories.tsx +390 -0
  125. package/src/components/data-display/MapPreview/MapPreview.tsx +922 -0
  126. package/src/components/data-display/MapPreview/MapPreview.types.ts +56 -0
  127. package/src/components/data-display/MapPreview/index.ts +2 -0
  128. package/src/components/data-display/Popover/Popover.md +245 -0
  129. package/src/components/data-display/Popover/Popover.stories.tsx +295 -0
  130. package/src/components/data-display/Popover/Popover.test.stories.tsx +1168 -0
  131. package/src/components/data-display/Popover/Popover.tsx +132 -0
  132. package/src/components/data-display/Popover/Popover.types.ts +33 -0
  133. package/src/components/data-display/Popover/index.ts +2 -0
  134. package/src/components/data-display/Progress/Progress.md +450 -0
  135. package/src/components/data-display/Progress/Progress.stories.tsx +481 -0
  136. package/src/components/data-display/Progress/Progress.test.stories.tsx +2070 -0
  137. package/src/components/data-display/Progress/Progress.tsx +332 -0
  138. package/src/components/data-display/Progress/Progress.types.ts +61 -0
  139. package/src/components/data-display/Progress/index.ts +2 -0
  140. package/src/components/data-display/SectionOnboarding/SectionOnboarding.md +108 -0
  141. package/src/components/data-display/SectionOnboarding/SectionOnboarding.stories.tsx +160 -0
  142. package/src/components/data-display/SectionOnboarding/SectionOnboarding.test.stories.tsx +190 -0
  143. package/src/components/data-display/SectionOnboarding/SectionOnboarding.tsx +224 -0
  144. package/src/components/data-display/SectionOnboarding/SectionOnboarding.types.ts +101 -0
  145. package/src/components/data-display/SectionOnboarding/index.ts +7 -0
  146. package/src/components/data-display/Sheet/Sheet.md +475 -0
  147. package/src/components/data-display/Sheet/Sheet.stories.tsx +883 -0
  148. package/src/components/data-display/Sheet/Sheet.test.stories.tsx +1101 -0
  149. package/src/components/data-display/Sheet/Sheet.tsx +978 -0
  150. package/src/components/data-display/Sheet/Sheet.types.ts +93 -0
  151. package/src/components/data-display/Sheet/index.ts +8 -0
  152. package/src/components/data-display/Stepper/Stepper.md +542 -0
  153. package/src/components/data-display/Stepper/Stepper.stories.tsx +540 -0
  154. package/src/components/data-display/Stepper/Stepper.test.stories.tsx +607 -0
  155. package/src/components/data-display/Stepper/Stepper.tsx +328 -0
  156. package/src/components/data-display/Stepper/Stepper.types.ts +97 -0
  157. package/src/components/data-display/Stepper/index.ts +2 -0
  158. package/src/components/data-display/Table/Table.md +243 -0
  159. package/src/components/data-display/Table/Table.stories.tsx +801 -0
  160. package/src/components/data-display/Table/Table.test.stories.tsx +369 -0
  161. package/src/components/data-display/Table/Table.tsx +831 -0
  162. package/src/components/data-display/Table/Table.types.ts +335 -0
  163. package/src/components/data-display/Table/index.ts +2 -0
  164. package/src/components/data-display/Timeline/Timeline.md +201 -0
  165. package/src/components/data-display/Timeline/Timeline.stories.tsx +444 -0
  166. package/src/components/data-display/Timeline/Timeline.test.stories.tsx +944 -0
  167. package/src/components/data-display/Timeline/Timeline.tsx +348 -0
  168. package/src/components/data-display/Timeline/Timeline.types.ts +26 -0
  169. package/src/components/data-display/Timeline/index.ts +2 -0
  170. package/src/components/data-display/TimingDiagram/TimingDiagram.md +162 -0
  171. package/src/components/data-display/TimingDiagram/TimingDiagram.stories.tsx +475 -0
  172. package/src/components/data-display/TimingDiagram/TimingDiagram.test.stories.tsx +734 -0
  173. package/src/components/data-display/TimingDiagram/TimingDiagram.tsx +399 -0
  174. package/src/components/data-display/TimingDiagram/TimingDiagram.types.ts +19 -0
  175. package/src/components/data-display/TimingDiagram/index.ts +2 -0
  176. package/src/components/data-display/Tooltip/Tooltip.md +397 -0
  177. package/src/components/data-display/Tooltip/Tooltip.stories.tsx +465 -0
  178. package/src/components/data-display/Tooltip/Tooltip.test.stories.tsx +1168 -0
  179. package/src/components/data-display/Tooltip/Tooltip.tsx +161 -0
  180. package/src/components/data-display/Tooltip/Tooltip.types.ts +33 -0
  181. package/src/components/data-display/Tooltip/index.ts +2 -0
  182. package/src/components/data-display/index.ts +29 -0
  183. package/src/components/feedback/Dialog/Dialog.md +527 -0
  184. package/src/components/feedback/Dialog/Dialog.stories.tsx +833 -0
  185. package/src/components/feedback/Dialog/Dialog.styles.ts +171 -0
  186. package/src/components/feedback/Dialog/Dialog.test.stories.tsx +955 -0
  187. package/src/components/feedback/Dialog/Dialog.tsx +256 -0
  188. package/src/components/feedback/Dialog/Dialog.types.ts +46 -0
  189. package/src/components/feedback/Dialog/index.ts +9 -0
  190. package/src/components/feedback/Modal/Modal.md +629 -0
  191. package/src/components/feedback/Modal/Modal.stories.tsx +765 -0
  192. package/src/components/feedback/Modal/Modal.test.stories.tsx +251 -0
  193. package/src/components/feedback/Modal/Modal.tsx +279 -0
  194. package/src/components/feedback/Modal/Modal.types.ts +26 -0
  195. package/src/components/feedback/Modal/index.ts +7 -0
  196. package/src/components/feedback/Sonner/Sonner.stories.tsx +698 -0
  197. package/src/components/feedback/Sonner/Sonner.test.stories.tsx +896 -0
  198. package/src/components/feedback/Sonner/Sonner.tsx +493 -0
  199. package/src/components/feedback/Sonner/Sonner.types.ts +65 -0
  200. package/src/components/feedback/Sonner/index.ts +8 -0
  201. package/src/components/feedback/StackedModal/StackedModal.md +273 -0
  202. package/src/components/feedback/StackedModal/StackedModal.stories.tsx +1785 -0
  203. package/src/components/feedback/StackedModal/StackedModal.test.stories.tsx +975 -0
  204. package/src/components/feedback/StackedModal/StackedModal.tsx +664 -0
  205. package/src/components/feedback/StackedModal/StackedModal.types.ts +70 -0
  206. package/src/components/feedback/StackedModal/index.ts +11 -0
  207. package/src/components/feedback/Toast/Toast.md +547 -0
  208. package/src/components/feedback/Toast/Toast.stories.tsx +548 -0
  209. package/src/components/feedback/Toast/Toast.test.stories.tsx +834 -0
  210. package/src/components/feedback/Toast/Toast.tsx +279 -0
  211. package/src/components/feedback/Toast/Toast.types.ts +59 -0
  212. package/src/components/feedback/Toast/index.ts +8 -0
  213. package/src/components/feedback/TutorialOverlay/TutorialOverlay.md +610 -0
  214. package/src/components/feedback/TutorialOverlay/TutorialOverlay.stories.tsx +691 -0
  215. package/src/components/feedback/TutorialOverlay/TutorialOverlay.test.stories.tsx +634 -0
  216. package/src/components/feedback/TutorialOverlay/TutorialOverlay.tsx +554 -0
  217. package/src/components/feedback/TutorialOverlay/TutorialOverlay.types.ts +30 -0
  218. package/src/components/feedback/TutorialOverlay/index.ts +2 -0
  219. package/src/components/feedback/index.ts +6 -0
  220. package/src/components/form/AddressAutocomplete/AddressAutocomplete.md +633 -0
  221. package/src/components/form/AddressAutocomplete/AddressAutocomplete.stories.tsx +663 -0
  222. package/src/components/form/AddressAutocomplete/AddressAutocomplete.test.stories.tsx +723 -0
  223. package/src/components/form/AddressAutocomplete/AddressAutocomplete.tsx +836 -0
  224. package/src/components/form/AddressAutocomplete/AddressAutocomplete.types.ts +37 -0
  225. package/src/components/form/AddressAutocomplete/index.ts +2 -0
  226. package/src/components/form/Autocomplete/Autocomplete.helpers.ts +115 -0
  227. package/src/components/form/Autocomplete/Autocomplete.keys.ts +134 -0
  228. package/src/components/form/Autocomplete/Autocomplete.parts.tsx +337 -0
  229. package/src/components/form/Autocomplete/Autocomplete.stories.tsx +715 -0
  230. package/src/components/form/Autocomplete/Autocomplete.test.stories.tsx +825 -0
  231. package/src/components/form/Autocomplete/Autocomplete.tsx +166 -0
  232. package/src/components/form/Autocomplete/Autocomplete.types.ts +116 -0
  233. package/src/components/form/Autocomplete/autocomplete.md +789 -0
  234. package/src/components/form/Autocomplete/index.ts +8 -0
  235. package/src/components/form/Autocomplete/useAutocomplete.ts +311 -0
  236. package/src/components/form/Button/Button.md +411 -0
  237. package/src/components/form/Button/Button.stories.tsx +362 -0
  238. package/src/components/form/Button/Button.test.stories.tsx +603 -0
  239. package/src/components/form/Button/Button.tsx +326 -0
  240. package/src/components/form/Button/Button.types.ts +74 -0
  241. package/src/components/form/Button/index.ts +2 -0
  242. package/src/components/form/Calendar/Calendar.md +807 -0
  243. package/src/components/form/Calendar/Calendar.stories.tsx +349 -0
  244. package/src/components/form/Calendar/Calendar.test.stories.tsx +465 -0
  245. package/src/components/form/Calendar/Calendar.tsx +571 -0
  246. package/src/components/form/Calendar/Calendar.types.ts +81 -0
  247. package/src/components/form/Calendar/index.ts +11 -0
  248. package/src/components/form/Checkbox/Checkbox.md +200 -0
  249. package/src/components/form/Checkbox/Checkbox.stories.tsx +265 -0
  250. package/src/components/form/Checkbox/Checkbox.test.stories.tsx +181 -0
  251. package/src/components/form/Checkbox/Checkbox.tsx +170 -0
  252. package/src/components/form/Checkbox/Checkbox.types.ts +20 -0
  253. package/src/components/form/Checkbox/index.ts +2 -0
  254. package/src/components/form/CodeEditor/CodeEditor.md +350 -0
  255. package/src/components/form/CodeEditor/CodeEditor.stories.tsx +871 -0
  256. package/src/components/form/CodeEditor/CodeEditor.test.stories.tsx +575 -0
  257. package/src/components/form/CodeEditor/CodeEditor.tsx +415 -0
  258. package/src/components/form/CodeEditor/CodeEditor.types.ts +38 -0
  259. package/src/components/form/CodeEditor/index.ts +2 -0
  260. package/src/components/form/Command/Command.md +468 -0
  261. package/src/components/form/Command/Command.stories.tsx +580 -0
  262. package/src/components/form/Command/Command.test.stories.tsx +215 -0
  263. package/src/components/form/Command/Command.tsx +545 -0
  264. package/src/components/form/Command/Command.types.ts +116 -0
  265. package/src/components/form/Command/index.ts +12 -0
  266. package/src/components/form/CreatableSelect/CreatableSelect.md +114 -0
  267. package/src/components/form/CreatableSelect/CreatableSelect.stories.tsx +112 -0
  268. package/src/components/form/CreatableSelect/CreatableSelect.test.stories.tsx +134 -0
  269. package/src/components/form/CreatableSelect/CreatableSelect.tsx +149 -0
  270. package/src/components/form/CreatableSelect/CreatableSelect.types.ts +37 -0
  271. package/src/components/form/CreatableSelect/index.ts +2 -0
  272. package/src/components/form/Form/Form.md +325 -0
  273. package/src/components/form/Form/Form.stories.tsx +687 -0
  274. package/src/components/form/Form/Form.test.stories.tsx +601 -0
  275. package/src/components/form/Form/Form.tsx +136 -0
  276. package/src/components/form/Form/Form.types.ts +42 -0
  277. package/src/components/form/Form/index.ts +8 -0
  278. package/src/components/form/Input/Input.md +252 -0
  279. package/src/components/form/Input/Input.stories.tsx +256 -0
  280. package/src/components/form/Input/Input.test.stories.tsx +1184 -0
  281. package/src/components/form/Input/Input.tsx +263 -0
  282. package/src/components/form/Input/Input.types.ts +24 -0
  283. package/src/components/form/Input/index.ts +2 -0
  284. package/src/components/form/InputOTP/InputOTP.md +419 -0
  285. package/src/components/form/InputOTP/InputOTP.stories.tsx +774 -0
  286. package/src/components/form/InputOTP/InputOTP.test.stories.tsx +596 -0
  287. package/src/components/form/InputOTP/InputOTP.tsx +231 -0
  288. package/src/components/form/InputOTP/InputOTP.types.ts +68 -0
  289. package/src/components/form/InputOTP/index.ts +2 -0
  290. package/src/components/form/Label/Label.md +426 -0
  291. package/src/components/form/Label/Label.stories.tsx +473 -0
  292. package/src/components/form/Label/Label.test.stories.tsx +909 -0
  293. package/src/components/form/Label/Label.tsx +367 -0
  294. package/src/components/form/Label/Label.types.ts +35 -0
  295. package/src/components/form/Label/index.ts +2 -0
  296. package/src/components/form/Menubar/Menubar.md +275 -0
  297. package/src/components/form/Menubar/Menubar.stories.tsx +472 -0
  298. package/src/components/form/Menubar/Menubar.test.stories.tsx +588 -0
  299. package/src/components/form/Menubar/Menubar.tsx +467 -0
  300. package/src/components/form/Menubar/Menubar.types.ts +71 -0
  301. package/src/components/form/Menubar/index.ts +8 -0
  302. package/src/components/form/PasswordStrength/PasswordStrength.md +139 -0
  303. package/src/components/form/PasswordStrength/PasswordStrength.stories.tsx +562 -0
  304. package/src/components/form/PasswordStrength/PasswordStrength.test.stories.tsx +327 -0
  305. package/src/components/form/PasswordStrength/PasswordStrength.tsx +419 -0
  306. package/src/components/form/PasswordStrength/PasswordStrength.types.ts +18 -0
  307. package/src/components/form/PasswordStrength/index.ts +2 -0
  308. package/src/components/form/PhoneInput/PhoneInput.md +578 -0
  309. package/src/components/form/PhoneInput/PhoneInput.stories.tsx +495 -0
  310. package/src/components/form/PhoneInput/PhoneInput.test.stories.tsx +666 -0
  311. package/src/components/form/PhoneInput/PhoneInput.tsx +376 -0
  312. package/src/components/form/PhoneInput/PhoneInput.types.ts +25 -0
  313. package/src/components/form/PhoneInput/index.ts +2 -0
  314. package/src/components/form/RadioGroup/RadioGroup.md +477 -0
  315. package/src/components/form/RadioGroup/RadioGroup.stories.tsx +518 -0
  316. package/src/components/form/RadioGroup/RadioGroup.test.stories.tsx +685 -0
  317. package/src/components/form/RadioGroup/RadioGroup.tsx +664 -0
  318. package/src/components/form/RadioGroup/RadioGroup.types.ts +82 -0
  319. package/src/components/form/RadioGroup/index.ts +2 -0
  320. package/src/components/form/RichTextEditor/RichTextEditor.md +710 -0
  321. package/src/components/form/RichTextEditor/RichTextEditor.stories.tsx +261 -0
  322. package/src/components/form/RichTextEditor/RichTextEditor.test.stories.tsx +498 -0
  323. package/src/components/form/RichTextEditor/RichTextEditor.tsx +468 -0
  324. package/src/components/form/RichTextEditor/RichTextEditor.types.ts +72 -0
  325. package/src/components/form/RichTextEditor/index.ts +2 -0
  326. package/src/components/form/SearchPalette/SearchPalette.md +69 -0
  327. package/src/components/form/SearchPalette/SearchPalette.parts.tsx +358 -0
  328. package/src/components/form/SearchPalette/SearchPalette.stories.tsx +135 -0
  329. package/src/components/form/SearchPalette/SearchPalette.tsx +141 -0
  330. package/src/components/form/SearchPalette/SearchPalette.types.ts +82 -0
  331. package/src/components/form/SearchPalette/index.ts +7 -0
  332. package/src/components/form/Select/Select.md +254 -0
  333. package/src/components/form/Select/Select.stories.tsx +364 -0
  334. package/src/components/form/Select/Select.test.stories.tsx +977 -0
  335. package/src/components/form/Select/Select.tsx +239 -0
  336. package/src/components/form/Select/Select.types.ts +57 -0
  337. package/src/components/form/Select/index.ts +2 -0
  338. package/src/components/form/Slider/Slider.md +326 -0
  339. package/src/components/form/Slider/Slider.stories.tsx +418 -0
  340. package/src/components/form/Slider/Slider.test.stories.tsx +1044 -0
  341. package/src/components/form/Slider/Slider.tsx +374 -0
  342. package/src/components/form/Slider/Slider.types.ts +113 -0
  343. package/src/components/form/Slider/index.ts +2 -0
  344. package/src/components/form/Switch/Switch.md +565 -0
  345. package/src/components/form/Switch/Switch.stories.tsx +697 -0
  346. package/src/components/form/Switch/Switch.test.stories.tsx +597 -0
  347. package/src/components/form/Switch/Switch.tsx +578 -0
  348. package/src/components/form/Switch/Switch.types.ts +130 -0
  349. package/src/components/form/Switch/index.ts +2 -0
  350. package/src/components/form/Textarea/Textarea.stories.tsx +473 -0
  351. package/src/components/form/Textarea/Textarea.test.stories.tsx +708 -0
  352. package/src/components/form/Textarea/Textarea.tsx +678 -0
  353. package/src/components/form/Textarea/Textarea.types.ts +84 -0
  354. package/src/components/form/Textarea/index.ts +2 -0
  355. package/src/components/form/Toggle/Toggle.md +234 -0
  356. package/src/components/form/Toggle/Toggle.stories.tsx +638 -0
  357. package/src/components/form/Toggle/Toggle.test.stories.tsx +1167 -0
  358. package/src/components/form/Toggle/Toggle.tsx +265 -0
  359. package/src/components/form/Toggle/Toggle.types.ts +79 -0
  360. package/src/components/form/Toggle/index.ts +2 -0
  361. package/src/components/form/ToggleGroup/ToggleGroup.md +329 -0
  362. package/src/components/form/ToggleGroup/ToggleGroup.stories.tsx +617 -0
  363. package/src/components/form/ToggleGroup/ToggleGroup.test.stories.tsx +918 -0
  364. package/src/components/form/ToggleGroup/ToggleGroup.tsx +129 -0
  365. package/src/components/form/ToggleGroup/ToggleGroup.types.ts +53 -0
  366. package/src/components/form/ToggleGroup/index.ts +2 -0
  367. package/src/components/form/UploadButton/UploadButton.md +44 -0
  368. package/src/components/form/UploadButton/UploadButton.stories.tsx +366 -0
  369. package/src/components/form/UploadButton/UploadButton.test.stories.tsx +454 -0
  370. package/src/components/form/UploadButton/UploadButton.tsx +312 -0
  371. package/src/components/form/UploadButton/UploadButton.types.ts +58 -0
  372. package/src/components/form/UploadButton/index.ts +2 -0
  373. package/src/components/form/index.ts +25 -0
  374. package/src/components/form/total-form/Fields/SelectField.tsx +57 -0
  375. package/src/components/form/total-form/Fields/TextField.tsx +58 -0
  376. package/src/components/form/total-form/Fields/index.ts +4 -0
  377. package/src/components/form/total-form/FormContainer.tsx +104 -0
  378. package/src/components/form/total-form/FormContext.tsx +38 -0
  379. package/src/components/form/total-form/FormErrorSnackbar.tsx +35 -0
  380. package/src/components/form/total-form/SubmitButton.tsx +27 -0
  381. package/src/components/form/total-form/index.ts +12 -0
  382. package/src/components/form/total-form/total-form.test.tsx +97 -0
  383. package/src/components/index.ts +7 -0
  384. package/src/components/layout/Accordion/Accordion.md +725 -0
  385. package/src/components/layout/Accordion/Accordion.stories.tsx +690 -0
  386. package/src/components/layout/Accordion/Accordion.test.stories.tsx +1362 -0
  387. package/src/components/layout/Accordion/Accordion.tsx +242 -0
  388. package/src/components/layout/Accordion/Accordion.types.ts +32 -0
  389. package/src/components/layout/Accordion/index.ts +8 -0
  390. package/src/components/layout/Card/Card.md +533 -0
  391. package/src/components/layout/Card/Card.stories.tsx +593 -0
  392. package/src/components/layout/Card/Card.test.stories.tsx +1134 -0
  393. package/src/components/layout/Card/Card.tsx +404 -0
  394. package/src/components/layout/Card/Card.types.ts +57 -0
  395. package/src/components/layout/Card/index.ts +8 -0
  396. package/src/components/layout/Collapsible/Collapsible.md +135 -0
  397. package/src/components/layout/Collapsible/Collapsible.stories.tsx +180 -0
  398. package/src/components/layout/Collapsible/Collapsible.test.stories.tsx +304 -0
  399. package/src/components/layout/Collapsible/Collapsible.tsx +198 -0
  400. package/src/components/layout/Collapsible/Collapsible.types.ts +35 -0
  401. package/src/components/layout/Collapsible/index.ts +6 -0
  402. package/src/components/layout/Container/Container.md +420 -0
  403. package/src/components/layout/Container/Container.stories.tsx +557 -0
  404. package/src/components/layout/Container/Container.test.stories.tsx +750 -0
  405. package/src/components/layout/Container/Container.tsx +72 -0
  406. package/src/components/layout/Container/Container.types.ts +11 -0
  407. package/src/components/layout/Container/index.ts +2 -0
  408. package/src/components/layout/ContentToolbar/ColumnsMenu.tsx +99 -0
  409. package/src/components/layout/ContentToolbar/ContentToolbar.md +75 -0
  410. package/src/components/layout/ContentToolbar/ContentToolbar.stories.tsx +129 -0
  411. package/src/components/layout/ContentToolbar/ContentToolbar.test.stories.tsx +251 -0
  412. package/src/components/layout/ContentToolbar/ContentToolbar.tsx +108 -0
  413. package/src/components/layout/ContentToolbar/ContentToolbar.types.ts +229 -0
  414. package/src/components/layout/ContentToolbar/FilterTrigger.tsx +71 -0
  415. package/src/components/layout/ContentToolbar/MultiSelectDropdown.tsx +297 -0
  416. package/src/components/layout/ContentToolbar/SavedViewsMenu.tsx +334 -0
  417. package/src/components/layout/ContentToolbar/SortByDropdown.tsx +213 -0
  418. package/src/components/layout/ContentToolbar/ViewSelector.tsx +98 -0
  419. package/src/components/layout/ContentToolbar/__tests__/ColumnsMenu.test.tsx +39 -0
  420. package/src/components/layout/ContentToolbar/__tests__/MultiSelectDropdown.test.tsx +110 -0
  421. package/src/components/layout/ContentToolbar/__tests__/SavedViewsMenu.test.tsx +99 -0
  422. package/src/components/layout/ContentToolbar/index.ts +24 -0
  423. package/src/components/layout/ContentToolbar/tests.md +42 -0
  424. package/src/components/layout/ContentToolbar/track.md +41 -0
  425. package/src/components/layout/Dashboard/Dashboard.md +71 -0
  426. package/src/components/layout/Dashboard/Dashboard.stories.tsx +104 -0
  427. package/src/components/layout/Dashboard/Dashboard.test.stories.tsx +164 -0
  428. package/src/components/layout/Dashboard/Dashboard.tsx +297 -0
  429. package/src/components/layout/Dashboard/Dashboard.types.ts +157 -0
  430. package/src/components/layout/Dashboard/DashboardContext.tsx +47 -0
  431. package/src/components/layout/Dashboard/DashboardParts.tsx +216 -0
  432. package/src/components/layout/Dashboard/index.ts +18 -0
  433. package/src/components/layout/Dashboard/tests.md +46 -0
  434. package/src/components/layout/Dashboard/track.md +50 -0
  435. package/src/components/layout/Drawer/Drawer.md +479 -0
  436. package/src/components/layout/Drawer/Drawer.stories.tsx +660 -0
  437. package/src/components/layout/Drawer/Drawer.test.stories.tsx +1339 -0
  438. package/src/components/layout/Drawer/Drawer.tsx +150 -0
  439. package/src/components/layout/Drawer/Drawer.types.ts +34 -0
  440. package/src/components/layout/Drawer/index.ts +2 -0
  441. package/src/components/layout/Resizable/Resizable.md +308 -0
  442. package/src/components/layout/Resizable/Resizable.stories.tsx +1039 -0
  443. package/src/components/layout/Resizable/Resizable.test.stories.tsx +750 -0
  444. package/src/components/layout/Resizable/Resizable.tsx +190 -0
  445. package/src/components/layout/Resizable/Resizable.types.ts +34 -0
  446. package/src/components/layout/Resizable/index.ts +2 -0
  447. package/src/components/layout/ScrollArea/ScrollArea.md +122 -0
  448. package/src/components/layout/ScrollArea/ScrollArea.stories.tsx +651 -0
  449. package/src/components/layout/ScrollArea/ScrollArea.test.stories.tsx +619 -0
  450. package/src/components/layout/ScrollArea/ScrollArea.tsx +449 -0
  451. package/src/components/layout/ScrollArea/ScrollArea.types.ts +80 -0
  452. package/src/components/layout/ScrollArea/index.ts +7 -0
  453. package/src/components/layout/Separator/Separator.stories.tsx +563 -0
  454. package/src/components/layout/Separator/Separator.test.stories.tsx +527 -0
  455. package/src/components/layout/Separator/Separator.tsx +187 -0
  456. package/src/components/layout/Separator/Separator.types.ts +17 -0
  457. package/src/components/layout/Separator/index.ts +2 -0
  458. package/src/components/layout/SettingsLayout/SettingsLayout.md +139 -0
  459. package/src/components/layout/SettingsLayout/SettingsLayout.parts.tsx +357 -0
  460. package/src/components/layout/SettingsLayout/SettingsLayout.stories.tsx +194 -0
  461. package/src/components/layout/SettingsLayout/SettingsLayout.test.stories.tsx +175 -0
  462. package/src/components/layout/SettingsLayout/SettingsLayout.tsx +69 -0
  463. package/src/components/layout/SettingsLayout/SettingsLayout.types.ts +61 -0
  464. package/src/components/layout/SettingsLayout/index.ts +6 -0
  465. package/src/components/layout/Sidebar/Sidebar.md +367 -0
  466. package/src/components/layout/Sidebar/Sidebar.stories.tsx +611 -0
  467. package/src/components/layout/Sidebar/Sidebar.test.stories.tsx +1326 -0
  468. package/src/components/layout/Sidebar/Sidebar.tsx +131 -0
  469. package/src/components/layout/Sidebar/Sidebar.types.ts +30 -0
  470. package/src/components/layout/Sidebar/index.ts +7 -0
  471. package/src/components/layout/Skeleton/Skeleton.md +240 -0
  472. package/src/components/layout/Skeleton/Skeleton.stories.tsx +689 -0
  473. package/src/components/layout/Skeleton/Skeleton.test.stories.tsx +521 -0
  474. package/src/components/layout/Skeleton/Skeleton.tsx +166 -0
  475. package/src/components/layout/Skeleton/Skeleton.types.ts +19 -0
  476. package/src/components/layout/Skeleton/index.ts +2 -0
  477. package/src/components/layout/Spacer/Spacer.md +84 -0
  478. package/src/components/layout/Spacer/Spacer.stories.tsx +502 -0
  479. package/src/components/layout/Spacer/Spacer.test.stories.tsx +472 -0
  480. package/src/components/layout/Spacer/Spacer.tsx +68 -0
  481. package/src/components/layout/Spacer/Spacer.types.ts +12 -0
  482. package/src/components/layout/Spacer/index.ts +2 -0
  483. package/src/components/layout/TableFilter/TableFilter.md +55 -0
  484. package/src/components/layout/TableFilter/TableFilter.stories.tsx +82 -0
  485. package/src/components/layout/TableFilter/TableFilter.test.stories.tsx +87 -0
  486. package/src/components/layout/TableFilter/TableFilter.tsx +383 -0
  487. package/src/components/layout/TableFilter/TableFilter.types.ts +87 -0
  488. package/src/components/layout/TableFilter/TableFilterContext.tsx +29 -0
  489. package/src/components/layout/TableFilter/index.ts +15 -0
  490. package/src/components/layout/TableFilter/tests.md +37 -0
  491. package/src/components/layout/TableFilter/track.md +36 -0
  492. package/src/components/layout/index.ts +14 -0
  493. package/src/components/navigation/Breadcrumbs/Breadcrumbs.md +558 -0
  494. package/src/components/navigation/Breadcrumbs/Breadcrumbs.stories.tsx +640 -0
  495. package/src/components/navigation/Breadcrumbs/Breadcrumbs.test.stories.tsx +1007 -0
  496. package/src/components/navigation/Breadcrumbs/Breadcrumbs.tsx +516 -0
  497. package/src/components/navigation/Breadcrumbs/Breadcrumbs.types.ts +132 -0
  498. package/src/components/navigation/Breadcrumbs/index.ts +2 -0
  499. package/src/components/navigation/CommandPalette/CommandPalette.md +201 -0
  500. package/src/components/navigation/CommandPalette/CommandPalette.stories.tsx +384 -0
  501. package/src/components/navigation/CommandPalette/CommandPalette.test.stories.tsx +437 -0
  502. package/src/components/navigation/CommandPalette/CommandPalette.tsx +434 -0
  503. package/src/components/navigation/CommandPalette/CommandPalette.types.ts +25 -0
  504. package/src/components/navigation/CommandPalette/index.ts +2 -0
  505. package/src/components/navigation/ContextMenu/ContextMenu.md +535 -0
  506. package/src/components/navigation/ContextMenu/ContextMenu.stories.tsx +611 -0
  507. package/src/components/navigation/ContextMenu/ContextMenu.test.stories.tsx +850 -0
  508. package/src/components/navigation/ContextMenu/ContextMenu.tsx +254 -0
  509. package/src/components/navigation/ContextMenu/ContextMenu.types.ts +96 -0
  510. package/src/components/navigation/ContextMenu/index.ts +2 -0
  511. package/src/components/navigation/DropdownMenu/DropdownMenu.md +514 -0
  512. package/src/components/navigation/DropdownMenu/DropdownMenu.stories.tsx +580 -0
  513. package/src/components/navigation/DropdownMenu/DropdownMenu.test.stories.tsx +660 -0
  514. package/src/components/navigation/DropdownMenu/DropdownMenu.tsx +305 -0
  515. package/src/components/navigation/DropdownMenu/DropdownMenu.types.ts +116 -0
  516. package/src/components/navigation/DropdownMenu/index.ts +2 -0
  517. package/src/components/navigation/NavigationMenu/NavigationMenu.md +580 -0
  518. package/src/components/navigation/NavigationMenu/NavigationMenu.tsx +874 -0
  519. package/src/components/navigation/NavigationMenu/NavigationMenu.types.ts +135 -0
  520. package/src/components/navigation/NavigationMenu/index.ts +2 -0
  521. package/src/components/navigation/NavigationMenu/stories/NavigationMenu.stories.tsx +518 -0
  522. package/src/components/navigation/NavigationMenu/stories/NavigationMenu.test.stories.tsx +931 -0
  523. package/src/components/navigation/NavigationMenu/stories/NavigationMenuHorizontal.stories.tsx +503 -0
  524. package/src/components/navigation/NavigationMenu/stories/NavigationMenuVertical.stories.tsx +455 -0
  525. package/src/components/navigation/Pagination/Pagination.md +699 -0
  526. package/src/components/navigation/Pagination/Pagination.stories.tsx +604 -0
  527. package/src/components/navigation/Pagination/Pagination.test.stories.tsx +520 -0
  528. package/src/components/navigation/Pagination/Pagination.tsx +356 -0
  529. package/src/components/navigation/Pagination/Pagination.types.ts +129 -0
  530. package/src/components/navigation/Pagination/index.ts +2 -0
  531. package/src/components/navigation/Tabs/Tabs.md +774 -0
  532. package/src/components/navigation/Tabs/Tabs.stories.tsx +1006 -0
  533. package/src/components/navigation/Tabs/Tabs.test.stories.tsx +1225 -0
  534. package/src/components/navigation/Tabs/Tabs.tsx +433 -0
  535. package/src/components/navigation/Tabs/Tabs.types.ts +239 -0
  536. package/src/components/navigation/Tabs/index.ts +2 -0
  537. package/src/components/navigation/index.ts +7 -0
  538. package/src/components/typography/Blockquote/Blockquote.md +130 -0
  539. package/src/components/typography/Blockquote/Blockquote.stories.tsx +359 -0
  540. package/src/components/typography/Blockquote/Blockquote.test.stories.tsx +432 -0
  541. package/src/components/typography/Blockquote/Blockquote.tsx +166 -0
  542. package/src/components/typography/Blockquote/Blockquote.types.ts +11 -0
  543. package/src/components/typography/Blockquote/index.ts +2 -0
  544. package/src/components/typography/Code/Code.md +182 -0
  545. package/src/components/typography/Code/Code.stories.tsx +686 -0
  546. package/src/components/typography/Code/Code.test.stories.tsx +703 -0
  547. package/src/components/typography/Code/Code.tsx +228 -0
  548. package/src/components/typography/Code/Code.types.ts +12 -0
  549. package/src/components/typography/Code/index.ts +2 -0
  550. package/src/components/typography/Heading/Heading.md +143 -0
  551. package/src/components/typography/Heading/Heading.stories.tsx +451 -0
  552. package/src/components/typography/Heading/Heading.test.stories.tsx +830 -0
  553. package/src/components/typography/Heading/Heading.tsx +178 -0
  554. package/src/components/typography/Heading/Heading.types.ts +11 -0
  555. package/src/components/typography/Heading/index.ts +2 -0
  556. package/src/components/typography/Paragraph/Paragraph.md +80 -0
  557. package/src/components/typography/Paragraph/Paragraph.stories.tsx +280 -0
  558. package/src/components/typography/Paragraph/Paragraph.test.stories.tsx +238 -0
  559. package/src/components/typography/Paragraph/Paragraph.tsx +99 -0
  560. package/src/components/typography/Paragraph/Paragraph.types.ts +10 -0
  561. package/src/components/typography/Paragraph/index.ts +2 -0
  562. package/src/components/typography/Text/Text.md +129 -0
  563. package/src/components/typography/Text/Text.stories.tsx +359 -0
  564. package/src/components/typography/Text/Text.test.stories.tsx +762 -0
  565. package/src/components/typography/Text/Text.tsx +159 -0
  566. package/src/components/typography/Text/Text.types.ts +15 -0
  567. package/src/components/typography/Text/index.ts +2 -0
  568. package/src/components/typography/index.ts +5 -0
  569. package/src/components/utility/AnimatedIcon/AnimatedIcon.md +359 -0
  570. package/src/components/utility/AnimatedIcon/AnimatedIcon.stories.tsx +947 -0
  571. package/src/components/utility/AnimatedIcon/AnimatedIcon.test.stories.tsx +596 -0
  572. package/src/components/utility/AnimatedIcon/AnimatedIcon.tsx +595 -0
  573. package/src/components/utility/AnimatedIcon/AnimatedIcon.types.ts +98 -0
  574. package/src/components/utility/AnimatedIcon/index.ts +2 -0
  575. package/src/components/utility/AspectRatio/AspectRatio.md +200 -0
  576. package/src/components/utility/AspectRatio/AspectRatio.stories.tsx +414 -0
  577. package/src/components/utility/AspectRatio/AspectRatio.test.stories.tsx +859 -0
  578. package/src/components/utility/AspectRatio/AspectRatio.tsx +76 -0
  579. package/src/components/utility/AspectRatio/AspectRatio.types.ts +13 -0
  580. package/src/components/utility/AspectRatio/index.ts +2 -0
  581. package/src/components/utility/InfiniteScroll/InfiniteScroll.md +531 -0
  582. package/src/components/utility/InfiniteScroll/InfiniteScroll.stories.tsx +620 -0
  583. package/src/components/utility/InfiniteScroll/InfiniteScroll.test.stories.tsx +358 -0
  584. package/src/components/utility/InfiniteScroll/InfiniteScroll.tsx +204 -0
  585. package/src/components/utility/InfiniteScroll/InfiniteScroll.types.ts +39 -0
  586. package/src/components/utility/InfiniteScroll/index.ts +6 -0
  587. package/src/components/utility/Portal/Portal.button-container.example.tsx +99 -0
  588. package/src/components/utility/Portal/Portal.md +593 -0
  589. package/src/components/utility/Portal/Portal.stories.tsx +340 -0
  590. package/src/components/utility/Portal/Portal.test.stories.tsx +2086 -0
  591. package/src/components/utility/Portal/Portal.tsx +39 -0
  592. package/src/components/utility/Portal/Portal.types.ts +7 -0
  593. package/src/components/utility/Portal/index.ts +2 -0
  594. package/src/components/utility/Transition/Transition.md +684 -0
  595. package/src/components/utility/Transition/Transition.stories.tsx +493 -0
  596. package/src/components/utility/Transition/Transition.test.stories.tsx +854 -0
  597. package/src/components/utility/Transition/Transition.tsx +140 -0
  598. package/src/components/utility/Transition/Transition.types.ts +14 -0
  599. package/src/components/utility/Transition/index.ts +6 -0
  600. package/src/components/utility/VirtualList/VirtualList.md +520 -0
  601. package/src/components/utility/VirtualList/VirtualList.stories.tsx +1073 -0
  602. package/src/components/utility/VirtualList/VirtualList.test.stories.tsx +1074 -0
  603. package/src/components/utility/VirtualList/VirtualList.tsx +369 -0
  604. package/src/components/utility/VirtualList/VirtualList.types.ts +56 -0
  605. package/src/components/utility/VirtualList/index.ts +7 -0
  606. package/src/components/utility/WorkflowStep/WorkflowStep.md +187 -0
  607. package/src/components/utility/WorkflowStep/WorkflowStep.stories.tsx +433 -0
  608. package/src/components/utility/WorkflowStep/WorkflowStep.test.stories.tsx +364 -0
  609. package/src/components/utility/WorkflowStep/WorkflowStep.tsx +506 -0
  610. package/src/components/utility/WorkflowStep/WorkflowStep.types.ts +133 -0
  611. package/src/components/utility/WorkflowStep/index.ts +13 -0
  612. package/src/components/utility/index.ts +7 -0
  613. package/src/index.ts +17 -0
  614. package/src/mui/AppBar.ts +2 -0
  615. package/src/mui/Box.ts +2 -0
  616. package/src/mui/CssBaseline.ts +2 -0
  617. package/src/mui/FormControl.ts +2 -0
  618. package/src/mui/FormControlLabel.ts +2 -0
  619. package/src/mui/Grid2.ts +2 -0
  620. package/src/mui/InputLabel.ts +2 -0
  621. package/src/mui/List.ts +2 -0
  622. package/src/mui/ListItem.ts +2 -0
  623. package/src/mui/ListItemButton.ts +2 -0
  624. package/src/mui/ListItemText.ts +2 -0
  625. package/src/mui/Stack.ts +2 -0
  626. package/src/mui/SvgIcon.ts +2 -0
  627. package/src/mui/Toolbar.ts +2 -0
  628. package/src/mui/styles.ts +2 -0
  629. package/src/mui/useMediaQuery.ts +1 -0
  630. package/src/social-login-button.tsx +199 -0
  631. package/src/user-avatar.tsx +102 -0
  632. package/src/utils/cn.ts +9 -0
  633. package/src/utils/index.ts +1 -0
@@ -0,0 +1,699 @@
1
+ # Pagination Component
2
+
3
+ A flexible and customizable pagination component for navigating through multiple pages of content.
4
+
5
+ ## Purpose and Use Cases
6
+
7
+ The Pagination component provides users with an intuitive way to navigate through large datasets split across multiple pages. It supports various visual styles and configurations to match different design requirements.
8
+
9
+ ### Common Use Cases
10
+
11
+ - Table pagination for large datasets
12
+ - Search results pagination
13
+ - Product catalog navigation
14
+ - Blog post listings
15
+ - Gallery or media browsing
16
+ - API response pagination
17
+
18
+ ## Features
19
+
20
+ - **Multiple Variants**: Default, rounded, dots, and minimal styles
21
+ - **Size Options**: Small, medium, and large sizes
22
+ - **Customizable Icons**: Custom first, last, previous, and next button icons
23
+ - **Page Info Display**: Optional page information text
24
+ - **Items Per Page**: Optional items per page selector
25
+ - **Accessibility**: Full keyboard navigation and screen reader support
26
+ - **Responsive**: Works well across different screen sizes
27
+ - **Theme Integration**: Supports light/dark themes and custom colors
28
+
29
+ ## Props Documentation
30
+
31
+ ### Core Props
32
+
33
+ | Prop | Type | Default | Description |
34
+ | ---------- | ----------------------- | -------- | ------------------------------------ |
35
+ | `page` | `number` | Required | Current active page number (1-based) |
36
+ | `count` | `number` | Required | Total number of pages |
37
+ | `onChange` | `(event, page) => void` | Required | Callback when page changes |
38
+
39
+ ### Style Props
40
+
41
+ | Prop | Type | Default | Description |
42
+ | --------- | ----------------------------------------------- | ----------- | -------------------------- |
43
+ | `variant` | `'default' \| 'rounded' \| 'dots' \| 'minimal'` | `'default'` | Visual style variant |
44
+ | `size` | `'sm' \| 'md' \| 'lg'` | `'md'` | Size of pagination buttons |
45
+ | `color` | `'primary' \| 'secondary' \| 'standard'` | `'primary'` | Color theme |
46
+
47
+ ### Navigation Props
48
+
49
+ | Prop | Type | Default | Description |
50
+ | ----------------- | --------- | ------- | ----------------------------------------- |
51
+ | `boundaryCount` | `number` | `1` | Pages at beginning/end always visible |
52
+ | `siblingCount` | `number` | `1` | Pages before/after current always visible |
53
+ | `hideNextButton` | `boolean` | `false` | Hide next page button |
54
+ | `hidePrevButton` | `boolean` | `false` | Hide previous page button |
55
+ | `showFirstButton` | `boolean` | `false` | Show first page button |
56
+ | `showLastButton` | `boolean` | `false` | Show last page button |
57
+
58
+ ### Icon Props
59
+
60
+ | Prop | Type | Default | Description |
61
+ | -------------- | ----------- | -------------------- | ------------------------- |
62
+ | `firstIcon` | `ReactNode` | `<FirstPage />` | Custom first page icon |
63
+ | `lastIcon` | `ReactNode` | `<LastPage />` | Custom last page icon |
64
+ | `previousIcon` | `ReactNode` | `<NavigateBefore />` | Custom previous page icon |
65
+ | `nextIcon` | `ReactNode` | `<NavigateNext />` | Custom next page icon |
66
+
67
+ ### Display Props
68
+
69
+ | Prop | Type | Default | Description |
70
+ | ---------------------- | ------------------------- | ---------------------------- | ------------------------------ |
71
+ | `showPageInfo` | `boolean` | `false` | Show page information text |
72
+ | `pageInfoFormat` | `(page, count) => string` | `'Page ${page} of ${count}'` | Custom page info formatter |
73
+ | `showItemsPerPage` | `boolean` | `false` | Show items per page selector |
74
+ | `itemsPerPageOptions` | `number[]` | `[10, 25, 50, 100]` | Items per page options |
75
+ | `itemsPerPage` | `number` | `10` | Current items per page |
76
+ | `onItemsPerPageChange` | `(count) => void` | `undefined` | Items per page change callback |
77
+
78
+ ### Other Props
79
+
80
+ | Prop | Type | Default | Description |
81
+ | ----------- | --------- | ----------- | ------------------------------- |
82
+ | `disabled` | `boolean` | `false` | Disable all pagination controls |
83
+ | `className` | `string` | `undefined` | Additional CSS class name |
84
+
85
+ ## Usage Examples
86
+
87
+ ### Basic Pagination
88
+
89
+ ```tsx
90
+ import { Pagination } from '@/components/navigation/Pagination';
91
+
92
+ function BasicExample() {
93
+ const [page, setPage] = useState(1);
94
+ const totalPages = 10;
95
+
96
+ return (
97
+ <Pagination page={page} count={totalPages} onChange={(event, newPage) => setPage(newPage)} />
98
+ );
99
+ }
100
+ ```
101
+
102
+ ### With Page Info and Items Per Page
103
+
104
+ ```tsx
105
+ function CompleteExample() {
106
+ const [page, setPage] = useState(1);
107
+ const [itemsPerPage, setItemsPerPage] = useState(25);
108
+ const totalPages = Math.ceil(totalItems / itemsPerPage);
109
+
110
+ return (
111
+ <Pagination
112
+ page={page}
113
+ count={totalPages}
114
+ onChange={(event, newPage) => setPage(newPage)}
115
+ showPageInfo
116
+ showItemsPerPage
117
+ itemsPerPage={itemsPerPage}
118
+ onItemsPerPageChange={setItemsPerPage}
119
+ itemsPerPageOptions={[10, 25, 50, 100]}
120
+ />
121
+ );
122
+ }
123
+ ```
124
+
125
+ ### Different Variants
126
+
127
+ ```tsx
128
+ // Default variant (flat with hover effects)
129
+ <Pagination page={1} count={10} onChange={handleChange} />
130
+
131
+ // Rounded buttons
132
+ <Pagination
133
+ page={1}
134
+ count={10}
135
+ onChange={handleChange}
136
+ variant="rounded"
137
+ />
138
+
139
+ // Minimal dots (for image galleries)
140
+ <Pagination
141
+ page={1}
142
+ count={10}
143
+ onChange={handleChange}
144
+ variant="dots"
145
+ />
146
+
147
+ // Minimal text-only
148
+ <Pagination
149
+ page={1}
150
+ count={10}
151
+ onChange={handleChange}
152
+ variant="minimal"
153
+ />
154
+ ```
155
+
156
+ ### With Custom Icons
157
+
158
+ ```tsx
159
+ import { ArrowBack, ArrowForward } from '@mui/icons-material';
160
+
161
+ <Pagination
162
+ page={1}
163
+ count={10}
164
+ onChange={handleChange}
165
+ previousIcon={<ArrowBack />}
166
+ nextIcon={<ArrowForward />}
167
+ showFirstButton
168
+ showLastButton
169
+ />;
170
+ ```
171
+
172
+ ## Accessibility
173
+
174
+ The Pagination component is fully accessible:
175
+
176
+ - **Keyboard Navigation**: Full support for Tab, Enter, and arrow keys
177
+ - **Screen Reader Support**: Proper ARIA labels and announcements
178
+ - **Focus Management**: Clear focus indicators and logical tab order
179
+ - **High Contrast**: Works with high contrast themes
180
+ - **WCAG Compliance**: Meets WCAG 2.1 AA standards
181
+
182
+ ### Keyboard Shortcuts
183
+
184
+ - `Tab` / `Shift+Tab`: Navigate between buttons
185
+ - `Enter` / `Space`: Activate focused button
186
+ - `Home`: Jump to first page (when first button visible)
187
+ - `End`: Jump to last page (when last button visible)
188
+ - `Arrow Keys`: Navigate between page buttons
189
+
190
+ ## Best Practices
191
+
192
+ ### Design Guidelines
193
+
194
+ 1. **Use appropriate variants**:
195
+ - `default` for data tables
196
+ - `rounded` for modern interfaces
197
+ - `dots` for image carousels/galleries
198
+ - `minimal` for content-heavy layouts
199
+
200
+ 2. **Choose the right size**:
201
+ - `sm` for compact layouts or mobile
202
+ - `md` for standard desktop interfaces
203
+ - `lg` for touch-friendly or accessibility-focused designs
204
+
205
+ 3. **Show relevant information**:
206
+ - Enable `showPageInfo` for data contexts
207
+ - Enable `showItemsPerPage` when users need control
208
+ - Keep boundary/sibling counts reasonable (1-2)
209
+
210
+ ### Performance Tips
211
+
212
+ 1. **Debounce page changes** for API calls
213
+ 2. **Use React.memo** for parent components
214
+ 3. **Virtualize large datasets** when possible
215
+ 4. **Cache page data** to improve navigation speed
216
+
217
+ ### UX Recommendations
218
+
219
+ 1. **Always show current page clearly**
220
+ 2. **Provide context** with page info when helpful
221
+ 3. **Use consistent placement** throughout your app
222
+ 4. **Consider loading states** during page changes
223
+ 5. **Test with screen readers** and keyboard navigation
224
+
225
+ ## Theme Customization
226
+
227
+ The component respects your MUI theme configuration:
228
+
229
+ ```tsx
230
+ // Custom theme colors
231
+ const theme = createTheme({
232
+ palette: {
233
+ primary: {
234
+ main: '#your-color',
235
+ },
236
+ },
237
+ });
238
+ ```
239
+
240
+ ## Common Patterns
241
+
242
+ ### Table Pagination
243
+
244
+ ```tsx
245
+ function TablePagination({ data, pageSize = 10 }) {
246
+ const [page, setPage] = useState(1);
247
+ const totalPages = Math.ceil(data.length / pageSize);
248
+
249
+ const paginatedData = data.slice((page - 1) * pageSize, page * pageSize);
250
+
251
+ return (
252
+ <div>
253
+ <Table data={paginatedData} />
254
+ <Pagination
255
+ page={page}
256
+ count={totalPages}
257
+ onChange={(_, newPage) => setPage(newPage)}
258
+ showPageInfo
259
+ />
260
+ </div>
261
+ );
262
+ }
263
+ ```
264
+
265
+ ### API Pagination
266
+
267
+ ```tsx
268
+ function ApiPagination() {
269
+ const [page, setPage] = useState(1);
270
+ const [loading, setLoading] = useState(false);
271
+ const { data, totalPages } = useApiData(page);
272
+
273
+ const handlePageChange = async (event, newPage) => {
274
+ setLoading(true);
275
+ setPage(newPage);
276
+ // API call will be triggered by useApiData hook
277
+ };
278
+
279
+ return (
280
+ <div>
281
+ {loading && <LoadingSpinner />}
282
+ <DataComponent data={data} />
283
+ <Pagination
284
+ page={page}
285
+ count={totalPages}
286
+ onChange={handlePageChange}
287
+ disabled={loading}
288
+ showPageInfo
289
+ showItemsPerPage
290
+ itemsPerPage={pageSize}
291
+ onItemsPerPageChange={setPageSize}
292
+ />
293
+ </div>
294
+ );
295
+ }
296
+ ```
297
+
298
+ ## Testing
299
+
300
+ The Pagination component includes comprehensive test IDs for automated testing, supporting both unit and end-to-end test scenarios.
301
+
302
+ ### Test IDs
303
+
304
+ All test IDs follow a consistent pattern and can be customized using the `dataTestId` prop:
305
+
306
+ | Element | Default Test ID | Custom Test ID Pattern | Description |
307
+ |---------|----------------|------------------------|-------------|
308
+ | Container | `pagination` | `{dataTestId}` | Main pagination container |
309
+ | First button | `pagination-first` | `{dataTestId}-first` | First page button |
310
+ | Previous button | `pagination-prev` | `{dataTestId}-prev` | Previous page button |
311
+ | Next button | `pagination-next` | `{dataTestId}-next` | Next page button |
312
+ | Last button | `pagination-last` | `{dataTestId}-last` | Last page button |
313
+ | Page button | `pagination-page-{N}` | `{dataTestId}-page-{N}` | Individual page button (N = page number) |
314
+ | Page info | `pagination-info` | `{dataTestId}-info` | Page information text |
315
+ | Items per page | `pagination-items-per-page` | `{dataTestId}-items-per-page` | Items per page selector |
316
+
317
+ ### Testing Best Practices
318
+
319
+ #### Unit Testing with React Testing Library
320
+
321
+ ```tsx
322
+ import { render, screen, fireEvent } from '@testing-library/react';
323
+ import { Pagination } from './Pagination';
324
+
325
+ describe('Pagination', () => {
326
+ it('should render with default test IDs', () => {
327
+ render(
328
+ <Pagination
329
+ page={1}
330
+ count={5}
331
+ onChange={jest.fn()}
332
+ />
333
+ );
334
+
335
+ expect(screen.getByTestId('pagination')).toBeInTheDocument();
336
+ expect(screen.getByTestId('pagination-page-1')).toBeInTheDocument();
337
+ expect(screen.getByTestId('pagination-prev')).toBeInTheDocument();
338
+ expect(screen.getByTestId('pagination-next')).toBeInTheDocument();
339
+ });
340
+
341
+ it('should use custom test IDs when provided', () => {
342
+ render(
343
+ <Pagination
344
+ page={2}
345
+ count={5}
346
+ onChange={jest.fn()}
347
+ dataTestId="custom-pagination"
348
+ />
349
+ );
350
+
351
+ expect(screen.getByTestId('custom-pagination')).toBeInTheDocument();
352
+ expect(screen.getByTestId('custom-pagination-page-2')).toBeInTheDocument();
353
+ expect(screen.getByTestId('custom-pagination-prev')).toBeInTheDocument();
354
+ expect(screen.getByTestId('custom-pagination-next')).toBeInTheDocument();
355
+ });
356
+
357
+ it('should call onChange when page button is clicked', () => {
358
+ const handleChange = jest.fn();
359
+ render(
360
+ <Pagination
361
+ page={1}
362
+ count={5}
363
+ onChange={handleChange}
364
+ />
365
+ );
366
+
367
+ fireEvent.click(screen.getByTestId('pagination-page-3'));
368
+ expect(handleChange).toHaveBeenCalledWith(expect.any(Object), 3);
369
+ });
370
+
371
+ it('should show first and last buttons when enabled', () => {
372
+ render(
373
+ <Pagination
374
+ page={3}
375
+ count={10}
376
+ onChange={jest.fn()}
377
+ showFirstButton
378
+ showLastButton
379
+ />
380
+ );
381
+
382
+ expect(screen.getByTestId('pagination-first')).toBeInTheDocument();
383
+ expect(screen.getByTestId('pagination-last')).toBeInTheDocument();
384
+ });
385
+
386
+ it('should show page info when enabled', () => {
387
+ render(
388
+ <Pagination
389
+ page={2}
390
+ count={10}
391
+ onChange={jest.fn()}
392
+ showPageInfo
393
+ />
394
+ );
395
+
396
+ const pageInfo = screen.getByTestId('pagination-info');
397
+ expect(pageInfo).toHaveTextContent('Page 2 of 10');
398
+ });
399
+
400
+ it('should show items per page selector when enabled', () => {
401
+ const handleItemsChange = jest.fn();
402
+ render(
403
+ <Pagination
404
+ page={1}
405
+ count={10}
406
+ onChange={jest.fn()}
407
+ showItemsPerPage
408
+ itemsPerPage={25}
409
+ onItemsPerPageChange={handleItemsChange}
410
+ />
411
+ );
412
+
413
+ const selector = screen.getByTestId('pagination-items-per-page');
414
+ expect(selector).toBeInTheDocument();
415
+ });
416
+ });
417
+ ```
418
+
419
+ #### Navigation Testing
420
+
421
+ ```tsx
422
+ describe('Pagination Navigation', () => {
423
+ it('should navigate to next page', () => {
424
+ const handleChange = jest.fn();
425
+ render(
426
+ <Pagination
427
+ page={1}
428
+ count={5}
429
+ onChange={handleChange}
430
+ />
431
+ );
432
+
433
+ fireEvent.click(screen.getByTestId('pagination-next'));
434
+ expect(handleChange).toHaveBeenCalledWith(expect.any(Object), 2);
435
+ });
436
+
437
+ it('should navigate to previous page', () => {
438
+ const handleChange = jest.fn();
439
+ render(
440
+ <Pagination
441
+ page={3}
442
+ count={5}
443
+ onChange={handleChange}
444
+ />
445
+ );
446
+
447
+ fireEvent.click(screen.getByTestId('pagination-prev'));
448
+ expect(handleChange).toHaveBeenCalledWith(expect.any(Object), 2);
449
+ });
450
+
451
+ it('should jump to first page', () => {
452
+ const handleChange = jest.fn();
453
+ render(
454
+ <Pagination
455
+ page={5}
456
+ count={10}
457
+ onChange={handleChange}
458
+ showFirstButton
459
+ />
460
+ );
461
+
462
+ fireEvent.click(screen.getByTestId('pagination-first'));
463
+ expect(handleChange).toHaveBeenCalledWith(expect.any(Object), 1);
464
+ });
465
+
466
+ it('should jump to last page', () => {
467
+ const handleChange = jest.fn();
468
+ render(
469
+ <Pagination
470
+ page={1}
471
+ count={10}
472
+ onChange={handleChange}
473
+ showLastButton
474
+ />
475
+ );
476
+
477
+ fireEvent.click(screen.getByTestId('pagination-last'));
478
+ expect(handleChange).toHaveBeenCalledWith(expect.any(Object), 10);
479
+ });
480
+
481
+ it('should disable navigation when disabled prop is true', () => {
482
+ render(
483
+ <Pagination
484
+ page={2}
485
+ count={5}
486
+ onChange={jest.fn()}
487
+ disabled
488
+ />
489
+ );
490
+
491
+ expect(screen.getByTestId('pagination-prev')).toBeDisabled();
492
+ expect(screen.getByTestId('pagination-next')).toBeDisabled();
493
+ });
494
+ });
495
+ ```
496
+
497
+ #### E2E Testing with Playwright
498
+
499
+ ```typescript
500
+ import { test, expect } from '@playwright/test';
501
+
502
+ test.describe('Pagination Component', () => {
503
+ test('should navigate through pages', async ({ page }) => {
504
+ await page.goto('/pagination-demo');
505
+
506
+ // Click on page 3
507
+ await page.getByTestId('pagination-page-3').click();
508
+ await expect(page.locator('[data-testid="pagination-page-3"]')).toHaveClass(/Mui-selected/);
509
+
510
+ // Navigate to next page
511
+ await page.getByTestId('pagination-next').click();
512
+ await expect(page.locator('[data-testid="pagination-page-4"]')).toHaveClass(/Mui-selected/);
513
+
514
+ // Navigate to previous page
515
+ await page.getByTestId('pagination-prev').click();
516
+ await expect(page.locator('[data-testid="pagination-page-3"]')).toHaveClass(/Mui-selected/);
517
+ });
518
+
519
+ test('should change items per page', async ({ page }) => {
520
+ await page.goto('/pagination-demo');
521
+
522
+ // Open items per page dropdown
523
+ await page.getByTestId('pagination-items-per-page').click();
524
+
525
+ // Select 50 items per page
526
+ await page.getByRole('option', { name: '50' }).click();
527
+
528
+ // Verify selection
529
+ await expect(page.getByTestId('pagination-items-per-page')).toContainText('50');
530
+ });
531
+
532
+ test('should display correct page info', async ({ page }) => {
533
+ await page.goto('/pagination-demo');
534
+
535
+ const pageInfo = page.getByTestId('pagination-info');
536
+ await expect(pageInfo).toHaveText('Page 1 of 10');
537
+
538
+ // Navigate to page 5
539
+ await page.getByTestId('pagination-page-5').click();
540
+ await expect(pageInfo).toHaveText('Page 5 of 10');
541
+ });
542
+
543
+ test('should support keyboard navigation', async ({ page }) => {
544
+ await page.goto('/pagination-demo');
545
+
546
+ // Focus on page 2 button
547
+ await page.getByTestId('pagination-page-2').focus();
548
+
549
+ // Press Enter to navigate
550
+ await page.keyboard.press('Enter');
551
+ await expect(page.locator('[data-testid="pagination-page-2"]')).toHaveClass(/Mui-selected/);
552
+
553
+ // Use arrow keys to navigate
554
+ await page.keyboard.press('ArrowRight');
555
+ await page.keyboard.press('Enter');
556
+ await expect(page.locator('[data-testid="pagination-page-3"]')).toHaveClass(/Mui-selected/);
557
+ });
558
+ });
559
+ ```
560
+
561
+ ### Common Test Scenarios
562
+
563
+ #### Testing with Multiple Pagination Instances
564
+
565
+ ```tsx
566
+ describe('Multiple Pagination Instances', () => {
567
+ it('should support multiple instances with unique test IDs', () => {
568
+ render(
569
+ <>
570
+ <Pagination
571
+ dataTestId="users-pagination"
572
+ page={1}
573
+ count={5}
574
+ onChange={jest.fn()}
575
+ />
576
+ <Pagination
577
+ dataTestId="products-pagination"
578
+ page={2}
579
+ count={10}
580
+ onChange={jest.fn()}
581
+ />
582
+ </>
583
+ );
584
+
585
+ expect(screen.getByTestId('users-pagination')).toBeInTheDocument();
586
+ expect(screen.getByTestId('products-pagination')).toBeInTheDocument();
587
+ expect(screen.getByTestId('users-pagination-page-1')).toBeInTheDocument();
588
+ expect(screen.getByTestId('products-pagination-page-2')).toBeInTheDocument();
589
+ });
590
+ });
591
+ ```
592
+
593
+ #### Testing Different Variants
594
+
595
+ ```tsx
596
+ describe('Pagination Variants', () => {
597
+ it('should render dots variant correctly', () => {
598
+ render(
599
+ <Pagination
600
+ page={3}
601
+ count={10}
602
+ onChange={jest.fn()}
603
+ variant="dots"
604
+ />
605
+ );
606
+
607
+ // Dots variant hides navigation buttons
608
+ expect(screen.queryByTestId('pagination-prev')).not.toBeInTheDocument();
609
+ expect(screen.queryByTestId('pagination-next')).not.toBeInTheDocument();
610
+
611
+ // Page dots should still be present
612
+ expect(screen.getByTestId('pagination-page-3')).toBeInTheDocument();
613
+ });
614
+
615
+ it('should render minimal variant correctly', () => {
616
+ render(
617
+ <Pagination
618
+ page={2}
619
+ count={5}
620
+ onChange={jest.fn()}
621
+ variant="minimal"
622
+ />
623
+ );
624
+
625
+ expect(screen.getByTestId('pagination')).toBeInTheDocument();
626
+ expect(screen.getByTestId('pagination-page-2')).toBeInTheDocument();
627
+ });
628
+ });
629
+ ```
630
+
631
+ #### Testing Accessibility
632
+
633
+ ```tsx
634
+ describe('Pagination Accessibility', () => {
635
+ it('should have proper ARIA labels', () => {
636
+ render(
637
+ <Pagination
638
+ page={2}
639
+ count={5}
640
+ onChange={jest.fn()}
641
+ showFirstButton
642
+ showLastButton
643
+ />
644
+ );
645
+
646
+ expect(screen.getByTestId('pagination-first')).toHaveAttribute('aria-label', 'Go to first page');
647
+ expect(screen.getByTestId('pagination-last')).toHaveAttribute('aria-label', 'Go to last page');
648
+ expect(screen.getByTestId('pagination-prev')).toHaveAttribute('aria-label', 'Go to previous page');
649
+ expect(screen.getByTestId('pagination-next')).toHaveAttribute('aria-label', 'Go to next page');
650
+ });
651
+
652
+ it('should indicate current page', () => {
653
+ render(
654
+ <Pagination
655
+ page={3}
656
+ count={10}
657
+ onChange={jest.fn()}
658
+ />
659
+ );
660
+
661
+ const currentPage = screen.getByTestId('pagination-page-3');
662
+ expect(currentPage).toHaveClass('Mui-selected');
663
+ expect(currentPage).toHaveAttribute('aria-current', 'page');
664
+ });
665
+ });
666
+ ```
667
+
668
+ ### Integration Testing Tips
669
+
670
+ 1. **Test with realistic data**: Use actual page counts and data volumes
671
+ 2. **Test edge cases**: First page, last page, single page scenarios
672
+ 3. **Test state management**: Verify page state updates correctly
673
+ 4. **Test async operations**: Mock API calls and test loading states
674
+ 5. **Test responsiveness**: Verify behavior across different viewport sizes
675
+ 6. **Test accessibility**: Use axe-core or similar tools for a11y testing
676
+
677
+ ### Visual Regression Testing
678
+
679
+ ```typescript
680
+ import { test } from '@playwright/test';
681
+
682
+ test.describe('Pagination Visual Tests', () => {
683
+ test('should match snapshot - default variant', async ({ page }) => {
684
+ await page.goto('/pagination-demo');
685
+ await expect(page.getByTestId('pagination')).toHaveScreenshot('pagination-default.png');
686
+ });
687
+
688
+ test('should match snapshot - rounded variant', async ({ page }) => {
689
+ await page.goto('/pagination-demo?variant=rounded');
690
+ await expect(page.getByTestId('pagination')).toHaveScreenshot('pagination-rounded.png');
691
+ });
692
+
693
+ test('should match snapshot - hover state', async ({ page }) => {
694
+ await page.goto('/pagination-demo');
695
+ await page.getByTestId('pagination-page-3').hover();
696
+ await expect(page.getByTestId('pagination')).toHaveScreenshot('pagination-hover.png');
697
+ });
698
+ });
699
+ ```