@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,955 @@
1
+ /* eslint-env browser */
2
+ import { Box,Button, Typography } from '@mui/material';
3
+ import type { Meta, StoryObj } from '@storybook/react-vite';
4
+ import React, { useState } from 'react';
5
+ import { expect, fn,userEvent, waitFor, within } from 'storybook/test';
6
+
7
+ import { Dialog, DialogActions,DialogContent, DialogHeader } from './Dialog';
8
+
9
+ const meta: Meta<typeof Dialog> = {
10
+ title: 'Feedback/Dialog/Tests',
11
+ component: Dialog,
12
+ parameters: {
13
+ layout: 'centered',
14
+ chromatic: { disableSnapshot: false },
15
+ docs: {
16
+ description: {
17
+ component:
18
+ 'Comprehensive test suite for the Dialog component covering interactions, accessibility, visual states, performance, and edge cases.',
19
+ },
20
+ },
21
+ },
22
+ tags: ['autodocs', 'test', 'component:Dialog'],
23
+ };
24
+
25
+ export default meta;
26
+ type Story = StoryObj<typeof meta>;
27
+
28
+ // Test wrapper component
29
+ const TestDialogWrapper = ({
30
+ children,
31
+ onOpen = fn(),
32
+ onClose = fn(),
33
+ ...args
34
+ }: {
35
+ children: React.ReactNode;
36
+ onOpen?: () => void;
37
+ onClose?: () => void;
38
+ [key: string]: unknown;
39
+ }) => {
40
+ const [open, setOpen] = useState(false);
41
+
42
+ const handleOpen = () => {
43
+ setOpen(true);
44
+ onOpen();
45
+ };
46
+
47
+ const handleClose = () => {
48
+ setOpen(false);
49
+ onClose();
50
+ };
51
+
52
+ return (
53
+ <Box>
54
+ <Button variant="contained" onClick={handleOpen} data-testid="open-dialog-button">
55
+ Open Dialog
56
+ </Button>
57
+ <Dialog {...args} open={open} onClose={handleClose}>
58
+ {React.Children.map(children, (child) => {
59
+ if (React.isValidElement(child) && child.type === DialogActions) {
60
+ // Clone DialogActions and add onClick handlers to buttons
61
+ return React.cloneElement(
62
+ child,
63
+ {},
64
+ React.Children.map(child.props.children, (button) => {
65
+ if (
66
+ React.isValidElement(button) &&
67
+ (button.props['data-testid'] === 'cancel-button' ||
68
+ button.props['data-testid'] === 'close-modal-button' ||
69
+ button.props['data-testid'] === 'force-close-button')
70
+ ) {
71
+ return React.cloneElement(button, { onClick: handleClose });
72
+ }
73
+ return button;
74
+ }),
75
+ );
76
+ }
77
+ return child;
78
+ })}
79
+ </Dialog>
80
+ </Box>
81
+ );
82
+ };
83
+
84
+ // 1. Basic Interaction Tests
85
+ export const BasicInteraction: Story = {
86
+ name: '🧪 Basic Interaction Test',
87
+ render: (args) => (
88
+ <TestDialogWrapper {...args}>
89
+ <DialogHeader
90
+ title="Basic Interaction Dialog"
91
+ subtitle="Test basic user interactions"
92
+ data-testid="dialog-header"
93
+ />
94
+ <DialogContent data-testid="dialog-content">
95
+ <Typography>Test content for basic interactions.</Typography>
96
+ </DialogContent>
97
+ <DialogActions data-testid="dialog-actions">
98
+ <Button data-testid="cancel-button">Cancel</Button>
99
+ <Button variant="contained" data-testid="confirm-button">
100
+ Confirm
101
+ </Button>
102
+ </DialogActions>
103
+ </TestDialogWrapper>
104
+ ),
105
+ args: {
106
+ variant: 'default',
107
+ size: 'md',
108
+ onOpen: fn(),
109
+ onClose: fn(),
110
+ },
111
+ play: async ({ canvasElement, step, args }) => {
112
+ const canvas = within(canvasElement);
113
+
114
+ await step('Initial render verification', async () => {
115
+ const openButton = canvas.getByTestId('open-dialog-button');
116
+ await expect(openButton).toBeInTheDocument();
117
+ await expect(openButton).toHaveTextContent('Open Dialog');
118
+ });
119
+
120
+ await step('Open dialog interaction', async () => {
121
+ const openButton = canvas.getByTestId('open-dialog-button');
122
+ await userEvent.click(openButton);
123
+
124
+ await waitFor(
125
+ async () => {
126
+ // MUI Dialog renders in a portal outside the component tree
127
+ const dialog = document.querySelector('[role="dialog"]');
128
+ await expect(dialog).toBeInTheDocument();
129
+ },
130
+ { timeout: 3000 },
131
+ );
132
+
133
+ await expect(args.onOpen).toHaveBeenCalledTimes(1);
134
+ });
135
+
136
+ await step('Dialog content verification', async () => {
137
+ // Query within document since dialog is in a portal
138
+ const dialogTitle = within(document.body).getByText('Basic Interaction Dialog');
139
+ const dialogSubtitle = within(document.body).getByText('Test basic user interactions');
140
+ const dialogContent = within(document.body).getByText('Test content for basic interactions.');
141
+
142
+ await expect(dialogTitle).toBeInTheDocument();
143
+ await expect(dialogSubtitle).toBeInTheDocument();
144
+ await expect(dialogContent).toBeInTheDocument();
145
+ });
146
+
147
+ await step('Close dialog interaction', async () => {
148
+ const cancelButton = within(document.body).getByTestId('cancel-button');
149
+ await userEvent.click(cancelButton);
150
+
151
+ await waitFor(async () => {
152
+ const dialog = document.querySelector('[role="dialog"]');
153
+ await expect(dialog).not.toBeInTheDocument();
154
+ });
155
+ });
156
+ },
157
+ };
158
+
159
+ // 2. Keyboard Navigation Test
160
+ export const KeyboardNavigation: Story = {
161
+ name: '⌨️ Keyboard Navigation Test',
162
+ render: (args) => (
163
+ <TestDialogWrapper {...args}>
164
+ <DialogHeader title="Keyboard Navigation Test" subtitle="Test keyboard accessibility" />
165
+ <DialogContent>
166
+ <Typography paragraph>Test keyboard navigation and focus management.</Typography>
167
+ <Button data-testid="first-focusable">First Button</Button>
168
+ <Button data-testid="second-focusable" sx={{ ml: 1 }}>
169
+ Second Button
170
+ </Button>
171
+ </DialogContent>
172
+ <DialogActions>
173
+ <Button data-testid="cancel-action">Cancel</Button>
174
+ <Button variant="contained" data-testid="confirm-action">
175
+ Confirm
176
+ </Button>
177
+ </DialogActions>
178
+ </TestDialogWrapper>
179
+ ),
180
+ args: {
181
+ variant: 'default',
182
+ size: 'md',
183
+ onOpen: fn(),
184
+ onClose: fn(),
185
+ },
186
+ parameters: {
187
+ a11y: {
188
+ element: '#storybook-root',
189
+ config: {
190
+ rules: [
191
+ { id: 'color-contrast', enabled: true },
192
+ { id: 'aria-required-attr', enabled: true },
193
+ { id: 'aria-roles', enabled: true },
194
+ { id: 'aria-valid-attr-value', enabled: true },
195
+ { id: 'button-name', enabled: true },
196
+ { id: 'duplicate-id', enabled: true },
197
+ { id: 'label', enabled: true },
198
+ ],
199
+ },
200
+ },
201
+ },
202
+ play: async ({ canvasElement, step }) => {
203
+ const canvas = within(canvasElement);
204
+
205
+ await step('Open dialog for keyboard testing', async () => {
206
+ const openButton = canvas.getByTestId('open-dialog-button');
207
+ await userEvent.click(openButton);
208
+
209
+ await waitFor(async () => {
210
+ const dialog = document.querySelector('[role="dialog"]');
211
+ await expect(dialog).toBeInTheDocument();
212
+ });
213
+ });
214
+
215
+ await step('Tab navigation forward', async () => {
216
+ // First focusable element should be the first button
217
+ const firstButton = within(document.body).getByTestId('first-focusable');
218
+ firstButton.focus();
219
+ await expect(firstButton).toHaveFocus();
220
+
221
+ // Tab to next element
222
+ await userEvent.tab();
223
+ const secondButton = within(document.body).getByTestId('second-focusable');
224
+ await expect(secondButton).toHaveFocus();
225
+
226
+ // Continue tabbing to action buttons
227
+ await userEvent.tab();
228
+ const cancelButton = within(document.body).getByTestId('cancel-action');
229
+ await expect(cancelButton).toHaveFocus();
230
+ });
231
+
232
+ await step('Tab navigation backward', async () => {
233
+ await userEvent.tab({ shift: true });
234
+ const secondButton = within(document.body).getByTestId('second-focusable');
235
+ await expect(secondButton).toHaveFocus();
236
+ });
237
+
238
+ await step('Escape key handling', async () => {
239
+ await userEvent.keyboard('{Escape}');
240
+
241
+ await waitFor(async () => {
242
+ const dialog = document.querySelector('[role="dialog"]');
243
+ await expect(dialog).not.toBeInTheDocument();
244
+ });
245
+ });
246
+ },
247
+ };
248
+
249
+ // 3. Screen Reader Test
250
+ export const ScreenReaderTest: Story = {
251
+ name: '🔊 Screen Reader Test',
252
+ render: (args) => (
253
+ <TestDialogWrapper {...args}>
254
+ <DialogHeader
255
+ title="Screen Reader Test Dialog"
256
+ subtitle="Testing ARIA attributes and labels"
257
+ />
258
+ <DialogContent>
259
+ <Typography>
260
+ This dialog tests screen reader compatibility with proper ARIA attributes.
261
+ </Typography>
262
+ <Typography id="description-text">
263
+ Additional description text that should be referenced by aria-describedby.
264
+ </Typography>
265
+ </DialogContent>
266
+ <DialogActions>
267
+ <Button aria-label="Cancel dialog">Cancel</Button>
268
+ <Button variant="contained" aria-label="Confirm action">
269
+ Confirm
270
+ </Button>
271
+ </DialogActions>
272
+ </TestDialogWrapper>
273
+ ),
274
+ args: {
275
+ variant: 'default',
276
+ size: 'md',
277
+ },
278
+ play: async ({ canvasElement, step }) => {
279
+ const canvas = within(canvasElement);
280
+
281
+ await step('Open dialog for ARIA testing', async () => {
282
+ const openButton = canvas.getByTestId('open-dialog-button');
283
+ await userEvent.click(openButton);
284
+
285
+ await waitFor(async () => {
286
+ const dialog = document.querySelector('[role="dialog"]');
287
+ await expect(dialog).toBeInTheDocument();
288
+ });
289
+ });
290
+
291
+ await step('Verify dialog role and attributes', async () => {
292
+ const dialog = document.querySelector('[role="dialog"]');
293
+ await expect(dialog).toBeInTheDocument();
294
+ await expect(dialog).toHaveAttribute('role', 'dialog');
295
+ });
296
+
297
+ await step('Verify ARIA labels on buttons', async () => {
298
+ const cancelButton = within(document.body).getByLabelText('Cancel dialog');
299
+ const confirmButton = within(document.body).getByLabelText('Confirm action');
300
+
301
+ await expect(cancelButton).toBeInTheDocument();
302
+ await expect(confirmButton).toBeInTheDocument();
303
+ await expect(confirmButton).toHaveAttribute('aria-label', 'Confirm action');
304
+ });
305
+
306
+ await step('Verify dialog controls accessibility', async () => {
307
+ // Verify action buttons have proper ARIA attributes
308
+ const cancelButton = within(document.body).getByLabelText('Cancel dialog');
309
+ const confirmButton = within(document.body).getByLabelText('Confirm action');
310
+ await expect(cancelButton).toBeInTheDocument();
311
+ await expect(confirmButton).toBeInTheDocument();
312
+ });
313
+ },
314
+ };
315
+
316
+ // 4. Focus Management Test
317
+ export const FocusManagement: Story = {
318
+ name: '🎯 Focus Management Test',
319
+ render: (args) => (
320
+ <Box>
321
+ <Button data-testid="trigger-button">Trigger Button</Button>
322
+ <TestDialogWrapper {...args}>
323
+ <DialogHeader title="Focus Management Test" subtitle="Testing focus trap and restoration" />
324
+ <DialogContent>
325
+ <Button data-testid="first-modal-element">First Element</Button>
326
+ <Button data-testid="second-modal-element" sx={{ ml: 1 }}>
327
+ Second Element
328
+ </Button>
329
+ </DialogContent>
330
+ <DialogActions>
331
+ <Button data-testid="close-modal-button">Close</Button>
332
+ </DialogActions>
333
+ </TestDialogWrapper>
334
+ </Box>
335
+ ),
336
+ args: {
337
+ variant: 'default',
338
+ size: 'md',
339
+ onOpen: fn(),
340
+ onClose: fn(),
341
+ },
342
+ play: async ({ canvasElement, step }) => {
343
+ const canvas = within(canvasElement);
344
+
345
+ await step('Focus initial trigger button', async () => {
346
+ const triggerButton = canvas.getByTestId('trigger-button');
347
+ triggerButton.focus();
348
+ await expect(triggerButton).toHaveFocus();
349
+ });
350
+
351
+ await step('Open modal and verify focus management', async () => {
352
+ const openButton = canvas.getByTestId('open-dialog-button');
353
+ await userEvent.click(openButton);
354
+
355
+ await waitFor(async () => {
356
+ const dialog = document.querySelector('[role="dialog"]');
357
+ await expect(dialog).toBeInTheDocument();
358
+ });
359
+
360
+ // Focus should move to the first focusable element in the dialog
361
+ // In MUI Dialog, focus typically goes to the dialog container or first interactive element
362
+ await waitFor(() => {
363
+ const firstElement = within(document.body).getByTestId('first-modal-element');
364
+ firstElement.focus();
365
+ expect(document.activeElement).toBeTruthy();
366
+ });
367
+ });
368
+
369
+ await step('Test focus trap within modal', async () => {
370
+ const firstElement = within(document.body).getByTestId('first-modal-element');
371
+ const secondElement = within(document.body).getByTestId('second-modal-element');
372
+ const closeModalButton = within(document.body).getByTestId('close-modal-button');
373
+
374
+ // Focus first element explicitly
375
+ firstElement.focus();
376
+ await expect(firstElement).toHaveFocus();
377
+
378
+ // Tab to next element
379
+ await userEvent.tab();
380
+ await expect(secondElement).toHaveFocus();
381
+
382
+ // Tab to close button
383
+ await userEvent.tab();
384
+ await expect(closeModalButton).toHaveFocus();
385
+
386
+ // Tab should cycle back (focus trap) - verify focus is managed
387
+ await userEvent.tab();
388
+ await waitFor(() => {
389
+ const focusedElement = document.activeElement;
390
+ expect(focusedElement).toBeTruthy();
391
+ // Focus should be on one of the dialog elements
392
+ const isInDialog =
393
+ focusedElement &&
394
+ (focusedElement === firstElement ||
395
+ focusedElement === secondElement ||
396
+ focusedElement === closeModalButton);
397
+ expect(isInDialog).toBe(true);
398
+ });
399
+ });
400
+
401
+ await step('Close modal and verify focus restoration', async () => {
402
+ const closeModalButton = within(document.body).getByTestId('close-modal-button');
403
+ await userEvent.click(closeModalButton);
404
+
405
+ await waitFor(async () => {
406
+ const dialog = document.querySelector('[role="dialog"]');
407
+ await expect(dialog).not.toBeInTheDocument();
408
+ });
409
+
410
+ // Focus should return to the open button
411
+ const openButton = canvas.getByTestId('open-dialog-button');
412
+ await expect(openButton).toHaveFocus();
413
+ });
414
+ },
415
+ };
416
+
417
+ // 5. Visual States Test
418
+ export const VisualStates: Story = {
419
+ name: '👁️ Visual States Test',
420
+ render: (args) => (
421
+ <TestDialogWrapper {...args}>
422
+ <DialogHeader
423
+ title="Visual States Test"
424
+ subtitle="Testing different visual states and variants"
425
+ />
426
+ <DialogContent data-testid="dialog-content">
427
+ <Typography>Testing visual states and styling.</Typography>
428
+ <Button data-testid="interactive-element">Interactive Element</Button>
429
+ </DialogContent>
430
+ <DialogActions>
431
+ <Button disabled data-testid="disabled-button">
432
+ Disabled
433
+ </Button>
434
+ <Button variant="contained" data-testid="active-button">
435
+ Active
436
+ </Button>
437
+ </DialogActions>
438
+ </TestDialogWrapper>
439
+ ),
440
+ args: {
441
+ variant: 'glass',
442
+ size: 'md',
443
+ glow: true,
444
+ gradient: true,
445
+ borderRadius: 'lg',
446
+ onOpen: fn(),
447
+ onClose: fn(),
448
+ },
449
+ play: async ({ canvasElement, step }) => {
450
+ const canvas = within(canvasElement);
451
+
452
+ await step('Open dialog for visual testing', async () => {
453
+ const openButton = canvas.getByTestId('open-dialog-button');
454
+ await userEvent.click(openButton);
455
+
456
+ await waitFor(async () => {
457
+ const dialog = document.querySelector('[role="dialog"]');
458
+ await expect(dialog).toBeInTheDocument();
459
+ });
460
+ });
461
+
462
+ await step('Verify glass variant styling', async () => {
463
+ const dialog = document.querySelector('[role="dialog"]');
464
+
465
+ // Dialog should have glass morphism styles
466
+ await expect(dialog).toBeInTheDocument();
467
+ });
468
+
469
+ await step('Test hover interactions', async () => {
470
+ const interactiveElement = within(document.body).getByTestId('interactive-element');
471
+
472
+ await userEvent.hover(interactiveElement);
473
+ await expect(interactiveElement).toHaveClass('MuiButton-root');
474
+
475
+ await userEvent.unhover(interactiveElement);
476
+ });
477
+
478
+ await step('Test disabled state', async () => {
479
+ const disabledButton = within(document.body).getByTestId('disabled-button');
480
+ await expect(disabledButton).toBeDisabled();
481
+
482
+ // Verify disabled button has proper styling and cannot receive focus
483
+ const computedStyle = window.getComputedStyle(disabledButton);
484
+ await expect(computedStyle.pointerEvents).toBe('none');
485
+ await expect(disabledButton).toBeDisabled();
486
+ });
487
+
488
+ await step('Test active button state', async () => {
489
+ const activeButton = within(document.body).getByTestId('active-button');
490
+ await expect(activeButton).not.toBeDisabled();
491
+ await expect(activeButton).toHaveClass('MuiButton-contained');
492
+ });
493
+ },
494
+ };
495
+
496
+ // 6. Performance Test
497
+ export const PerformanceTest: Story = {
498
+ name: '⚡ Performance Test',
499
+ render: (args) => {
500
+ const items = Array.from({ length: 100 }, (_, i) => ({
501
+ id: i,
502
+ name: `Item ${i + 1}`,
503
+ }));
504
+
505
+ return (
506
+ <TestDialogWrapper {...args}>
507
+ <DialogHeader title="Performance Test Dialog" subtitle="Testing with large content" />
508
+ <DialogContent data-testid="performance-content">
509
+ <Box sx={{ maxHeight: 400, overflow: 'auto' }} data-testid="scroll-container">
510
+ {items.map((item) => (
511
+ <Typography key={item.id} data-testid={`item-${item.id}`}>
512
+ {item.name}
513
+ </Typography>
514
+ ))}
515
+ </Box>
516
+ </DialogContent>
517
+ <DialogActions>
518
+ <Button>Close</Button>
519
+ </DialogActions>
520
+ </TestDialogWrapper>
521
+ );
522
+ },
523
+ args: {
524
+ variant: 'default',
525
+ size: 'lg',
526
+ },
527
+ play: async ({ canvasElement, step }) => {
528
+ const canvas = within(canvasElement);
529
+
530
+ await step('Open dialog for performance testing', async () => {
531
+ const openButton = canvas.getByTestId('open-dialog-button');
532
+
533
+ const startTime = window.performance.now();
534
+ await userEvent.click(openButton);
535
+
536
+ await waitFor(async () => {
537
+ const dialog = document.querySelector('[role="dialog"]');
538
+ await expect(dialog).toBeInTheDocument();
539
+ });
540
+
541
+ const endTime = window.performance.now();
542
+ const renderTime = endTime - startTime;
543
+
544
+ // console.log(`Dialog open time: ${renderTime}ms`);
545
+ // Reasonable render time for dialog open
546
+ await expect(renderTime).toBeLessThan(500);
547
+ });
548
+
549
+ await step('Test scroll performance', async () => {
550
+ const scrollContainer = within(document.body).getByTestId('scroll-container');
551
+
552
+ // Simulate rapid scrolling
553
+ for (let i = 0; i < 5; i++) {
554
+ scrollContainer.scrollTop = i * 50;
555
+ await new Promise((resolve) => window.setTimeout(resolve, 10));
556
+ }
557
+
558
+ // Verify scrolling works
559
+ await expect(scrollContainer).toBeInTheDocument();
560
+ await expect(scrollContainer.scrollTop).toBeGreaterThan(0);
561
+ });
562
+
563
+ await step('Measure item render performance', async () => {
564
+ const items = within(document.body).getAllByTestId(/item-\d+/);
565
+ await expect(items).toHaveLength(100);
566
+
567
+ // All items should be rendered efficiently
568
+ const startTime = window.performance.now();
569
+ items.forEach((item) => {
570
+ expect(item).toBeInTheDocument();
571
+ });
572
+ const endTime = window.performance.now();
573
+
574
+ const measureTime = endTime - startTime;
575
+ // console.log(`Item measurement time: ${measureTime}ms`);
576
+ await expect(measureTime).toBeLessThan(100);
577
+ });
578
+ },
579
+ };
580
+
581
+ // 7. Edge Cases Test
582
+ export const EdgeCases: Story = {
583
+ name: '🔧 Edge Cases Test',
584
+ render: (args) => (
585
+ <TestDialogWrapper {...args}>
586
+ <DialogHeader
587
+ title="Edge Cases Test Dialog with Very Long Title That Should Handle Overflow Gracefully"
588
+ subtitle="This is a very long subtitle that tests how the dialog handles overflow content and maintains proper layout and accessibility standards"
589
+ showCloseButton={args.showCloseButton}
590
+ />
591
+ <DialogContent data-testid="edge-case-content">
592
+ <Typography data-testid="long-text">
593
+ This is a very long piece of text that should test how the dialog handles content overflow
594
+ and text wrapping. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod
595
+ tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
596
+ exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure
597
+ dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
598
+ </Typography>
599
+ <Box data-testid="empty-state" sx={{ display: 'none' }}>
600
+ <Typography>No data available</Typography>
601
+ </Box>
602
+ </DialogContent>
603
+ <DialogActions data-testid="edge-case-actions">
604
+ <Button>Very Long Button Text That Tests Overflow</Button>
605
+ <Button variant="contained">OK</Button>
606
+ </DialogActions>
607
+ </TestDialogWrapper>
608
+ ),
609
+ args: {
610
+ variant: 'default',
611
+ size: 'md',
612
+ showCloseButton: true,
613
+ },
614
+ play: async ({ canvasElement, step }) => {
615
+ const canvas = within(canvasElement);
616
+
617
+ await step('Open dialog for edge case testing', async () => {
618
+ const openButton = canvas.getByTestId('open-dialog-button');
619
+ await userEvent.click(openButton);
620
+
621
+ await waitFor(async () => {
622
+ const dialog = document.querySelector('[role="dialog"]');
623
+ await expect(dialog).toBeInTheDocument();
624
+ });
625
+ });
626
+
627
+ await step('Test long title handling', async () => {
628
+ const longTitle = within(document.body).getByText(
629
+ /Edge Cases Test Dialog with Very Long Title/,
630
+ );
631
+ await expect(longTitle).toBeInTheDocument();
632
+
633
+ // Title should be visible and not cause layout issues
634
+ const titleElement = longTitle.closest('[class*="MuiDialogTitle"]');
635
+ if (titleElement) {
636
+ const computedStyle = window.getComputedStyle(titleElement);
637
+ await expect(computedStyle.overflow).toBeDefined();
638
+ }
639
+ });
640
+
641
+ await step('Test long content text wrapping', async () => {
642
+ const longText = within(document.body).getByTestId('long-text');
643
+ await expect(longText).toBeInTheDocument();
644
+
645
+ const computedStyle = window.getComputedStyle(longText);
646
+ // Text should wrap properly - check that it's not 'nowrap'
647
+ await expect(computedStyle.wordWrap).not.toBe('nowrap');
648
+ await expect(computedStyle.overflowWrap).toBeDefined();
649
+ });
650
+
651
+ await step('Test dialog responsiveness', async () => {
652
+ const dialog = document.querySelector('[role="dialog"]');
653
+ const dialogContent = within(document.body).getByTestId('edge-case-content');
654
+
655
+ await expect(dialog).toBeInTheDocument();
656
+ await expect(dialogContent).toBeInTheDocument();
657
+
658
+ // Dialog should maintain proper dimensions
659
+ const dialogRect = dialog.getBoundingClientRect();
660
+ await expect(dialogRect.width).toBeGreaterThan(0);
661
+ await expect(dialogRect.height).toBeGreaterThan(0);
662
+ });
663
+
664
+ await step('Test button overflow handling', async () => {
665
+ const longButton = within(document.body).getByText(
666
+ 'Very Long Button Text That Tests Overflow',
667
+ );
668
+ await expect(longButton).toBeInTheDocument();
669
+
670
+ // Button should be clickable despite long text
671
+ await userEvent.hover(longButton);
672
+ await userEvent.click(longButton);
673
+ });
674
+ },
675
+ };
676
+
677
+ // 8. Persistent Dialog Test
678
+ export const PersistentDialogTest: Story = {
679
+ name: '🔒 Persistent Dialog Test',
680
+ render: (args) => (
681
+ <TestDialogWrapper {...args}>
682
+ <DialogHeader
683
+ title="Persistent Dialog"
684
+ subtitle="Cannot be closed by backdrop or escape"
685
+ showCloseButton={false}
686
+ />
687
+ <DialogContent>
688
+ <Typography>
689
+ This dialog is persistent and cannot be closed by clicking the backdrop or pressing the
690
+ Escape key. It must be closed using the action buttons.
691
+ </Typography>
692
+ </DialogContent>
693
+ <DialogActions>
694
+ <Button color="error" data-testid="force-close-button">
695
+ Force Close
696
+ </Button>
697
+ <Button variant="contained">Confirm</Button>
698
+ </DialogActions>
699
+ </TestDialogWrapper>
700
+ ),
701
+ args: {
702
+ variant: 'default',
703
+ size: 'md',
704
+ persistent: true,
705
+ backdrop: true,
706
+ onOpen: fn(),
707
+ onClose: fn(),
708
+ },
709
+ play: async ({ canvasElement, step }) => {
710
+ const canvas = within(canvasElement);
711
+
712
+ await step('Open persistent dialog', async () => {
713
+ const openButton = canvas.getByTestId('open-dialog-button');
714
+ await userEvent.click(openButton);
715
+
716
+ await waitFor(async () => {
717
+ const dialog = document.querySelector('[role="dialog"]');
718
+ await expect(dialog).toBeInTheDocument();
719
+ });
720
+ });
721
+
722
+ await step('Test escape key does not close persistent dialog', async () => {
723
+ await userEvent.keyboard('{Escape}');
724
+
725
+ // Wait a moment and verify dialog is still open
726
+ await new Promise((resolve) => window.setTimeout(resolve, 100));
727
+ const dialog = document.querySelector('[role="dialog"]');
728
+ await expect(dialog).toBeInTheDocument();
729
+ });
730
+
731
+ await step('Test backdrop click does not close persistent dialog', async () => {
732
+ const backdrop = document.querySelector('.MuiBackdrop-root');
733
+ if (backdrop) {
734
+ await userEvent.click(backdrop);
735
+
736
+ // Wait a moment and verify dialog is still open
737
+ await new Promise((resolve) => window.setTimeout(resolve, 100));
738
+ const dialog = document.querySelector('[role="dialog"]');
739
+ await expect(dialog).toBeInTheDocument();
740
+ }
741
+ });
742
+
743
+ await step('Test dialog cannot be closed by backdrop', async () => {
744
+ // This dialog is persistent - no close button in header
745
+ const dialogHeader = document.querySelector('[class*="MuiDialogTitle"]');
746
+ const closeButton = dialogHeader ? dialogHeader.querySelector('[aria-label="close"]') : null;
747
+ await expect(closeButton).not.toBeInTheDocument();
748
+ });
749
+
750
+ await step('Test dialog can only be closed via action buttons', async () => {
751
+ const forceCloseButton = within(document.body).getByTestId('force-close-button');
752
+ await userEvent.click(forceCloseButton);
753
+
754
+ await waitFor(async () => {
755
+ const dialog = document.querySelector('[role="dialog"]');
756
+ await expect(dialog).not.toBeInTheDocument();
757
+ });
758
+ });
759
+ },
760
+ };
761
+
762
+ // 9. Responsive Design Test
763
+ export const ResponsiveDesign: Story = {
764
+ name: '📱 Responsive Design Test',
765
+ render: (args) => (
766
+ <TestDialogWrapper {...args}>
767
+ <DialogHeader title="Responsive Design Test" subtitle="Testing dialog responsiveness" />
768
+ <DialogContent>
769
+ <Typography>
770
+ This dialog should adapt to different screen sizes and maintain proper layout on mobile,
771
+ tablet, and desktop viewports.
772
+ </Typography>
773
+ </DialogContent>
774
+ <DialogActions>
775
+ <Button>Cancel</Button>
776
+ <Button variant="contained">Confirm</Button>
777
+ </DialogActions>
778
+ </TestDialogWrapper>
779
+ ),
780
+ args: {
781
+ variant: 'default',
782
+ size: 'md',
783
+ onOpen: fn(),
784
+ onClose: fn(),
785
+ },
786
+ parameters: {
787
+ viewport: {
788
+ defaultViewport: 'mobile1',
789
+ },
790
+ },
791
+ play: async ({ canvasElement, step }) => {
792
+ const canvas = within(canvasElement);
793
+
794
+ await step('Open dialog on mobile viewport', async () => {
795
+ const openButton = canvas.getByTestId('open-dialog-button');
796
+ await userEvent.click(openButton);
797
+
798
+ await waitFor(async () => {
799
+ const dialog = document.querySelector('[role="dialog"]');
800
+ await expect(dialog).toBeInTheDocument();
801
+ });
802
+ });
803
+
804
+ await step('Test mobile dialog layout', async () => {
805
+ const dialog = document.querySelector('[role="dialog"]');
806
+ const dialogRect = dialog.getBoundingClientRect();
807
+
808
+ // On mobile, dialog should take a significant portion of the screen width
809
+ const viewportWidth = window.innerWidth;
810
+ const widthRatio = dialogRect.width / viewportWidth;
811
+ await expect(widthRatio).toBeGreaterThan(0.5); // Dialog should take at least 50% of width
812
+ });
813
+ },
814
+ };
815
+
816
+ // 10. Theme Variations Test
817
+ export const ThemeVariations: Story = {
818
+ name: '🎨 Theme Variations Test',
819
+ render: (args) => (
820
+ <TestDialogWrapper {...args}>
821
+ <DialogHeader title="Theme Variations Test" subtitle="Testing dark and light themes" />
822
+ <DialogContent>
823
+ <Typography>
824
+ This dialog should display correctly in both light and dark themes, maintaining proper
825
+ contrast and readability.
826
+ </Typography>
827
+ </DialogContent>
828
+ <DialogActions>
829
+ <Button>Cancel</Button>
830
+ <Button variant="contained">Confirm</Button>
831
+ </DialogActions>
832
+ </TestDialogWrapper>
833
+ ),
834
+ args: {
835
+ variant: 'default',
836
+ size: 'md',
837
+ onOpen: fn(),
838
+ onClose: fn(),
839
+ },
840
+ parameters: {
841
+ backgrounds: {
842
+ default: 'dark',
843
+ },
844
+ },
845
+ play: async ({ canvasElement, step }) => {
846
+ const canvas = within(canvasElement);
847
+
848
+ await step('Open dialog for theme testing', async () => {
849
+ const openButton = canvas.getByTestId('open-dialog-button');
850
+ await userEvent.click(openButton);
851
+
852
+ await waitFor(async () => {
853
+ const dialog = document.querySelector('[role="dialog"]');
854
+ await expect(dialog).toBeInTheDocument();
855
+ });
856
+ });
857
+
858
+ await step('Verify theme-aware styling', async () => {
859
+ const dialog = document.querySelector('[role="dialog"]');
860
+ const computedStyle = window.getComputedStyle(dialog);
861
+
862
+ // Dialog should have proper background color
863
+ await expect(computedStyle.backgroundColor).toBeDefined();
864
+ await expect(computedStyle.color).toBeDefined();
865
+ });
866
+ },
867
+ };
868
+
869
+ // 11. Integration Test
870
+ export const Integration: Story = {
871
+ name: '🔗 Integration Test',
872
+ render: (args) => {
873
+ const [nestedOpen, setNestedOpen] = useState(false);
874
+
875
+ return (
876
+ <TestDialogWrapper {...args}>
877
+ <DialogHeader title="Integration Test" subtitle="Testing dialog with other components" />
878
+ <DialogContent>
879
+ <Typography paragraph>
880
+ This test verifies dialog integration with other components like nested dialogs, form
881
+ elements, and complex interactions.
882
+ </Typography>
883
+ <Button
884
+ variant="outlined"
885
+ onClick={() => setNestedOpen(true)}
886
+ data-testid="open-nested-dialog"
887
+ >
888
+ Open Nested Dialog
889
+ </Button>
890
+ <Dialog open={nestedOpen} onClose={() => setNestedOpen(false)} size="sm">
891
+ <DialogHeader title="Nested Dialog" />
892
+ <DialogContent>
893
+ <Typography>This is a nested dialog for testing integration.</Typography>
894
+ </DialogContent>
895
+ <DialogActions>
896
+ <Button onClick={() => setNestedOpen(false)} data-testid="close-nested-dialog">
897
+ Close Nested
898
+ </Button>
899
+ </DialogActions>
900
+ </Dialog>
901
+ </DialogContent>
902
+ <DialogActions>
903
+ <Button>Cancel</Button>
904
+ <Button variant="contained">Confirm</Button>
905
+ </DialogActions>
906
+ </TestDialogWrapper>
907
+ );
908
+ },
909
+ args: {
910
+ variant: 'default',
911
+ size: 'lg',
912
+ onOpen: fn(),
913
+ onClose: fn(),
914
+ },
915
+ play: async ({ canvasElement, step }) => {
916
+ const canvas = within(canvasElement);
917
+
918
+ await step('Open main dialog', async () => {
919
+ const openButton = canvas.getByTestId('open-dialog-button');
920
+ await userEvent.click(openButton);
921
+
922
+ await waitFor(async () => {
923
+ const dialog = document.querySelector('[role="dialog"]');
924
+ await expect(dialog).toBeInTheDocument();
925
+ });
926
+ });
927
+
928
+ await step('Test nested dialog functionality', async () => {
929
+ const openNestedButton = within(document.body).getByTestId('open-nested-dialog');
930
+ await userEvent.click(openNestedButton);
931
+
932
+ await waitFor(async () => {
933
+ const dialogs = document.querySelectorAll('[role="dialog"]');
934
+ await expect(dialogs).toHaveLength(2);
935
+ });
936
+
937
+ // Close nested dialog
938
+ const closeNestedButton = within(document.body).getByTestId('close-nested-dialog');
939
+ await userEvent.click(closeNestedButton);
940
+
941
+ await waitFor(async () => {
942
+ const dialogs = document.querySelectorAll('[role="dialog"]');
943
+ await expect(dialogs).toHaveLength(1);
944
+ });
945
+ });
946
+
947
+ await step('Verify main dialog still functional', async () => {
948
+ const mainDialog = document.querySelector('[role="dialog"]');
949
+ await expect(mainDialog).toBeInTheDocument();
950
+
951
+ const dialogTitle = within(document.body).getByText('Integration Test');
952
+ await expect(dialogTitle).toBeInTheDocument();
953
+ });
954
+ },
955
+ };