@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,1168 @@
1
+ import { Delete, Help, Info } from '@mui/icons-material';
2
+ import { Box, Button, IconButton, Stack, Typography } from '@mui/material';
3
+ import type { Meta, StoryObj } from '@storybook/react-vite';
4
+ import React from 'react';
5
+ import { expect, userEvent, waitFor,within } from 'storybook/test';
6
+
7
+ import { Tooltip } from './Tooltip';
8
+
9
+ const meta: Meta<typeof Tooltip> = {
10
+ title: 'DataDisplay/Tooltip/Tests',
11
+ component: Tooltip,
12
+ parameters: {
13
+ layout: 'centered',
14
+ chromatic: { disableSnapshot: false },
15
+ },
16
+ tags: ['autodocs', 'test', 'component:Tooltip'],
17
+ };
18
+
19
+ export default meta;
20
+ type Story = StoryObj<typeof meta>;
21
+
22
+ // Helper function to find tooltip by content or just the first visible one
23
+ const findTooltipByContent = async (content?: string) => {
24
+ const tooltips = await within(document.body).findAllByRole('tooltip');
25
+ if (!content) {
26
+ // Return the last tooltip (innermost div with actual content)
27
+ return tooltips[tooltips.length - 1];
28
+ }
29
+ return tooltips.find((tip) => tip.textContent?.includes(content));
30
+ };
31
+
32
+ // 7.2 Interaction Tests
33
+ export const BasicInteraction: Story = {
34
+ name: '🧪 Basic Interaction Test',
35
+ args: {
36
+ title: 'Test tooltip content',
37
+ variant: 'default',
38
+ },
39
+ render: (args) => (
40
+ <Box sx={{ p: 4, display: 'flex', justifyContent: 'center' }}>
41
+ <Tooltip {...args}>
42
+ <Button variant="outlined" data-testid="trigger-button">
43
+ Hover me
44
+ </Button>
45
+ </Tooltip>
46
+ </Box>
47
+ ),
48
+ play: async ({ canvasElement, step }) => {
49
+ const canvas = within(canvasElement);
50
+
51
+ await step('Initial render verification', async () => {
52
+ const button = canvas.getByTestId('trigger-button');
53
+ await expect(button).toBeInTheDocument();
54
+ await expect(button).toHaveTextContent('Hover me');
55
+ });
56
+
57
+ await step('Hover interaction shows tooltip', async () => {
58
+ const button = canvas.getByTestId('trigger-button');
59
+ await userEvent.hover(button);
60
+
61
+ // Wait for tooltip to appear
62
+ await waitFor(
63
+ async () => {
64
+ const tooltip = await findTooltipByContent('Test tooltip content');
65
+ await expect(tooltip).toBeInTheDocument();
66
+ await expect(tooltip).toHaveTextContent('Test tooltip content');
67
+ },
68
+ { timeout: 2000 },
69
+ );
70
+ });
71
+
72
+ await step('Unhover hides tooltip', async () => {
73
+ const button = canvas.getByTestId('trigger-button');
74
+ await userEvent.unhover(button);
75
+
76
+ // Wait for tooltip to disappear
77
+ await waitFor(
78
+ () => {
79
+ const tooltip = within(document.body).queryByRole('tooltip');
80
+ expect(tooltip).not.toBeInTheDocument();
81
+ },
82
+ { timeout: 2000 },
83
+ );
84
+ });
85
+ },
86
+ };
87
+
88
+ export const ClickInteraction: Story = {
89
+ name: '🖱️ Click Interaction Test',
90
+ args: {
91
+ title: 'Click tooltip',
92
+ variant: 'light',
93
+ },
94
+ render: (args) => (
95
+ <Box sx={{ p: 4, display: 'flex', justifyContent: 'center' }}>
96
+ <Tooltip {...args}>
97
+ <Button variant="contained" color="primary" data-testid="click-trigger">
98
+ Click me
99
+ </Button>
100
+ </Tooltip>
101
+ </Box>
102
+ ),
103
+ play: async ({ canvasElement, step }) => {
104
+ const canvas = within(canvasElement);
105
+
106
+ await step('Click shows tooltip', async () => {
107
+ const button = canvas.getByTestId('click-trigger');
108
+ await userEvent.click(button);
109
+
110
+ await waitFor(
111
+ async () => {
112
+ const tooltip = await findTooltipByContent('Click tooltip');
113
+ await expect(tooltip).toBeInTheDocument();
114
+ await expect(tooltip).toHaveTextContent('Click tooltip');
115
+ },
116
+ { timeout: 2000 },
117
+ );
118
+ });
119
+
120
+ await step('Click elsewhere hides tooltip', async () => {
121
+ // Click outside the button
122
+ await userEvent.click(canvasElement);
123
+
124
+ await waitFor(
125
+ () => {
126
+ const tooltip = within(document.body).queryByRole('tooltip');
127
+ expect(tooltip).not.toBeInTheDocument();
128
+ },
129
+ { timeout: 2000 },
130
+ );
131
+ });
132
+ },
133
+ };
134
+
135
+ const StateChangeTestComponent = () => {
136
+ const [variant, setVariant] = React.useState<'default' | 'dark' | 'light' | 'glass'>('default');
137
+ const [glow, setGlow] = React.useState(false);
138
+ const [pulse, setPulse] = React.useState(false);
139
+
140
+ return (
141
+ <Box sx={{ p: 4, display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 2 }}>
142
+ <Stack direction="row" spacing={2} sx={{ mb: 2 }}>
143
+ <Button
144
+ variant="outlined"
145
+ size="small"
146
+ onClick={() => setVariant(variant === 'default' ? 'dark' : 'default')}
147
+ data-testid="variant-toggle"
148
+ >
149
+ Toggle Variant
150
+ </Button>
151
+ <Button
152
+ variant="outlined"
153
+ size="small"
154
+ onClick={() => setGlow(!glow)}
155
+ data-testid="glow-toggle"
156
+ >
157
+ Toggle Glow
158
+ </Button>
159
+ <Button
160
+ variant="outlined"
161
+ size="small"
162
+ onClick={() => setPulse(!pulse)}
163
+ data-testid="pulse-toggle"
164
+ >
165
+ Toggle Pulse
166
+ </Button>
167
+ </Stack>
168
+
169
+ <Tooltip
170
+ title={`Variant: ${variant}, Glow: ${glow}, Pulse: ${pulse}`}
171
+ variant={variant}
172
+ glow={glow}
173
+ pulse={pulse}
174
+ >
175
+ <Button variant="contained" data-testid="stateful-tooltip">
176
+ Dynamic Tooltip
177
+ </Button>
178
+ </Tooltip>
179
+ </Box>
180
+ );
181
+ };
182
+
183
+ export const StateChangeTest: Story = {
184
+ name: '🔄 State Change Test',
185
+ render: () => <StateChangeTestComponent />,
186
+ play: async ({ canvasElement, step }) => {
187
+ const canvas = within(canvasElement);
188
+
189
+ await step('Toggle variant changes tooltip style', async () => {
190
+ const variantButton = canvas.getByTestId('variant-toggle');
191
+ const tooltipTrigger = canvas.getByTestId('stateful-tooltip');
192
+
193
+ await userEvent.click(variantButton);
194
+ await userEvent.hover(tooltipTrigger);
195
+
196
+ await waitFor(
197
+ async () => {
198
+ const tooltip = await findTooltipByContent();
199
+ await expect(tooltip).toBeInTheDocument();
200
+ await expect(tooltip).toHaveTextContent(/dark/);
201
+ },
202
+ { timeout: 2000 },
203
+ );
204
+
205
+ await userEvent.unhover(tooltipTrigger);
206
+ });
207
+
208
+ await step('Toggle glow adds visual effect', async () => {
209
+ const glowButton = canvas.getByTestId('glow-toggle');
210
+ const tooltipTrigger = canvas.getByTestId('stateful-tooltip');
211
+
212
+ await userEvent.click(glowButton);
213
+ await userEvent.hover(tooltipTrigger);
214
+
215
+ await waitFor(
216
+ async () => {
217
+ const tooltip = await findTooltipByContent();
218
+ await expect(tooltip).toHaveTextContent(/Glow: true/);
219
+ },
220
+ { timeout: 2000 },
221
+ );
222
+
223
+ await userEvent.unhover(tooltipTrigger);
224
+ });
225
+
226
+ await step('Toggle pulse adds animation', async () => {
227
+ const pulseButton = canvas.getByTestId('pulse-toggle');
228
+ const tooltipTrigger = canvas.getByTestId('stateful-tooltip');
229
+
230
+ await userEvent.click(pulseButton);
231
+ await userEvent.hover(tooltipTrigger);
232
+
233
+ await waitFor(
234
+ async () => {
235
+ const tooltip = await findTooltipByContent();
236
+ await expect(tooltip).toHaveTextContent(/Pulse: true/);
237
+ },
238
+ { timeout: 2000 },
239
+ );
240
+
241
+ await userEvent.unhover(tooltipTrigger);
242
+ });
243
+ },
244
+ };
245
+
246
+ // 7.3 Accessibility Tests
247
+ export const KeyboardNavigation: Story = {
248
+ name: '⌨️ Keyboard Navigation Test',
249
+ parameters: {
250
+ a11y: {
251
+ element: '#storybook-root',
252
+ config: {
253
+ rules: [
254
+ { id: 'color-contrast', enabled: true },
255
+ { id: 'aria-required-attr', enabled: true },
256
+ { id: 'aria-roles', enabled: true },
257
+ { id: 'aria-valid-attr-value', enabled: true },
258
+ { id: 'button-name', enabled: true },
259
+ { id: 'duplicate-id', enabled: true },
260
+ { id: 'label', enabled: true },
261
+ ],
262
+ },
263
+ },
264
+ },
265
+ render: () => (
266
+ <Box sx={{ p: 4, display: 'flex', justifyContent: 'center', gap: 2 }}>
267
+ <Stack direction="row" spacing={2}>
268
+ <Tooltip title="First tooltip" variant="default">
269
+ <Button variant="outlined" data-testid="first-focusable">
270
+ First
271
+ </Button>
272
+ </Tooltip>
273
+
274
+ <Tooltip title="Second tooltip" variant="light">
275
+ <Button variant="outlined" data-testid="second-focusable">
276
+ Second
277
+ </Button>
278
+ </Tooltip>
279
+
280
+ <Tooltip title="Third tooltip with keyboard navigation" variant="glass">
281
+ <IconButton data-testid="third-focusable">
282
+ <Help />
283
+ </IconButton>
284
+ </Tooltip>
285
+ </Stack>
286
+ </Box>
287
+ ),
288
+ play: async ({ canvasElement, step }) => {
289
+ const canvas = within(canvasElement);
290
+
291
+ await step('Tab navigation forward', async () => {
292
+ const firstElement = canvas.getByTestId('first-focusable');
293
+ const secondElement = canvas.getByTestId('second-focusable');
294
+
295
+ // Focus first element
296
+ firstElement.focus();
297
+ await expect(firstElement).toHaveFocus();
298
+
299
+ // Tab to next element
300
+ await userEvent.tab();
301
+ await expect(secondElement).toHaveFocus();
302
+ });
303
+
304
+ await step('Tab navigation backward', async () => {
305
+ await userEvent.tab({ shift: true });
306
+ const firstElement = canvas.getByTestId('first-focusable');
307
+ await expect(firstElement).toHaveFocus();
308
+ });
309
+
310
+ await step('Enter key maintains focus', async () => {
311
+ const firstButton = canvas.getByTestId('first-focusable');
312
+ firstButton.focus();
313
+ await userEvent.keyboard('{Enter}');
314
+ await expect(firstButton).toHaveFocus();
315
+ });
316
+
317
+ await step('Space key maintains focus', async () => {
318
+ const secondButton = canvas.getByTestId('second-focusable');
319
+ secondButton.focus();
320
+ await userEvent.keyboard(' ');
321
+ await expect(secondButton).toHaveFocus();
322
+ });
323
+ },
324
+ };
325
+
326
+ export const ScreenReaderTest: Story = {
327
+ name: '🔊 Screen Reader Test',
328
+ render: () => (
329
+ <Box sx={{ p: 4, display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 3 }}>
330
+ <Tooltip title="This tooltip provides additional context" variant="default">
331
+ <Button data-testid="aria-component" aria-label="Action button with tooltip">
332
+ Action
333
+ </Button>
334
+ </Tooltip>
335
+
336
+ <Tooltip title="Delete this item permanently" variant="dark" placement="top">
337
+ <IconButton data-testid="delete-button" aria-label="Delete item" color="error">
338
+ <Delete />
339
+ </IconButton>
340
+ </Tooltip>
341
+
342
+ <Box>
343
+ <Typography variant="subtitle2" id="field-label" data-testid="field-label" sx={{ mb: 1 }}>
344
+ Important Setting
345
+ </Typography>
346
+ <Tooltip
347
+ title="This setting affects system performance and cannot be changed later"
348
+ variant="light"
349
+ placement="right"
350
+ >
351
+ <IconButton
352
+ data-testid="help-icon"
353
+ aria-label="Help information for important setting"
354
+ aria-describedby="field-label"
355
+ size="small"
356
+ >
357
+ <Info fontSize="small" />
358
+ </IconButton>
359
+ </Tooltip>
360
+ </Box>
361
+ </Box>
362
+ ),
363
+ play: async ({ canvasElement, step }) => {
364
+ const canvas = within(canvasElement);
365
+
366
+ await step('Verify ARIA labels', async () => {
367
+ const actionButton = canvas.getByTestId('aria-component');
368
+ await expect(actionButton).toHaveAttribute('aria-label', 'Action button with tooltip');
369
+
370
+ const deleteButton = canvas.getByTestId('delete-button');
371
+ await expect(deleteButton).toHaveAttribute('aria-label', 'Delete item');
372
+ });
373
+
374
+ await step('Verify ARIA descriptions', async () => {
375
+ const helpIcon = canvas.getByTestId('help-icon');
376
+ await expect(helpIcon).toHaveAttribute('aria-describedby', 'field-label');
377
+
378
+ const label = canvas.getByTestId('field-label') || canvas.getByText('Important Setting');
379
+ await expect(label).toBeInTheDocument();
380
+ });
381
+
382
+ await step('Verify tooltip content is accessible', async () => {
383
+ const actionButton = canvas.getByTestId('aria-component');
384
+ await userEvent.hover(actionButton);
385
+
386
+ await waitFor(
387
+ async () => {
388
+ const tooltip = await findTooltipByContent();
389
+ await expect(tooltip).toBeInTheDocument();
390
+ await expect(tooltip).toHaveTextContent('This tooltip provides additional context');
391
+ },
392
+ { timeout: 2000 },
393
+ );
394
+
395
+ await userEvent.unhover(actionButton);
396
+ });
397
+ },
398
+ };
399
+
400
+ export const FocusManagement: Story = {
401
+ name: '🎯 Focus Management Test',
402
+ render: () => (
403
+ <Box sx={{ p: 4, display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 3 }}>
404
+ <Tooltip title="Focus is maintained on trigger" variant="default">
405
+ <Button data-testid="focus-trigger" variant="contained" autoFocus>
406
+ Auto Focus Button
407
+ </Button>
408
+ </Tooltip>
409
+
410
+ <Stack direction="row" spacing={2}>
411
+ <Tooltip title="First focusable element" variant="light">
412
+ <Button data-testid="first-element">First</Button>
413
+ </Tooltip>
414
+
415
+ <Tooltip title="Second focusable element" variant="glass">
416
+ <Button data-testid="second-element">Second</Button>
417
+ </Tooltip>
418
+
419
+ <Tooltip title="Last focusable element" variant="dark">
420
+ <Button data-testid="last-element">Last</Button>
421
+ </Tooltip>
422
+ </Stack>
423
+ </Box>
424
+ ),
425
+ play: async ({ canvasElement, step }) => {
426
+ const canvas = within(canvasElement);
427
+
428
+ await step('Auto focus on mount', async () => {
429
+ const autoFocusElement = canvas.getByTestId('focus-trigger');
430
+ await waitFor(() => {
431
+ expect(autoFocusElement).toHaveFocus();
432
+ });
433
+ });
434
+
435
+ await step('Focus is maintained during tooltip display', async () => {
436
+ const focusButton = canvas.getByTestId('focus-trigger');
437
+ focusButton.focus();
438
+ await expect(focusButton).toHaveFocus();
439
+
440
+ // Hover to show tooltip
441
+ await userEvent.hover(focusButton);
442
+
443
+ await waitFor(
444
+ async () => {
445
+ const tooltip = await findTooltipByContent();
446
+ await expect(tooltip).toBeInTheDocument();
447
+ // Focus should remain on trigger
448
+ await expect(focusButton).toHaveFocus();
449
+ },
450
+ { timeout: 2000 },
451
+ );
452
+
453
+ await userEvent.unhover(focusButton);
454
+ });
455
+
456
+ await step('Tab order is preserved', async () => {
457
+ const firstElement = canvas.getByTestId('first-element');
458
+ const secondElement = canvas.getByTestId('second-element');
459
+ const lastElement = canvas.getByTestId('last-element');
460
+
461
+ firstElement.focus();
462
+ await expect(firstElement).toHaveFocus();
463
+
464
+ await userEvent.tab();
465
+ await expect(secondElement).toHaveFocus();
466
+
467
+ await userEvent.tab();
468
+ await expect(lastElement).toHaveFocus();
469
+ });
470
+ },
471
+ };
472
+
473
+ // 7.4 Visual Tests
474
+ export const ResponsiveDesign: Story = {
475
+ name: '📱 Responsive Design Test',
476
+ parameters: {
477
+ viewport: {
478
+ viewports: {
479
+ mobile: {
480
+ name: 'Mobile',
481
+ styles: { width: '375px', height: '667px' },
482
+ type: 'mobile',
483
+ },
484
+ tablet: {
485
+ name: 'Tablet',
486
+ styles: { width: '768px', height: '1024px' },
487
+ type: 'tablet',
488
+ },
489
+ desktop: {
490
+ name: 'Desktop',
491
+ styles: { width: '1920px', height: '1080px' },
492
+ type: 'desktop',
493
+ },
494
+ },
495
+ defaultViewport: 'mobile',
496
+ },
497
+ chromatic: {
498
+ viewports: [375, 768, 1920],
499
+ delay: 300,
500
+ },
501
+ },
502
+ render: () => (
503
+ <Box
504
+ sx={{
505
+ p: 2,
506
+ display: 'flex',
507
+ flexDirection: { xs: 'column', md: 'row' },
508
+ gap: 2,
509
+ justifyContent: 'center',
510
+ alignItems: 'center',
511
+ }}
512
+ data-testid="responsive-container"
513
+ >
514
+ <Tooltip
515
+ title="This tooltip adapts to different screen sizes and viewport widths"
516
+ variant="default"
517
+ maxWidth={200}
518
+ >
519
+ <Button variant="outlined" size="small">
520
+ Mobile Tooltip
521
+ </Button>
522
+ </Tooltip>
523
+
524
+ <Tooltip
525
+ title="Tablet and desktop tooltip with more content that demonstrates responsive behavior"
526
+ variant="light"
527
+ maxWidth={300}
528
+ >
529
+ <Button variant="outlined">Responsive Tooltip</Button>
530
+ </Tooltip>
531
+ </Box>
532
+ ),
533
+ play: async ({ canvasElement, step }) => {
534
+ const canvas = within(canvasElement);
535
+
536
+ await step('Verify responsive container layout', async () => {
537
+ const container = canvas.getByTestId('responsive-container');
538
+ await expect(container).toBeInTheDocument();
539
+
540
+ // Check if layout adapts based on screen size
541
+ const computedStyle = window.getComputedStyle(container);
542
+
543
+ if (window.innerWidth <= 768) {
544
+ // Mobile: should be column layout
545
+ await expect(computedStyle.flexDirection).toBe('column');
546
+ } else {
547
+ // Desktop: should be row layout
548
+ await expect(computedStyle.flexDirection).toBe('row');
549
+ }
550
+ });
551
+
552
+ await step('Test tooltip rendering at different viewport sizes', async () => {
553
+ const buttons = canvas.getAllByRole('button');
554
+
555
+ for (const button of buttons) {
556
+ await userEvent.hover(button);
557
+
558
+ await waitFor(
559
+ async () => {
560
+ const tooltip = await findTooltipByContent();
561
+ await expect(tooltip).toBeInTheDocument();
562
+ },
563
+ { timeout: 2000 },
564
+ );
565
+
566
+ await userEvent.unhover(button);
567
+ }
568
+ });
569
+ },
570
+ };
571
+
572
+ export const ThemeVariations: Story = {
573
+ name: '🎨 Theme Variations Test',
574
+ parameters: {
575
+ backgrounds: {
576
+ default: 'light',
577
+ values: [
578
+ { name: 'light', value: '#ffffff' },
579
+ { name: 'dark', value: '#1a1a1a' },
580
+ { name: 'gray', value: '#f5f5f5' },
581
+ ],
582
+ },
583
+ },
584
+ render: () => (
585
+ <Box sx={{ p: 4, display: 'flex', flexDirection: 'column', gap: 3, alignItems: 'center' }}>
586
+ <Stack direction="row" spacing={2}>
587
+ <Tooltip title="Default theme" variant="default">
588
+ <Button variant="outlined" data-testid="default-theme">
589
+ Default
590
+ </Button>
591
+ </Tooltip>
592
+
593
+ <Tooltip title="Light theme" variant="light">
594
+ <Button variant="outlined" data-testid="light-theme">
595
+ Light
596
+ </Button>
597
+ </Tooltip>
598
+
599
+ <Tooltip title="Dark theme" variant="dark">
600
+ <Button variant="outlined" data-testid="dark-theme">
601
+ Dark
602
+ </Button>
603
+ </Tooltip>
604
+
605
+ <Tooltip title="Glass theme" variant="glass">
606
+ <Button variant="outlined" data-testid="glass-theme">
607
+ Glass
608
+ </Button>
609
+ </Tooltip>
610
+ </Stack>
611
+
612
+ <Stack direction="row" spacing={2}>
613
+ <Tooltip title="Glow effect" variant="default" glow>
614
+ <Button variant="contained" color="primary" data-testid="glow-effect">
615
+ Glow
616
+ </Button>
617
+ </Tooltip>
618
+
619
+ <Tooltip title="Pulse animation" variant="light" pulse>
620
+ <Button variant="contained" color="secondary" data-testid="pulse-effect">
621
+ Pulse
622
+ </Button>
623
+ </Tooltip>
624
+
625
+ <Tooltip title="Combined effects" variant="glass" glow pulse>
626
+ <Button variant="contained" color="success" data-testid="combined-effects">
627
+ Combined
628
+ </Button>
629
+ </Tooltip>
630
+ </Stack>
631
+ </Box>
632
+ ),
633
+ play: async ({ canvasElement, step }) => {
634
+ const canvas = within(canvasElement);
635
+
636
+ await step('Verify all theme variants render', async () => {
637
+ const buttons = ['default-theme', 'light-theme', 'dark-theme', 'glass-theme'];
638
+
639
+ for (const buttonId of buttons) {
640
+ const button = canvas.getByTestId(buttonId);
641
+ await userEvent.hover(button);
642
+
643
+ await waitFor(
644
+ async () => {
645
+ const tooltip = await findTooltipByContent();
646
+ await expect(tooltip).toBeInTheDocument();
647
+ },
648
+ { timeout: 2000 },
649
+ );
650
+
651
+ await userEvent.unhover(button);
652
+ }
653
+ });
654
+
655
+ await step('Verify visual effects render', async () => {
656
+ const effectButtons = ['glow-effect', 'pulse-effect', 'combined-effects'];
657
+
658
+ for (const buttonId of effectButtons) {
659
+ const button = canvas.getByTestId(buttonId);
660
+ await userEvent.hover(button);
661
+
662
+ await waitFor(
663
+ async () => {
664
+ const tooltip = await findTooltipByContent();
665
+ await expect(tooltip).toBeInTheDocument();
666
+ },
667
+ { timeout: 2000 },
668
+ );
669
+
670
+ await userEvent.unhover(button);
671
+ }
672
+ });
673
+ },
674
+ };
675
+
676
+ export const VisualStates: Story = {
677
+ name: '👁️ Visual States Test',
678
+ render: () => (
679
+ <Box sx={{ p: 4, display: 'flex', flexDirection: 'column', gap: 3, alignItems: 'center' }}>
680
+ <Stack direction="row" spacing={2}>
681
+ <Tooltip title="Normal state tooltip">
682
+ <Button variant="outlined" data-testid="normal-state">
683
+ Normal
684
+ </Button>
685
+ </Tooltip>
686
+
687
+ <Tooltip title="This button is disabled" placement="top">
688
+ <span>
689
+ <Button variant="outlined" disabled data-testid="disabled-button">
690
+ Disabled
691
+ </Button>
692
+ </span>
693
+ </Tooltip>
694
+ </Stack>
695
+
696
+ <Stack direction="row" spacing={2}>
697
+ <Tooltip title="Small size tooltip" size="sm">
698
+ <Button variant="outlined" size="small" data-testid="small-tooltip">
699
+ Small
700
+ </Button>
701
+ </Tooltip>
702
+
703
+ <Tooltip title="Large size tooltip" size="lg">
704
+ <Button variant="outlined" size="large" data-testid="large-tooltip">
705
+ Large
706
+ </Button>
707
+ </Tooltip>
708
+ </Stack>
709
+
710
+ <Tooltip
711
+ title="This is a very long tooltip text that should wrap properly within the maximum width constraints and demonstrate how the tooltip handles lengthy content gracefully"
712
+ maxWidth={200}
713
+ >
714
+ <Button variant="outlined" data-testid="long-text-tooltip">
715
+ Long Text
716
+ </Button>
717
+ </Tooltip>
718
+ </Box>
719
+ ),
720
+ play: async ({ canvasElement, step }) => {
721
+ const canvas = within(canvasElement);
722
+
723
+ await step('Normal state tooltip', async () => {
724
+ const button = canvas.getByTestId('normal-state');
725
+ await userEvent.hover(button);
726
+
727
+ await waitFor(
728
+ async () => {
729
+ const tooltip = await findTooltipByContent();
730
+ await expect(tooltip).toBeInTheDocument();
731
+ await expect(tooltip).toHaveTextContent('Normal state tooltip');
732
+ },
733
+ { timeout: 2000 },
734
+ );
735
+
736
+ await userEvent.unhover(button);
737
+ });
738
+
739
+ await step('Disabled state tooltip', async () => {
740
+ const disabledButton = canvas.getByTestId('disabled-button');
741
+ await expect(disabledButton).toBeDisabled();
742
+
743
+ // Hover on the span wrapper since disabled buttons don't receive hover events
744
+ const wrapper = disabledButton.parentElement;
745
+ if (wrapper) {
746
+ await userEvent.hover(wrapper);
747
+
748
+ await waitFor(
749
+ async () => {
750
+ const tooltip = await findTooltipByContent();
751
+ await expect(tooltip).toHaveTextContent('This button is disabled');
752
+ },
753
+ { timeout: 2000 },
754
+ );
755
+
756
+ await userEvent.unhover(wrapper);
757
+ }
758
+ });
759
+
760
+ await step('Different sizes render correctly', async () => {
761
+ const smallButton = canvas.getByTestId('small-tooltip');
762
+ await userEvent.hover(smallButton);
763
+
764
+ await waitFor(
765
+ async () => {
766
+ const tooltip = await findTooltipByContent();
767
+ await expect(tooltip).toHaveTextContent('Small size tooltip');
768
+ },
769
+ { timeout: 2000 },
770
+ );
771
+
772
+ await userEvent.unhover(smallButton);
773
+
774
+ const largeButton = canvas.getByTestId('large-tooltip');
775
+ await userEvent.hover(largeButton);
776
+
777
+ await waitFor(
778
+ async () => {
779
+ const tooltip = await findTooltipByContent();
780
+ await expect(tooltip).toHaveTextContent('Large size tooltip');
781
+ },
782
+ { timeout: 2000 },
783
+ );
784
+
785
+ await userEvent.unhover(largeButton);
786
+ });
787
+
788
+ await step('Long text wrapping', async () => {
789
+ const longTextButton = canvas.getByTestId('long-text-tooltip');
790
+ await userEvent.hover(longTextButton);
791
+
792
+ await waitFor(
793
+ async () => {
794
+ const tooltip = await findTooltipByContent();
795
+ await expect(tooltip).toBeInTheDocument();
796
+ // Check that tooltip contains the long text
797
+ await expect(tooltip).toHaveTextContent(/very long tooltip text/);
798
+ },
799
+ { timeout: 2000 },
800
+ );
801
+
802
+ await userEvent.unhover(longTextButton);
803
+ });
804
+ },
805
+ };
806
+
807
+ // 7.5 Performance Tests
808
+ export const PerformanceTest: Story = {
809
+ name: '⚡ Performance Test',
810
+ render: () => {
811
+ const items = Array.from({ length: 20 }, (_, i) => ({
812
+ id: i,
813
+ name: `Item ${i}`,
814
+ description: `Description for item ${i} with additional context information`,
815
+ }));
816
+
817
+ return (
818
+ <Box sx={{ p: 2, maxHeight: 400, overflow: 'auto' }} data-testid="scroll-container">
819
+ <Stack spacing={1}>
820
+ {items.map((item) => (
821
+ <Tooltip key={item.id} title={item.description} variant="default" placement="right">
822
+ <Button
823
+ variant="outlined"
824
+ size="small"
825
+ fullWidth
826
+ data-testid={`item-${item.id}`}
827
+ sx={{ justifyContent: 'flex-start' }}
828
+ >
829
+ {item.name}
830
+ </Button>
831
+ </Tooltip>
832
+ ))}
833
+ </Stack>
834
+ </Box>
835
+ );
836
+ },
837
+ play: async ({ canvasElement, step }) => {
838
+ const canvas = within(canvasElement);
839
+
840
+ await step('Measure render time for multiple tooltips', async () => {
841
+ const startTime = Date.now();
842
+ const elements = canvas.getAllByTestId(/item-/);
843
+ const endTime = Date.now();
844
+
845
+ const renderTime = endTime - startTime;
846
+
847
+ // Assert reasonable render time
848
+ await expect(renderTime).toBeLessThan(100);
849
+ await expect(elements.length).toBe(20);
850
+ });
851
+
852
+ await step('Test rapid tooltip interactions', async () => {
853
+ const elements = canvas.getAllByTestId(/item-/);
854
+ const testElements = elements.slice(0, 5); // Test first 5 items
855
+
856
+ const startTime = Date.now();
857
+
858
+ // Rapidly hover over multiple tooltips
859
+ for (const element of testElements) {
860
+ await userEvent.hover(element);
861
+ await new Promise((resolve) => window.setTimeout(resolve, 50)); // Brief pause
862
+ await userEvent.unhover(element);
863
+ }
864
+
865
+ const endTime = Date.now();
866
+ const interactionTime = endTime - startTime;
867
+
868
+ // Should handle rapid interactions without hanging
869
+ await expect(interactionTime).toBeLessThan(2000);
870
+ });
871
+
872
+ await step('Test scroll performance with tooltips', async () => {
873
+ const scrollContainer = canvas.getByTestId('scroll-container');
874
+
875
+ const startTime = Date.now();
876
+
877
+ // Simulate scrolling
878
+ for (let i = 0; i < 5; i++) {
879
+ scrollContainer.scrollTop = i * 50;
880
+ await new Promise((resolve) => window.setTimeout(resolve, 20));
881
+ }
882
+
883
+ const endTime = Date.now();
884
+ const scrollTime = endTime - startTime;
885
+
886
+ // Verify smooth scrolling
887
+ await expect(scrollTime).toBeLessThan(500);
888
+ await expect(scrollContainer).toBeInTheDocument();
889
+ });
890
+ },
891
+ };
892
+
893
+ // 7.6 Edge Cases Tests
894
+ export const EdgeCases: Story = {
895
+ name: '🔧 Edge Cases Test',
896
+ render: () => (
897
+ <Box sx={{ p: 4, display: 'flex', flexDirection: 'column', gap: 3, alignItems: 'center' }}>
898
+ <Tooltip title="" variant="default">
899
+ <Button variant="outlined" data-testid="empty-tooltip">
900
+ Empty Tooltip
901
+ </Button>
902
+ </Tooltip>
903
+
904
+ <Tooltip
905
+ title="This is an extremely long tooltip text that contains a lot of information and should properly handle the maximum width constraints while maintaining readability and proper text wrapping behavior even with very lengthy content that might otherwise cause layout issues or performance problems in less robust implementations"
906
+ maxWidth={150}
907
+ variant="light"
908
+ >
909
+ <Button variant="outlined" data-testid="very-long-text">
910
+ Very Long Text
911
+ </Button>
912
+ </Tooltip>
913
+
914
+ <Tooltip title={'Special chars: !@#$%^&*()_+{}|:<>?[];\'"\\,./`~'} variant="glass">
915
+ <Button variant="outlined" data-testid="special-chars">
916
+ Special Characters
917
+ </Button>
918
+ </Tooltip>
919
+
920
+ <Tooltip
921
+ title="HTML content test: <script>alert('test')</script> & entities: &lt;&gt;&amp;"
922
+ variant="dark"
923
+ >
924
+ <Button variant="outlined" data-testid="html-content">
925
+ HTML Content
926
+ </Button>
927
+ </Tooltip>
928
+
929
+ <Tooltip title={0 as unknown as string} variant="default">
930
+ <Button variant="outlined" data-testid="invalid-props">
931
+ Invalid Props
932
+ </Button>
933
+ </Tooltip>
934
+ </Box>
935
+ ),
936
+ play: async ({ canvasElement, step }) => {
937
+ const canvas = within(canvasElement);
938
+
939
+ await step('Empty content handling', async () => {
940
+ const emptyButton = canvas.getByTestId('empty-tooltip');
941
+ await userEvent.hover(emptyButton);
942
+
943
+ // Should handle empty tooltip gracefully (might not show or show empty)
944
+ await new Promise((resolve) => window.setTimeout(resolve, 500));
945
+
946
+ await userEvent.unhover(emptyButton);
947
+ });
948
+
949
+ await step('Very long text overflow handling', async () => {
950
+ const longTextButton = canvas.getByTestId('very-long-text');
951
+ await userEvent.hover(longTextButton);
952
+
953
+ await waitFor(
954
+ async () => {
955
+ const tooltip = await findTooltipByContent();
956
+ await expect(tooltip).toBeInTheDocument();
957
+ // Should contain the long text but be constrained by maxWidth
958
+ await expect(tooltip).toHaveTextContent(/extremely long tooltip text/);
959
+ },
960
+ { timeout: 2000 },
961
+ );
962
+
963
+ await userEvent.unhover(longTextButton);
964
+ });
965
+
966
+ await step('Special characters handling', async () => {
967
+ const specialButton = canvas.getByTestId('special-chars');
968
+ await userEvent.hover(specialButton);
969
+
970
+ await waitFor(
971
+ async () => {
972
+ const tooltip = await findTooltipByContent();
973
+ await expect(tooltip).toBeInTheDocument();
974
+ await expect(tooltip).toHaveTextContent(/Special chars:/);
975
+ },
976
+ { timeout: 2000 },
977
+ );
978
+
979
+ await userEvent.unhover(specialButton);
980
+ });
981
+
982
+ await step('HTML content sanitization', async () => {
983
+ const htmlButton = canvas.getByTestId('html-content');
984
+ await userEvent.hover(htmlButton);
985
+
986
+ await waitFor(
987
+ async () => {
988
+ const tooltip = await findTooltipByContent();
989
+ await expect(tooltip).toBeInTheDocument();
990
+ // Should contain the text but not execute HTML/scripts
991
+ await expect(tooltip).toHaveTextContent(/HTML content test/);
992
+ },
993
+ { timeout: 2000 },
994
+ );
995
+
996
+ await userEvent.unhover(htmlButton);
997
+ });
998
+
999
+ await step('Invalid props handling', async () => {
1000
+ const invalidButton = canvas.getByTestId('invalid-props');
1001
+
1002
+ // Component should handle invalid props gracefully
1003
+ await expect(invalidButton).toBeInTheDocument();
1004
+
1005
+ await userEvent.hover(invalidButton);
1006
+ // Should not crash and either show nothing or handle gracefully
1007
+ await new Promise((resolve) => window.setTimeout(resolve, 500));
1008
+ await userEvent.unhover(invalidButton);
1009
+ });
1010
+ },
1011
+ };
1012
+
1013
+ // 7.7 Integration Tests
1014
+ const IntegrationTestComponent = () => {
1015
+ const [count, setCount] = React.useState(0);
1016
+ const [showTooltips, setShowTooltips] = React.useState(true);
1017
+
1018
+ return (
1019
+ <Box sx={{ p: 4, display: 'flex', flexDirection: 'column', gap: 3, alignItems: 'center' }}>
1020
+ <Typography variant="h6" data-testid="counter-display">
1021
+ Count: {count}
1022
+ </Typography>
1023
+
1024
+ <Stack direction="row" spacing={2}>
1025
+ <Button
1026
+ variant="outlined"
1027
+ onClick={() => setShowTooltips(!showTooltips)}
1028
+ data-testid="toggle-tooltips"
1029
+ >
1030
+ Toggle Tooltips
1031
+ </Button>
1032
+
1033
+ <Button variant="outlined" onClick={() => setCount(0)} data-testid="reset-counter">
1034
+ Reset
1035
+ </Button>
1036
+ </Stack>
1037
+
1038
+ <Stack direction="row" spacing={2}>
1039
+ {showTooltips ? (
1040
+ <>
1041
+ <Tooltip title={`Increment counter (current: ${count})`} variant="default">
1042
+ <Button
1043
+ variant="contained"
1044
+ color="primary"
1045
+ onClick={() => setCount((c) => c + 1)}
1046
+ data-testid="increment-with-tooltip"
1047
+ >
1048
+ +
1049
+ </Button>
1050
+ </Tooltip>
1051
+
1052
+ <Tooltip title={`Decrement counter (current: ${count})`} variant="dark">
1053
+ <Button
1054
+ variant="contained"
1055
+ color="secondary"
1056
+ onClick={() => setCount((c) => c - 1)}
1057
+ data-testid="decrement-with-tooltip"
1058
+ >
1059
+ -
1060
+ </Button>
1061
+ </Tooltip>
1062
+ </>
1063
+ ) : (
1064
+ <>
1065
+ <Button
1066
+ variant="contained"
1067
+ color="primary"
1068
+ onClick={() => setCount((c) => c + 1)}
1069
+ data-testid="increment-without-tooltip"
1070
+ >
1071
+ +
1072
+ </Button>
1073
+
1074
+ <Button
1075
+ variant="contained"
1076
+ color="secondary"
1077
+ onClick={() => setCount((c) => c - 1)}
1078
+ data-testid="decrement-without-tooltip"
1079
+ >
1080
+ -
1081
+ </Button>
1082
+ </>
1083
+ )}
1084
+ </Stack>
1085
+ </Box>
1086
+ );
1087
+ };
1088
+
1089
+ export const IntegrationTest: Story = {
1090
+ name: '🔗 Integration Test',
1091
+ render: () => <IntegrationTestComponent />,
1092
+ play: async ({ canvasElement, step }) => {
1093
+ const canvas = within(canvasElement);
1094
+
1095
+ await step('Integration with state management', async () => {
1096
+ const counterDisplay = canvas.getByTestId('counter-display');
1097
+ const incrementButton = canvas.getByTestId('increment-with-tooltip');
1098
+
1099
+ await expect(counterDisplay).toHaveTextContent('Count: 0');
1100
+
1101
+ // Click increment button
1102
+ await userEvent.click(incrementButton);
1103
+
1104
+ await waitFor(() => {
1105
+ expect(counterDisplay).toHaveTextContent('Count: 1');
1106
+ });
1107
+ });
1108
+
1109
+ await step('Tooltip content updates with state', async () => {
1110
+ const incrementButton = canvas.getByTestId('increment-with-tooltip');
1111
+
1112
+ // Hover to see tooltip with updated count
1113
+ await userEvent.hover(incrementButton);
1114
+
1115
+ await waitFor(
1116
+ async () => {
1117
+ const tooltip = await findTooltipByContent();
1118
+ await expect(tooltip).toHaveTextContent('current: 1');
1119
+ },
1120
+ { timeout: 2000 },
1121
+ );
1122
+
1123
+ await userEvent.unhover(incrementButton);
1124
+ });
1125
+
1126
+ await step('Conditional tooltip rendering', async () => {
1127
+ const toggleButton = canvas.getByTestId('toggle-tooltips');
1128
+
1129
+ // Toggle tooltips off
1130
+ await userEvent.click(toggleButton);
1131
+
1132
+ // Verify buttons without tooltips exist
1133
+ await waitFor(() => {
1134
+ const incrementWithoutTooltip = canvas.getByTestId('increment-without-tooltip');
1135
+ expect(incrementWithoutTooltip).toBeInTheDocument();
1136
+ });
1137
+ });
1138
+
1139
+ await step('State reset integration', async () => {
1140
+ const resetButton = canvas.getByTestId('reset-counter');
1141
+ const counterDisplay = canvas.getByTestId('counter-display');
1142
+
1143
+ await userEvent.click(resetButton);
1144
+
1145
+ await waitFor(() => {
1146
+ expect(counterDisplay).toHaveTextContent('Count: 0');
1147
+ });
1148
+
1149
+ // Toggle tooltips back on
1150
+ const toggleButton = canvas.getByTestId('toggle-tooltips');
1151
+ await userEvent.click(toggleButton);
1152
+
1153
+ // Verify tooltip shows reset state
1154
+ const incrementButton = canvas.getByTestId('increment-with-tooltip');
1155
+ await userEvent.hover(incrementButton);
1156
+
1157
+ await waitFor(
1158
+ async () => {
1159
+ const tooltip = await findTooltipByContent();
1160
+ await expect(tooltip).toHaveTextContent('current: 0');
1161
+ },
1162
+ { timeout: 2000 },
1163
+ );
1164
+
1165
+ await userEvent.unhover(incrementButton);
1166
+ });
1167
+ },
1168
+ };