@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,944 @@
1
+ import { CheckCircle, Error as ErrorIcon, Info, Warning } from '@mui/icons-material';
2
+ import type { Meta, StoryObj } from '@storybook/react-vite';
3
+ import { expect, fn,Mock,userEvent, waitFor, within } from 'storybook/test';
4
+
5
+ import { Timeline } from './Timeline';
6
+ import type { TimelineItem } from './Timeline.types';
7
+
8
+ const meta: Meta<typeof Timeline> = {
9
+ title: 'Enhanced/Timeline/Tests',
10
+ component: Timeline,
11
+ parameters: {
12
+ layout: 'centered',
13
+ chromatic: { disableSnapshot: false },
14
+ },
15
+ tags: ['autodocs', 'test', 'component:Timeline'],
16
+ };
17
+
18
+ export default meta;
19
+ type Story = StoryObj<typeof meta>;
20
+
21
+ // Sample data for testing
22
+ const sampleItems: TimelineItem[] = [
23
+ {
24
+ id: '1',
25
+ title: 'Order Placed',
26
+ description: 'Your order has been successfully placed',
27
+ timestamp: '2024-01-01 10:00 AM',
28
+ icon: <CheckCircle />,
29
+ color: '#4caf50',
30
+ metadata: { 'Order ID': '#12345', Status: 'Confirmed' },
31
+ action: {
32
+ label: 'View Details',
33
+ onClick: fn(),
34
+ },
35
+ },
36
+ {
37
+ id: '2',
38
+ title: 'Processing',
39
+ description: 'Your order is being processed',
40
+ timestamp: '2024-01-01 11:00 AM',
41
+ icon: <Info />,
42
+ color: '#2196f3',
43
+ metadata: { Location: 'Warehouse A', Expected: '2 hours' },
44
+ },
45
+ {
46
+ id: '3',
47
+ title: 'Quality Check',
48
+ description: 'Items are undergoing quality inspection',
49
+ timestamp: '2024-01-01 02:00 PM',
50
+ icon: <Warning />,
51
+ color: '#ff9800',
52
+ },
53
+ {
54
+ id: '4',
55
+ title: 'Shipped',
56
+ description: 'Your order has been shipped',
57
+ timestamp: '2024-01-02 09:00 AM',
58
+ icon: <CheckCircle />,
59
+ color: '#4caf50',
60
+ metadata: { Tracking: 'ABC123XYZ', Carrier: 'FedEx' },
61
+ },
62
+ ];
63
+
64
+ // Test Stories
65
+
66
+ export const BasicInteraction: Story = {
67
+ args: {
68
+ items: sampleItems,
69
+ variant: 'default',
70
+ orientation: 'vertical',
71
+ onItemClick: fn(),
72
+ },
73
+ play: async ({ canvasElement, args }) => {
74
+ const canvas = within(canvasElement);
75
+
76
+ // Verify all timeline items are rendered
77
+ const timelineItems = canvas.getAllByRole('article');
78
+ await expect(timelineItems).toHaveLength(sampleItems.length);
79
+
80
+ // Verify each item displays its title and timestamp
81
+ for (const item of sampleItems) {
82
+ await expect(canvas.getByText(item.title)).toBeInTheDocument();
83
+ await expect(canvas.getByText(item.timestamp)).toBeInTheDocument();
84
+ }
85
+
86
+ // Test clicking on timeline items
87
+ const firstItem = timelineItems[0];
88
+ await userEvent.click(firstItem);
89
+ await expect(args.onItemClick).toHaveBeenCalledWith(sampleItems[0]);
90
+ await expect(args.onItemClick).toHaveBeenCalledTimes(1);
91
+
92
+ // Reset mock
93
+ (args?.onItemClick as Mock)?.mockClear?.();
94
+
95
+ // Test expand/collapse functionality for items with descriptions
96
+ const expandButtons = Array.from(canvasElement.querySelectorAll('button')).filter(
97
+ (btn) => btn.querySelector('svg[data-testid="ExpandMoreIcon"]')
98
+ );
99
+
100
+ await expect(expandButtons.length).toBeGreaterThan(0);
101
+
102
+ // Initially collapsed - description should not be visible
103
+ const firstDescription = sampleItems[0].description!;
104
+ let descriptionElement = canvas.queryByText(firstDescription);
105
+ await expect(descriptionElement).not.toBeVisible();
106
+
107
+ // Click to expand
108
+ await userEvent.click(expandButtons[0]);
109
+
110
+ // Wait for expansion animation and verify description is now visible
111
+ await waitFor(() => {
112
+ descriptionElement = canvas.getByText(firstDescription);
113
+ expect(descriptionElement).toBeVisible();
114
+ }, { timeout: 3000 });
115
+
116
+ // Verify the expand button rotated (indicates expanded state)
117
+ // Check the computed style includes rotation (will be a matrix in computed styles)
118
+ const buttonStyle = window.getComputedStyle(expandButtons[0]);
119
+ await expect(buttonStyle.transform).not.toBe('none');
120
+
121
+ // Click to collapse
122
+ await userEvent.click(expandButtons[0]);
123
+
124
+ // Wait for collapse animation
125
+ await waitFor(() => {
126
+ descriptionElement = canvas.queryByText(firstDescription);
127
+ expect(descriptionElement).not.toBeVisible();
128
+ }, { timeout: 3000 });
129
+
130
+ // Verify the expand button rotated back
131
+ // The collapsed state should not have the same transform as when expanded
132
+ await waitFor(() => {
133
+ const _collapsedButtonStyle = window.getComputedStyle(expandButtons[0]);
134
+ const _expandedButtonStyle = window.getComputedStyle(expandButtons[0]);
135
+ // Just verify the animation has completed - description is not visible
136
+ expect(canvas.queryByText(firstDescription)).not.toBeVisible();
137
+ });
138
+ },
139
+ };
140
+
141
+ export const FormInteraction: Story = {
142
+ args: {
143
+ items: sampleItems.map((item) => ({
144
+ ...item,
145
+ action: {
146
+ label: `Action ${item.id}`,
147
+ onClick: fn(),
148
+ },
149
+ })),
150
+ variant: 'detailed',
151
+ },
152
+ play: async ({ canvasElement, args }) => {
153
+ const canvas = within(canvasElement);
154
+
155
+ // In detailed variant, all descriptions should be visible
156
+ // Wait for animations to complete
157
+ await waitFor(async () => {
158
+ for (const item of args.items) {
159
+ if (item.description) {
160
+ const element = canvas.getByText(item.description);
161
+ expect(element).toBeVisible();
162
+ }
163
+ }
164
+ }, { timeout: 5000 });
165
+
166
+ // Test action button clicks
167
+ const actionButtons = Array.from(canvasElement.querySelectorAll('button')).filter(
168
+ (btn) => btn.textContent?.includes('Action')
169
+ );
170
+
171
+ await expect(actionButtons).toHaveLength(args.items.length);
172
+
173
+ // Test each action button
174
+ for (let i = 0; i < actionButtons.length; i++) {
175
+ const button = actionButtons[i];
176
+ const expectedLabel = `Action ${args.items[i].id}`;
177
+
178
+ // Verify button has correct label
179
+ await expect(button).toHaveTextContent(expectedLabel);
180
+
181
+ // Click the button
182
+ await userEvent.click(button);
183
+
184
+ // Verify the corresponding onClick was called
185
+ await expect(args.items[i].action?.onClick).toHaveBeenCalledTimes(1);
186
+
187
+ // Reset for next iteration
188
+ (args.items[i].action?.onClick as Mock)?.mockClear?.();
189
+ }
190
+
191
+ // Test that action button clicks don't trigger item click
192
+ const firstActionButton = actionButtons[0];
193
+ const itemClickMock = fn();
194
+ args.onItemClick = itemClickMock;
195
+
196
+ await userEvent.click(firstActionButton);
197
+ await expect(itemClickMock).not.toHaveBeenCalled();
198
+
199
+ // Verify metadata is displayed in detailed variant
200
+ for (const item of args.items) {
201
+ if (item.metadata) {
202
+ for (const [key, value] of Object.entries(item.metadata)) {
203
+ const metadataText = `${key}: ${value}`;
204
+ await expect(canvas.getByText(metadataText)).toBeInTheDocument();
205
+ }
206
+ }
207
+ }
208
+ },
209
+ };
210
+
211
+ export const KeyboardNavigation: Story = {
212
+ args: {
213
+ items: sampleItems,
214
+ variant: 'default',
215
+ orientation: 'vertical',
216
+ onItemClick: fn(),
217
+ },
218
+ play: async ({ canvasElement, args }) => {
219
+ const canvas = within(canvasElement);
220
+
221
+ // Wait for timeline to render
222
+ await waitFor(() => {
223
+ const cards = canvas.getAllByRole('article');
224
+ expect(cards).toHaveLength(sampleItems.length);
225
+ }, { timeout: 3000 });
226
+
227
+ // Get all interactive elements
228
+ const cards = canvas.getAllByRole('article');
229
+ const expandButtons = Array.from(canvasElement.querySelectorAll('button')).filter(
230
+ (btn) => btn.querySelector('svg[data-testid="ExpandMoreIcon"]')
231
+ );
232
+ // We don't need actionButtons in this test but keep for potential use
233
+ // const actionButtons = Array.from(canvasElement.querySelectorAll('button')).filter(
234
+ // (btn) => btn.textContent?.includes('View Details')
235
+ // );
236
+
237
+ // Test Tab navigation through timeline cards
238
+ // Find the first expand button and click it to test expansion
239
+ await userEvent.click(expandButtons[0]);
240
+ await waitFor(() => {
241
+ const description = canvas.getByText(sampleItems[0].description!);
242
+ expect(description).toBeVisible();
243
+ }, { timeout: 3000 });
244
+
245
+ // Verify button rotation indicates expanded state (transform will be a matrix in computed styles)
246
+ const expandedButtonStyle = window.getComputedStyle(expandButtons[0]);
247
+ await expect(expandedButtonStyle.transform).not.toBe('none');
248
+
249
+ // Test action button with keyboard
250
+ const actionButton = canvas.getByRole('button', { name: /View Details/i });
251
+ await userEvent.click(actionButton);
252
+ await expect(args.items[0].action?.onClick).toHaveBeenCalledTimes(1);
253
+
254
+ // Click expand button to collapse
255
+ await userEvent.click(expandButtons[0]);
256
+ await waitFor(() => {
257
+ const description = canvas.queryByText(sampleItems[0].description!);
258
+ expect(description).not.toBeVisible();
259
+ }, { timeout: 3000 });
260
+
261
+ // Test clicking card with Enter key
262
+ // Click the card instead since cards aren't naturally focusable
263
+ await userEvent.click(cards[1]);
264
+ await expect(args.onItemClick).toHaveBeenCalledWith(sampleItems[1]);
265
+ },
266
+ };
267
+
268
+ export const ScreenReader: Story = {
269
+ args: {
270
+ items: sampleItems,
271
+ variant: 'detailed',
272
+ },
273
+ play: async ({ canvasElement }) => {
274
+ const canvas = within(canvasElement);
275
+
276
+ // Wait for timeline to render
277
+ await waitFor(() => {
278
+ const cards = canvas.getAllByRole('article');
279
+ expect(cards).toHaveLength(sampleItems.length);
280
+ }, { timeout: 3000 });
281
+
282
+ // Verify timeline structure is accessible with semantic HTML
283
+ const cards = canvas.getAllByRole('article');
284
+ await expect(cards).toHaveLength(sampleItems.length);
285
+
286
+ // Verify all text content is accessible
287
+ for (const item of sampleItems) {
288
+ // Title and timestamp should be readable
289
+ await expect(canvas.getByText(item.title)).toBeInTheDocument();
290
+ await expect(canvas.getByText(item.timestamp)).toBeInTheDocument();
291
+
292
+ // Verify heading hierarchy
293
+ const headings = canvasElement.querySelectorAll('h6');
294
+ const titleHeading = Array.from(headings).find(h => h.textContent === item.title);
295
+ await expect(titleHeading).toBeInTheDocument();
296
+ }
297
+
298
+ // Verify interactive elements have accessible names
299
+ const expandButtons = Array.from(canvasElement.querySelectorAll('button')).filter(
300
+ (btn) => btn.querySelector('svg[data-testid="ExpandMoreIcon"]')
301
+ );
302
+
303
+ for (const button of expandButtons) {
304
+ // Button should be focusable
305
+ await expect(button).not.toHaveAttribute('disabled');
306
+ await expect(button.tabIndex).toBeGreaterThanOrEqual(0);
307
+ }
308
+
309
+ // Verify icons are decorative (aria-hidden) or have labels
310
+ const icons = canvasElement.querySelectorAll('svg');
311
+ await expect(icons.length).toBeGreaterThan(0);
312
+
313
+ // Timeline dots should have color indication
314
+ const dots = canvasElement.querySelectorAll('[data-testid="timeline-dot"]');
315
+ await expect(dots).toHaveLength(sampleItems.length);
316
+
317
+ for (let i = 0; i < dots.length; i++) {
318
+ const dot = dots[i] as HTMLElement;
319
+ const item = sampleItems[i];
320
+ if (item.color) {
321
+ const style = window.getComputedStyle(dot);
322
+ await expect(style.background).toContain('gradient');
323
+ }
324
+ }
325
+
326
+ // Verify connectors are purely decorative
327
+ const connectors = canvasElement.querySelectorAll('[data-testid="timeline-connector"]');
328
+ await expect(connectors).toHaveLength(sampleItems.length - 1);
329
+ },
330
+ };
331
+
332
+ export const FocusManagement: Story = {
333
+ args: {
334
+ items: sampleItems,
335
+ variant: 'default',
336
+ onItemClick: fn(),
337
+ },
338
+ play: async ({ canvasElement, args }) => {
339
+ const canvas = within(canvasElement);
340
+
341
+ // Wait for timeline to render
342
+ await waitFor(() => {
343
+ const cards = canvas.getAllByRole('article');
344
+ expect(cards).toHaveLength(sampleItems.length);
345
+ }, { timeout: 3000 });
346
+
347
+ // Get interactive elements
348
+ const expandButtons = Array.from(canvasElement.querySelectorAll('button')).filter(
349
+ (btn) => btn.querySelector('svg[data-testid="ExpandMoreIcon"]')
350
+ );
351
+ const cards = canvas.getAllByRole('article');
352
+
353
+ // Test focus retention on expand/collapse
354
+ await expect(expandButtons.length).toBeGreaterThan(0);
355
+
356
+ expandButtons[0].focus();
357
+ await expect(document.activeElement).toBe(expandButtons[0]);
358
+
359
+ // Click to expand
360
+ await userEvent.click(expandButtons[0]);
361
+
362
+ // Focus should remain on the button after expansion
363
+ await expect(document.activeElement).toBe(expandButtons[0]);
364
+
365
+ // Wait for expansion to complete
366
+ await waitFor(() => {
367
+ const description = canvas.getByText(sampleItems[0].description!);
368
+ expect(description).toBeVisible();
369
+ }, { timeout: 3000 });
370
+
371
+ // Now action button should be available
372
+ const actionButton = canvas.getByRole('button', { name: /View Details/i });
373
+ actionButton.focus();
374
+ await expect(document.activeElement).toBe(actionButton);
375
+
376
+ // Click action button and verify focus remains
377
+ await userEvent.click(actionButton);
378
+ await expect(document.activeElement).toBe(actionButton);
379
+ await expect(args.items[0].action?.onClick).toHaveBeenCalled();
380
+
381
+ // Test focus on card click
382
+ await userEvent.click(cards[0]);
383
+ await expect(args.onItemClick).toHaveBeenCalled();
384
+
385
+ // Test focus trap prevention (focus can move outside component)
386
+ const lastExpandButton = expandButtons[expandButtons.length - 1];
387
+ lastExpandButton.focus();
388
+ await userEvent.tab();
389
+
390
+ // Focus should move outside the timeline component
391
+ await expect(document.activeElement).not.toBe(lastExpandButton);
392
+
393
+ // Test programmatic focus
394
+ expandButtons[1].focus();
395
+ await expect(document.activeElement).toBe(expandButtons[1]);
396
+
397
+ // Click to expand second item
398
+ await userEvent.click(expandButtons[1]);
399
+ await expect(document.activeElement).toBe(expandButtons[1]);
400
+
401
+ // Verify multiple items can be expanded simultaneously
402
+ await waitFor(() => {
403
+ const firstDescription = canvas.getByText(sampleItems[0].description!);
404
+ const secondDescription = canvas.getByText(sampleItems[1].description!);
405
+ expect(firstDescription).toBeVisible();
406
+ expect(secondDescription).toBeVisible();
407
+ }, { timeout: 3000 });
408
+ },
409
+ };
410
+
411
+ export const ResponsiveDesign: Story = {
412
+ args: {
413
+ items: sampleItems,
414
+ variant: 'default',
415
+ orientation: 'vertical',
416
+ onItemClick: fn(),
417
+ },
418
+ parameters: {
419
+ viewport: { defaultViewport: 'mobile1' },
420
+ },
421
+ play: async ({ canvasElement }) => {
422
+ const canvas = within(canvasElement);
423
+
424
+ // Verify timeline renders on mobile - wait longer for mobile viewport
425
+ let container: HTMLElement | null = null;
426
+ await waitFor(() => {
427
+ container = canvas.getByTestId('timeline-container') as HTMLElement;
428
+ expect(container).toBeInTheDocument();
429
+ expect(container).not.toBeNull();
430
+ }, { timeout: 5000 });
431
+
432
+ // Assert container is not null for TypeScript
433
+ if (!container) {
434
+ throw new Error('Timeline container not found');
435
+ }
436
+
437
+ // Wait for all items to render
438
+ await waitFor(() => {
439
+ const items = canvas.getAllByRole('article');
440
+ expect(items).toHaveLength(sampleItems.length);
441
+ }, { timeout: 3000 });
442
+
443
+ // Verify all items are rendered
444
+ const items = canvas.getAllByRole('article');
445
+ await expect(items).toHaveLength(sampleItems.length);
446
+
447
+ // Check vertical orientation layout
448
+ const containerStyle = window.getComputedStyle(container);
449
+ await expect(containerStyle.flexDirection).toBe('column');
450
+ await expect(containerStyle.display).toBe('flex');
451
+
452
+ // Verify items stack vertically with proper spacing
453
+ const itemContainers = canvas.getAllByTestId('timeline-item-container');
454
+ await expect(itemContainers).toHaveLength(sampleItems.length);
455
+
456
+ // Check each item's layout
457
+ for (let i = 0; i < itemContainers.length; i++) {
458
+ const itemContainer = itemContainers[i] as HTMLElement;
459
+ const itemStyle = window.getComputedStyle(itemContainer);
460
+
461
+ // Items should use flex layout
462
+ await expect(itemStyle.display).toBe('flex');
463
+
464
+ // Gap should be applied
465
+ await expect(itemStyle.gap).toBeTruthy();
466
+ }
467
+
468
+ // Verify text doesn't overflow on mobile
469
+ const titles = canvasElement.querySelectorAll('h6');
470
+ for (const title of titles) {
471
+ const titleElement = title as HTMLElement;
472
+ const rect = titleElement.getBoundingClientRect();
473
+ const containerRect = (container as HTMLElement).getBoundingClientRect();
474
+
475
+ // Title should be within container bounds
476
+ await expect(rect.right).toBeLessThanOrEqual(containerRect.right);
477
+ await expect(rect.left).toBeGreaterThanOrEqual(containerRect.left);
478
+ }
479
+
480
+ // Test touch interactions work on mobile
481
+ const firstCard = items[0];
482
+ await userEvent.click(firstCard);
483
+
484
+ // Expand buttons should be large enough for touch
485
+ const expandButtons = Array.from(canvasElement.querySelectorAll('button')).filter(
486
+ (btn) => btn.querySelector('svg[data-testid="ExpandMoreIcon"]')
487
+ );
488
+
489
+ for (const button of expandButtons) {
490
+ const rect = button.getBoundingClientRect();
491
+ // Minimum touch target size (44x44 pixels recommended)
492
+ await expect(rect.width).toBeGreaterThanOrEqual(32);
493
+ await expect(rect.height).toBeGreaterThanOrEqual(32);
494
+ }
495
+ },
496
+ };
497
+
498
+ export const ThemeVariations: Story = {
499
+ args: {
500
+ items: sampleItems,
501
+ variant: 'detailed',
502
+ },
503
+ parameters: {
504
+ backgrounds: { default: 'dark' },
505
+ },
506
+ play: async ({ canvasElement }) => {
507
+ const canvas = within(canvasElement);
508
+
509
+ // Wait for timeline to render
510
+ await waitFor(() => {
511
+ const cards = canvas.getAllByRole('article');
512
+ expect(cards).toHaveLength(sampleItems.length);
513
+ }, { timeout: 3000 });
514
+
515
+ // Verify timeline renders in dark theme
516
+ const cards = canvas.getAllByRole('article');
517
+ await expect(cards).toHaveLength(sampleItems.length);
518
+
519
+ // Verify custom colors are applied to timeline dots
520
+ const dots = canvas.getAllByTestId('timeline-dot');
521
+ await expect(dots).toHaveLength(sampleItems.length);
522
+
523
+ for (let i = 0; i < dots.length; i++) {
524
+ const dot = dots[i] as HTMLElement;
525
+ const item = sampleItems[i];
526
+ const style = window.getComputedStyle(dot);
527
+
528
+ // Verify gradient background is applied
529
+ await expect(style.background).toContain('gradient');
530
+
531
+ // Verify custom color is used if provided
532
+ if (item.color) {
533
+ // Check box-shadow uses the custom color
534
+ await expect(style.boxShadow).toBeTruthy();
535
+ }
536
+
537
+ // Verify border for contrast
538
+ await expect(style.border).toBeTruthy();
539
+
540
+ // Verify dot has proper dimensions
541
+ await expect(style.width).toBe('40px');
542
+ await expect(style.height).toBe('40px');
543
+ await expect(style.borderRadius).toBe('50%');
544
+ }
545
+
546
+ // Verify cards have glass morphism effect
547
+ const timelineCards = canvas.getAllByTestId('timeline-card');
548
+ for (const card of timelineCards) {
549
+ const cardElement = card as HTMLElement;
550
+ const style = window.getComputedStyle(cardElement) as ReturnType<typeof window.getComputedStyle> & { webkitBackdropFilter?: string };
551
+
552
+ // Check glass effect properties
553
+ await expect(style.backdropFilter || style.webkitBackdropFilter).toContain('blur');
554
+ await expect(style.background).toContain('gradient');
555
+ await expect(style.border).toBeTruthy();
556
+ }
557
+
558
+ // Verify text contrast in dark theme
559
+ const timestamps = canvas.getAllByTestId('timeline-timestamp');
560
+ for (const timestamp of timestamps) {
561
+ const element = timestamp as HTMLElement;
562
+ const style = window.getComputedStyle(element);
563
+
564
+ // Timestamp should have secondary text color
565
+ await expect(style.color).toBeTruthy();
566
+ await expect(style.fontSize).toBe('12px'); // Computed value, not CSS value
567
+ await expect(style.textTransform).toBe('uppercase');
568
+ }
569
+
570
+ // Verify connector gradient
571
+ const connectors = canvas.getAllByTestId('timeline-connector');
572
+ for (const connector of connectors) {
573
+ const element = connector as HTMLElement;
574
+ const style = window.getComputedStyle(element);
575
+ await expect(style.background).toContain('gradient');
576
+ }
577
+ },
578
+ };
579
+
580
+ export const VisualStates: Story = {
581
+ args: {
582
+ items: [
583
+ ...sampleItems,
584
+ {
585
+ id: '5',
586
+ title: 'Error State',
587
+ description: 'An error occurred',
588
+ timestamp: '2024-01-02 10:00 AM',
589
+ icon: <ErrorIcon />,
590
+ color: '#f44336',
591
+ },
592
+ ],
593
+ variant: 'default',
594
+ animated: true,
595
+ alternating: true,
596
+ },
597
+ play: async ({ canvasElement }) => {
598
+ const canvas = within(canvasElement);
599
+ const expectedItemCount = sampleItems.length + 1; // Including the error state item
600
+
601
+ // Wait for timeline to render with animations
602
+ await waitFor(() => {
603
+ const cards = canvas.getAllByRole('article');
604
+ expect(cards).toHaveLength(expectedItemCount);
605
+ }, { timeout: 3000 });
606
+
607
+ // Verify all items including error state are rendered
608
+ const cards = canvas.getAllByRole('article');
609
+ await expect(cards).toHaveLength(expectedItemCount);
610
+
611
+ // Test hover state on cards - verify cursor is set for interactivity
612
+ const firstCard = cards[0];
613
+ const initialStyle = window.getComputedStyle(firstCard);
614
+ await expect(initialStyle.cursor).toBe('pointer');
615
+
616
+ // Note: userEvent.hover() doesn't trigger CSS :hover pseudo-class
617
+ // The hover transform is verified visually and applied via CSS :hover
618
+
619
+ // Verify alternating layout
620
+ const itemContainers = canvas.getAllByTestId('timeline-item-container');
621
+ await expect(itemContainers).toHaveLength(expectedItemCount);
622
+
623
+ for (let i = 0; i < itemContainers.length; i++) {
624
+ const container = itemContainers[i] as HTMLElement;
625
+ const style = window.getComputedStyle(container);
626
+
627
+ // Check alternating flex direction
628
+ if (i % 2 === 0) {
629
+ await expect(style.flexDirection).toBe('row');
630
+ await expect(style.textAlign).toBe('left');
631
+ } else {
632
+ await expect(style.flexDirection).toBe('row-reverse');
633
+ await expect(style.textAlign).toBe('right');
634
+ }
635
+ }
636
+
637
+ // Verify animations are applied
638
+ for (let i = 0; i < itemContainers.length; i++) {
639
+ const container = itemContainers[i] as HTMLElement;
640
+ const style = window.getComputedStyle(container);
641
+
642
+ // Check slide-in animation with staggered delay
643
+ await expect(style.animation).toContain('0.5s');
644
+ await expect(style.animation).toContain('ease');
645
+ // Animation delay varies per item - just check it has some delay
646
+ await expect(style.animation).toBeTruthy();
647
+ }
648
+
649
+ // Verify error state styling
650
+ const allDots = canvas.getAllByTestId('timeline-dot');
651
+ const errorDot = allDots[4] as HTMLElement;
652
+ const errorStyle = window.getComputedStyle(errorDot);
653
+ await expect(errorStyle.background).toContain('gradient');
654
+
655
+ // Verify pulse animation on dots
656
+ for (const dot of allDots) {
657
+ const dotElement = dot as HTMLElement;
658
+ const style = window.getComputedStyle(dotElement);
659
+ await expect(style.animation).toContain('2s');
660
+ await expect(style.animation).toContain('ease');
661
+ await expect(style.animation).toContain('infinite');
662
+ }
663
+
664
+ // Test different icon states
665
+ const icons = canvasElement.querySelectorAll('svg');
666
+ await expect(icons.length).toBeGreaterThan(0);
667
+
668
+ // Verify icon colors within dots
669
+ for (const dot of allDots) {
670
+ const icon = dot.querySelector('svg');
671
+ if (icon) {
672
+ const iconStyle = window.getComputedStyle(icon);
673
+ await expect(iconStyle.fontSize).toBeTruthy();
674
+ }
675
+ }
676
+ },
677
+ };
678
+
679
+ export const Performance: Story = {
680
+ args: {
681
+ items: Array.from({ length: 50 }, (_, i) => ({
682
+ id: `${i}`,
683
+ title: `Event ${i + 1}`,
684
+ description: `Description for event ${i + 1}`,
685
+ timestamp: `2024-01-01 ${String(i % 12).padStart(2, '0')}:00 ${i < 12 ? 'AM' : 'PM'}`,
686
+ metadata: { Index: `${i}`, Category: `Category ${i % 5}` },
687
+ })),
688
+ variant: 'compact',
689
+ animated: false,
690
+ onItemClick: fn(),
691
+ },
692
+ play: async ({ canvasElement, args }) => {
693
+ const canvas = within(canvasElement);
694
+
695
+ // Wait for all items to render
696
+ await waitFor(() => {
697
+ const items = canvas.getAllByRole('article');
698
+ expect(items).toHaveLength(50);
699
+ }, { timeout: 3000 });
700
+
701
+ // Verify large number of items render correctly
702
+ const items = canvas.getAllByRole('article');
703
+ await expect(items).toHaveLength(50);
704
+
705
+ // Verify compact variant styling
706
+ const timelineCards = canvas.getAllByTestId('timeline-card');
707
+ for (const card of timelineCards.slice(0, 5)) { // Check first 5 for performance
708
+ const cardElement = card as HTMLElement;
709
+ // Compact variant should have reduced padding
710
+ // Skip checking style directly as it's not used beyond content check
711
+ const contentElement = cardElement.querySelector('.MuiCardContent-root') as HTMLElement;
712
+ if (contentElement) {
713
+ const contentStyle = window.getComputedStyle(contentElement);
714
+ await expect(contentStyle.padding).toBe('0px');
715
+ }
716
+ }
717
+
718
+ // Test animations are disabled
719
+ const itemContainers = canvas.getAllByTestId('timeline-item-container');
720
+ for (const container of itemContainers.slice(0, 5)) { // Check first 5
721
+ const element = container as HTMLElement;
722
+ const style = window.getComputedStyle(element);
723
+
724
+ // No animation should be applied when animated=false
725
+ await expect(style.animation).toContain('none');
726
+ }
727
+
728
+ // Test interaction performance with many items
729
+ const startTime = Date.now();
730
+
731
+ // Click multiple items quickly
732
+ await userEvent.click(items[0]);
733
+ await userEvent.click(items[10]);
734
+ await userEvent.click(items[20]);
735
+
736
+ const endTime = Date.now();
737
+ const interactionTime = endTime - startTime;
738
+
739
+ // Interactions should be responsive (under 1 second for 3 clicks)
740
+ await expect(interactionTime).toBeLessThan(1000);
741
+
742
+ // Verify clicks were registered
743
+ await expect(args.onItemClick).toHaveBeenCalledTimes(3);
744
+
745
+ // Test scrolling performance for vertical timeline - ensure container exists
746
+ await waitFor(() => {
747
+ const container = canvas.getByTestId('timeline-container');
748
+ expect(container).toBeInTheDocument();
749
+ }, { timeout: 3000 });
750
+
751
+ // Verify all titles are rendered correctly
752
+ for (let i = 0; i < 5; i++) { // Check first 5 items
753
+ await expect(canvas.getByText(`Event ${i + 1}`)).toBeInTheDocument();
754
+ }
755
+
756
+ // In compact mode, descriptions should still be visible
757
+ for (let i = 0; i < 3; i++) { // Check first 3
758
+ await expect(canvas.getByText(`Description for event ${i + 1}`)).toBeInTheDocument();
759
+ }
760
+
761
+ // In compact mode, metadata chips are NOT rendered (they require expanded state or detailed variant)
762
+ // Verify no metadata chips are present
763
+ const metadataChips = canvasElement.querySelectorAll('[class*="MuiChip"]');
764
+ await expect(metadataChips.length).toBe(0);
765
+
766
+ // Test connectors are rendered efficiently
767
+ const connectors = canvas.getAllByTestId('timeline-connector');
768
+ await expect(connectors).toHaveLength(49); // 50 items = 49 connectors
769
+ },
770
+ };
771
+
772
+ export const EdgeCases: Story = {
773
+ args: {
774
+ items: [
775
+ {
776
+ id: '1',
777
+ title:
778
+ 'Very long title that should wrap properly and not break the layout even when it contains many words',
779
+ description:
780
+ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris.',
781
+ timestamp: '2024-12-31 11:59 PM',
782
+ metadata: {
783
+ 'Long Key Name': 'Long value that might need truncation',
784
+ 'Another Key': 'Another value',
785
+ 'Third Key': 'Third value',
786
+ 'Fourth Key': 'Fourth value',
787
+ },
788
+ },
789
+ {
790
+ id: '2',
791
+ title: '',
792
+ timestamp: '',
793
+ },
794
+ {
795
+ id: '3',
796
+ title: 'Minimal item',
797
+ timestamp: 'Now',
798
+ },
799
+ ],
800
+ variant: 'detailed',
801
+ onItemClick: fn(),
802
+ },
803
+ play: async ({ canvasElement, args }) => {
804
+ const canvas = within(canvasElement);
805
+
806
+ // Wait for timeline to render using a more robust query
807
+ const items = await canvas.findAllByRole('article', {}, { timeout: 3000 });
808
+ expect(items).toHaveLength(3);
809
+
810
+ // Verify long title wraps properly
811
+ const longTitleText =
812
+ 'Very long title that should wrap properly and not break the layout even when it contains many words';
813
+ const longTitleElement = await canvas.findByText(longTitleText);
814
+ expect(longTitleElement).toBeInTheDocument();
815
+
816
+ const titleStyle = window.getComputedStyle(longTitleElement);
817
+ const titleRect = longTitleElement.getBoundingClientRect();
818
+ const cardRect = longTitleElement.closest('[data-testid="timeline-card"]')?.getBoundingClientRect();
819
+
820
+ if (cardRect) {
821
+ expect(titleRect.width).toBeLessThanOrEqual(cardRect.width);
822
+ }
823
+ expect(titleStyle.overflowWrap).toBeTruthy();
824
+
825
+ // Wait for the animation to complete by putting the visibility assertion inside waitFor.
826
+ const longDescription =
827
+ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris.';
828
+
829
+ await waitFor(() => {
830
+ expect(canvas.getByText(longDescription)).toBeVisible();
831
+ }, { timeout: 3000 });
832
+
833
+ // Test empty title and timestamp handling
834
+ const emptyItemCard = items[1];
835
+ expect(emptyItemCard).toBeInTheDocument();
836
+
837
+ await userEvent.click(emptyItemCard);
838
+ await expect(args.onItemClick).toHaveBeenCalledWith(expect.objectContaining({ id: '2' }));
839
+
840
+ // Verify minimal item renders correctly
841
+ await expect(canvas.getByText('Minimal item')).toBeInTheDocument();
842
+ await expect(canvas.getByText('Now')).toBeInTheDocument();
843
+
844
+ // Test metadata chip rendering and overflow - wait for them to appear
845
+ const metadataChips = await canvas.findAllByText(/Key Name|Another Key|Third Key|Fourth Key/, {}, { timeout: 3000 });
846
+ expect(metadataChips).toHaveLength(4);
847
+
848
+ const metadataContainer = metadataChips[0]?.parentElement?.parentElement;
849
+ if (metadataContainer) {
850
+ await waitFor(() => {
851
+ const containerStyle = window.getComputedStyle(metadataContainer as HTMLElement);
852
+ expect(containerStyle.flexWrap).toBe('wrap');
853
+ });
854
+ const finalContainerStyle = window.getComputedStyle(metadataContainer as HTMLElement);
855
+ expect(finalContainerStyle.display).toBe('flex');
856
+ }
857
+
858
+ // Test timeline dots and connectors using test-ids for resilience
859
+ const dots = await canvas.findAllByTestId('timeline-dot');
860
+ expect(dots).toHaveLength(3);
861
+
862
+ const connectors = await canvas.findAllByTestId('timeline-connector');
863
+ expect(connectors).toHaveLength(2);
864
+
865
+ // Verify one expand button exists for the item with a description.
866
+ const expandButtons = canvas.queryAllByRole('button', { name: /expand item details/i });
867
+ expect(expandButtons).toHaveLength(1);
868
+ },
869
+ };
870
+
871
+ export const Integration: Story = {
872
+ args: {
873
+ items: sampleItems,
874
+ variant: 'default',
875
+ orientation: 'horizontal',
876
+ showConnector: true,
877
+ animated: true,
878
+ alternating: false,
879
+ onItemClick: fn(),
880
+ },
881
+ play: async ({ canvasElement, args }) => {
882
+ const canvas = within(canvasElement);
883
+
884
+ // 1. Wait for the main container to appear using its test-id.
885
+ const container = await canvas.findByTestId('timeline-container');
886
+
887
+ // 2. Assert styles on the now-guaranteed-to-exist container.
888
+ const containerStyle = window.getComputedStyle(container);
889
+ expect(containerStyle.flexDirection).toBe('row');
890
+ expect(containerStyle.overflowX).toBe('auto');
891
+
892
+ // 3. Wait for all item containers to render.
893
+ const itemContainers = await canvas.findAllByTestId('timeline-item-container');
894
+ expect(itemContainers).toHaveLength(sampleItems.length);
895
+
896
+ for (const itemContainer of itemContainers) {
897
+ const style = window.getComputedStyle(itemContainer);
898
+ expect(style.flexDirection).toBe('column');
899
+ expect(style.alignItems).toBe('center');
900
+ }
901
+
902
+ // 4. Test all interactive features work together
903
+ const cards = await canvas.findAllByRole('article');
904
+ await userEvent.click(cards[0]);
905
+ expect(args.onItemClick).toHaveBeenCalledWith(sampleItems[0]);
906
+ expect(args.onItemClick).toHaveBeenCalledTimes(1);
907
+
908
+ // 5. Expand an item by finding its accessible button label
909
+ const expandButtons = await canvas.findAllByRole('button', {
910
+ name: /Expand item details/i,
911
+ });
912
+
913
+ if (expandButtons.length > 0) {
914
+ await userEvent.click(expandButtons[0]);
915
+ // Wait for description to appear and become visible (animations take time)
916
+ await waitFor(async () => {
917
+ const description = await canvas.findByText(sampleItems[0].description!);
918
+ expect(description).toBeVisible();
919
+ }, { timeout: 3000 });
920
+
921
+ // Find and click the action button that is now visible
922
+ const actionButton = await canvas.findByRole('button', { name: /View Details/i });
923
+ await userEvent.click(actionButton);
924
+ expect(sampleItems[0].action?.onClick).toHaveBeenCalled();
925
+ }
926
+
927
+ // 6. Verify all visual elements are properly rendered, waiting for each one.
928
+ const dots = await canvas.findAllByTestId('timeline-dot');
929
+ expect(dots).toHaveLength(sampleItems.length);
930
+
931
+ // Asynchronously verify that each dot contains an icon
932
+ for (const dot of dots) {
933
+ // Use `within` to scope the search inside each dot and wait for the SVG to appear.
934
+ // This is the key fix for the original error.
935
+ const icon = await within(dot).findByTestId(/item-icon/);
936
+ expect(icon).toBeInTheDocument();
937
+ }
938
+
939
+ // 7. Test scrolling behavior for horizontal timeline
940
+ if (container.scrollWidth > container.clientWidth) {
941
+ expect(container.scrollWidth).toBeGreaterThan(container.clientWidth);
942
+ }
943
+ },
944
+ };