@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,825 @@
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
+ import { useState } from 'react';
3
+ import { expect, userEvent, waitFor,within } from 'storybook/test';
4
+
5
+ import { Autocomplete } from './Autocomplete';
6
+ import type { AutocompleteProps } from './Autocomplete.types';
7
+
8
+ interface Person {
9
+ id: string;
10
+ name: string;
11
+ email: string;
12
+ department?: string;
13
+ }
14
+
15
+ const samplePeople: Person[] = [
16
+ { id: '1', name: 'John Doe', email: 'john@example.com', department: 'Engineering' },
17
+ { id: '2', name: 'Jane Smith', email: 'jane@example.com', department: 'Design' },
18
+ { id: '3', name: 'Bob Johnson', email: 'bob@example.com', department: 'Marketing' },
19
+ { id: '4', name: 'Alice Brown', email: 'alice@example.com', department: 'Engineering' },
20
+ { id: '5', name: 'Charlie Wilson', email: 'charlie@example.com', department: 'Sales' },
21
+ ];
22
+
23
+ const stringSuggestions = ['Apple', 'Banana', 'Cherry', 'Date', 'Elderberry', 'Fig', 'Grape'];
24
+
25
+ const meta: Meta<typeof Autocomplete> = {
26
+ title: 'Form/Autocomplete/Tests',
27
+ component: Autocomplete,
28
+ tags: ['autodocs', 'test', 'component:Autocomplete'],
29
+ parameters: {
30
+ docs: {
31
+ description: {
32
+ component:
33
+ 'A comprehensive autocomplete component with ARIA support, keyboard navigation, and multiple selection modes.',
34
+ },
35
+ },
36
+ },
37
+ argTypes: {
38
+ value: { control: 'text' },
39
+ suggestions: { control: false },
40
+ multiple: { control: 'boolean' },
41
+ disabled: { control: 'boolean' },
42
+ allowFreeText: { control: 'boolean' },
43
+ showGhostText: { control: 'boolean' },
44
+ matchMode: { control: { type: 'select', options: ['contains', 'startsWith', 'fuzzy'] } },
45
+ debounceMs: { control: { type: 'number', min: 0, max: 1000 } },
46
+ maxVisibleItems: { control: { type: 'number', min: 1, max: 20 } },
47
+ },
48
+ };
49
+
50
+ export default meta;
51
+ type Story = StoryObj<typeof Autocomplete>;
52
+
53
+ // Test Component wrapper for controlled state
54
+ const AutocompleteWrapper = (props: Partial<AutocompleteProps<Person | string>>) => {
55
+ const [value, setValue] = useState(props.value || '');
56
+ const [selectedItems, setSelectedItems] = useState(props.selectedItems || []);
57
+
58
+ return (
59
+ <div style={{ padding: '20px', minHeight: '200px' }}>
60
+ <Autocomplete
61
+ {...props}
62
+ value={value}
63
+ onChange={setValue}
64
+ selectedItems={selectedItems}
65
+ onSelectedItemsChange={setSelectedItems}
66
+ />
67
+ </div>
68
+ );
69
+ };
70
+
71
+ // Basic Tests
72
+ export const Default: Story = {
73
+ render: () => (
74
+ <AutocompleteWrapper suggestions={stringSuggestions} placeholder="Type to search fruits..." />
75
+ ),
76
+ play: async ({ canvasElement }) => {
77
+ const canvas = within(canvasElement);
78
+ const input = canvas.getByRole('combobox');
79
+
80
+ // Test input is present and accessible
81
+ await expect(input).toBeInTheDocument();
82
+ await expect(input).toHaveAttribute('aria-expanded', 'false');
83
+
84
+ // Test typing shows suggestions
85
+ await userEvent.click(input);
86
+ await userEvent.type(input, 'ap');
87
+
88
+ // Wait for listbox to appear first (which confirms dropdown opened)
89
+ const listbox = await canvas.findByRole('listbox');
90
+ await expect(listbox).toBeInTheDocument();
91
+
92
+ // Now check aria-expanded is true
93
+ await expect(input).toHaveAttribute('aria-expanded', 'true');
94
+
95
+ const options = canvas.getAllByRole('option');
96
+ await expect(options).toHaveLength(2); // Apple, Grape (both contain "ap")
97
+ await expect(options[0]).toHaveTextContent('Apple');
98
+ await expect(options[1]).toHaveTextContent('Grape');
99
+ },
100
+ };
101
+
102
+ export const WithObjectSuggestions: Story = {
103
+ render: () => (
104
+ <AutocompleteWrapper
105
+ suggestions={samplePeople}
106
+ getKey={(person: Person) => person.id}
107
+ getLabel={(person: Person) => person.name}
108
+ getDescription={(person: Person) => `${person.email} - ${person.department}`}
109
+ placeholder="Search people..."
110
+ />
111
+ ),
112
+ play: async ({ canvasElement }) => {
113
+ const canvas = within(canvasElement);
114
+ const input = canvas.getByRole('combobox');
115
+
116
+ await userEvent.click(input);
117
+ await userEvent.type(input, 'john');
118
+
119
+ // Wait for listbox to appear first
120
+ const listbox = await canvas.findByRole('listbox');
121
+ await expect(listbox).toBeInTheDocument();
122
+
123
+ const options = canvas.getAllByRole('option');
124
+ await expect(options).toHaveLength(2); // John Doe, Bob Johnson
125
+
126
+ // Test custom rendering with description
127
+ await expect(options[0]).toHaveTextContent('john@example.com - Engineering');
128
+ },
129
+ };
130
+
131
+ // Ghost Text Tests
132
+ export const GhostText: Story = {
133
+ render: () => (
134
+ <AutocompleteWrapper
135
+ suggestions={stringSuggestions}
136
+ showGhostText={true}
137
+ placeholder="Type 'ap' to see ghost text..."
138
+ />
139
+ ),
140
+ play: async ({ canvasElement }) => {
141
+ const canvas = within(canvasElement);
142
+ const input = canvas.getByRole('combobox');
143
+
144
+ // Focus input first to enable ghost text
145
+ await userEvent.click(input);
146
+ await userEvent.type(input, 'ap');
147
+
148
+ // Wait for listbox to appear first
149
+ const listbox = await canvas.findByRole('listbox');
150
+ await expect(listbox).toBeInTheDocument();
151
+
152
+ // Test ghost text appears - look for the new inline suggestion pattern
153
+ // Since we're using the new pattern, check for the presence of the suggestion
154
+ const options = canvas.getAllByRole('option');
155
+ await expect(options).toHaveLength(2); // Apple, Grape both contain "ap"
156
+ await expect(options[0]).toHaveTextContent('Apple');
157
+
158
+ // Test that Tab key completes the ghost text
159
+ await userEvent.keyboard('{Tab}');
160
+ await expect(input).toHaveValue('apple'); // lowercase because user typed "ap"
161
+ // Verify dropdown closes after completion
162
+ await waitFor(() => expect(input).toHaveAttribute('aria-expanded', 'false'));
163
+ },
164
+ };
165
+
166
+ export const GhostTextArrowRight: Story = {
167
+ render: () => (
168
+ <AutocompleteWrapper
169
+ suggestions={stringSuggestions}
170
+ showGhostText={true}
171
+ placeholder="Type 'ch' and press ArrowRight..."
172
+ />
173
+ ),
174
+ play: async ({ canvasElement }) => {
175
+ const canvas = within(canvasElement);
176
+ const input = canvas.getByRole('combobox');
177
+
178
+ // Focus and type to trigger ghost text
179
+ await userEvent.click(input);
180
+ await userEvent.type(input, 'ch');
181
+
182
+ // Wait for listbox to appear first
183
+ const listbox = await canvas.findByRole('listbox');
184
+ await expect(listbox).toBeInTheDocument();
185
+
186
+ // Verify suggestion appears
187
+ const options = canvas.getAllByRole('option');
188
+ await expect(options).toHaveLength(1);
189
+ await expect(options[0]).toHaveTextContent('Cherry');
190
+
191
+ // Test that ArrowRight key completes the ghost text
192
+ await userEvent.keyboard('{ArrowRight}');
193
+ await expect(input).toHaveValue('Cherry');
194
+ await waitFor(() => expect(input).toHaveAttribute('aria-expanded', 'false'));
195
+ },
196
+ };
197
+
198
+ export const FocusBlurBehavior: Story = {
199
+ name: '🔄 Focus/Blur Behavior Test',
200
+ render: () => (
201
+ <AutocompleteWrapper
202
+ suggestions={stringSuggestions}
203
+ showGhostText={true}
204
+ placeholder="Test focus/blur behavior..."
205
+ data-testid="focus-blur-autocomplete"
206
+ />
207
+ ),
208
+ play: async ({ canvasElement, step }) => {
209
+ const canvas = within(canvasElement);
210
+
211
+ await step('Initial state verification', async () => {
212
+ const input = canvas.getByRole('combobox');
213
+ await expect(input).toBeInTheDocument();
214
+ await expect(input).toHaveAttribute('aria-expanded', 'false');
215
+ });
216
+
217
+ await step('Open dropdown with typing', async () => {
218
+ const input = canvas.getByRole('combobox');
219
+ await userEvent.click(input);
220
+ await userEvent.type(input, 'ap');
221
+
222
+ // Wait for listbox to appear
223
+ const listbox = await canvas.findByRole('listbox');
224
+ await expect(listbox).toBeInTheDocument();
225
+ await expect(input).toHaveAttribute('aria-expanded', 'true');
226
+ });
227
+
228
+ await step('Close dropdown (test dropdown close functionality)', async () => {
229
+ const input = canvas.getByRole('combobox');
230
+ // Try multiple methods to close dropdown
231
+ await userEvent.keyboard('{Escape}');
232
+
233
+ // Give some time for the state to update
234
+ await waitFor(() => expect(input).toHaveAttribute('aria-expanded', 'false'), {
235
+ timeout: 1000,
236
+ });
237
+ });
238
+ },
239
+ };
240
+
241
+ // Keyboard Navigation Tests
242
+ export const KeyboardNavigation: Story = {
243
+ name: '⌨️ Keyboard Navigation Test',
244
+ render: () => (
245
+ <AutocompleteWrapper
246
+ suggestions={stringSuggestions}
247
+ placeholder="Test keyboard navigation..."
248
+ data-testid="keyboard-nav-autocomplete"
249
+ />
250
+ ),
251
+ play: async ({ canvasElement, step }) => {
252
+ const canvas = within(canvasElement);
253
+
254
+ await step('Open dropdown with typing', async () => {
255
+ const input = canvas.getByRole('combobox');
256
+ await userEvent.click(input);
257
+ await userEvent.type(input, 'e');
258
+
259
+ // Wait for listbox to appear
260
+ const listbox = await canvas.findByRole('listbox');
261
+ await expect(listbox).toBeInTheDocument();
262
+ });
263
+
264
+ await step('Verify options are displayed', async () => {
265
+ const options = canvas.getAllByRole('option');
266
+ await expect(options).toHaveLength(5); // Apple, Cherry, Date, Elderberry, Grape
267
+ });
268
+
269
+ await step('Test arrow key navigation', async () => {
270
+ const input = canvas.getByRole('combobox');
271
+ const options = canvas.getAllByRole('option');
272
+
273
+ // Navigate down - should select some option
274
+ await userEvent.keyboard('{ArrowDown}');
275
+
276
+ // Wait for some option to become selected
277
+ await waitFor(() => {
278
+ const selectedOptions = options.filter(
279
+ (option) => option.getAttribute('aria-selected') === 'true',
280
+ );
281
+ expect(selectedOptions.length).toBeGreaterThan(0);
282
+ });
283
+
284
+ // Test selection with Enter
285
+ await userEvent.keyboard('{Enter}');
286
+
287
+ // Should have some value selected
288
+ const finalValue = input.getAttribute('value') || '';
289
+ expect(finalValue.length).toBeGreaterThan(0);
290
+ });
291
+ },
292
+ };
293
+
294
+ // Multiple Selection Tests
295
+ export const MultipleSelection: Story = {
296
+ render: () => (
297
+ <AutocompleteWrapper
298
+ suggestions={stringSuggestions}
299
+ multiple={true}
300
+ placeholder="Select multiple fruits..."
301
+ />
302
+ ),
303
+ play: async ({ canvasElement }) => {
304
+ const canvas = within(canvasElement);
305
+ const input = canvas.getByRole('combobox');
306
+
307
+ // Select first item
308
+ await userEvent.click(input);
309
+ await userEvent.type(input, 'Apple', { delay: 50 });
310
+
311
+ // Wait for dropdown and select
312
+ await waitFor(() => expect(canvas.queryByRole('listbox')).toBeInTheDocument(), {
313
+ timeout: 1500,
314
+ });
315
+ await userEvent.keyboard('{Enter}');
316
+
317
+ // Wait for first chip to appear and input to clear
318
+ await waitFor(
319
+ () => {
320
+ const chip = canvas.getByTestId('selected-chip-0');
321
+ expect(chip).toBeInTheDocument();
322
+ expect(input).toHaveValue('');
323
+ },
324
+ { timeout: 2000 },
325
+ );
326
+
327
+ // Wait for the dropdown to settle closed after the first selection (deterministic,
328
+ // instead of a fixed debounce sleep) before starting the second selection.
329
+ await waitFor(() => expect(canvas.queryByRole('listbox')).not.toBeInTheDocument());
330
+
331
+ // Select second item
332
+ await userEvent.type(input, 'Banana', { delay: 50 });
333
+
334
+ // Wait for dropdown and select
335
+ await waitFor(() => expect(canvas.queryByRole('listbox')).toBeInTheDocument(), {
336
+ timeout: 1500,
337
+ });
338
+ await userEvent.keyboard('{Enter}');
339
+
340
+ // Should have 2 chips
341
+ await waitFor(
342
+ () => {
343
+ const chip0 = canvas.getByTestId('selected-chip-0');
344
+ const chip1 = canvas.getByTestId('selected-chip-1');
345
+ expect(chip0).toBeInTheDocument();
346
+ expect(chip1).toBeInTheDocument();
347
+ },
348
+ { timeout: 2000 },
349
+ );
350
+ },
351
+ };
352
+
353
+ // Async Loading Tests
354
+ export const AsyncLoading: Story = {
355
+ render: () => (
356
+ <AutocompleteWrapper
357
+ suggestions={stringSuggestions}
358
+ async={true}
359
+ isLoading={true}
360
+ placeholder="Async autocomplete..."
361
+ />
362
+ ),
363
+ play: async ({ canvasElement }) => {
364
+ const canvas = within(canvasElement);
365
+ const input = canvas.getByRole('combobox');
366
+
367
+ await userEvent.click(input);
368
+ await userEvent.type(input, 'test');
369
+
370
+ // Wait for dropdown to open due to loading state
371
+ await waitFor(
372
+ async () => {
373
+ await expect(input).toHaveAttribute('aria-expanded', 'true');
374
+ },
375
+ { timeout: 1000 },
376
+ );
377
+
378
+ // Check loading indicator in input - it's in the InputProps endAdornment
379
+ // We verify loading state by checking for the loading text in dropdown
380
+ // The CircularProgress in the input is harder to query reliably
381
+
382
+ // Check for loading text in dropdown
383
+ await waitFor(
384
+ async () => {
385
+ const loadingText = canvas.getByText('Loading...');
386
+ await expect(loadingText).toBeInTheDocument();
387
+ },
388
+ { timeout: 1000 },
389
+ );
390
+ },
391
+ };
392
+
393
+ // Match Mode Tests
394
+ export const FuzzyMatchingTest: Story = {
395
+ render: () => (
396
+ <AutocompleteWrapper
397
+ suggestions={['JavaScript', 'TypeScript', 'CoffeeScript', 'ActionScript']}
398
+ matchMode="fuzzy"
399
+ placeholder="Type 'jvs' for fuzzy matching..."
400
+ />
401
+ ),
402
+ play: async ({ canvasElement }) => {
403
+ const canvas = within(canvasElement);
404
+ const input = canvas.getByRole('combobox');
405
+
406
+ // Test fuzzy matching
407
+ await userEvent.click(input);
408
+ await userEvent.type(input, 'jvs');
409
+
410
+ // Wait for listbox to appear first
411
+ const listbox = await canvas.findByRole('listbox');
412
+ await expect(listbox).toBeInTheDocument();
413
+
414
+ const options = canvas.getAllByRole('option');
415
+ await expect(options).toHaveLength(1);
416
+ await expect(options[0]).toHaveTextContent('JavaScript');
417
+ },
418
+ };
419
+
420
+ // Disabled State Tests
421
+ export const DisabledState: Story = {
422
+ render: () => (
423
+ <AutocompleteWrapper
424
+ suggestions={stringSuggestions}
425
+ disabled={true}
426
+ placeholder="This is disabled..."
427
+ />
428
+ ),
429
+ play: async ({ canvasElement }) => {
430
+ const canvas = within(canvasElement);
431
+ const input = canvas.getByRole('combobox');
432
+
433
+ await expect(input).toBeDisabled();
434
+
435
+ // Try typing - should not work
436
+ await userEvent.type(input, 'test');
437
+ await expect(input).toHaveValue('');
438
+ },
439
+ };
440
+
441
+ // No Results Tests
442
+ export const NoResults: Story = {
443
+ render: () => (
444
+ <AutocompleteWrapper
445
+ suggestions={stringSuggestions}
446
+ placeholder="Type 'xyz' for no results..."
447
+ />
448
+ ),
449
+ play: async ({ canvasElement }) => {
450
+ const canvas = within(canvasElement);
451
+ const input = canvas.getByRole('combobox');
452
+
453
+ await userEvent.click(input);
454
+ await userEvent.type(input, 'xyz');
455
+
456
+ // Wait for the dropdown to open with no results message
457
+ await waitFor(
458
+ async () => {
459
+ const noResults = canvas.getByText('No results found');
460
+ await expect(noResults).toBeInTheDocument();
461
+ },
462
+ { timeout: 1000 },
463
+ );
464
+ },
465
+ };
466
+
467
+ // Escape Key Tests
468
+ export const EscapeKey: Story = {
469
+ render: () => (
470
+ <AutocompleteWrapper
471
+ suggestions={stringSuggestions}
472
+ placeholder="Test escape key behavior..."
473
+ />
474
+ ),
475
+ play: async ({ canvasElement }) => {
476
+ const canvas = within(canvasElement);
477
+ const input = canvas.getByRole('combobox');
478
+
479
+ // Open suggestions
480
+ await userEvent.click(input);
481
+ await userEvent.type(input, 'apple');
482
+
483
+ // Wait for dropdown to open
484
+ await waitFor(() => expect(input).toHaveAttribute('aria-expanded', 'true'), {
485
+ timeout: 1000,
486
+ });
487
+
488
+ // Single escape closes dropdown
489
+ await userEvent.keyboard('{Escape}');
490
+ await waitFor(() => expect(input).toHaveAttribute('aria-expanded', 'false'));
491
+ await expect(input).toHaveValue('apple');
492
+
493
+ // Double escape clears value (simulated by double press)
494
+ await userEvent.keyboard('{Escape}');
495
+ await userEvent.keyboard('{Escape}');
496
+ // Note: Double escape detection requires special handling
497
+ },
498
+ };
499
+
500
+ // Free Text Tests
501
+ export const FreeText: Story = {
502
+ render: () => (
503
+ <AutocompleteWrapper
504
+ suggestions={stringSuggestions}
505
+ allowFreeText={true}
506
+ placeholder="Type anything and press Enter..."
507
+ />
508
+ ),
509
+ play: async ({ canvasElement }) => {
510
+ const canvas = within(canvasElement);
511
+ const input = canvas.getByRole('combobox');
512
+
513
+ // Type custom text not in suggestions
514
+ await userEvent.type(input, 'Custom Value');
515
+ await userEvent.keyboard('{Enter}');
516
+
517
+ await expect(input).toHaveValue('Custom Value');
518
+ },
519
+ };
520
+
521
+ // Accessibility Tests
522
+ export const AccessibilityCompliance: Story = {
523
+ render: () => (
524
+ <AutocompleteWrapper
525
+ suggestions={samplePeople}
526
+ getKey={(person: Person) => person.id}
527
+ getLabel={(person: Person) => person.name}
528
+ inputAriaLabel="Search for team members"
529
+ placeholder="Search team members..."
530
+ />
531
+ ),
532
+ play: async ({ canvasElement }) => {
533
+ const canvas = within(canvasElement);
534
+ const input = canvas.getByRole('combobox');
535
+
536
+ // Test ARIA attributes
537
+ await expect(input).toHaveAttribute('role', 'combobox');
538
+ await expect(input).toHaveAttribute('aria-autocomplete', 'list');
539
+ await expect(input).toHaveAttribute('aria-expanded', 'false');
540
+ await expect(input).toHaveAttribute('aria-label', 'Search for team members');
541
+
542
+ // Open dropdown
543
+ await userEvent.click(input);
544
+ await userEvent.type(input, 'john');
545
+
546
+ // Wait for dropdown to open
547
+ await waitFor(() => expect(input).toHaveAttribute('aria-expanded', 'true'), {
548
+ timeout: 1000,
549
+ });
550
+ await expect(input).toHaveAttribute('aria-controls');
551
+
552
+ const listbox = canvas.getByRole('listbox');
553
+ await expect(listbox).toBeInTheDocument();
554
+
555
+ const options = canvas.getAllByRole('option');
556
+ // Options should have aria-selected attribute (first may be true if active)
557
+ options.forEach((option) => {
558
+ expect(option).toHaveAttribute('aria-selected');
559
+ });
560
+ },
561
+ };
562
+
563
+ // Performance Tests
564
+ export const LargeDataset: Story = {
565
+ render: () => {
566
+ const largeSuggestions = Array.from({ length: 1000 }, (_, i) => `Item ${i + 1}`);
567
+
568
+ return (
569
+ <AutocompleteWrapper
570
+ suggestions={largeSuggestions}
571
+ maxVisibleItems={10}
572
+ debounceMs={300}
573
+ placeholder="Search 1000 items..."
574
+ />
575
+ );
576
+ },
577
+ play: async ({ canvasElement }) => {
578
+ const canvas = within(canvasElement);
579
+ const input = canvas.getByRole('combobox');
580
+
581
+ // Test with large dataset
582
+ await userEvent.click(input);
583
+ await userEvent.type(input, '99');
584
+
585
+ // Wait for listbox to appear first
586
+ const listbox = await canvas.findByRole('listbox');
587
+ await expect(listbox).toBeInTheDocument();
588
+
589
+ const options = canvas.getAllByRole('option');
590
+ // Should limit visible items
591
+ await expect(options.length).toBeLessThanOrEqual(10);
592
+ },
593
+ };
594
+
595
+ // Edge Cases
596
+ export const EdgeCases: Story = {
597
+ render: () => (
598
+ <AutocompleteWrapper
599
+ suggestions={['', 'Normal Item', ' Spaces ', 'Special!@#$%^&*()']}
600
+ placeholder="Test edge cases..."
601
+ />
602
+ ),
603
+ play: async ({ canvasElement }) => {
604
+ const canvas = within(canvasElement);
605
+ const input = canvas.getByRole('combobox');
606
+
607
+ // Test searching for items with spaces
608
+ await userEvent.click(input);
609
+ await userEvent.type(input, 'Spaces');
610
+
611
+ // Wait for listbox to appear
612
+ await waitFor(() => expect(canvas.queryByRole('listbox')).toBeInTheDocument(), {
613
+ timeout: 1000,
614
+ });
615
+
616
+ // Should handle empty and special characters
617
+ const options = canvas.getAllByRole('option');
618
+ await expect(options.length).toBeGreaterThan(0);
619
+ },
620
+ };
621
+
622
+ // Form Interaction Tests
623
+ export const FormInteraction: Story = {
624
+ render: () => (
625
+ <AutocompleteWrapper suggestions={stringSuggestions} placeholder="Form interaction test..." />
626
+ ),
627
+ play: async ({ canvasElement }) => {
628
+ const canvas = within(canvasElement);
629
+ const input = canvas.getByRole('combobox');
630
+
631
+ // Test form submission behavior
632
+ await userEvent.click(input);
633
+ await userEvent.type(input, 'Apple');
634
+
635
+ // Wait for dropdown and select
636
+ const listbox = await canvas.findByRole('listbox');
637
+ await expect(listbox).toBeInTheDocument();
638
+
639
+ await userEvent.keyboard('{Enter}');
640
+ await expect(input).toHaveValue('Apple');
641
+
642
+ // Test that form would submit correctly (value is selected)
643
+ const finalValue = input.getAttribute('value') || '';
644
+ expect(finalValue).toBe('Apple');
645
+ },
646
+ };
647
+
648
+ // Responsive Design Tests
649
+ export const ResponsiveDesign: Story = {
650
+ render: () => (
651
+ <div style={{ width: '100%', maxWidth: '300px' }}>
652
+ <AutocompleteWrapper suggestions={stringSuggestions} placeholder="Responsive test..." />
653
+ </div>
654
+ ),
655
+ play: async ({ canvasElement }) => {
656
+ const canvas = within(canvasElement);
657
+ const input = canvas.getByRole('combobox');
658
+
659
+ // Test responsive behavior
660
+ await userEvent.click(input);
661
+ await userEvent.type(input, 'a');
662
+
663
+ // Wait for dropdown to appear
664
+ const listbox = await canvas.findByRole('listbox');
665
+ await expect(listbox).toBeInTheDocument();
666
+
667
+ // Verify dropdown adapts to container width
668
+ const options = canvas.getAllByRole('option');
669
+ expect(options.length).toBeGreaterThan(0);
670
+
671
+ // Test mobile-friendly interaction
672
+ const firstOption = options[0];
673
+ await userEvent.click(firstOption);
674
+
675
+ // Should select the option
676
+ const selectedValue = input.getAttribute('value') || '';
677
+ expect(selectedValue.length).toBeGreaterThan(0);
678
+ },
679
+ };
680
+
681
+ // Theme Variations Tests
682
+ export const ThemeVariations: Story = {
683
+ render: () => (
684
+ <AutocompleteWrapper suggestions={stringSuggestions} placeholder="Theme variation test..." />
685
+ ),
686
+ play: async ({ canvasElement }) => {
687
+ const canvas = within(canvasElement);
688
+ const input = canvas.getByRole('combobox');
689
+
690
+ // Test that component renders with theme
691
+ await expect(input).toBeInTheDocument();
692
+ await expect(input).toHaveAttribute('placeholder', 'Theme variation test...');
693
+
694
+ // Test interaction with theming
695
+ await userEvent.click(input);
696
+ await userEvent.type(input, 'Apple');
697
+
698
+ // Wait for dropdown
699
+ const listbox = await canvas.findByRole('listbox');
700
+ await expect(listbox).toBeInTheDocument();
701
+
702
+ // Verify themed elements render correctly
703
+ const options = canvas.getAllByRole('option');
704
+ expect(options.length).toBeGreaterThan(0);
705
+ await expect(options[0]).toHaveTextContent('Apple');
706
+ },
707
+ };
708
+
709
+ // Visual States Tests
710
+ export const VisualStates: Story = {
711
+ render: () => (
712
+ <AutocompleteWrapper
713
+ suggestions={stringSuggestions}
714
+ placeholder="Visual states test..."
715
+ disabled={false}
716
+ />
717
+ ),
718
+ play: async ({ canvasElement }) => {
719
+ const canvas = within(canvasElement);
720
+ const input = canvas.getByRole('combobox');
721
+
722
+ // Test normal state
723
+ await expect(input).toBeInTheDocument();
724
+ await expect(input).not.toBeDisabled();
725
+
726
+ // Test focus state (waitFor keeps the focus assertion but avoids flakiness).
727
+ await userEvent.click(input);
728
+ await waitFor(() => expect(input).toHaveFocus());
729
+
730
+ // Test with content state
731
+ await userEvent.type(input, 'Test');
732
+ await expect(input).toHaveValue('Test');
733
+
734
+ // Test dropdown open state
735
+ await userEvent.clear(input);
736
+ await userEvent.type(input, 'Apple');
737
+
738
+ const listbox = await canvas.findByRole('listbox');
739
+ await expect(listbox).toBeInTheDocument();
740
+
741
+ // Test selection state
742
+ await userEvent.keyboard('{Enter}');
743
+ await expect(input).toHaveValue('Apple');
744
+ },
745
+ };
746
+
747
+ // Typed suggestions (search vs. link) — Google-style results
748
+ interface SearchLinkItem {
749
+ id: string;
750
+ text: string;
751
+ type: 'search' | 'link';
752
+ url?: string;
753
+ }
754
+
755
+ const searchLinkItems: SearchLinkItem[] = [
756
+ { id: 's1', text: 'Produtos', type: 'search' },
757
+ { id: 's2', text: 'Pedidos', type: 'search' },
758
+ { id: 'l1', text: 'Abrir documentação', type: 'link', url: 'https://example.com/docs' },
759
+ ];
760
+
761
+ const SearchLinkWrapper = () => {
762
+ const [value, setValue] = useState('');
763
+ const [openedUrl, setOpenedUrl] = useState('');
764
+
765
+ return (
766
+ <div style={{ padding: '20px', minHeight: '260px' }}>
767
+ <Autocomplete<SearchLinkItem>
768
+ value={value}
769
+ onChange={setValue}
770
+ suggestions={searchLinkItems}
771
+ getKey={(item) => item.id}
772
+ getLabel={(item) => item.text}
773
+ getSuggestionType={(item) => item.type}
774
+ getUrl={(item) => item.url}
775
+ openLink={(url) => setOpenedUrl(url)}
776
+ placeholder="Buscar ou abrir link..."
777
+ />
778
+ <div data-testid="opened-url">{openedUrl}</div>
779
+ </div>
780
+ );
781
+ };
782
+
783
+ export const SearchAndLinkSuggestions: Story = {
784
+ render: () => <SearchLinkWrapper />,
785
+ play: async ({ canvasElement, step }) => {
786
+ const canvas = within(canvasElement);
787
+ const input = canvas.getByRole('combobox');
788
+
789
+ await step('link suggestion opens the URL and leaves the input unchanged', async () => {
790
+ await userEvent.click(input);
791
+ await userEvent.type(input, 'o'); // matches all three (contains "o")
792
+
793
+ const listbox = await canvas.findByRole('listbox');
794
+ await expect(listbox).toBeInTheDocument();
795
+
796
+ const linkOption = await canvas.findByText('Abrir documentação');
797
+ // A `link` suggestion renders a leading icon.
798
+ await expect(linkOption.closest('[role="option"]')?.querySelector('svg')).toBeInTheDocument();
799
+
800
+ await userEvent.click(linkOption);
801
+
802
+ // openLink fired with the target URL...
803
+ await expect(canvas.getByTestId('opened-url')).toHaveTextContent(
804
+ 'https://example.com/docs',
805
+ );
806
+ // ...and the input value was NOT replaced by the link label.
807
+ await expect(input).toHaveValue('o');
808
+ await waitFor(() => expect(input).toHaveAttribute('aria-expanded', 'false'));
809
+ });
810
+
811
+ await step('search suggestion fills the input', async () => {
812
+ await userEvent.clear(input);
813
+ await userEvent.type(input, 'produt');
814
+
815
+ const searchOption = await canvas.findByText('Produtos');
816
+ await userEvent.click(searchOption);
817
+
818
+ await expect(input).toHaveValue('Produtos');
819
+ // The link was not re-opened by a search selection.
820
+ await expect(canvas.getByTestId('opened-url')).toHaveTextContent(
821
+ 'https://example.com/docs',
822
+ );
823
+ });
824
+ },
825
+ };