@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,666 @@
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
+ import { expect, fn, userEvent, waitFor, within } from 'storybook/test';
3
+
4
+ import { PhoneInput } from './PhoneInput';
5
+
6
+ const meta: Meta<typeof PhoneInput> = {
7
+ title: 'Form/PhoneInput/Tests',
8
+ component: PhoneInput,
9
+ parameters: {
10
+ layout: 'centered',
11
+ chromatic: { disableSnapshot: false },
12
+ docs: {
13
+ description: {
14
+ component: 'Test stories for PhoneInput component validation and interactions',
15
+ },
16
+ },
17
+ },
18
+ tags: ['autodocs', 'test'],
19
+ args: {
20
+ label: 'Phone Number',
21
+ placeholder: 'Enter phone number',
22
+ countryCode: 'US',
23
+ onChange: fn(),
24
+ },
25
+ };
26
+
27
+ export default meta;
28
+ export type Story = StoryObj<typeof meta>;
29
+
30
+ // 1. Interaction Tests
31
+ export const BasicInteraction: Story = {
32
+ args: {
33
+ label: 'Phone Number',
34
+ onChange: fn(),
35
+ },
36
+ play: async ({ canvasElement, args }) => {
37
+ const canvas = within(canvasElement);
38
+
39
+ // Find input field
40
+ const input = canvas.getByRole('textbox');
41
+ await expect(input).toBeInTheDocument();
42
+ await expect(input).toHaveAttribute('type', 'tel');
43
+
44
+ // Clear any existing value
45
+ await userEvent.clear(input);
46
+
47
+ // Type a US phone number
48
+ await userEvent.type(input, '5551234567');
49
+
50
+ // Verify onChange was called with each keystroke
51
+ await waitFor(() => {
52
+ expect(args.onChange).toHaveBeenCalled();
53
+ const lastCall = args.onChange.mock.calls[args.onChange.mock.calls.length - 1];
54
+ expect(lastCall[0]).toContain('5551234567');
55
+ });
56
+
57
+ // Blur to trigger formatting
58
+ await userEvent.tab();
59
+
60
+ // Verify the value is formatted after blur - use longer timeout for formatting
61
+ await waitFor(() => {
62
+ const formattedValue = input.getAttribute('value');
63
+ expect(formattedValue).toMatch(/\+1.*555.*123.*4567/);
64
+ }, { timeout: 3000 });
65
+ },
66
+ };
67
+
68
+ // 2. Form Interaction Tests
69
+ export const FormInteraction: Story = {
70
+ args: {
71
+ required: true,
72
+ error: false,
73
+ },
74
+ play: async ({ canvasElement }) => {
75
+ const canvas = within(canvasElement);
76
+
77
+ const input = canvas.getByRole('textbox');
78
+ await expect(input).toBeInTheDocument();
79
+
80
+ // Clear any existing value
81
+ await userEvent.clear(input);
82
+
83
+ // Type an invalid phone number
84
+ await userEvent.type(input, '123');
85
+
86
+ // Blur to trigger validation
87
+ await userEvent.tab();
88
+
89
+ // Should show validation error - use regex to match partial text
90
+ await waitFor(() => {
91
+ const helperText = canvas.getByText(/Invalid phone number/i);
92
+ expect(helperText).toBeVisible();
93
+ }, { timeout: 3000 });
94
+
95
+ // Clear and type a valid number
96
+ await userEvent.click(input);
97
+ await userEvent.clear(input);
98
+ await userEvent.type(input, '5551234567');
99
+ await userEvent.tab();
100
+
101
+ // Error should be gone
102
+ await waitFor(() => {
103
+ const errorText = canvas.queryByText(/Invalid phone number/i);
104
+ expect(errorText).not.toBeInTheDocument();
105
+ }, { timeout: 3000 });
106
+ },
107
+ };
108
+
109
+ // 3. Keyboard Navigation Tests
110
+ export const KeyboardNavigation: Story = {
111
+ play: async ({ canvasElement }) => {
112
+ const canvas = within(canvasElement);
113
+ const menuScope = within(document.body);
114
+
115
+ // Find country selector button using testId
116
+ const countrySelector = canvas.getByTestId('country-selector');
117
+ await expect(countrySelector).toBeInTheDocument();
118
+
119
+ // Tab to country selector
120
+ await userEvent.tab();
121
+ await expect(countrySelector).toHaveFocus();
122
+
123
+ // Press Enter to open country menu
124
+ await userEvent.keyboard('[Enter]');
125
+
126
+ // Verify menu is open and contains countries - use menuScope for portal
127
+ await waitFor(() => {
128
+ const unitedStates = menuScope.getByText('United States');
129
+ expect(unitedStates).toBeVisible();
130
+
131
+ const unitedKingdom = menuScope.getByText('United Kingdom');
132
+ expect(unitedKingdom).toBeVisible();
133
+ }, { timeout: 3000 });
134
+
135
+ // Navigate with arrow keys
136
+ await userEvent.keyboard('[ArrowDown]');
137
+ await userEvent.keyboard('[ArrowDown]');
138
+
139
+ // Select with Enter
140
+ await userEvent.keyboard('[Enter]');
141
+
142
+ // Menu should close
143
+ await waitFor(() => {
144
+ const menu = menuScope.queryByRole('menu');
145
+ expect(menu).not.toBeInTheDocument();
146
+ }, { timeout: 3000 });
147
+ },
148
+ };
149
+
150
+ // 4. Screen Reader Tests
151
+ export const ScreenReader: Story = {
152
+ play: async ({ canvasElement }) => {
153
+ const canvas = within(canvasElement);
154
+
155
+ // Check for proper ARIA labels
156
+ const input = canvas.getByRole('textbox');
157
+ await expect(input).toHaveAttribute('type', 'tel');
158
+
159
+ // Check label association - use getByLabelText to verify label is properly associated
160
+ const inputByLabel = canvas.getByLabelText('Phone Number');
161
+ await expect(inputByLabel).toBeInTheDocument();
162
+ await expect(inputByLabel).toBe(input);
163
+
164
+ // Check for country selector accessibility using testId
165
+ const countryButton = canvas.getByTestId('country-selector');
166
+ await expect(countryButton).toHaveAttribute('aria-expanded', 'false');
167
+ await expect(countryButton).toHaveAttribute('aria-label', 'Select country');
168
+
169
+ // Open menu and check expanded state
170
+ await userEvent.click(countryButton);
171
+ await waitFor(() => {
172
+ expect(countryButton).toHaveAttribute('aria-expanded', 'true');
173
+ }, { timeout: 3000 });
174
+
175
+ // Close menu
176
+ await userEvent.keyboard('[Escape]');
177
+ await waitFor(() => {
178
+ expect(countryButton).toHaveAttribute('aria-expanded', 'false');
179
+ }, { timeout: 3000 });
180
+ },
181
+ };
182
+
183
+ // 5. Focus Management Tests
184
+ export const FocusManagement: Story = {
185
+ play: async ({ canvasElement }) => {
186
+ const canvas = within(canvasElement);
187
+
188
+ const input = canvas.getByRole('textbox');
189
+
190
+ // Focus the input
191
+ await userEvent.click(input);
192
+ await expect(input).toHaveFocus();
193
+
194
+ // Tab away and back
195
+ await userEvent.tab();
196
+ await userEvent.tab({ shift: true });
197
+ await expect(input).toHaveFocus();
198
+ },
199
+ };
200
+
201
+ // 6. Responsive Design Tests
202
+ export const ResponsiveDesign: Story = {
203
+ parameters: {
204
+ viewport: {
205
+ viewports: {
206
+ mobile: { name: 'Mobile', styles: { width: '375px', height: '667px' } },
207
+ },
208
+ defaultViewport: 'mobile',
209
+ },
210
+ },
211
+ play: async ({ canvasElement }) => {
212
+ const canvas = within(canvasElement);
213
+ const menuScope = within(document.body);
214
+
215
+ const input = canvas.getByRole('textbox');
216
+ await expect(input).toBeVisible();
217
+
218
+ // Verify component renders properly on mobile using testId
219
+ const container = canvas.getByTestId('phone-input-container');
220
+ expect(container).toBeInTheDocument();
221
+
222
+ // Verify country selector is accessible on mobile using testId
223
+ const countryButton = canvas.getByTestId('country-selector');
224
+ await expect(countryButton).toBeVisible();
225
+
226
+ // Test input functionality on mobile
227
+ await userEvent.clear(input);
228
+ await userEvent.click(input);
229
+ await expect(input).toHaveFocus();
230
+
231
+ // Type phone number on mobile viewport
232
+ await userEvent.type(input, '5551234567');
233
+ await waitFor(() => {
234
+ expect(input).toHaveValue('5551234567');
235
+ }, { timeout: 3000 });
236
+
237
+ // Test country selection on mobile - use menuScope for portal
238
+ await userEvent.click(countryButton);
239
+ await waitFor(() => {
240
+ expect(menuScope.getByText('United States')).toBeVisible();
241
+ }, { timeout: 3000 });
242
+
243
+ // Close menu by clicking outside
244
+ await userEvent.click(input);
245
+ },
246
+ };
247
+
248
+ // 7. Theme Variation Tests
249
+ export const ThemeVariations: Story = {
250
+ args: {
251
+ variant: 'glass',
252
+ },
253
+ play: async ({ canvasElement }) => {
254
+ const canvas = within(canvasElement);
255
+
256
+ const input = canvas.getByRole('textbox');
257
+ await expect(input).toBeInTheDocument();
258
+
259
+ // Use testId to get the container instead of querySelector
260
+ const container = canvas.getByTestId('phone-input-container');
261
+ expect(container).toBeInTheDocument();
262
+
263
+ // Check if glass variant applies styles to the input field
264
+ const inputField = canvas.getByTestId('phone-input-field');
265
+ // Get the MuiOutlinedInput-root element which has the glass styling
266
+ const inputRoot = inputField.querySelector('.MuiOutlinedInput-root');
267
+ expect(inputRoot).toBeTruthy();
268
+
269
+ const styles = window.getComputedStyle(inputRoot!);
270
+ // Glass effect should have backdrop blur
271
+ expect(styles.backdropFilter || styles.webkitBackdropFilter).toMatch(/blur/);
272
+
273
+ // Check hover effect
274
+ await userEvent.hover(inputRoot!);
275
+ await waitFor(() => {
276
+ const hoverStyles = window.getComputedStyle(inputRoot!);
277
+ expect(hoverStyles.background).toBeTruthy();
278
+ }, { timeout: 3000 });
279
+ },
280
+ };
281
+
282
+ // 8. Visual State Tests
283
+ export const VisualStates: Story = {
284
+ args: {
285
+ error: true,
286
+ errorMessage: 'Invalid phone number',
287
+ },
288
+ play: async ({ canvasElement }) => {
289
+ const canvas = within(canvasElement);
290
+
291
+ // Check error state
292
+ const input = canvas.getByRole('textbox');
293
+ await expect(input).toHaveAttribute('aria-invalid', 'true');
294
+
295
+ const errorText = canvas.getByText('Invalid phone number');
296
+ await expect(errorText).toBeVisible();
297
+ },
298
+ };
299
+
300
+ // 9. Performance Tests
301
+ export const Performance: Story = {
302
+ play: async ({ canvasElement }) => {
303
+ const canvas = within(canvasElement);
304
+ const menuScope = within(document.body);
305
+
306
+ const input = canvas.getByRole('textbox');
307
+
308
+ // Test rapid input - verify input responsiveness
309
+ await userEvent.clear(input);
310
+ const testNumber = '5551234567';
311
+
312
+ await userEvent.type(input, testNumber);
313
+
314
+ // Verify all digits were entered correctly
315
+ await waitFor(() => {
316
+ expect(input).toHaveValue(testNumber);
317
+ }, { timeout: 3000 });
318
+
319
+ // Test country switching functionality using testId
320
+ const countryButton = canvas.getByTestId('country-selector');
321
+ await userEvent.click(countryButton);
322
+
323
+ // Wait for menu to appear - use menuScope for portal
324
+ await waitFor(() => {
325
+ const ukOption = menuScope.getByText('United Kingdom');
326
+ expect(ukOption).toBeVisible();
327
+ }, { timeout: 3000 });
328
+
329
+ // Select UK - use menuScope
330
+ await userEvent.click(menuScope.getByText('United Kingdom'));
331
+
332
+ // Verify country changed successfully using testId
333
+ await waitFor(() => {
334
+ const dialCode = canvas.getByTestId('country-dial-code');
335
+ expect(dialCode).toHaveTextContent('+44');
336
+ }, { timeout: 3000 });
337
+ },
338
+ };
339
+
340
+ // 10. Edge Cases Tests
341
+ export const EdgeCases: Story = {
342
+ play: async ({ canvasElement }) => {
343
+ const canvas = within(canvasElement);
344
+
345
+ const input = canvas.getByRole('textbox');
346
+
347
+ // Test with letters - should accept them as phone numbers can contain letters
348
+ await userEvent.clear(input);
349
+ await userEvent.type(input, 'abc123');
350
+ await waitFor(() => {
351
+ const value = input.getAttribute('value');
352
+ expect(value).toBe('abc123');
353
+ }, { timeout: 3000 });
354
+
355
+ // Test with very long input - should accept up to reasonable length
356
+ await userEvent.clear(input);
357
+ const longNumber = '12345678901234567890';
358
+ await userEvent.type(input, longNumber);
359
+
360
+ await waitFor(() => {
361
+ const value = input.getAttribute('value');
362
+ expect(value).toBe(longNumber);
363
+ expect(value?.length).toBe(20);
364
+ }, { timeout: 3000 });
365
+
366
+ // Test with formatted input characters
367
+ await userEvent.clear(input);
368
+ await userEvent.type(input, '555-123-4567');
369
+ await userEvent.tab();
370
+
371
+ // Should format the number with international format
372
+ await waitFor(() => {
373
+ const value = input.getAttribute('value');
374
+ expect(value).toMatch(/\+1.*555.*123.*4567/);
375
+ }, { timeout: 5000 });
376
+
377
+ // Test paste event with formatted number
378
+ await userEvent.clear(input);
379
+ await userEvent.paste('+1 (555) 123-4567');
380
+
381
+ // Should handle pasted formatted numbers
382
+ await waitFor(() => {
383
+ const value = input.getAttribute('value');
384
+ expect(value).toBe('+1 (555) 123-4567');
385
+ }, { timeout: 3000 });
386
+ },
387
+ };
388
+
389
+ // 11. Country Code Selection Test
390
+ export const CountryCodeSelection: Story = {
391
+ args: {
392
+ countryCode: 'US',
393
+ onChange: fn(),
394
+ },
395
+ play: async ({ canvasElement, args }) => {
396
+ const canvas = within(canvasElement);
397
+ const menuScope = within(document.body);
398
+
399
+ // Verify initial US country using testId
400
+ const dialCode = canvas.getByTestId('country-dial-code');
401
+ await expect(dialCode).toHaveTextContent('+1');
402
+
403
+ // Open country selector using testId
404
+ const countryButton = canvas.getByTestId('country-selector');
405
+ await userEvent.click(countryButton);
406
+
407
+ // Verify key countries are shown - use menuScope for portal
408
+ await waitFor(() => {
409
+ expect(menuScope.getByText('United States')).toBeVisible();
410
+ expect(menuScope.getByText('United Kingdom')).toBeVisible();
411
+ }, { timeout: 3000 });
412
+
413
+ // Verify Germany exists in the menu (may not be visible due to scroll)
414
+ const germanyOption = menuScope.getByText('Germany');
415
+ expect(germanyOption).toBeInTheDocument();
416
+
417
+ // Select Germany
418
+ await userEvent.click(germanyOption);
419
+
420
+ // Verify country changed using testId
421
+ await waitFor(() => {
422
+ const germanDialCode = canvas.getByTestId('country-dial-code');
423
+ expect(germanDialCode).toHaveTextContent('+49');
424
+ }, { timeout: 3000 });
425
+
426
+ // Type a German phone number
427
+ const input = canvas.getByRole('textbox');
428
+ await userEvent.type(input, '30123456789');
429
+
430
+ // Verify onChange called with German country code
431
+ await waitFor(() => {
432
+ const lastCall = args.onChange.mock.calls[args.onChange.mock.calls.length - 1];
433
+ expect(lastCall[2]).toBe('DE');
434
+ }, { timeout: 3000 });
435
+ },
436
+ };
437
+
438
+ // 12. Phone Number Formatting Test
439
+ export const PhoneNumberFormatting: Story = {
440
+ args: {
441
+ onChange: fn(),
442
+ },
443
+ play: async ({ canvasElement, args }) => {
444
+ const canvas = within(canvasElement);
445
+ const menuScope = within(document.body);
446
+ const input = canvas.getByRole('textbox');
447
+
448
+ // Test US number formatting
449
+ await userEvent.type(input, '2125551234');
450
+ await userEvent.tab();
451
+
452
+ await waitFor(() => {
453
+ const value = input.getAttribute('value');
454
+ expect(value).toMatch(/\+1.*212.*555.*1234/);
455
+ }, { timeout: 5000 });
456
+
457
+ // Change to UK and test UK formatting using testId
458
+ const countryButton = canvas.getByTestId('country-selector');
459
+ await userEvent.click(countryButton);
460
+ await waitFor(() => {
461
+ expect(menuScope.getByText('United Kingdom')).toBeVisible();
462
+ }, { timeout: 3000 });
463
+ await userEvent.click(menuScope.getByText('United Kingdom'));
464
+
465
+ // Clear and type UK number
466
+ await userEvent.clear(input);
467
+ await userEvent.type(input, '2079460958');
468
+ await userEvent.tab();
469
+
470
+ await waitFor(() => {
471
+ const value = input.getAttribute('value');
472
+ expect(value).toMatch(/\+44.*20.*7946.*0958/);
473
+ }, { timeout: 5000 });
474
+
475
+ // Verify validation status in onChange
476
+ await waitFor(() => {
477
+ const calls = args.onChange.mock.calls;
478
+ const lastCall = calls[calls.length - 1];
479
+ expect(lastCall[1]).toBe(true); // Should be valid
480
+ }, { timeout: 3000 });
481
+ },
482
+ };
483
+
484
+ // 13. Integration Tests
485
+ export const Integration: Story = {
486
+ args: {
487
+ countryCode: 'GB',
488
+ defaultValue: '+44 20 7946 0958',
489
+ },
490
+ play: async ({ canvasElement, args }) => {
491
+ const canvas = within(canvasElement);
492
+ const menuScope = within(document.body);
493
+
494
+ const input = canvas.getByRole('textbox');
495
+
496
+ // Verify initial value is set
497
+ await expect(input).toHaveValue('+44 20 7946 0958');
498
+
499
+ // Verify UK country is selected initially using testId
500
+ const countrySelector = canvas.getByTestId('country-selector');
501
+ const dialCode = canvas.getByTestId('country-dial-code');
502
+ await expect(dialCode).toHaveTextContent('+44');
503
+
504
+ // Change country to United States
505
+ await userEvent.click(countrySelector);
506
+
507
+ // Wait for menu to open - use menuScope for portal
508
+ await waitFor(() => {
509
+ const usOption = menuScope.getByText('United States');
510
+ expect(usOption).toBeVisible();
511
+ }, { timeout: 3000 });
512
+
513
+ // Select United States - use menuScope
514
+ await userEvent.click(menuScope.getByText('United States'));
515
+
516
+ // Verify country changed using testId
517
+ await waitFor(() => {
518
+ const newDialCode = canvas.getByTestId('country-dial-code');
519
+ expect(newDialCode).toHaveTextContent('+1');
520
+ }, { timeout: 3000 });
521
+
522
+ // Verify onChange was called with country change
523
+ await waitFor(() => {
524
+ expect(args.onChange).toHaveBeenCalled();
525
+ const lastCall = args.onChange.mock.calls[args.onChange.mock.calls.length - 1];
526
+ expect(lastCall[2]).toBe('US'); // Country code should be US
527
+ }, { timeout: 3000 });
528
+
529
+ // Type a new number with US format
530
+ await userEvent.clear(input);
531
+ await userEvent.type(input, '2125551234');
532
+ await userEvent.tab();
533
+
534
+ // Verify US formatting is applied
535
+ await waitFor(() => {
536
+ const value = input.getAttribute('value');
537
+ expect(value).toMatch(/\+1.*212.*555.*1234/);
538
+ }, { timeout: 5000 });
539
+ },
540
+ };
541
+
542
+ // 14. Enhanced Validation Tests
543
+ export const EnhancedValidation: Story = {
544
+ args: {
545
+ onChange: fn(),
546
+ },
547
+ play: async ({ canvasElement, args }) => {
548
+ const canvas = within(canvasElement);
549
+ const input = canvas.getByRole('textbox');
550
+
551
+ // Test invalid US number
552
+ await userEvent.clear(input);
553
+ await userEvent.type(input, '123');
554
+ await userEvent.tab();
555
+
556
+ await waitFor(() => {
557
+ const helperText = canvas.getByText(/Invalid phone number for United States/);
558
+ expect(helperText).toBeVisible();
559
+ });
560
+
561
+ // Test valid US number
562
+ await userEvent.clear(input);
563
+ await userEvent.type(input, '2125551234');
564
+ await userEvent.tab();
565
+
566
+ await waitFor(() => {
567
+ const errorText = canvas.queryByText(/Invalid phone number/);
568
+ expect(errorText).not.toBeInTheDocument();
569
+ });
570
+
571
+ // Verify onChange called with validation result
572
+ await waitFor(() => {
573
+ const lastCall = args.onChange.mock.calls[args.onChange.mock.calls.length - 1];
574
+ expect(lastCall[1]).toBe(true); // Should be valid
575
+ expect(lastCall[2]).toBe('US'); // Country code
576
+ });
577
+ },
578
+ };
579
+
580
+ // 15. Auto-Country Detection Tests
581
+ export const AutoCountryDetection: Story = {
582
+ args: {
583
+ onChange: fn(),
584
+ },
585
+ play: async ({ canvasElement, args }) => {
586
+ const canvas = within(canvasElement);
587
+ const input = canvas.getByRole('textbox');
588
+
589
+ // Type German international number
590
+ await userEvent.clear(input);
591
+ await userEvent.type(input, '+49301234567');
592
+
593
+ // Should auto-detect Germany using testId
594
+ await waitFor(() => {
595
+ const germanDialCode = canvas.getByTestId('country-dial-code');
596
+ expect(germanDialCode).toHaveTextContent('+49');
597
+ }, { timeout: 3000 });
598
+
599
+ // Verify onChange called with German country
600
+ await waitFor(() => {
601
+ const lastCall = args.onChange.mock.calls[args.onChange.mock.calls.length - 1];
602
+ expect(lastCall[2]).toBe('DE');
603
+ }, { timeout: 3000 });
604
+
605
+ // Type UK international number
606
+ await userEvent.clear(input);
607
+ await userEvent.type(input, '+442079460958');
608
+
609
+ // Should auto-detect UK using testId
610
+ await waitFor(() => {
611
+ const ukDialCode = canvas.getByTestId('country-dial-code');
612
+ expect(ukDialCode).toHaveTextContent('+44');
613
+ }, { timeout: 3000 });
614
+
615
+ // Verify onChange called with UK country
616
+ await waitFor(() => {
617
+ const lastCall = args.onChange.mock.calls[args.onChange.mock.calls.length - 1];
618
+ expect(lastCall[2]).toBe('GB');
619
+ }, { timeout: 3000 });
620
+ },
621
+ };
622
+
623
+ // 16. Extended Country Support Tests
624
+ export const ExtendedCountrySupport: Story = {
625
+ args: {
626
+ onChange: fn(),
627
+ },
628
+ play: async ({ canvasElement, args }) => {
629
+ const canvas = within(canvasElement);
630
+ const menuScope = within(document.body);
631
+
632
+ // Test country selection from extended list using testId
633
+ const countryButton = canvas.getByTestId('country-selector');
634
+ await userEvent.click(countryButton);
635
+
636
+ // Verify key extended countries are available - use menuScope for portal
637
+ await waitFor(() => {
638
+ expect(menuScope.getByText('Argentina')).toBeInTheDocument();
639
+ expect(menuScope.getByText('Belgium')).toBeInTheDocument();
640
+ expect(menuScope.getByText('Denmark')).toBeInTheDocument();
641
+ expect(menuScope.getByText('Finland')).toBeInTheDocument();
642
+ expect(menuScope.getByText('Singapore')).toBeInTheDocument();
643
+ expect(menuScope.getByText('Sweden')).toBeInTheDocument();
644
+ expect(menuScope.getByText('United Arab Emirates')).toBeInTheDocument();
645
+ }, { timeout: 3000 });
646
+
647
+ // Select Singapore - use menuScope
648
+ await userEvent.click(menuScope.getByText('Singapore'));
649
+
650
+ // Verify Singapore dial code appears using testId
651
+ await waitFor(() => {
652
+ const singaporeDialCode = canvas.getByTestId('country-dial-code');
653
+ expect(singaporeDialCode).toHaveTextContent('+65');
654
+ }, { timeout: 3000 });
655
+
656
+ // Type Singapore number
657
+ const input = canvas.getByRole('textbox');
658
+ await userEvent.type(input, '81234567');
659
+
660
+ // Verify onChange called with Singapore country code
661
+ await waitFor(() => {
662
+ const lastCall = args.onChange.mock.calls[args.onChange.mock.calls.length - 1];
663
+ expect(lastCall[2]).toBe('SG');
664
+ }, { timeout: 3000 });
665
+ },
666
+ };