@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,1184 @@
1
+ import { Email, Lock, Person,Visibility, VisibilityOff } from '@mui/icons-material';
2
+ import { IconButton } from '@mui/material';
3
+ import type { Meta, StoryObj } from '@storybook/react-vite';
4
+ import { useState } from 'react';
5
+ import { expect, fn,userEvent, waitFor, within } from 'storybook/test';
6
+
7
+ import { Input } from './Input';
8
+
9
+ const meta: Meta<typeof Input> = {
10
+ title: 'Form/Input/Tests',
11
+ component: Input,
12
+ parameters: {
13
+ layout: 'centered',
14
+ chromatic: { disableSnapshot: false },
15
+ },
16
+ tags: ['autodocs', 'test', 'component:Input'],
17
+ };
18
+
19
+ export default meta;
20
+ type Story = StoryObj<typeof meta>;
21
+
22
+ // ============================================================================
23
+ // INTERACTION TESTS
24
+ // ============================================================================
25
+
26
+ export const BasicInteraction: Story = {
27
+ name: '🧪 Basic Interaction Test',
28
+ args: {
29
+ label: 'Test Input',
30
+ placeholder: 'Type here...',
31
+ 'data-testid': 'basic-input',
32
+ onChange: fn(),
33
+ onFocus: fn(),
34
+ onBlur: fn(),
35
+ onClick: fn(),
36
+ },
37
+ play: async ({ canvasElement, step, args }) => {
38
+ const canvas = within(canvasElement);
39
+
40
+ await step('Initial render verification', async () => {
41
+ const input = canvas.getByLabelText('Test Input');
42
+ await expect(input).toBeInTheDocument();
43
+ await expect(input).toHaveAttribute('placeholder', 'Type here...');
44
+ });
45
+
46
+ await step('Click interaction', async () => {
47
+ const input = canvas.getByLabelText('Test Input');
48
+ await userEvent.click(input);
49
+ await expect(args.onClick).toHaveBeenCalled();
50
+ });
51
+
52
+ await step('Focus interaction', async () => {
53
+ const input = canvas.getByLabelText('Test Input');
54
+ await userEvent.click(input);
55
+ await expect(args.onFocus).toHaveBeenCalled();
56
+ });
57
+
58
+ await step('Type interaction', async () => {
59
+ const input = canvas.getByLabelText('Test Input');
60
+ await userEvent.type(input, 'Hello World');
61
+ await expect(input).toHaveValue('Hello World');
62
+ await expect(args.onChange).toHaveBeenCalled();
63
+ });
64
+
65
+ await step('Clear input', async () => {
66
+ const input = canvas.getByLabelText('Test Input');
67
+ await userEvent.clear(input);
68
+ await expect(input).toHaveValue('');
69
+ });
70
+
71
+ await step('Blur interaction', async () => {
72
+ const input = canvas.getByLabelText('Test Input');
73
+ await userEvent.click(input);
74
+ await userEvent.tab(); // Move focus away
75
+ await expect(args.onBlur).toHaveBeenCalled();
76
+ });
77
+ },
78
+ };
79
+
80
+ export const FormInteraction: Story = {
81
+ name: '📝 Form Interaction Test',
82
+ render: () => {
83
+ const TestForm = () => {
84
+ const [email, setEmail] = useState('');
85
+ const [password, setPassword] = useState('');
86
+ const [submitted, setSubmitted] = useState(false);
87
+
88
+ const handleSubmit = (e: React.FormEvent) => {
89
+ e.preventDefault();
90
+ setSubmitted(true);
91
+ };
92
+
93
+ return (
94
+ <form
95
+ onSubmit={handleSubmit}
96
+ style={{ display: 'flex', flexDirection: 'column', gap: '16px', width: '300px' }}
97
+ >
98
+ <Input
99
+ label="Email"
100
+ type="email"
101
+ value={email}
102
+ onChange={(e) => setEmail(e.target.value)}
103
+ data-testid="form-email"
104
+ required
105
+ />
106
+ <Input
107
+ label="Password"
108
+ type="password"
109
+ value={password}
110
+ onChange={(e) => setPassword(e.target.value)}
111
+ data-testid="form-password"
112
+ required
113
+ />
114
+ <button type="submit" data-testid="form-submit">
115
+ Submit
116
+ </button>
117
+ {submitted && <div data-testid="form-success">Form submitted with email: {email}</div>}
118
+ </form>
119
+ );
120
+ };
121
+
122
+ return <TestForm />;
123
+ },
124
+ play: async ({ canvasElement, step }) => {
125
+ const canvas = within(canvasElement);
126
+
127
+ await step('Fill email field', async () => {
128
+ const emailInput = canvas.getByTestId('form-email');
129
+ await userEvent.type(emailInput, 'test@example.com');
130
+ await expect(emailInput).toHaveValue('test@example.com');
131
+ });
132
+
133
+ await step('Fill password field', async () => {
134
+ const passwordInput = canvas.getByTestId('form-password');
135
+ await userEvent.type(passwordInput, 'secretpassword');
136
+ await expect(passwordInput).toHaveValue('secretpassword');
137
+ });
138
+
139
+ await step('Submit form', async () => {
140
+ const submitButton = canvas.getByTestId('form-submit');
141
+ await userEvent.click(submitButton);
142
+
143
+ await waitFor(async () => {
144
+ const success = canvas.getByTestId('form-success');
145
+ await expect(success).toHaveTextContent('Form submitted with email: test@example.com');
146
+ });
147
+ });
148
+ },
149
+ };
150
+
151
+ export const StateChangeTest: Story = {
152
+ name: '🔄 State Change Test',
153
+ render: () => {
154
+ const StatefulComponent = () => {
155
+ const [value, setValue] = useState('');
156
+ const [error, setError] = useState(false);
157
+ const [loading, setLoading] = useState(false);
158
+
159
+ const handleValidation = (inputValue: string) => {
160
+ setError(inputValue.length < 3);
161
+ };
162
+
163
+ const handleLoadingToggle = () => {
164
+ setLoading(!loading);
165
+ window.setTimeout(() => setLoading(false), 2000);
166
+ };
167
+
168
+ return (
169
+ <div style={{ display: 'flex', flexDirection: 'column', gap: '16px', width: '300px' }}>
170
+ <Input
171
+ label="Stateful Input"
172
+ value={value}
173
+ onChange={(e) => {
174
+ setValue(e.target.value);
175
+ handleValidation(e.target.value);
176
+ }}
177
+ error={error}
178
+ helperText={error ? 'Must be at least 3 characters' : 'Type at least 3 characters'}
179
+ data-testid="stateful-input"
180
+ />
181
+ <Input
182
+ label="Loading Input"
183
+ loading={loading}
184
+ placeholder="Click button to simulate loading"
185
+ data-testid="loading-input"
186
+ />
187
+ <button onClick={handleLoadingToggle} data-testid="loading-toggle">
188
+ Toggle Loading
189
+ </button>
190
+ <div data-testid="state-display">
191
+ {`Value: ${value || ''} | Error: ${error.toString()} | Loading: ${loading.toString()}`}
192
+ </div>
193
+ </div>
194
+ );
195
+ };
196
+
197
+ return <StatefulComponent />;
198
+ },
199
+ play: async ({ canvasElement, step }) => {
200
+ const canvas = within(canvasElement);
201
+
202
+ await step('Verify initial state', async () => {
203
+ const stateDisplay = canvas.getByTestId('state-display');
204
+ await expect(stateDisplay.textContent).toMatch(
205
+ /Value:\s+\|\s+Error:\s+false\s+\|\s+Loading:\s+false/,
206
+ );
207
+ });
208
+
209
+ await step('Type short text to trigger error', async () => {
210
+ const input = canvas.getByTestId('stateful-input');
211
+ await userEvent.type(input, 'ab');
212
+
213
+ await waitFor(async () => {
214
+ const stateDisplay = canvas.getByTestId('state-display');
215
+ await expect(stateDisplay).toHaveTextContent('Error: true');
216
+ await expect(input).toHaveAttribute('aria-invalid', 'true');
217
+ });
218
+ });
219
+
220
+ await step('Type longer text to clear error', async () => {
221
+ const input = canvas.getByTestId('stateful-input');
222
+ await userEvent.clear(input);
223
+ await userEvent.type(input, 'valid input');
224
+
225
+ await waitFor(async () => {
226
+ const stateDisplay = canvas.getByTestId('state-display');
227
+ await expect(stateDisplay).toHaveTextContent('Error: false');
228
+ await expect(input).not.toHaveAttribute('aria-invalid', 'true');
229
+ });
230
+ });
231
+
232
+ await step('Toggle loading state', async () => {
233
+ const loadingToggle = canvas.getByTestId('loading-toggle');
234
+ await userEvent.click(loadingToggle);
235
+
236
+ const stateDisplay = canvas.getByTestId('state-display');
237
+ await expect(stateDisplay).toHaveTextContent('Loading: true');
238
+
239
+ const loadingInput = canvas.getByTestId('loading-input');
240
+ await expect(loadingInput).toBeDisabled();
241
+ });
242
+ },
243
+ };
244
+
245
+ // ============================================================================
246
+ // ACCESSIBILITY TESTS
247
+ // ============================================================================
248
+
249
+ export const KeyboardNavigation: Story = {
250
+ name: '⌨️ Keyboard Navigation Test',
251
+ render: () => (
252
+ <div style={{ display: 'flex', flexDirection: 'column', gap: '16px', width: '300px' }}>
253
+ <Input label="First Input" placeholder="Tab to navigate" data-testid="first-input" />
254
+ <Input label="Second Input" placeholder="Continue tabbing" data-testid="second-input" />
255
+ <Input label="Third Input" placeholder="Final input" data-testid="third-input" />
256
+ <button data-testid="after-inputs">Button After Inputs</button>
257
+ </div>
258
+ ),
259
+ parameters: {
260
+ a11y: {
261
+ element: '#storybook-root',
262
+ config: {
263
+ rules: [
264
+ { id: 'color-contrast', enabled: true },
265
+ { id: 'aria-required-attr', enabled: true },
266
+ { id: 'aria-roles', enabled: true },
267
+ { id: 'aria-valid-attr-value', enabled: true },
268
+ { id: 'label', enabled: true },
269
+ ],
270
+ },
271
+ },
272
+ },
273
+ play: async ({ canvasElement, step }) => {
274
+ const canvas = within(canvasElement);
275
+
276
+ await step('Tab navigation forward', async () => {
277
+ const firstInput = canvas.getByTestId('first-input');
278
+ const secondInput = canvas.getByTestId('second-input');
279
+
280
+ // Focus first element
281
+ firstInput.focus();
282
+ await expect(firstInput).toHaveFocus();
283
+
284
+ // Tab to next element
285
+ await userEvent.tab();
286
+ await expect(secondInput).toHaveFocus();
287
+ });
288
+
289
+ await step('Tab navigation continues', async () => {
290
+ const thirdInput = canvas.getByTestId('third-input');
291
+ const button = canvas.getByTestId('after-inputs');
292
+
293
+ await userEvent.tab();
294
+ await expect(thirdInput).toHaveFocus();
295
+
296
+ await userEvent.tab();
297
+ await expect(button).toHaveFocus();
298
+ });
299
+
300
+ await step('Tab navigation backward', async () => {
301
+ const thirdInput = canvas.getByTestId('third-input');
302
+
303
+ await userEvent.tab({ shift: true });
304
+ await expect(thirdInput).toHaveFocus();
305
+ });
306
+
307
+ await step('Enter key in input (should not submit)', async () => {
308
+ const firstInput = canvas.getByTestId('first-input');
309
+ firstInput.focus();
310
+
311
+ await userEvent.type(firstInput, 'test');
312
+ await userEvent.keyboard('{Enter}');
313
+
314
+ // Input should still have focus and content
315
+ await expect(firstInput).toHaveFocus();
316
+ await expect(firstInput).toHaveValue('test');
317
+ });
318
+ },
319
+ };
320
+
321
+ export const ScreenReaderTest: Story = {
322
+ name: '🔊 Screen Reader Test',
323
+ render: () => (
324
+ <div style={{ display: 'flex', flexDirection: 'column', gap: '16px', width: '300px' }}>
325
+ <Input
326
+ label="Full Name"
327
+ placeholder="Enter your full name"
328
+ helperText="This field is required for registration"
329
+ required
330
+ data-testid="name-input"
331
+ aria-describedby="name-description"
332
+ />
333
+ <div id="name-description" data-testid="name-description">
334
+ Please enter your first and last name
335
+ </div>
336
+
337
+ <Input
338
+ label="Email Address"
339
+ type="email"
340
+ error
341
+ helperText="Please enter a valid email address"
342
+ data-testid="email-input"
343
+ aria-invalid="true"
344
+ aria-describedby="email-error"
345
+ />
346
+ <div id="email-error" data-testid="email-error" role="alert">
347
+ The email format is invalid
348
+ </div>
349
+ </div>
350
+ ),
351
+ play: async ({ canvasElement, step }) => {
352
+ const canvas = within(canvasElement);
353
+
354
+ await step('Verify ARIA labels', async () => {
355
+ const nameInput = canvas.getByTestId('name-input');
356
+ await expect(nameInput).toBeInTheDocument();
357
+ await expect(nameInput).toHaveAttribute('required');
358
+
359
+ // Verify the label is associated correctly
360
+ const label = nameInput.closest('.MuiFormControl-root')?.querySelector('label');
361
+ await expect(label).toHaveTextContent('Full Name');
362
+ });
363
+
364
+ await step('Verify ARIA descriptions', async () => {
365
+ const nameInput = canvas.getByTestId('name-input');
366
+ // MUI generates its own aria-describedby ID for helper text
367
+ const ariaDescribedBy = nameInput.getAttribute('aria-describedby');
368
+ await expect(ariaDescribedBy).toBeTruthy();
369
+ await expect(ariaDescribedBy).toMatch(/helper-text/);
370
+
371
+ const description = canvas.getByTestId('name-description');
372
+ await expect(description).toBeInTheDocument();
373
+ await expect(description).toHaveTextContent('Please enter your first and last name');
374
+ });
375
+
376
+ await step('Verify error state attributes', async () => {
377
+ const emailInput = canvas.getByTestId('email-input');
378
+ await expect(emailInput).toHaveAttribute('aria-invalid', 'true');
379
+ // MUI generates its own aria-describedby ID for helper text
380
+ const emailAriaDescribedBy = emailInput.getAttribute('aria-describedby');
381
+ await expect(emailAriaDescribedBy).toBeTruthy();
382
+ await expect(emailAriaDescribedBy).toMatch(/helper-text/);
383
+ });
384
+
385
+ await step('Verify live regions', async () => {
386
+ const errorRegion = canvas.getByTestId('email-error');
387
+ await expect(errorRegion).toHaveAttribute('role', 'alert');
388
+ await expect(errorRegion).toHaveTextContent('The email format is invalid');
389
+ });
390
+ },
391
+ };
392
+
393
+ export const FocusManagement: Story = {
394
+ name: '🎯 Focus Management Test',
395
+ render: () => {
396
+ const FocusTestComponent = () => {
397
+ const [showModal, setShowModal] = useState(false);
398
+
399
+ return (
400
+ <div>
401
+ <Input
402
+ label="Trigger Input"
403
+ placeholder="Click here first"
404
+ data-testid="trigger-input"
405
+ autoFocus
406
+ />
407
+
408
+ <button onClick={() => setShowModal(true)} data-testid="open-modal">
409
+ Open Modal
410
+ </button>
411
+
412
+ {showModal && (
413
+ <div
414
+ role="dialog"
415
+ aria-modal="true"
416
+ style={{
417
+ position: 'fixed',
418
+ top: '50%',
419
+ left: '50%',
420
+ transform: 'translate(-50%, -50%)',
421
+ background: 'white',
422
+ padding: '20px',
423
+ border: '1px solid #ccc',
424
+ borderRadius: '8px',
425
+ boxShadow: '0 4px 6px rgba(0,0,0,0.1)',
426
+ }}
427
+ data-testid="modal"
428
+ >
429
+ <Input
430
+ label="Modal Input"
431
+ placeholder="Focus trapped here"
432
+ data-testid="modal-input"
433
+ autoFocus
434
+ />
435
+ <button onClick={() => setShowModal(false)} data-testid="close-modal">
436
+ Close
437
+ </button>
438
+ </div>
439
+ )}
440
+ </div>
441
+ );
442
+ };
443
+
444
+ return <FocusTestComponent />;
445
+ },
446
+ play: async ({ canvasElement, step }) => {
447
+ const canvas = within(canvasElement);
448
+
449
+ await step('Auto focus on mount', async () => {
450
+ const triggerInput = canvas.getByTestId('trigger-input');
451
+ await waitFor(() => {
452
+ expect(triggerInput).toHaveFocus();
453
+ });
454
+ });
455
+
456
+ await step('Focus management in modal', async () => {
457
+ const openButton = canvas.getByTestId('open-modal');
458
+ await userEvent.click(openButton);
459
+
460
+ const modal = await canvas.findByTestId('modal');
461
+ await expect(modal).toBeInTheDocument();
462
+
463
+ const modalInput = within(modal).getByTestId('modal-input');
464
+ await waitFor(() => {
465
+ expect(modalInput).toHaveFocus();
466
+ });
467
+ });
468
+
469
+ await step('Focus restoration after modal close', async () => {
470
+ const modal = canvas.getByTestId('modal');
471
+ const closeButton = within(modal).getByTestId('close-modal');
472
+ const openButton = canvas.getByTestId('open-modal');
473
+
474
+ // Set focus to open button before closing
475
+ openButton.focus();
476
+ await userEvent.click(closeButton);
477
+
478
+ // Modal should be gone
479
+ await waitFor(() => {
480
+ expect(canvas.queryByTestId('modal')).not.toBeInTheDocument();
481
+ });
482
+ });
483
+ },
484
+ };
485
+
486
+ // ============================================================================
487
+ // VISUAL TESTS
488
+ // ============================================================================
489
+
490
+ export const ResponsiveDesign: Story = {
491
+ name: '📱 Responsive Design Test',
492
+ render: () => (
493
+ <div
494
+ style={{
495
+ display: 'grid',
496
+ gridTemplateColumns: 'repeat(auto-fit, minmax(250px, 1fr))',
497
+ gap: '16px',
498
+ }}
499
+ >
500
+ <Input
501
+ variant="outlined"
502
+ label="Responsive Input 1"
503
+ placeholder="Resize window to test"
504
+ data-testid="responsive-1"
505
+ />
506
+ <Input
507
+ variant="glass"
508
+ label="Responsive Input 2"
509
+ placeholder="Watch layout adapt"
510
+ data-testid="responsive-2"
511
+ />
512
+ <Input
513
+ variant="gradient"
514
+ label="Responsive Input 3"
515
+ placeholder="Grid adjusts automatically"
516
+ data-testid="responsive-3"
517
+ />
518
+ </div>
519
+ ),
520
+ parameters: {
521
+ viewport: {
522
+ viewports: {
523
+ mobile: {
524
+ name: 'Mobile',
525
+ styles: { width: '375px', height: '667px' },
526
+ type: 'mobile',
527
+ },
528
+ tablet: {
529
+ name: 'Tablet',
530
+ styles: { width: '768px', height: '1024px' },
531
+ type: 'tablet',
532
+ },
533
+ desktop: {
534
+ name: 'Desktop',
535
+ styles: { width: '1920px', height: '1080px' },
536
+ type: 'desktop',
537
+ },
538
+ },
539
+ defaultViewport: 'mobile',
540
+ },
541
+ chromatic: {
542
+ viewports: [375, 768, 1920],
543
+ delay: 300,
544
+ },
545
+ },
546
+ play: async ({ canvasElement, step }) => {
547
+ const canvas = within(canvasElement);
548
+
549
+ await step('Verify responsive container', async () => {
550
+ const container = canvasElement.querySelector('div[style*="grid"]') as HTMLElement;
551
+ const computedStyle = window.getComputedStyle(container);
552
+
553
+ // Check that CSS Grid is being used
554
+ await expect(computedStyle.display).toBe('grid');
555
+
556
+ // Check that grid has appropriate column layout (computed may be different from raw CSS)
557
+ const gridCols = computedStyle.gridTemplateColumns;
558
+ // Should have a meaningful grid layout (not none or empty)
559
+ await expect(gridCols).not.toBe('none');
560
+ await expect(gridCols.length).toBeGreaterThan(0);
561
+ });
562
+
563
+ await step('Verify inputs are functional at all sizes', async () => {
564
+ const input1 = canvas.getByTestId('responsive-1');
565
+ const input2 = canvas.getByTestId('responsive-2');
566
+ const input3 = canvas.getByTestId('responsive-3');
567
+
568
+ // Test interaction on each input
569
+ await userEvent.click(input1);
570
+ await expect(input1).toHaveFocus();
571
+
572
+ await userEvent.click(input2);
573
+ await expect(input2).toHaveFocus();
574
+
575
+ await userEvent.click(input3);
576
+ await expect(input3).toHaveFocus();
577
+ });
578
+ },
579
+ };
580
+
581
+ export const ThemeVariations: Story = {
582
+ name: '🎨 Theme Variations Test',
583
+ render: () => (
584
+ <div style={{ display: 'flex', flexDirection: 'column', gap: '16px', width: '300px' }}>
585
+ <Input
586
+ variant="outlined"
587
+ label="Outlined Theme"
588
+ placeholder="Default theme"
589
+ data-testid="theme-outlined"
590
+ />
591
+ <Input
592
+ variant="glass"
593
+ label="Glass Theme"
594
+ placeholder="Glass morphism"
595
+ data-testid="theme-glass"
596
+ />
597
+ <Input
598
+ variant="gradient"
599
+ label="Gradient Theme"
600
+ placeholder="Gradient borders"
601
+ data-testid="theme-gradient"
602
+ />
603
+ </div>
604
+ ),
605
+ parameters: {
606
+ backgrounds: {
607
+ default: 'light',
608
+ values: [
609
+ { name: 'light', value: '#ffffff' },
610
+ { name: 'dark', value: '#1a1a1a' },
611
+ { name: 'blue', value: '#1e3a8a' },
612
+ ],
613
+ },
614
+ },
615
+ play: async ({ canvasElement, step }) => {
616
+ const canvas = within(canvasElement);
617
+
618
+ await step('Verify theme styling is applied', async () => {
619
+ const glassInput = canvas.getByTestId('theme-glass');
620
+ const gradientInput = canvas.getByTestId('theme-gradient');
621
+
622
+ // These inputs should be visible and styled
623
+ await expect(glassInput).toBeVisible();
624
+ await expect(gradientInput).toBeVisible();
625
+ });
626
+
627
+ await step('Test theme consistency on focus', async () => {
628
+ const outlinedInput = canvas.getByTestId('theme-outlined');
629
+ const glassInput = canvas.getByTestId('theme-glass');
630
+
631
+ // Focus each input to test theme-aware focus styles
632
+ await userEvent.click(outlinedInput);
633
+ await expect(outlinedInput).toHaveFocus();
634
+
635
+ await userEvent.click(glassInput);
636
+ await expect(glassInput).toHaveFocus();
637
+ });
638
+ },
639
+ };
640
+
641
+ export const VisualStates: Story = {
642
+ name: '👁️ Visual States Test',
643
+ render: () => (
644
+ <div style={{ display: 'flex', flexDirection: 'column', gap: '16px', width: '300px' }}>
645
+ <Input label="Default State" placeholder="Normal input" data-testid="default-state" />
646
+ <Input label="Hover State" placeholder="Hover over me" data-testid="hover-state" />
647
+ <Input label="Focus State" placeholder="Click to focus" data-testid="focus-state" />
648
+ <Input
649
+ label="Disabled State"
650
+ placeholder="Cannot interact"
651
+ disabled
652
+ data-testid="disabled-state"
653
+ />
654
+ <Input
655
+ label="Error State"
656
+ placeholder="Has error"
657
+ error
658
+ helperText="This field has an error"
659
+ data-testid="error-state"
660
+ />
661
+ <Input
662
+ label="Loading State"
663
+ placeholder="Processing..."
664
+ loading
665
+ data-testid="loading-state"
666
+ />
667
+ <Input
668
+ variant="glass"
669
+ label="Glow Effect"
670
+ placeholder="Has glow"
671
+ glow
672
+ data-testid="glow-state"
673
+ />
674
+ </div>
675
+ ),
676
+ play: async ({ canvasElement, step }) => {
677
+ const canvas = within(canvasElement);
678
+
679
+ await step('Default state is visible', async () => {
680
+ const defaultInput = canvas.getByTestId('default-state');
681
+ await expect(defaultInput).toBeVisible();
682
+ await expect(defaultInput).not.toBeDisabled();
683
+ });
684
+
685
+ await step('Hover state interaction', async () => {
686
+ const hoverInput = canvas.getByTestId('hover-state');
687
+ await userEvent.hover(hoverInput);
688
+ // Visual hover effects should be applied via CSS
689
+ await expect(hoverInput).toBeVisible();
690
+ });
691
+
692
+ await step('Focus state interaction', async () => {
693
+ const focusInput = canvas.getByTestId('focus-state');
694
+ await userEvent.click(focusInput);
695
+ await expect(focusInput).toHaveFocus();
696
+ });
697
+
698
+ await step('Disabled state verification', async () => {
699
+ const disabledInput = canvas.getByTestId('disabled-state');
700
+ await expect(disabledInput).toBeDisabled();
701
+ // Try to click (should not gain focus)
702
+ await userEvent.click(disabledInput);
703
+ await expect(disabledInput).not.toHaveFocus();
704
+ });
705
+
706
+ await step('Error state verification', async () => {
707
+ const errorInput = canvas.getByTestId('error-state');
708
+ await expect(errorInput).toHaveAttribute('aria-invalid', 'true');
709
+ });
710
+
711
+ await step('Loading state verification', async () => {
712
+ const loadingInput = canvas.getByTestId('loading-state');
713
+ await expect(loadingInput).toBeDisabled();
714
+
715
+ // Should have a loading spinner in end adornment
716
+ const spinner = canvas.getByRole('progressbar');
717
+ await expect(spinner).toBeInTheDocument();
718
+ });
719
+
720
+ await step('Glow state interaction', async () => {
721
+ const glowInput = canvas.getByTestId('glow-state');
722
+ await userEvent.click(glowInput);
723
+ await expect(glowInput).toHaveFocus();
724
+ // Glow effect should be visible via CSS
725
+ });
726
+ },
727
+ };
728
+
729
+ // ============================================================================
730
+ // EDGE CASES TESTS
731
+ // ============================================================================
732
+
733
+ export const EdgeCases: Story = {
734
+ name: '🔧 Edge Cases Test',
735
+ render: () => (
736
+ <div style={{ display: 'flex', flexDirection: 'column', gap: '16px', width: '300px' }}>
737
+ <Input
738
+ label="Empty with Floating"
739
+ floating
740
+ placeholder="Floating label behavior"
741
+ data-testid="empty-floating"
742
+ />
743
+ <Input
744
+ label="Long Text Overflow"
745
+ defaultValue="This is a very long text that should show how the input handles overflow and long content gracefully without breaking the layout"
746
+ data-testid="long-text"
747
+ />
748
+ <Input
749
+ label="No Full Width"
750
+ fullWidth={false}
751
+ placeholder="Not full width"
752
+ data-testid="not-full-width"
753
+ />
754
+ <Input
755
+ label="All Effects Combined"
756
+ variant="glass"
757
+ glow
758
+ pulse
759
+ floating
760
+ placeholder="Kitchen sink example"
761
+ helperText="All visual effects enabled"
762
+ data-testid="all-effects"
763
+ />
764
+ <Input
765
+ label="Special Characters"
766
+ placeholder="Test: !@#$%^&*()_+-=[]{}|;:,.<>?"
767
+ data-testid="special-chars"
768
+ />
769
+ <Input label="Unicode Support" placeholder="测试 العربية Русский 🚀" data-testid="unicode" />
770
+ </div>
771
+ ),
772
+ play: async ({ canvasElement, step }) => {
773
+ const canvas = within(canvasElement);
774
+
775
+ await step('Empty floating label behavior', async () => {
776
+ const floatingInput = canvas.getByTestId('empty-floating');
777
+
778
+ // Label should be in placeholder position initially
779
+ await expect(floatingInput).toHaveAttribute('placeholder', 'Floating label behavior');
780
+
781
+ // Type something to trigger label float
782
+ await userEvent.click(floatingInput);
783
+ await userEvent.type(floatingInput, 'test');
784
+ await expect(floatingInput).toHaveValue('test');
785
+
786
+ // Clear and blur to test label return
787
+ await userEvent.clear(floatingInput);
788
+ await userEvent.tab();
789
+ });
790
+
791
+ await step('Long text overflow handling', async () => {
792
+ const longTextInput = canvas.getByTestId('long-text');
793
+ await expect(longTextInput.value).toContain('This is a very long text');
794
+
795
+ // Input should handle overflow gracefully
796
+ await userEvent.click(longTextInput);
797
+ await userEvent.keyboard('{End}');
798
+ });
799
+
800
+ await step('Width constraints', async () => {
801
+ const notFullWidthInput = canvas.getByTestId('not-full-width');
802
+ await expect(notFullWidthInput).toBeVisible();
803
+
804
+ // Should not fill full container width
805
+ const inputElement = notFullWidthInput.closest('.MuiTextField-root') as HTMLElement;
806
+ await expect(inputElement).toBeInTheDocument();
807
+ });
808
+
809
+ await step('Combined effects functionality', async () => {
810
+ const allEffectsInput = canvas.getByTestId('all-effects');
811
+
812
+ // Should be visible and interactive despite all effects
813
+ await userEvent.click(allEffectsInput);
814
+ await expect(allEffectsInput).toHaveFocus();
815
+
816
+ await userEvent.type(allEffectsInput, 'works with all effects');
817
+ await expect(allEffectsInput).toHaveValue('works with all effects');
818
+ });
819
+
820
+ await step('Special characters input', async () => {
821
+ const specialCharsInput = canvas.getByTestId('special-chars');
822
+ const specialText = '!@#$%^&*()_+-=test'; // Simplified to avoid userEvent.type issues
823
+
824
+ await userEvent.click(specialCharsInput);
825
+ await userEvent.type(specialCharsInput, specialText);
826
+ await expect(specialCharsInput).toHaveValue(specialText);
827
+ });
828
+
829
+ await step('Unicode support', async () => {
830
+ const unicodeInput = canvas.getByTestId('unicode');
831
+ const unicodeText = '测试 العربية Русский 🚀';
832
+
833
+ await userEvent.click(unicodeInput);
834
+ await userEvent.type(unicodeInput, unicodeText);
835
+ await expect(unicodeInput).toHaveValue(unicodeText);
836
+ });
837
+ },
838
+ };
839
+
840
+ // ============================================================================
841
+ // PERFORMANCE TESTS
842
+ // ============================================================================
843
+
844
+ export const PerformanceTest: Story = {
845
+ name: '⚡ Performance Test',
846
+ render: () => {
847
+ const inputs = Array.from({ length: 50 }, (_, i) => (
848
+ <Input
849
+ key={i}
850
+ label={`Performance Input ${i + 1}`}
851
+ placeholder={`Input number ${i + 1}`}
852
+ data-testid={`perf-input-${i}`}
853
+ variant={i % 3 === 0 ? 'glass' : i % 3 === 1 ? 'gradient' : 'outlined'}
854
+ />
855
+ ));
856
+
857
+ return (
858
+ <div
859
+ style={{
860
+ display: 'grid',
861
+ gridTemplateColumns: 'repeat(auto-fit, minmax(300px, 1fr))',
862
+ gap: '16px',
863
+ maxHeight: '400px',
864
+ overflowY: 'auto',
865
+ padding: '16px',
866
+ }}
867
+ >
868
+ {inputs}
869
+ </div>
870
+ );
871
+ },
872
+ play: async ({ canvasElement, step }) => {
873
+ const canvas = within(canvasElement);
874
+
875
+ await step('Measure render time for multiple inputs', async () => {
876
+ const startTime = window.performance.now();
877
+ const inputs = canvas.getAllByTestId(/perf-input-/);
878
+ const endTime = window.performance.now();
879
+
880
+ const renderTime = endTime - startTime;
881
+ // console.log(`Found ${inputs.length} inputs in ${renderTime}ms`);
882
+
883
+ // Assert we have all inputs
884
+ await expect(inputs).toHaveLength(50);
885
+
886
+ // Assert reasonable performance (adjust threshold as needed)
887
+ await expect(renderTime).toBeLessThan(100);
888
+ });
889
+
890
+ await step('Test interaction performance', async () => {
891
+ // Test clicking on several inputs rapidly
892
+ const inputs = canvas.getAllByTestId(/perf-input-/).slice(0, 5);
893
+
894
+ const startTime = window.performance.now();
895
+
896
+ for (const input of inputs) {
897
+ await userEvent.click(input);
898
+ await userEvent.type(input, 'fast');
899
+ await userEvent.clear(input);
900
+ }
901
+
902
+ const endTime = window.performance.now();
903
+ const interactionTime = endTime - startTime;
904
+
905
+ // console.log(`Interaction test completed in ${interactionTime}ms`);
906
+
907
+ // Should complete interactions in reasonable time
908
+ await expect(interactionTime).toBeLessThan(2000);
909
+ });
910
+
911
+ await step('Test scroll performance', async () => {
912
+ const container = canvasElement.querySelector('[style*="overflowY"]') as HTMLElement;
913
+
914
+ if (container) {
915
+ // Simulate scrolling
916
+ container.scrollTop = 100;
917
+ await new Promise((resolve) => window.setTimeout(resolve, 100));
918
+
919
+ container.scrollTop = 200;
920
+ await new Promise((resolve) => window.setTimeout(resolve, 100));
921
+
922
+ // Verify scroll worked
923
+ await expect(container.scrollTop).toBeGreaterThan(0);
924
+ }
925
+ });
926
+ },
927
+ };
928
+
929
+ // ============================================================================
930
+ // INTEGRATION TESTS
931
+ // ============================================================================
932
+
933
+ export const IntegrationTest: Story = {
934
+ name: '🔗 Integration Test',
935
+ render: () => {
936
+ const IntegrationComponent = () => {
937
+ const [formData, setFormData] = useState({
938
+ firstName: '',
939
+ lastName: '',
940
+ email: '',
941
+ password: '',
942
+ confirmPassword: '',
943
+ });
944
+ const [errors, setErrors] = useState<Record<string, string>>({});
945
+ const [showPassword, setShowPassword] = useState(false);
946
+
947
+ const handleChange = (field: string) => (e: React.ChangeEvent<HTMLInputElement>) => {
948
+ const newValue = e.target.value;
949
+ const newFormData = { ...formData, [field]: newValue };
950
+ setFormData(newFormData);
951
+
952
+ // Validate this specific field
953
+ const newErrors = { ...errors };
954
+
955
+ if (field === 'firstName' && !newValue) {
956
+ newErrors.firstName = 'First name is required';
957
+ } else if (field === 'firstName') {
958
+ delete newErrors.firstName;
959
+ }
960
+
961
+ if (field === 'lastName' && !newValue) {
962
+ newErrors.lastName = 'Last name is required';
963
+ } else if (field === 'lastName') {
964
+ delete newErrors.lastName;
965
+ }
966
+
967
+ if (field === 'email' && !newValue) {
968
+ newErrors.email = 'Email is required';
969
+ } else if (field === 'email') {
970
+ delete newErrors.email;
971
+ }
972
+
973
+ if (field === 'password' && !newValue) {
974
+ newErrors.password = 'Password is required';
975
+ } else if (field === 'password') {
976
+ delete newErrors.password;
977
+ }
978
+
979
+ if (field === 'confirmPassword') {
980
+ if (!newValue) {
981
+ newErrors.confirmPassword = 'Confirm password is required';
982
+ } else if (newFormData.password !== newValue) {
983
+ newErrors.confirmPassword = 'Passwords do not match';
984
+ } else {
985
+ delete newErrors.confirmPassword;
986
+ }
987
+ }
988
+
989
+ // Also check password match when password field changes
990
+ if (field === 'password' && newFormData.confirmPassword) {
991
+ if (newValue !== newFormData.confirmPassword) {
992
+ newErrors.confirmPassword = 'Passwords do not match';
993
+ } else {
994
+ delete newErrors.confirmPassword;
995
+ }
996
+ }
997
+
998
+ setErrors(newErrors);
999
+ };
1000
+
1001
+ const validateForm = () => {
1002
+ const newErrors: Record<string, string> = {};
1003
+
1004
+ if (!formData.firstName) newErrors.firstName = 'First name is required';
1005
+ if (!formData.lastName) newErrors.lastName = 'Last name is required';
1006
+ if (!formData.email) newErrors.email = 'Email is required';
1007
+ if (!formData.password) newErrors.password = 'Password is required';
1008
+ if (!formData.confirmPassword) {
1009
+ newErrors.confirmPassword = 'Confirm password is required';
1010
+ } else if (formData.password !== formData.confirmPassword) {
1011
+ newErrors.confirmPassword = 'Passwords do not match';
1012
+ }
1013
+
1014
+ setErrors(newErrors);
1015
+ return Object.keys(newErrors).length === 0;
1016
+ };
1017
+
1018
+ const handleSubmit = (e: React.FormEvent) => {
1019
+ e.preventDefault();
1020
+ if (validateForm()) {
1021
+ window.alert('Form submitted successfully!');
1022
+ }
1023
+ };
1024
+
1025
+ return (
1026
+ <form
1027
+ onSubmit={handleSubmit}
1028
+ style={{ display: 'flex', flexDirection: 'column', gap: '16px', width: '400px' }}
1029
+ >
1030
+ <div style={{ display: 'flex', gap: '16px' }}>
1031
+ <Input
1032
+ label="First Name"
1033
+ value={formData.firstName}
1034
+ onChange={handleChange('firstName')}
1035
+ error={!!errors.firstName}
1036
+ helperText={errors.firstName}
1037
+ data-testid="first-name"
1038
+ startAdornment={<Person />}
1039
+ fullWidth
1040
+ />
1041
+ <Input
1042
+ label="Last Name"
1043
+ value={formData.lastName}
1044
+ onChange={handleChange('lastName')}
1045
+ error={!!errors.lastName}
1046
+ helperText={errors.lastName}
1047
+ data-testid="last-name"
1048
+ fullWidth
1049
+ />
1050
+ </div>
1051
+
1052
+ <Input
1053
+ label="Email"
1054
+ type="email"
1055
+ value={formData.email}
1056
+ onChange={handleChange('email')}
1057
+ error={!!errors.email}
1058
+ helperText={errors.email}
1059
+ data-testid="email"
1060
+ startAdornment={<Email />}
1061
+ />
1062
+
1063
+ <Input
1064
+ label="Password"
1065
+ type={showPassword ? 'text' : 'password'}
1066
+ value={formData.password}
1067
+ onChange={handleChange('password')}
1068
+ error={!!errors.password}
1069
+ helperText={errors.password}
1070
+ data-testid="password"
1071
+ startAdornment={<Lock />}
1072
+ endAdornment={
1073
+ <IconButton
1074
+ onClick={() => setShowPassword(!showPassword)}
1075
+ data-testid="password-toggle"
1076
+ >
1077
+ {showPassword ? <VisibilityOff /> : <Visibility />}
1078
+ </IconButton>
1079
+ }
1080
+ />
1081
+
1082
+ <Input
1083
+ label="Confirm Password"
1084
+ type="password"
1085
+ value={formData.confirmPassword}
1086
+ onChange={handleChange('confirmPassword')}
1087
+ error={!!errors.confirmPassword}
1088
+ helperText={errors.confirmPassword}
1089
+ data-testid="confirm-password"
1090
+ startAdornment={<Lock />}
1091
+ />
1092
+
1093
+ <button type="submit" data-testid="submit-form">
1094
+ Register
1095
+ </button>
1096
+
1097
+ <div data-testid="form-summary">
1098
+ Form Valid:{' '}
1099
+ {Object.keys(errors).length === 0 && Object.values(formData).every((v) => v.length > 0)
1100
+ ? 'Yes'
1101
+ : 'No'}{' '}
1102
+ | Fields Filled: {Object.values(formData).filter((v) => v.length > 0).length}/5
1103
+ </div>
1104
+ </form>
1105
+ );
1106
+ };
1107
+
1108
+ return <IntegrationComponent />;
1109
+ },
1110
+ play: async ({ canvasElement, step }) => {
1111
+ const canvas = within(canvasElement);
1112
+
1113
+ await step('Fill out form fields', async () => {
1114
+ await userEvent.type(canvas.getByTestId('first-name'), 'John');
1115
+ await userEvent.type(canvas.getByTestId('last-name'), 'Doe');
1116
+ await userEvent.type(canvas.getByTestId('email'), 'john.doe@example.com');
1117
+ await userEvent.type(canvas.getByTestId('password'), 'securePassword123');
1118
+ await userEvent.type(canvas.getByTestId('confirm-password'), 'securePassword123');
1119
+ });
1120
+
1121
+ await step('Verify form state updates', async () => {
1122
+ const summary = canvas.getByTestId('form-summary');
1123
+ await expect(summary).toHaveTextContent('Fields Filled: 5/5');
1124
+ });
1125
+
1126
+ await step('Test password visibility toggle', async () => {
1127
+ const passwordInput = canvas.getByTestId('password');
1128
+ const toggleButton = canvas.getByTestId('password-toggle');
1129
+
1130
+ // Should be password type initially
1131
+ await expect(passwordInput).toHaveAttribute('type', 'password');
1132
+
1133
+ // Click toggle
1134
+ await userEvent.click(toggleButton);
1135
+ await expect(passwordInput).toHaveAttribute('type', 'text');
1136
+
1137
+ // Click again to hide
1138
+ await userEvent.click(toggleButton);
1139
+ await expect(passwordInput).toHaveAttribute('type', 'password');
1140
+ });
1141
+
1142
+ await step('Test form validation on submit', async () => {
1143
+ // Clear one field to trigger validation
1144
+ const firstNameInput = canvas.getByTestId('first-name');
1145
+ await userEvent.clear(firstNameInput);
1146
+
1147
+ const submitButton = canvas.getByTestId('submit-form');
1148
+ await userEvent.click(submitButton);
1149
+
1150
+ // Should show error
1151
+ await waitFor(async () => {
1152
+ await expect(canvas.getByText('First name is required')).toBeInTheDocument();
1153
+ });
1154
+
1155
+ // Form should be invalid
1156
+ const summary = canvas.getByTestId('form-summary');
1157
+ await expect(summary).toHaveTextContent('Form Valid: No');
1158
+ });
1159
+
1160
+ await step('Fix validation error', async () => {
1161
+ const firstNameInput = canvas.getByTestId('first-name');
1162
+ await userEvent.type(firstNameInput, 'John');
1163
+
1164
+ // Error should clear
1165
+ await waitFor(async () => {
1166
+ expect(canvas.queryByText('First name is required')).not.toBeInTheDocument();
1167
+ });
1168
+
1169
+ // Check that all fields are filled
1170
+ const summary = canvas.getByTestId('form-summary');
1171
+ await waitFor(async () => {
1172
+ await expect(summary).toHaveTextContent('Fields Filled: 5/5');
1173
+ });
1174
+
1175
+ // Form should be valid again (all fields filled and no errors)
1176
+ await waitFor(
1177
+ async () => {
1178
+ await expect(summary).toHaveTextContent('Form Valid: Yes');
1179
+ },
1180
+ { timeout: 2000 },
1181
+ );
1182
+ });
1183
+ },
1184
+ };