@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,815 @@
1
+ # Carousel Component
2
+
3
+ ## Purpose
4
+
5
+ The Carousel component is a versatile data display component that presents content in a rotating, sequential manner. It supports various visual styles, animations, and interactive features for engaging content presentation.
6
+
7
+ ## Usage
8
+
9
+ ```tsx
10
+ import { Carousel } from '@/components/data-display/Carousel';
11
+
12
+ <Carousel
13
+ items={[
14
+ { id: '1', content: 'Slide 1', image: '/image1.jpg', title: 'First Slide' },
15
+ { id: '2', content: 'Slide 2', image: '/image2.jpg', title: 'Second Slide' },
16
+ ]}
17
+ variant="glass"
18
+ autoPlay={true}
19
+ showIndicators={true}
20
+ />;
21
+ ```
22
+
23
+ ## Props
24
+
25
+ ### items
26
+
27
+ - **Type**: `CarouselItem[]`
28
+ - **Required**: Yes
29
+ - **Description**: Array of carousel items with content, images, titles, and descriptions
30
+
31
+ ### variant
32
+
33
+ - **Type**: `'default' | 'glass' | 'gradient' | 'elevated' | 'minimal' | 'cards'`
34
+ - **Default**: `'default'`
35
+ - **Description**: Visual style variant of the carousel
36
+
37
+ ### size
38
+
39
+ - **Type**: `'xs' | 'sm' | 'md' | 'lg' | 'xl'`
40
+ - **Default**: `'md'`
41
+ - **Description**: Size of the carousel
42
+
43
+ ### color
44
+
45
+ - **Type**: `'primary' | 'secondary' | 'success' | 'error' | 'warning' | 'info'`
46
+ - **Default**: `'primary'`
47
+ - **Description**: Color theme for controls and visual effects
48
+
49
+ ### autoPlay
50
+
51
+ - **Type**: `boolean`
52
+ - **Default**: `false`
53
+ - **Description**: Enable automatic slide progression
54
+
55
+ ### autoPlayInterval
56
+
57
+ - **Type**: `number`
58
+ - **Default**: `3000`
59
+ - **Description**: Interval between auto-play slides in milliseconds
60
+
61
+ ### loop
62
+
63
+ - **Type**: `boolean`
64
+ - **Default**: `true`
65
+ - **Description**: Enable looping when reaching first/last slide
66
+
67
+ ### showIndicators
68
+
69
+ - **Type**: `boolean`
70
+ - **Default**: `true`
71
+ - **Description**: Show dot indicators for navigation
72
+
73
+ ### showArrows
74
+
75
+ - **Type**: `boolean`
76
+ - **Default**: `true`
77
+ - **Description**: Show navigation arrows
78
+
79
+ ### showThumbnails
80
+
81
+ - **Type**: `boolean`
82
+ - **Default**: `false`
83
+ - **Description**: Show thumbnail navigation
84
+
85
+ ### pauseOnHover
86
+
87
+ - **Type**: `boolean`
88
+ - **Default**: `true`
89
+ - **Description**: Pause autoplay when hovering over the carousel
90
+
91
+ ### animation
92
+
93
+ - **Type**: `'slide' | 'fade' | 'zoom' | 'flip'`
94
+ - **Default**: `'slide'`
95
+ - **Description**: Slide transition animation type
96
+
97
+ ### height
98
+
99
+ - **Type**: `number | string`
100
+ - **Default**: `400`
101
+ - **Description**: Height of the carousel
102
+
103
+ ### width
104
+
105
+ - **Type**: `number | string`
106
+ - **Default**: `'100%'`
107
+ - **Description**: Width of the carousel
108
+
109
+ ### indicatorPosition
110
+
111
+ - **Type**: `'top' | 'bottom' | 'left' | 'right'`
112
+ - **Default**: `'bottom'`
113
+ - **Description**: Position of the indicator dots
114
+
115
+ ### arrowPosition
116
+
117
+ - **Type**: `'overlay' | 'outside' | 'inside'`
118
+ - **Default**: `'overlay'`
119
+ - **Description**: Position of navigation arrows
120
+
121
+ ### glow
122
+
123
+ - **Type**: `boolean`
124
+ - **Default**: `false`
125
+ - **Description**: Enable glow effect
126
+
127
+ ### pulse
128
+
129
+ - **Type**: `boolean`
130
+ - **Default**: `false`
131
+ - **Description**: Enable pulsing animation
132
+
133
+ ### glass
134
+
135
+ - **Type**: `boolean`
136
+ - **Default**: `false`
137
+ - **Description**: Enable glass morphism effect
138
+
139
+ ### gradient
140
+
141
+ - **Type**: `boolean`
142
+ - **Default**: `false`
143
+ - **Description**: Enable gradient backgrounds
144
+
145
+ ### loading
146
+
147
+ - **Type**: `boolean`
148
+ - **Default**: `false`
149
+ - **Description**: Show loading state
150
+
151
+ ### disabled
152
+
153
+ - **Type**: `boolean`
154
+ - **Default**: `false`
155
+ - **Description**: Disable all carousel interactions
156
+
157
+ ### onClick
158
+
159
+ - **Type**: `(item: CarouselItem, index: number) => void`
160
+ - **Description**: Callback when a carousel item is clicked
161
+
162
+ ### onChange
163
+
164
+ - **Type**: `(index: number) => void`
165
+ - **Description**: Callback when the active slide changes
166
+
167
+ ### onFocus
168
+
169
+ - **Type**: `FocusEventHandler<HTMLDivElement>`
170
+ - **Description**: Focus event handler
171
+
172
+ ### onBlur
173
+
174
+ - **Type**: `FocusEventHandler<HTMLDivElement>`
175
+ - **Description**: Blur event handler
176
+
177
+ ## Examples
178
+
179
+ ### Basic Carousel
180
+
181
+ ```tsx
182
+ <Carousel
183
+ items={[
184
+ { id: '1', content: 'Slide 1' },
185
+ { id: '2', content: 'Slide 2' },
186
+ ]}
187
+ />
188
+ ```
189
+
190
+ ### Autoplay with Thumbnails
191
+
192
+ ```tsx
193
+ <Carousel
194
+ items={items}
195
+ autoPlay={true}
196
+ autoPlayInterval={5000}
197
+ showThumbnails={true}
198
+ pauseOnHover={true}
199
+ />
200
+ ```
201
+
202
+ ### Glass Effect with Gradient
203
+
204
+ ```tsx
205
+ <Carousel items={items} variant="glass" gradient={true} glow={true} animation="fade" />
206
+ ```
207
+
208
+ ### Cards Layout
209
+
210
+ ```tsx
211
+ <Carousel items={items} variant="cards" showArrows={true} arrowPosition="outside" size="lg" />
212
+ ```
213
+
214
+ ## Accessibility
215
+
216
+ - **Keyboard Navigation**: Supports arrow keys for navigation (Left/Right arrows)
217
+ - **ARIA Attributes**: Includes proper ARIA labels and roles for screen readers
218
+ - **Focus Management**: Maintains proper focus states and tab order
219
+ - **Screen Reader Support**: Announces slide changes and current position
220
+ - **Alt Text**: Supports alt text for images
221
+ - **Pause Controls**: Can be paused/resumed with keyboard
222
+
223
+ ## Best Practices
224
+
225
+ 1. **Content Structure**: Ensure carousel items have consistent structure for better user experience
226
+ 2. **Image Optimization**: Use optimized images to improve performance
227
+ 3. **Autoplay Consideration**: Consider user preference for motion when using autoplay
228
+ 4. **Mobile Experience**: Test swipe gestures on touch devices
229
+ 5. **Fallback Content**: Provide meaningful content when images fail to load
230
+ 6. **Indicator Clarity**: Ensure indicators are visible against carousel content
231
+ 7. **Performance**: Limit the number of items for better performance
232
+
233
+ ## Related Components
234
+
235
+ - `Gallery`: For displaying image collections
236
+ - `Slider`: For numeric range selection
237
+ - `Tabs`: For switchable content panels
238
+ - `Timeline`: For chronological content display
239
+
240
+ ## Testing
241
+
242
+ ### Test IDs
243
+
244
+ #### Container Elements
245
+
246
+ ##### `carousel-container`
247
+ - **Element:** Main Carousel container
248
+ - **Location:** Root Box element that wraps the entire carousel
249
+ - **Usage:** Query the main container to verify Carousel is rendered
250
+ ```typescript
251
+ const container = await canvas.findByTestId('carousel-container');
252
+ expect(container).toBeInTheDocument();
253
+ ```
254
+
255
+ ##### `carousel-track`
256
+ - **Element:** Carousel slides container/track
257
+ - **Location:** Inner Box that contains all slides
258
+ - **Usage:** Query the track to verify it's rendered and check layout
259
+ ```typescript
260
+ const track = await canvas.findByTestId('carousel-track');
261
+ expect(track).toBeInTheDocument();
262
+ ```
263
+
264
+ #### Slide Elements
265
+
266
+ ##### `carousel-slide-${index}`
267
+ - **Element:** Individual carousel slide
268
+ - **Location:** Each slide's container Box (one per carousel item, indexed from 0)
269
+ - **Usage:** Query specific slides by index
270
+ ```typescript
271
+ // Get first slide
272
+ const firstSlide = await canvas.findByTestId('carousel-slide-0');
273
+ expect(firstSlide).toBeInTheDocument();
274
+
275
+ // Get all slides
276
+ const slides = await canvas.findAllByTestId(/carousel-slide-/);
277
+ expect(slides).toHaveLength(expectedCount);
278
+ ```
279
+
280
+ ##### `data-active` attribute
281
+ - **Element:** Added to active slide
282
+ - **Location:** On the currently visible slide's container
283
+ - **Usage:** Query to find which slide is currently active
284
+ ```typescript
285
+ const activeSlide = canvasElement.querySelector('[data-testid^="carousel-slide-"][data-active="true"]');
286
+ expect(activeSlide).toHaveAttribute('data-testid', 'carousel-slide-0');
287
+ ```
288
+
289
+ #### Navigation Elements
290
+
291
+ ##### `carousel-navigation`
292
+ - **Element:** Navigation buttons container
293
+ - **Location:** Wrapper Box containing prev/next buttons
294
+ - **Usage:** Query navigation container to verify it's rendered
295
+ ```typescript
296
+ const navigation = await canvas.findByTestId('carousel-navigation');
297
+ expect(navigation).toBeInTheDocument();
298
+ ```
299
+
300
+ ##### `carousel-prev-button`
301
+ - **Element:** Previous slide button
302
+ - **Location:** IconButton for navigating to previous slide
303
+ - **Usage:** Click to navigate backwards
304
+ ```typescript
305
+ const prevButton = await canvas.findByTestId('carousel-prev-button');
306
+ await userEvent.click(prevButton);
307
+ ```
308
+
309
+ ##### `carousel-next-button`
310
+ - **Element:** Next slide button
311
+ - **Location:** IconButton for navigating to next slide
312
+ - **Usage:** Click to navigate forwards
313
+ ```typescript
314
+ const nextButton = await canvas.findByTestId('carousel-next-button');
315
+ await userEvent.click(nextButton);
316
+ ```
317
+
318
+ #### Indicator Elements
319
+
320
+ ##### `carousel-indicators`
321
+ - **Element:** Indicators/dots container
322
+ - **Location:** Box containing all indicator dots/lines/numbers
323
+ - **Usage:** Query indicators container to verify it's rendered
324
+ ```typescript
325
+ const indicators = await canvas.findByTestId('carousel-indicators');
326
+ expect(indicators).toBeInTheDocument();
327
+ ```
328
+
329
+ ##### `carousel-indicator-${index}`
330
+ - **Element:** Individual indicator (dot/line/number)
331
+ - **Location:** Each indicator element (one per slide, indexed from 0)
332
+ - **Usage:** Click to navigate to specific slide
333
+ ```typescript
334
+ // Click third indicator
335
+ const thirdIndicator = await canvas.findByTestId('carousel-indicator-2');
336
+ await userEvent.click(thirdIndicator);
337
+
338
+ // Get all indicators
339
+ const indicators = await canvas.findAllByTestId(/carousel-indicator-/);
340
+ expect(indicators).toHaveLength(expectedCount);
341
+ ```
342
+
343
+ ##### `data-active` attribute on indicators
344
+ - **Element:** Added to active indicator
345
+ - **Location:** On the indicator for the currently visible slide
346
+ - **Usage:** Query to find which indicator is active
347
+ ```typescript
348
+ const activeIndicator = canvasElement.querySelector('[data-testid^="carousel-indicator-"][data-active="true"]');
349
+ expect(activeIndicator).toHaveAttribute('data-testid', 'carousel-indicator-0');
350
+ ```
351
+
352
+ #### Thumbnail Elements
353
+
354
+ ##### `carousel-thumbnails`
355
+ - **Element:** Thumbnails container
356
+ - **Location:** Box containing all thumbnail images
357
+ - **Usage:** Query thumbnails container to verify it's rendered (only visible when `showThumbnails=true`)
358
+ ```typescript
359
+ const thumbnails = await canvas.findByTestId('carousel-thumbnails');
360
+ expect(thumbnails).toBeInTheDocument();
361
+ ```
362
+
363
+ ##### `carousel-thumbnail-${index}`
364
+ - **Element:** Individual thumbnail
365
+ - **Location:** Each thumbnail Box (one per slide, indexed from 0)
366
+ - **Usage:** Click to navigate to specific slide
367
+ ```typescript
368
+ // Click second thumbnail
369
+ const secondThumbnail = await canvas.findByTestId('carousel-thumbnail-1');
370
+ await userEvent.click(secondThumbnail);
371
+
372
+ // Get all thumbnails
373
+ const thumbnails = await canvas.findAllByTestId(/carousel-thumbnail-/);
374
+ expect(thumbnails).toHaveLength(expectedCount);
375
+ ```
376
+
377
+ ##### `data-active` attribute on thumbnails
378
+ - **Element:** Added to active thumbnail
379
+ - **Location:** On the thumbnail for the currently visible slide
380
+ - **Usage:** Query to find which thumbnail is active
381
+ ```typescript
382
+ const activeThumbnail = canvasElement.querySelector('[data-testid^="carousel-thumbnail-"][data-active="true"]');
383
+ expect(activeThumbnail).toHaveAttribute('data-testid', 'carousel-thumbnail-0');
384
+ ```
385
+
386
+ ### Test Patterns
387
+
388
+ #### Wait for Carousel to Render
389
+ ```typescript
390
+ import { waitFor, within } from 'storybook/test';
391
+
392
+ // Wait for container
393
+ const container = await canvas.findByTestId('carousel-container');
394
+
395
+ // Wait for track to render
396
+ await waitFor(async () => {
397
+ const track = await canvas.findByTestId('carousel-track');
398
+ expect(track).toBeInTheDocument();
399
+ }, { timeout: 3000 });
400
+ ```
401
+
402
+ #### Verify Slide Navigation
403
+ ```typescript
404
+ // Get initial active slide
405
+ const firstSlide = await canvas.findByTestId('carousel-slide-0');
406
+ expect(firstSlide).toHaveAttribute('data-active', 'true');
407
+
408
+ // Click next button
409
+ const nextButton = await canvas.findByTestId('carousel-next-button');
410
+ await userEvent.click(nextButton);
411
+
412
+ // Wait for slide transition
413
+ await waitFor(() => {
414
+ const secondSlide = canvas.getByTestId('carousel-slide-1');
415
+ expect(secondSlide).toHaveAttribute('data-active', 'true');
416
+ }, { timeout: 1000 });
417
+ ```
418
+
419
+ #### Verify Indicator Navigation
420
+ ```typescript
421
+ // Get all indicators
422
+ const indicators = await canvas.findAllByTestId(/carousel-indicator-/);
423
+ expect(indicators).toHaveLength(items.length);
424
+
425
+ // Click third indicator
426
+ await userEvent.click(indicators[2]);
427
+
428
+ // Verify third slide is active
429
+ await waitFor(() => {
430
+ const thirdSlide = canvas.getByTestId('carousel-slide-2');
431
+ expect(thirdSlide).toHaveAttribute('data-active', 'true');
432
+ }, { timeout: 1000 });
433
+ ```
434
+
435
+ #### Test Autoplay Functionality
436
+ ```typescript
437
+ // Wait for initial render
438
+ const container = await canvas.findByTestId('carousel-container');
439
+
440
+ // First slide should be active
441
+ let activeSlide = canvasElement.querySelector('[data-active="true"]');
442
+ expect(activeSlide).toHaveAttribute('data-testid', 'carousel-slide-0');
443
+
444
+ // Wait for autoplay to advance
445
+ await waitFor(() => {
446
+ activeSlide = canvasElement.querySelector('[data-testid^="carousel-slide-"][data-active="true"]');
447
+ expect(activeSlide).toHaveAttribute('data-testid', 'carousel-slide-1');
448
+ }, { timeout: 5000 });
449
+
450
+ // Test pause on hover
451
+ await userEvent.hover(container);
452
+
453
+ // Wait to ensure it doesn't advance
454
+ await new Promise((resolve) => setTimeout(resolve, 2000));
455
+
456
+ // Should still be on second slide
457
+ activeSlide = canvasElement.querySelector('[data-active="true"]');
458
+ expect(activeSlide).toHaveAttribute('data-testid', 'carousel-slide-1');
459
+ ```
460
+
461
+ #### Verify Thumbnails
462
+ ```typescript
463
+ // Check if thumbnails are visible
464
+ const thumbnailsContainer = await canvas.findByTestId('carousel-thumbnails');
465
+ expect(thumbnailsContainer).toBeInTheDocument();
466
+
467
+ // Get all thumbnails
468
+ const thumbnails = await canvas.findAllByTestId(/carousel-thumbnail-/);
469
+ expect(thumbnails).toHaveLength(items.length);
470
+
471
+ // Click fourth thumbnail
472
+ await userEvent.click(thumbnails[3]);
473
+
474
+ // Verify fourth slide is active
475
+ await waitFor(() => {
476
+ const fourthSlide = canvas.getByTestId('carousel-slide-3');
477
+ expect(fourthSlide).toHaveAttribute('data-active', 'true');
478
+ }, { timeout: 1000 });
479
+ ```
480
+
481
+ #### Check Navigation Button States
482
+ ```typescript
483
+ // When loop=false and at first slide, prev should be disabled
484
+ const prevButton = await canvas.findByTestId('carousel-prev-button');
485
+ expect(prevButton).toBeDisabled();
486
+
487
+ // Navigate to last slide
488
+ const indicators = await canvas.findAllByTestId(/carousel-indicator-/);
489
+ await userEvent.click(indicators[indicators.length - 1]);
490
+
491
+ await waitFor(() => {
492
+ const lastSlide = canvas.getByTestId(`carousel-slide-${items.length - 1}`);
493
+ expect(lastSlide).toHaveAttribute('data-active', 'true');
494
+ });
495
+
496
+ // Next button should be disabled at last slide
497
+ const nextButton = await canvas.findByTestId('carousel-next-button');
498
+ expect(nextButton).toBeDisabled();
499
+ ```
500
+
501
+ #### Test Multiple Navigation Methods
502
+ ```typescript
503
+ // Navigate using next button
504
+ const nextButton = await canvas.findByTestId('carousel-next-button');
505
+ await userEvent.click(nextButton);
506
+
507
+ await waitFor(() => {
508
+ expect(canvas.getByTestId('carousel-slide-1')).toHaveAttribute('data-active', 'true');
509
+ });
510
+
511
+ // Navigate using indicator
512
+ const thirdIndicator = await canvas.findByTestId('carousel-indicator-2');
513
+ await userEvent.click(thirdIndicator);
514
+
515
+ await waitFor(() => {
516
+ expect(canvas.getByTestId('carousel-slide-2')).toHaveAttribute('data-active', 'true');
517
+ });
518
+
519
+ // Navigate using thumbnail
520
+ const firstThumbnail = await canvas.findByTestId('carousel-thumbnail-0');
521
+ await userEvent.click(firstThumbnail);
522
+
523
+ await waitFor(() => {
524
+ expect(canvas.getByTestId('carousel-slide-0')).toHaveAttribute('data-active', 'true');
525
+ });
526
+ ```
527
+
528
+ ### Props That Affect Test Behavior
529
+
530
+ #### `variant`
531
+ - **Values:** `'default' | 'glass' | 'gradient' | 'elevated' | 'minimal' | 'cards'`
532
+ - **Impact:** Changes visual styling but not testId structure
533
+ - **Test Tip:** Use same testIds regardless of variant
534
+
535
+ #### `showArrows`
536
+ - **Values:** `boolean` (default: `true`)
537
+ - **Impact:** When `false`, navigation buttons are not rendered
538
+ - **Test Tip:** Use `queryByTestId` to check for absence
539
+
540
+ #### `showIndicators`
541
+ - **Values:** `boolean` (default: `true`)
542
+ - **Impact:** When `false`, indicators are not rendered
543
+ - **Test Tip:** Use `queryByTestId` to check for absence
544
+
545
+ #### `showThumbnails`
546
+ - **Values:** `boolean` (default: `false`)
547
+ - **Impact:** When `true`, thumbnails container is rendered
548
+ - **Test Tip:** Thumbnails only visible when explicitly enabled
549
+
550
+ #### `autoPlay`
551
+ - **Values:** `boolean` (default: `false`)
552
+ - **Impact:** Automatically advances slides at `autoPlayInterval`
553
+ - **Test Tip:** Use `waitFor` with appropriate timeout
554
+
555
+ #### `autoPlayInterval`
556
+ - **Values:** `number` (milliseconds, default: `3000`)
557
+ - **Impact:** Time between automatic slide transitions
558
+ - **Test Tip:** Adjust `waitFor` timeout based on interval
559
+
560
+ #### `pauseOnHover`
561
+ - **Values:** `boolean` (default: `true`)
562
+ - **Impact:** Pauses autoplay when hovering over carousel
563
+ - **Test Tip:** Test with `userEvent.hover()` and `userEvent.unhover()`
564
+
565
+ #### `loop`
566
+ - **Values:** `boolean` (default: `true`)
567
+ - **Impact:**
568
+ - When `false`: Navigation buttons disabled at boundaries
569
+ - When `true`: Carousel loops from last to first slide
570
+ - **Test Tip:** Test button disabled states at first/last slides
571
+
572
+ #### `animation`
573
+ - **Values:** `'slide' | 'fade' | 'zoom' | 'flip'` (default: `'slide'`)
574
+ - **Impact:** Changes transition animation
575
+ - **Test Tip:** Use `waitFor` to account for animation duration
576
+
577
+ #### `disabled`
578
+ - **Values:** `boolean` (default: `false`)
579
+ - **Impact:** Disables all navigation when `true`
580
+ - **Test Tip:** Verify all buttons are disabled
581
+
582
+ #### `loading`
583
+ - **Values:** `boolean` (default: `false`)
584
+ - **Impact:** Shows CircularProgress instead of slides
585
+ - **Test Tip:** Carousel content not rendered when loading
586
+
587
+ ### Common Test Scenarios
588
+
589
+ #### 1. Basic Rendering Test
590
+ ```typescript
591
+ play: async ({ canvasElement }) => {
592
+ const canvas = within(canvasElement);
593
+
594
+ // Wait for carousel to render
595
+ const container = await canvas.findByTestId('carousel-container');
596
+ expect(container).toBeInTheDocument();
597
+
598
+ // Verify track is rendered
599
+ const track = await canvas.findByTestId('carousel-track');
600
+ expect(track).toBeInTheDocument();
601
+
602
+ // Verify correct number of slides
603
+ const slides = await canvas.findAllByTestId(/carousel-slide-/);
604
+ expect(slides).toHaveLength(expectedCount);
605
+ }
606
+ ```
607
+
608
+ #### 2. Navigation Test
609
+ ```typescript
610
+ play: async ({ canvasElement }) => {
611
+ const canvas = within(canvasElement);
612
+
613
+ // Wait for render
614
+ await canvas.findByTestId('carousel-container');
615
+
616
+ // Test next button
617
+ const nextButton = await canvas.findByTestId('carousel-next-button');
618
+ await userEvent.click(nextButton);
619
+
620
+ await waitFor(() => {
621
+ const secondSlide = canvas.getByTestId('carousel-slide-1');
622
+ expect(secondSlide).toHaveAttribute('data-active', 'true');
623
+ }, { timeout: 1000 });
624
+
625
+ // Test previous button
626
+ const prevButton = await canvas.findByTestId('carousel-prev-button');
627
+ await userEvent.click(prevButton);
628
+
629
+ await waitFor(() => {
630
+ const firstSlide = canvas.getByTestId('carousel-slide-0');
631
+ expect(firstSlide).toHaveAttribute('data-active', 'true');
632
+ }, { timeout: 1000 });
633
+ }
634
+ ```
635
+
636
+ #### 3. Indicator Navigation Test
637
+ ```typescript
638
+ play: async ({ canvasElement }) => {
639
+ const canvas = within(canvasElement);
640
+
641
+ await canvas.findByTestId('carousel-container');
642
+
643
+ // Get all indicators
644
+ const indicators = await canvas.findAllByTestId(/carousel-indicator-/);
645
+ expect(indicators).toHaveLength(expectedCount);
646
+
647
+ // Click third indicator
648
+ await userEvent.click(indicators[2]);
649
+
650
+ // Verify third slide is active
651
+ await waitFor(() => {
652
+ const thirdSlide = canvas.getByTestId('carousel-slide-2');
653
+ expect(thirdSlide).toHaveAttribute('data-active', 'true');
654
+ }, { timeout: 1000 });
655
+
656
+ // Verify third indicator is active
657
+ expect(indicators[2]).toHaveAttribute('data-active', 'true');
658
+ }
659
+ ```
660
+
661
+ #### 4. Thumbnail Navigation Test
662
+ ```typescript
663
+ play: async ({ canvasElement }) => {
664
+ const canvas = within(canvasElement);
665
+
666
+ await canvas.findByTestId('carousel-container');
667
+
668
+ // Verify thumbnails are rendered
669
+ const thumbnailsContainer = await canvas.findByTestId('carousel-thumbnails');
670
+ expect(thumbnailsContainer).toBeInTheDocument();
671
+
672
+ // Get all thumbnails
673
+ const thumbnails = await canvas.findAllByTestId(/carousel-thumbnail-/);
674
+ expect(thumbnails).toHaveLength(expectedCount);
675
+
676
+ // Click second thumbnail
677
+ await userEvent.click(thumbnails[1]);
678
+
679
+ // Verify second slide is active
680
+ await waitFor(() => {
681
+ const secondSlide = canvas.getByTestId('carousel-slide-1');
682
+ expect(secondSlide).toHaveAttribute('data-active', 'true');
683
+ }, { timeout: 1000 });
684
+ }
685
+ ```
686
+
687
+ #### 5. Autoplay Test
688
+ ```typescript
689
+ play: async ({ canvasElement }) => {
690
+ const canvas = within(canvasElement);
691
+
692
+ const container = await canvas.findByTestId('carousel-container');
693
+
694
+ // First slide should be active
695
+ expect(canvas.getByTestId('carousel-slide-0')).toHaveAttribute('data-active', 'true');
696
+
697
+ // Wait for autoplay to advance (assuming 2000ms interval)
698
+ await waitFor(() => {
699
+ expect(canvas.getByTestId('carousel-slide-1')).toHaveAttribute('data-active', 'true');
700
+ }, { timeout: 3000 });
701
+
702
+ // Test pause on hover
703
+ await userEvent.hover(container);
704
+
705
+ // Wait to ensure it doesn't advance
706
+ await new Promise((resolve) => setTimeout(resolve, 2500));
707
+
708
+ // Should still be on second slide
709
+ expect(canvas.getByTestId('carousel-slide-1')).toHaveAttribute('data-active', 'true');
710
+ }
711
+ ```
712
+
713
+ #### 6. Accessibility Test
714
+ ```typescript
715
+ play: async ({ canvasElement }) => {
716
+ const canvas = within(canvasElement);
717
+
718
+ await canvas.findByTestId('carousel-container');
719
+
720
+ // Check navigation buttons have labels
721
+ const prevButton = await canvas.findByTestId('carousel-prev-button');
722
+ expect(prevButton).toHaveAttribute('aria-label', 'Previous slide');
723
+
724
+ const nextButton = await canvas.findByTestId('carousel-next-button');
725
+ expect(nextButton).toHaveAttribute('aria-label', 'Next slide');
726
+
727
+ // Check indicators have labels
728
+ const firstIndicator = await canvas.findByTestId('carousel-indicator-0');
729
+ expect(firstIndicator).toHaveAttribute('aria-label', 'Go to slide 1');
730
+ }
731
+ ```
732
+
733
+ ### Troubleshooting
734
+
735
+ #### Issue: "Unable to find element with testId X"
736
+
737
+ **Solution:** Always use `await` with `findByTestId`:
738
+ ```typescript
739
+ // Wrong - synchronous
740
+ const element = canvas.getByTestId('carousel-container');
741
+
742
+ // Correct - asynchronous
743
+ const element = await canvas.findByTestId('carousel-container');
744
+ ```
745
+
746
+ #### Issue: Test fails intermittently with slide transitions
747
+
748
+ **Solution:** Use `waitFor` with proper timeout for animations:
749
+ ```typescript
750
+ await waitFor(() => {
751
+ const slide = canvas.getByTestId('carousel-slide-1');
752
+ expect(slide).toHaveAttribute('data-active', 'true');
753
+ }, { timeout: 1000 }); // Adjust based on transition duration
754
+ ```
755
+
756
+ #### Issue: Can't find active slide
757
+
758
+ **Solution:** Use `data-active` attribute or query by visibility:
759
+ ```typescript
760
+ // Option 1: Query by data-active attribute
761
+ const activeSlide = canvasElement.querySelector('[data-testid^="carousel-slide-"][data-active="true"]');
762
+
763
+ // Option 2: Check all slides and find the active one
764
+ const slides = await canvas.findAllByTestId(/carousel-slide-/);
765
+ const activeSlide = slides.find(slide => slide.getAttribute('data-active') === 'true');
766
+ ```
767
+
768
+ #### Issue: Navigation buttons not found
769
+
770
+ **Solution:** Check if `showArrows` prop is true. Use `queryByTestId` to check for absence:
771
+ ```typescript
772
+ // When showArrows=false
773
+ const nextButton = canvas.queryByTestId('carousel-next-button');
774
+ expect(nextButton).not.toBeInTheDocument();
775
+ ```
776
+
777
+ #### Issue: Indicators not rendering
778
+
779
+ **Solution:** Check if `showIndicators` prop is true:
780
+ ```typescript
781
+ // When showIndicators=true
782
+ const indicators = await canvas.findByTestId('carousel-indicators');
783
+ expect(indicators).toBeInTheDocument();
784
+
785
+ // When showIndicators=false
786
+ const indicators = canvas.queryByTestId('carousel-indicators');
787
+ expect(indicators).not.toBeInTheDocument();
788
+ ```
789
+
790
+ #### Issue: Autoplay doesn't advance
791
+
792
+ **Solution:** Check `autoPlay` prop and `pauseOnHover` behavior:
793
+ ```typescript
794
+ // Ensure not hovering if pauseOnHover=true
795
+ const container = await canvas.findByTestId('carousel-container');
796
+ await userEvent.unhover(container);
797
+
798
+ // Wait with appropriate timeout based on autoPlayInterval
799
+ await waitFor(() => {
800
+ expect(canvas.getByTestId('carousel-slide-1')).toHaveAttribute('data-active', 'true');
801
+ }, { timeout: autoPlayInterval + 1000 });
802
+ ```
803
+
804
+ ### Best Practices
805
+
806
+ 1. **Always use async/await** with testId queries in Storybook tests
807
+ 2. **Use `waitFor`** when testing components with animations or transitions
808
+ 3. **Scope queries** with `within()` when looking inside specific containers
809
+ 4. **Use regex patterns** for dynamic testIds: `/carousel-slide-/`, `/carousel-indicator-/`
810
+ 5. **Add timeouts** for animated transitions: `{ timeout: 1000 }`
811
+ 6. **Check `data-active` attribute** to verify active state instead of relying on CSS
812
+ 7. **Use `queryByTestId`** when checking for elements that may not exist
813
+ 8. **Test all navigation methods** (arrows, indicators, thumbnails) independently
814
+ 9. **Account for autoplay intervals** in timeout values
815
+ 10. **Unhover elements** before testing autoplay to avoid pause-on-hover