@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,708 @@
1
+ import { Box, createTheme,ThemeProvider } from '@mui/material';
2
+ import type { Meta, StoryObj } from '@storybook/react-vite';
3
+ import { expect,userEvent, within } from 'storybook/test';
4
+
5
+ import { Textarea } from './Textarea';
6
+
7
+ const meta: Meta<typeof Textarea> = {
8
+ title: 'Form/Textarea/Tests',
9
+ component: Textarea,
10
+ parameters: {
11
+ layout: 'centered',
12
+ chromatic: { disableSnapshot: false },
13
+ },
14
+ tags: ['autodocs', 'test', 'component:Textarea'],
15
+ };
16
+
17
+ export default meta;
18
+ type Story = StoryObj<typeof meta>;
19
+
20
+ // 1. Basic Interaction Tests
21
+ export const BasicInteraction: Story = {
22
+ args: {
23
+ placeholder: 'Type your message here...',
24
+ 'dataTestId': 'basic-textarea',
25
+ },
26
+ play: async ({ canvasElement, step }) => {
27
+ const canvas = within(canvasElement);
28
+
29
+ await step('Find textarea element', async () => {
30
+ const textarea = canvas.getByRole('textbox');
31
+ expect(textarea).toBeInTheDocument();
32
+ expect(textarea).toHaveAttribute('placeholder', 'Type your message here...');
33
+ });
34
+
35
+ await step('Type text into textarea', async () => {
36
+ const textarea = canvas.getByRole('textbox');
37
+ await userEvent.click(textarea);
38
+ await userEvent.type(textarea, 'Hello World!\nThis is a second line.');
39
+ expect(textarea).toHaveValue('Hello World!\nThis is a second line.');
40
+ });
41
+
42
+ await step('Clear and retype text', async () => {
43
+ const textarea = canvas.getByRole('textbox');
44
+ await userEvent.clear(textarea);
45
+ await userEvent.type(textarea, 'New content');
46
+ expect(textarea).toHaveValue('New content');
47
+ });
48
+
49
+ await step('Verify special character input', async () => {
50
+ const textarea = canvas.getByRole('textbox');
51
+ await userEvent.clear(textarea);
52
+ // Test various special characters without problematic brackets
53
+ await userEvent.type(textarea, 'Special chars: @#$%^&*()_+-=;:,.<>?/~`');
54
+ expect(textarea).toHaveValue('Special chars: @#$%^&*()_+-=;:,.<>?/~`');
55
+ });
56
+ },
57
+ };
58
+
59
+ // 2. Form Interaction Tests
60
+ export const FormInteraction: Story = {
61
+ args: {
62
+ placeholder: 'Enter form message...',
63
+ name: 'message',
64
+ required: true,
65
+ 'dataTestId': 'form-textarea',
66
+ },
67
+ decorators: [
68
+ (Story) => (
69
+ <form>
70
+ <Story />
71
+ <button type="submit">Submit</button>
72
+ </form>
73
+ ),
74
+ ],
75
+ play: async ({ canvasElement, step }) => {
76
+ const canvas = within(canvasElement);
77
+
78
+ await step('Interact with textarea in form context', async () => {
79
+ const textarea = canvas.getByRole('textbox');
80
+ const submitButton = canvas.getByRole('button', { name: 'Submit' });
81
+
82
+ expect(textarea).toBeInTheDocument();
83
+ expect(textarea).toHaveAttribute('name', 'message');
84
+ expect(textarea).toHaveAttribute('required');
85
+ expect(submitButton).toBeInTheDocument();
86
+ });
87
+
88
+ await step('Fill textarea and verify form data', async () => {
89
+ const textarea = canvas.getByRole('textbox');
90
+ await userEvent.click(textarea);
91
+ await userEvent.type(textarea, 'Form submission test\nMultiple lines supported');
92
+ expect(textarea).toHaveValue('Form submission test\nMultiple lines supported');
93
+ });
94
+
95
+ await step('Test form validation behavior', async () => {
96
+ const textarea = canvas.getByRole('textbox');
97
+ await userEvent.clear(textarea);
98
+
99
+ // Required field should trigger validation when empty
100
+ expect(textarea).toHaveValue('');
101
+ expect(textarea).toHaveAttribute('required');
102
+ });
103
+ },
104
+ };
105
+
106
+ // 3. Rich Text Editor Tests
107
+ export const RichTextEditor: Story = {
108
+ args: {
109
+ variant: 'rich',
110
+ placeholder: 'Rich text editor...',
111
+ label: 'Rich Text Content',
112
+ 'dataTestId': 'rich-textarea',
113
+ },
114
+ play: async ({ canvasElement, step }) => {
115
+ const canvas = within(canvasElement);
116
+
117
+ await step('Find rich text editor components', async () => {
118
+ const label = canvas.getByText('Rich Text Content');
119
+ expect(label).toBeInTheDocument();
120
+
121
+ // Look for toolbar buttons
122
+ const boldButton = canvas.getByRole('button', { name: /bold/i });
123
+ const italicButton = canvas.getByRole('button', { name: /italic/i });
124
+ expect(boldButton).toBeInTheDocument();
125
+ expect(italicButton).toBeInTheDocument();
126
+ });
127
+
128
+ await step('Test rich text toolbar interactions', async () => {
129
+ const boldButton = canvas.getByRole('button', { name: /bold/i });
130
+ const italicButton = canvas.getByRole('button', { name: /italic/i });
131
+
132
+ // Click toolbar buttons
133
+ await userEvent.click(boldButton);
134
+ await userEvent.click(italicButton);
135
+
136
+ // Toolbar buttons should be interactive
137
+ expect(boldButton).toBeEnabled();
138
+ expect(italicButton).toBeEnabled();
139
+ });
140
+
141
+ await step('Test content editing in rich text mode', async () => {
142
+ // Find the contenteditable div
143
+ const editableArea =
144
+ canvas.getByRole('textbox') || canvasElement.querySelector('[contenteditable="true"]');
145
+
146
+ if (editableArea) {
147
+ await userEvent.click(editableArea);
148
+ // Rich text editor should be focusable
149
+ expect(document.activeElement).toBe(editableArea);
150
+ }
151
+ });
152
+ },
153
+ };
154
+
155
+ // 4. Keyboard Navigation Tests
156
+ export const KeyboardNavigation: Story = {
157
+ args: {
158
+ placeholder: 'Test keyboard navigation...',
159
+ 'dataTestId': 'keyboard-textarea',
160
+ },
161
+ play: async ({ canvasElement, step }) => {
162
+ const canvas = within(canvasElement);
163
+
164
+ await step('Focus textarea with Tab key', async () => {
165
+ const textarea = canvas.getByRole('textbox');
166
+
167
+ // Tab to focus
168
+ await userEvent.tab();
169
+ expect(textarea).toHaveFocus();
170
+ });
171
+
172
+ await step('Test Enter key behavior', async () => {
173
+ const textarea = canvas.getByRole('textbox');
174
+ await userEvent.click(textarea);
175
+ await userEvent.type(textarea, 'First line');
176
+ await userEvent.keyboard('{Enter}');
177
+ await userEvent.type(textarea, 'Second line');
178
+
179
+ expect(textarea).toHaveValue('First line\nSecond line');
180
+ });
181
+
182
+ await step('Test text selection with keyboard shortcuts', async () => {
183
+ const textarea = canvas.getByRole('textbox');
184
+ await userEvent.click(textarea);
185
+ await userEvent.clear(textarea);
186
+ await userEvent.type(textarea, 'Select this text');
187
+
188
+ // Select all text with Ctrl+A
189
+ await userEvent.keyboard('{Control>}a{/Control}');
190
+
191
+ // Text should be selected (we can't directly test selection, but the command should execute)
192
+ expect(textarea).toHaveValue('Select this text');
193
+ });
194
+
195
+ await step('Test Escape key behavior', async () => {
196
+ const textarea = canvas.getByRole('textbox');
197
+ await userEvent.click(textarea);
198
+ await userEvent.keyboard('{Escape}');
199
+
200
+ // Textarea should still be accessible after Escape
201
+ expect(textarea).toBeInTheDocument();
202
+ });
203
+ },
204
+ };
205
+
206
+ // 5. Screen Reader Tests
207
+ export const ScreenReader: Story = {
208
+ args: {
209
+ placeholder: 'Screen reader accessible textarea',
210
+ label: 'Accessible Textarea',
211
+ helperText: 'This textarea is accessible to screen readers',
212
+ 'aria-describedby': 'helper-text',
213
+ 'dataTestId': 'sr-textarea',
214
+ },
215
+ play: async ({ canvasElement, step }) => {
216
+ const canvas = within(canvasElement);
217
+
218
+ await step('Verify ARIA attributes', async () => {
219
+ const textarea = canvas.getByRole('textbox');
220
+ const label = canvas.getByText('Accessible Textarea');
221
+ const helperText = canvas.getByText('This textarea is accessible to screen readers');
222
+
223
+ expect(textarea).toBeInTheDocument();
224
+ expect(label).toBeInTheDocument();
225
+ expect(helperText).toBeInTheDocument();
226
+
227
+ // Check accessibility attributes
228
+ expect(textarea).toHaveAccessibleName('Accessible Textarea');
229
+ expect(textarea).toHaveAttribute('aria-describedby');
230
+ });
231
+
232
+ await step('Test screen reader announcements', async () => {
233
+ const textarea = canvas.getByRole('textbox');
234
+
235
+ // Focus should announce the textarea
236
+ await userEvent.click(textarea);
237
+ expect(textarea).toHaveFocus();
238
+
239
+ // Type content and verify it's available to screen readers
240
+ await userEvent.type(textarea, 'Screen reader content');
241
+ expect(textarea).toHaveValue('Screen reader content');
242
+ });
243
+
244
+ await step('Test error state accessibility', async () => {
245
+ const textarea = canvas.getByRole('textbox');
246
+
247
+ // Textarea should be accessible and have proper state information
248
+ expect(textarea).toBeInTheDocument();
249
+ expect(textarea).not.toHaveAttribute('aria-invalid', 'true');
250
+ });
251
+ },
252
+ };
253
+
254
+ // 6. Focus Management Tests
255
+ export const FocusManagement: Story = {
256
+ decorators: [
257
+ (Story) => (
258
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}>
259
+ <input placeholder="Previous input" data-testid="prev-input" />
260
+ <Story />
261
+ <input placeholder="Next input" data-testid="next-input" />
262
+ </Box>
263
+ ),
264
+ ],
265
+ args: {
266
+ placeholder: 'Focus management test...',
267
+ 'dataTestId': 'focus-textarea',
268
+ },
269
+ play: async ({ canvasElement, step }) => {
270
+ const canvas = within(canvasElement);
271
+
272
+ await step('Test focus sequence', async () => {
273
+ const prevInput = canvas.getByTestId('prev-input');
274
+ const textarea = canvas.getByTestId('focus-textarea');
275
+ const nextInput = canvas.getByTestId('next-input');
276
+
277
+ // Start with previous input
278
+ await userEvent.click(prevInput);
279
+ expect(prevInput).toHaveFocus();
280
+
281
+ // Tab to textarea
282
+ await userEvent.tab();
283
+ expect(textarea).toHaveFocus();
284
+
285
+ // Tab to next input
286
+ await userEvent.tab();
287
+ expect(nextInput).toHaveFocus();
288
+ });
289
+
290
+ await step('Test focus retention during interaction', async () => {
291
+ const textarea = canvas.getByTestId('focus-textarea');
292
+
293
+ await userEvent.click(textarea);
294
+ expect(textarea).toHaveFocus();
295
+
296
+ await userEvent.type(textarea, 'Typing should maintain focus');
297
+ expect(textarea).toHaveFocus();
298
+ expect(textarea).toHaveValue('Typing should maintain focus');
299
+ });
300
+
301
+ await step('Test blur behavior', async () => {
302
+ const textarea = canvas.getByTestId('focus-textarea');
303
+ const nextInput = canvas.getByTestId('next-input');
304
+
305
+ await userEvent.click(textarea);
306
+ expect(textarea).toHaveFocus();
307
+
308
+ // Click outside to blur
309
+ await userEvent.click(nextInput);
310
+ expect(textarea).not.toHaveFocus();
311
+ expect(nextInput).toHaveFocus();
312
+ });
313
+ },
314
+ };
315
+
316
+ // 7. Responsive Design Tests
317
+ export const ResponsiveDesign: Story = {
318
+ parameters: {
319
+ viewport: {
320
+ viewports: {
321
+ mobile: { name: 'Mobile', styles: { width: '375px', height: '667px' } },
322
+ tablet: { name: 'Tablet', styles: { width: '768px', height: '1024px' } },
323
+ desktop: { name: 'Desktop', styles: { width: '1200px', height: '800px' } },
324
+ },
325
+ },
326
+ },
327
+ args: {
328
+ placeholder: 'Responsive textarea...',
329
+ size: 'md',
330
+ 'dataTestId': 'responsive-textarea',
331
+ },
332
+ play: async ({ canvasElement, step }) => {
333
+ const canvas = within(canvasElement);
334
+
335
+ await step('Verify textarea renders on different viewports', async () => {
336
+ const textarea = canvas.getByRole('textbox');
337
+ expect(textarea).toBeInTheDocument();
338
+ expect(textarea).toBeVisible();
339
+ });
340
+
341
+ await step('Test interaction on small screens', async () => {
342
+ const textarea = canvas.getByRole('textbox');
343
+
344
+ await userEvent.click(textarea);
345
+ await userEvent.type(textarea, 'Mobile responsive content');
346
+ expect(textarea).toHaveValue('Mobile responsive content');
347
+ });
348
+
349
+ await step('Verify accessibility on touch devices', async () => {
350
+ const textarea = canvas.getByRole('textbox');
351
+
352
+ // Touch target should be large enough - we verify the element exists and is accessible
353
+ expect(textarea).toBeInTheDocument();
354
+ expect(textarea).toBeVisible();
355
+ // Note: We can't easily test computed dimensions in Storybook tests
356
+ });
357
+ },
358
+ };
359
+
360
+ // 8. Theme Variations Tests
361
+ export const ThemeVariations: Story = {
362
+ decorators: [
363
+ (Story) => {
364
+ const lightTheme = createTheme({ palette: { mode: 'light' } });
365
+ const darkTheme = createTheme({ palette: { mode: 'dark' } });
366
+
367
+ return (
368
+ <Box sx={{ display: 'flex', gap: 3, flexWrap: 'wrap' }}>
369
+ <Box>
370
+ <h3>Light Theme</h3>
371
+ <ThemeProvider theme={lightTheme}>
372
+ <Story />
373
+ </ThemeProvider>
374
+ </Box>
375
+ <Box>
376
+ <h3>Dark Theme</h3>
377
+ <ThemeProvider theme={darkTheme}>
378
+ <Story />
379
+ </ThemeProvider>
380
+ </Box>
381
+ </Box>
382
+ );
383
+ },
384
+ ],
385
+ args: {
386
+ placeholder: 'Theme test textarea...',
387
+ label: 'Theme Textarea',
388
+ color: 'primary',
389
+ 'dataTestId': 'theme-textarea',
390
+ },
391
+ play: async ({ canvasElement, step }) => {
392
+ const canvas = within(canvasElement);
393
+
394
+ await step('Find textareas in both themes', async () => {
395
+ const textareas = canvas.getAllByRole('textbox');
396
+ expect(textareas).toHaveLength(2); // Light and dark theme versions
397
+ });
398
+
399
+ await step('Test interaction in both themes', async () => {
400
+ const textareas = canvas.getAllByRole('textbox');
401
+
402
+ for (const textarea of textareas) {
403
+ await userEvent.click(textarea);
404
+ await userEvent.type(textarea, 'Theme test');
405
+ expect(textarea).toHaveValue('Theme test');
406
+ await userEvent.clear(textarea);
407
+ }
408
+ });
409
+
410
+ await step('Verify theme-specific styling', async () => {
411
+ const textareas = canvas.getAllByRole('textbox');
412
+
413
+ // Both textareas should be rendered and functional
414
+ textareas.forEach((textarea) => {
415
+ expect(textarea).toBeVisible();
416
+ expect(textarea).not.toHaveAttribute('disabled');
417
+ });
418
+ });
419
+ },
420
+ };
421
+
422
+ // 9. Visual States Tests
423
+ export const VisualStates: Story = {
424
+ render: () => (
425
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
426
+ <Box>
427
+ <h4>Default State</h4>
428
+ <Textarea placeholder="Default state..." dataTestId="default-textarea" />
429
+ </Box>
430
+ <Box>
431
+ <h4>Disabled State</h4>
432
+ <Textarea placeholder="Disabled state..." disabled dataTestId="disabled-textarea" />
433
+ </Box>
434
+ <Box>
435
+ <h4>Error State</h4>
436
+ <Textarea
437
+ placeholder="Error state..."
438
+ error
439
+ helperText="This field has an error"
440
+ dataTestId="error-textarea"
441
+ />
442
+ </Box>
443
+ <Box>
444
+ <h4>Glass Effect</h4>
445
+ <Textarea placeholder="Glass effect..." glass dataTestId="glass-textarea" />
446
+ </Box>
447
+ </Box>
448
+ ),
449
+ play: async ({ canvasElement, step }) => {
450
+ const canvas = within(canvasElement);
451
+
452
+ await step('Verify all visual states render', async () => {
453
+ const defaultTextarea = canvas.getByTestId('default-textarea');
454
+ const disabledTextarea = canvas.getByTestId('disabled-textarea');
455
+ const errorTextarea = canvas.getByTestId('error-textarea');
456
+ const glassTextarea = canvas.getByTestId('glass-textarea');
457
+
458
+ expect(defaultTextarea).toBeInTheDocument();
459
+ expect(disabledTextarea).toBeInTheDocument();
460
+ expect(errorTextarea).toBeInTheDocument();
461
+ expect(glassTextarea).toBeInTheDocument();
462
+ });
463
+
464
+ await step('Test disabled state behavior', async () => {
465
+ const disabledTextarea = canvas.getByTestId('disabled-textarea');
466
+
467
+ expect(disabledTextarea).toBeDisabled();
468
+
469
+ // Should not accept input when disabled
470
+ await userEvent.click(disabledTextarea);
471
+ expect(disabledTextarea).not.toHaveFocus();
472
+ });
473
+
474
+ await step('Test interactive states', async () => {
475
+ const defaultTextarea = canvas.getByTestId('default-textarea');
476
+ const errorTextarea = canvas.getByTestId('error-textarea');
477
+ const glassTextarea = canvas.getByTestId('glass-textarea');
478
+
479
+ // Test focus states
480
+ await userEvent.click(defaultTextarea);
481
+ expect(defaultTextarea).toHaveFocus();
482
+
483
+ await userEvent.click(errorTextarea);
484
+ expect(errorTextarea).toHaveFocus();
485
+
486
+ await userEvent.click(glassTextarea);
487
+ expect(glassTextarea).toHaveFocus();
488
+ });
489
+
490
+ await step('Test error state helper text', async () => {
491
+ const helperText = canvas.getByText('This field has an error');
492
+ expect(helperText).toBeInTheDocument();
493
+ });
494
+ },
495
+ };
496
+
497
+ // 10. Performance Tests
498
+ export const Performance: Story = {
499
+ args: {
500
+ placeholder: 'Performance test textarea...',
501
+ 'dataTestId': 'performance-textarea',
502
+ },
503
+ play: async ({ canvasElement, step }) => {
504
+ const canvas = within(canvasElement);
505
+
506
+ await step('Measure initial render performance', async () => {
507
+ const startTime = Date.now();
508
+ const textarea = canvas.getByTestId('performance-textarea');
509
+ const endTime = Date.now();
510
+
511
+ expect(textarea).toBeInTheDocument();
512
+ expect(endTime - startTime).toBeLessThan(100); // Should render quickly
513
+ });
514
+
515
+ await step('Test typing performance with large content', async () => {
516
+ const textarea = canvas.getByTestId('performance-textarea');
517
+ // Reduced from 1000 to 200 characters for faster test execution
518
+ const longText = 'A'.repeat(200);
519
+
520
+ const startTime = Date.now();
521
+ await userEvent.click(textarea);
522
+ await userEvent.type(textarea, longText, { delay: 0 });
523
+ const endTime = Date.now();
524
+
525
+ expect(textarea).toHaveValue(longText);
526
+ expect(endTime - startTime).toBeLessThan(10000); // Reduced from 30s to 10s
527
+ });
528
+
529
+ await step('Test multiple rapid interactions', async () => {
530
+ const textarea = canvas.getByTestId('performance-textarea');
531
+
532
+ const startTime = Date.now();
533
+ // Reduced from 10 to 5 iterations for faster test execution
534
+ for (let i = 0; i < 5; i++) {
535
+ await userEvent.clear(textarea);
536
+ await userEvent.type(textarea, `Content ${i}`, { delay: 0 });
537
+ }
538
+ const endTime = Date.now();
539
+
540
+ expect(textarea).toHaveValue('Content 4');
541
+ expect(endTime - startTime).toBeLessThan(10000); // Reduced from 30s to 10s
542
+ });
543
+ },
544
+ parameters: {
545
+ test: {
546
+ timeout: 10000, // 10 second timeout for performance tests
547
+ },
548
+ },
549
+ };
550
+
551
+ // 11. Edge Cases Tests
552
+ export const EdgeCases: Story = {
553
+ decorators: [
554
+ () => (
555
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
556
+ <Box>
557
+ <h4>Empty State</h4>
558
+ <Textarea placeholder="Empty placeholder..." dataTestId="empty-textarea" />
559
+ </Box>
560
+ <Box>
561
+ <h4>With Max Length</h4>
562
+ <Textarea placeholder="Max 10 chars..." maxLength={10} dataTestId="maxlength-textarea" />
563
+ </Box>
564
+ <Box>
565
+ <h4>Pre-filled Content</h4>
566
+ <Textarea defaultValue="Pre-filled content here" dataTestId="prefilled-textarea" />
567
+ </Box>
568
+ </Box>
569
+ ),
570
+ ],
571
+ play: async ({ canvasElement, step }) => {
572
+ const canvas = within(canvasElement);
573
+
574
+ await step('Test empty state behavior', async () => {
575
+ const emptyTextarea = canvas.getByTestId('empty-textarea');
576
+
577
+ expect(emptyTextarea).toHaveValue('');
578
+ expect(emptyTextarea).toHaveAttribute('placeholder', 'Empty placeholder...');
579
+ });
580
+
581
+ await step('Test max length constraint', async () => {
582
+ const maxLengthTextarea = canvas.getByTestId<HTMLTextAreaElement>('maxlength-textarea');
583
+
584
+ await userEvent.click(maxLengthTextarea);
585
+ await userEvent.type(maxLengthTextarea, 'This text is longer than 10 characters', { delay: 0 });
586
+
587
+ // Should be truncated to max length
588
+ const value = maxLengthTextarea.value;
589
+ expect(value.length).toBeLessThanOrEqual(10);
590
+ });
591
+
592
+ await step('Test pre-filled content', async () => {
593
+ const prefilledTextarea = canvas.getByTestId('prefilled-textarea');
594
+
595
+ expect(prefilledTextarea).toHaveValue('Pre-filled content here');
596
+
597
+ // Should be able to edit pre-filled content
598
+ await userEvent.click(prefilledTextarea);
599
+ await userEvent.clear(prefilledTextarea);
600
+ await userEvent.type(prefilledTextarea, 'New content', { delay: 0 });
601
+ expect(prefilledTextarea).toHaveValue('New content');
602
+ });
603
+
604
+ await step('Test special character input', async () => {
605
+ const emptyTextarea = canvas.getByTestId('empty-textarea');
606
+
607
+ await userEvent.clear(emptyTextarea);
608
+ // Simplified test text for faster execution
609
+ await userEvent.type(emptyTextarea, 'Special: @#$ abc', { delay: 0 });
610
+ expect(emptyTextarea).toHaveValue('Special: @#$ abc');
611
+ });
612
+
613
+ await step('Test newline handling', async () => {
614
+ const emptyTextarea = canvas.getByTestId('empty-textarea');
615
+
616
+ await userEvent.clear(emptyTextarea);
617
+ await userEvent.type(emptyTextarea, 'Line 1\nLine 2', { delay: 0 });
618
+ expect(emptyTextarea).toHaveValue('Line 1\nLine 2');
619
+ });
620
+ },
621
+ parameters: {
622
+ test: {
623
+ timeout: 10000, // 10 second timeout for edge case tests
624
+ },
625
+ },
626
+ };
627
+
628
+ // 12. Integration Tests
629
+ export const Integration: Story = {
630
+ decorators: [
631
+ (Story) => (
632
+ <Box component="form" sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}>
633
+ <input placeholder="Name" data-testid="name-input" />
634
+ <Story />
635
+ <Textarea placeholder="Additional comments..." data-testid="comments-textarea" />
636
+ <button type="submit">Submit Form</button>
637
+ </Box>
638
+ ),
639
+ ],
640
+ args: {
641
+ placeholder: 'Main message...',
642
+ name: 'message',
643
+ required: true,
644
+ label: 'Message',
645
+ helperText: 'Please enter your message',
646
+ 'dataTestId': 'integration-textarea',
647
+ },
648
+ play: async ({ canvasElement, step }) => {
649
+ const canvas = within(canvasElement);
650
+
651
+ await step('Verify form integration setup', async () => {
652
+ const nameInput = canvas.getByTestId('name-input');
653
+ const messageTextarea = canvas.getByTestId('integration-textarea');
654
+ const commentsTextarea = canvas.getByTestId('comments-textarea');
655
+ const submitButton = canvas.getByRole('button', { name: 'Submit Form' });
656
+
657
+ expect(nameInput).toBeInTheDocument();
658
+ expect(messageTextarea).toBeInTheDocument();
659
+ expect(commentsTextarea).toBeInTheDocument();
660
+ expect(submitButton).toBeInTheDocument();
661
+ });
662
+
663
+ await step('Test tab navigation through form', async () => {
664
+ const nameInput = canvas.getByTestId('name-input');
665
+ const messageTextarea = canvas.getByTestId('integration-textarea');
666
+ const commentsTextarea = canvas.getByTestId('comments-textarea');
667
+ const submitButton = canvas.getByRole('button', { name: 'Submit Form' });
668
+
669
+ await userEvent.click(nameInput);
670
+ expect(nameInput).toHaveFocus();
671
+
672
+ await userEvent.tab();
673
+ expect(messageTextarea).toHaveFocus();
674
+
675
+ await userEvent.tab();
676
+ expect(commentsTextarea).toHaveFocus();
677
+
678
+ await userEvent.tab();
679
+ expect(submitButton).toHaveFocus();
680
+ });
681
+
682
+ await step('Fill form with data', async () => {
683
+ const nameInput = canvas.getByTestId('name-input');
684
+ const messageTextarea = canvas.getByTestId('integration-textarea');
685
+ const commentsTextarea = canvas.getByTestId('comments-textarea');
686
+
687
+ await userEvent.click(nameInput);
688
+ await userEvent.type(nameInput, 'John Doe');
689
+ expect(nameInput).toHaveValue('John Doe');
690
+
691
+ await userEvent.click(messageTextarea);
692
+ await userEvent.type(messageTextarea, 'This is the main message\nwith multiple lines.');
693
+ expect(messageTextarea).toHaveValue('This is the main message\nwith multiple lines.');
694
+
695
+ await userEvent.click(commentsTextarea);
696
+ await userEvent.type(commentsTextarea, 'Additional comments here.');
697
+ expect(commentsTextarea).toHaveValue('Additional comments here.');
698
+ });
699
+
700
+ await step('Test form validation integration', async () => {
701
+ const messageTextarea = canvas.getByTestId('integration-textarea');
702
+ const helperText = canvas.getByText('Please enter your message');
703
+
704
+ expect(messageTextarea).toHaveAttribute('required');
705
+ expect(helperText).toBeInTheDocument();
706
+ });
707
+ },
708
+ };