@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,263 @@
1
+ import {
2
+ alpha,
3
+ CircularProgress,
4
+ InputAdornment,
5
+ keyframes,
6
+ styled,
7
+ TextField,
8
+ } from '@mui/material';
9
+ import React from 'react';
10
+
11
+ import type { InputProps } from './Input.types';
12
+
13
+ // Define pulse animation
14
+ const pulseAnimation = keyframes`
15
+ 0% {
16
+ box-shadow: 0 0 0 0 currentColor;
17
+ opacity: 1;
18
+ }
19
+ 70% {
20
+ box-shadow: 0 0 0 10px currentColor;
21
+ opacity: 0;
22
+ }
23
+ 100% {
24
+ box-shadow: 0 0 0 0 currentColor;
25
+ opacity: 0;
26
+ }
27
+ `;
28
+
29
+ const StyledTextField = styled(TextField, {
30
+ shouldForwardProp: (prop) =>
31
+ !['customVariant', 'floating', 'glow', 'pulse', 'loading'].includes(prop as string),
32
+ })<{
33
+ customVariant?: InputProps['variant'];
34
+ floating?: boolean;
35
+ glow?: boolean;
36
+ pulse?: boolean;
37
+ loading?: boolean;
38
+ }>(({ theme, customVariant, floating, glow, pulse, loading }) => ({
39
+ position: 'relative',
40
+ opacity: loading ? 0.7 : 1,
41
+
42
+ // Glow effect
43
+ ...(glow && {
44
+ '& .MuiInputBase-root': {
45
+ boxShadow: `0 0 15px ${alpha(theme.palette.primary.main, 0.3)}`,
46
+ '&.Mui-focused': {
47
+ boxShadow: `0 0 20px ${alpha(theme.palette.primary.main, 0.5)}`,
48
+ },
49
+ },
50
+ }),
51
+
52
+ // Pulse animation
53
+ ...(pulse && {
54
+ '&::after': {
55
+ content: '""',
56
+ position: 'absolute',
57
+ top: '50%',
58
+ left: '0',
59
+ right: '0',
60
+ height: '56px',
61
+ transform: 'translateY(-50%)',
62
+ borderRadius: theme.spacing(0.5),
63
+ backgroundColor: theme.palette.primary.main,
64
+ opacity: 0.3,
65
+ animation: `${pulseAnimation} 2s infinite`,
66
+ pointerEvents: 'none',
67
+ zIndex: -1,
68
+ },
69
+ }),
70
+
71
+ '& .MuiInputBase-root': {
72
+ transition: 'all 0.3s ease',
73
+
74
+ ...(customVariant === 'glass' && {
75
+ backgroundColor: alpha(theme.palette.background.paper, 0.1),
76
+ backdropFilter: 'blur(20px)',
77
+ border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,
78
+ '&:hover': {
79
+ backgroundColor: alpha(theme.palette.background.paper, 0.15),
80
+ borderColor: alpha(theme.palette.primary.main, 0.3),
81
+ },
82
+ '&.Mui-focused': {
83
+ backgroundColor: alpha(theme.palette.background.paper, 0.2),
84
+ borderColor: theme.palette.primary.main,
85
+ boxShadow: `0 0 0 2px ${alpha(theme.palette.primary.main, 0.1)}`,
86
+ },
87
+ }),
88
+
89
+ ...(customVariant === 'underline' && {
90
+ '&:before': {
91
+ borderBottomColor: alpha(theme.palette.divider, 0.42),
92
+ },
93
+ '&:hover:not(.Mui-disabled):before': {
94
+ borderBottomColor: theme.palette.primary.main,
95
+ },
96
+ '&:after': {
97
+ borderBottomColor: theme.palette.primary.main,
98
+ },
99
+ }),
100
+
101
+ ...(customVariant === 'gradient' && {
102
+ background: `linear-gradient(135deg, ${alpha(theme.palette.primary.main, 0.1)}, ${alpha(theme.palette.secondary.main, 0.1)})`,
103
+ border: `2px solid transparent`,
104
+ backgroundOrigin: 'border-box',
105
+ backgroundClip: 'padding-box, border-box',
106
+ position: 'relative',
107
+ '&::before': {
108
+ content: '""',
109
+ position: 'absolute',
110
+ top: 0,
111
+ left: 0,
112
+ right: 0,
113
+ bottom: 0,
114
+ borderRadius: 'inherit',
115
+ background: `linear-gradient(135deg, ${theme.palette.primary.main}, ${theme.palette.secondary.main})`,
116
+ mask: 'linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)',
117
+ maskComposite: 'exclude',
118
+ padding: '2px',
119
+ zIndex: -1,
120
+ },
121
+ '&:hover': {
122
+ background: `linear-gradient(135deg, ${alpha(theme.palette.primary.main, 0.15)}, ${alpha(theme.palette.secondary.main, 0.15)})`,
123
+ },
124
+ '&.Mui-focused': {
125
+ background: `linear-gradient(135deg, ${alpha(theme.palette.primary.main, 0.2)}, ${alpha(theme.palette.secondary.main, 0.2)})`,
126
+ '&::before': {
127
+ background: `linear-gradient(135deg, ${theme.palette.primary.dark}, ${theme.palette.secondary.dark})`,
128
+ },
129
+ },
130
+ }),
131
+ },
132
+
133
+ ...(floating && {
134
+ '& .MuiInputLabel-root': {
135
+ transform: 'translate(14px, 16px) scale(1)',
136
+ '&.MuiInputLabel-shrink': {
137
+ transform: 'translate(14px, -9px) scale(0.75)',
138
+ backgroundColor: theme.palette.background.paper,
139
+ padding: '0 4px',
140
+ },
141
+ },
142
+ }),
143
+
144
+ '& .MuiOutlinedInput-root': {
145
+ '& fieldset': {
146
+ borderColor: alpha(theme.palette.divider, 0.23),
147
+ },
148
+ '&:hover fieldset': {
149
+ borderColor: theme.palette.primary.main,
150
+ },
151
+ '&.Mui-focused fieldset': {
152
+ borderColor: theme.palette.primary.main,
153
+ borderWidth: 2,
154
+ },
155
+ '&.Mui-error fieldset': {
156
+ borderColor: theme.palette.error.main,
157
+ },
158
+ },
159
+
160
+ '& .MuiFilledInput-root': {
161
+ backgroundColor: alpha(theme.palette.action.hover, 0.04),
162
+ '&:hover': {
163
+ backgroundColor: alpha(theme.palette.action.hover, 0.08),
164
+ },
165
+ '&.Mui-focused': {
166
+ backgroundColor: alpha(theme.palette.action.hover, 0.12),
167
+ },
168
+ },
169
+ }));
170
+
171
+ const sizeMap = {
172
+ sm: { size: 'small' as const },
173
+ md: { size: 'medium' as const },
174
+ lg: { size: 'medium' as const, sx: { '& .MuiInputBase-input': { padding: '16px 14px' } } },
175
+ };
176
+
177
+ export const Input = React.forwardRef<HTMLInputElement, InputProps>(
178
+ (
179
+ {
180
+ variant = 'outlined',
181
+ size = 'md',
182
+ label,
183
+ error,
184
+ helperText,
185
+ startAdornment,
186
+ endAdornment,
187
+ fullWidth = true,
188
+ floating = false,
189
+ glow = false,
190
+ pulse = false,
191
+ loading = false,
192
+ onClick,
193
+ onFocus,
194
+ onBlur,
195
+ 'data-testid': dataTestId,
196
+ ...props
197
+ },
198
+ ref,
199
+ ) => {
200
+ const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {
201
+ onFocus?.(e);
202
+ };
203
+
204
+ const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {
205
+ onBlur?.(e);
206
+ };
207
+
208
+ const muiVariant =
209
+ variant === 'glass'
210
+ ? 'outlined'
211
+ : variant === 'underline'
212
+ ? 'standard'
213
+ : variant === 'gradient'
214
+ ? 'outlined'
215
+ : variant;
216
+
217
+ const sizeProps = sizeMap[size];
218
+
219
+ return (
220
+ <StyledTextField
221
+ ref={ref}
222
+ variant={muiVariant as 'outlined' | 'filled' | 'standard'}
223
+ customVariant={variant}
224
+ floating={floating}
225
+ glow={glow}
226
+ pulse={pulse}
227
+ loading={loading}
228
+ label={label}
229
+ error={error}
230
+ helperText={helperText}
231
+ fullWidth={fullWidth}
232
+ disabled={loading || props.disabled}
233
+ onClick={!loading ? onClick : undefined}
234
+ onFocus={handleFocus}
235
+ onBlur={handleBlur}
236
+ inputProps={{
237
+ 'data-testid': dataTestId,
238
+ }}
239
+ InputProps={{
240
+ startAdornment: startAdornment && (
241
+ <InputAdornment position="start">{startAdornment}</InputAdornment>
242
+ ),
243
+ endAdornment: (
244
+ <>
245
+ {loading && (
246
+ <InputAdornment position="end">
247
+ <CircularProgress size={20} />
248
+ </InputAdornment>
249
+ )}
250
+ {!loading && endAdornment && (
251
+ <InputAdornment position="end">{endAdornment}</InputAdornment>
252
+ )}
253
+ </>
254
+ ),
255
+ }}
256
+ {...sizeProps}
257
+ {...props}
258
+ />
259
+ );
260
+ },
261
+ );
262
+
263
+ Input.displayName = 'Input';
@@ -0,0 +1,24 @@
1
+ import type { InputHTMLAttributes, ReactNode } from 'react';
2
+ import type React from 'react';
3
+
4
+ export type InputVariant = 'outlined' | 'filled' | 'glass' | 'underline' | 'gradient';
5
+ export type InputSize = 'sm' | 'md' | 'lg';
6
+
7
+ export interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'color'> {
8
+ variant?: InputVariant;
9
+ size?: InputSize;
10
+ label?: string;
11
+ error?: boolean;
12
+ helperText?: string;
13
+ startAdornment?: ReactNode;
14
+ endAdornment?: ReactNode;
15
+ fullWidth?: boolean;
16
+ floating?: boolean;
17
+ glow?: boolean;
18
+ pulse?: boolean;
19
+ loading?: boolean;
20
+ onClick?: React.MouseEventHandler<HTMLInputElement>;
21
+ onFocus?: React.FocusEventHandler<HTMLInputElement>;
22
+ onBlur?: React.FocusEventHandler<HTMLInputElement>;
23
+ 'data-testid'?: string;
24
+ }
@@ -0,0 +1,2 @@
1
+ export { Input } from './Input';
2
+ export type { InputProps, InputSize,InputVariant } from './Input.types';
@@ -0,0 +1,419 @@
1
+ # InputOTP Component
2
+
3
+ ## Overview
4
+
5
+ The InputOTP component provides a specialized input field for one-time passwords and verification codes. It splits the input into individual digit boxes with automatic focus management, making it ideal for SMS verification codes, two-factor authentication, and other security-related inputs.
6
+
7
+ ## Features
8
+
9
+ - **Multiple Input Variants**: Supports numeric-only, alphanumeric, and masked input modes
10
+ - **Auto-Focus Management**: Automatically advances focus to the next input as users type
11
+ - **Keyboard Navigation**: Full support for arrow keys, backspace, and tab navigation
12
+ - **Paste Support**: Users can paste complete codes for quick entry
13
+ - **Visual Effects**: Optional glass morphism and gradient effects for modern UI design
14
+ - **Flexible Sizing**: Five size variants from extra-small to extra-large
15
+ - **Theme Integration**: Six color themes matching your design system
16
+ - **Accessibility**: WCAG compliant with proper ARIA attributes and keyboard support
17
+ - **Responsive Design**: Adapts to different screen sizes and touch interfaces
18
+
19
+ ## Props
20
+
21
+ | Prop | Type | Default | Description |
22
+ |------|------|---------|-------------|
23
+ | `variant` | `'numeric' \| 'alphanumeric' \| 'masked'` | `'numeric'` | Input validation type |
24
+ | `length` | `number` | `6` | Number of input digits |
25
+ | `value` | `string` | `''` | Current OTP value |
26
+ | `onChange` | `(value: string) => void` | - | Callback when value changes |
27
+ | `onComplete` | `(value: string) => void` | - | Callback when all digits are filled |
28
+ | `color` | `'primary' \| 'secondary' \| 'success' \| 'warning' \| 'danger' \| 'neutral'` | `'primary'` | Theme color |
29
+ | `size` | `'xs' \| 'sm' \| 'md' \| 'lg' \| 'xl'` | `'md'` | Input size |
30
+ | `autoFocus` | `boolean` | `false` | Auto-focus first input on mount |
31
+ | `disabled` | `boolean` | `false` | Disable all inputs |
32
+ | `error` | `boolean` | `false` | Show error state |
33
+ | `glass` | `boolean` | `false` | Apply glass morphism effect |
34
+ | `gradient` | `boolean` | `false` | Apply gradient focus effect |
35
+ | `className` | `string` | - | Additional CSS classes |
36
+ | `aria-label` | `string` | - | Accessibility label |
37
+
38
+ ## Usage Examples
39
+
40
+ ### Basic Usage
41
+
42
+ ```tsx
43
+ import { InputOTP } from '@procurement/ui';
44
+
45
+ function VerificationForm() {
46
+ const [code, setCode] = useState('');
47
+
48
+ const handleComplete = (value: string) => {
49
+ console.log('Verification code:', value);
50
+ // Submit verification code
51
+ };
52
+
53
+ return (
54
+ <InputOTP
55
+ value={code}
56
+ onChange={setCode}
57
+ onComplete={handleComplete}
58
+ autoFocus
59
+ />
60
+ );
61
+ }
62
+ ```
63
+
64
+ ### SMS Verification
65
+
66
+ ```tsx
67
+ <InputOTP
68
+ variant="numeric"
69
+ length={4}
70
+ color="primary"
71
+ size="lg"
72
+ autoFocus
73
+ onComplete={(code) => verifySMSCode(code)}
74
+ aria-label="Enter SMS verification code"
75
+ />
76
+ ```
77
+
78
+ ### Two-Factor Authentication
79
+
80
+ ```tsx
81
+ <InputOTP
82
+ variant="numeric"
83
+ length={6}
84
+ color="success"
85
+ glass
86
+ onComplete={(code) => verify2FA(code)}
87
+ aria-label="Enter 6-digit authenticator code"
88
+ />
89
+ ```
90
+
91
+ ### Masked Security PIN
92
+
93
+ ```tsx
94
+ <InputOTP
95
+ variant="masked"
96
+ length={4}
97
+ color="warning"
98
+ onComplete={(pin) => validatePIN(pin)}
99
+ aria-label="Enter your security PIN"
100
+ />
101
+ ```
102
+
103
+ ### Alphanumeric Code
104
+
105
+ ```tsx
106
+ <InputOTP
107
+ variant="alphanumeric"
108
+ length={8}
109
+ color="secondary"
110
+ gradient
111
+ onComplete={(code) => validateCode(code)}
112
+ aria-label="Enter product activation code"
113
+ />
114
+ ```
115
+
116
+ ### Error State Handling
117
+
118
+ ```tsx
119
+ function CodeVerification() {
120
+ const [code, setCode] = useState('');
121
+ const [hasError, setHasError] = useState(false);
122
+
123
+ const handleComplete = async (value: string) => {
124
+ const isValid = await verifyCode(value);
125
+ setHasError(!isValid);
126
+
127
+ if (isValid) {
128
+ // Proceed with success
129
+ }
130
+ };
131
+
132
+ return (
133
+ <>
134
+ <InputOTP
135
+ value={code}
136
+ onChange={setCode}
137
+ onComplete={handleComplete}
138
+ error={hasError}
139
+ color={hasError ? 'danger' : 'primary'}
140
+ />
141
+ {hasError && (
142
+ <Typography color="error" variant="caption">
143
+ Invalid verification code. Please try again.
144
+ </Typography>
145
+ )}
146
+ </>
147
+ );
148
+ }
149
+ ```
150
+
151
+ ## Keyboard Shortcuts
152
+
153
+ - **Arrow Left/Right**: Navigate between input fields
154
+ - **Backspace**: Delete current digit and move to previous field
155
+ - **Tab**: Move to next field
156
+ - **Shift+Tab**: Move to previous field
157
+ - **Delete**: Clear current field
158
+ - **Paste (Ctrl/Cmd+V)**: Paste complete code
159
+
160
+ ## Accessibility
161
+
162
+ The InputOTP component is designed with accessibility in mind:
163
+
164
+ - **ARIA Labels**: Each input field has proper ARIA attributes
165
+ - **Keyboard Navigation**: Full keyboard support for all interactions
166
+ - **Focus Management**: Clear focus indicators and logical tab order
167
+ - **Screen Reader Support**: Announces field positions and values
168
+ - **Error States**: Clear visual and semantic error indicators
169
+
170
+ ### Best Practices
171
+
172
+ 1. **Always provide an aria-label** describing what code is being entered
173
+ 2. **Use appropriate variants** - numeric for numbers only, masked for PINs
174
+ 3. **Provide clear error messages** when verification fails
175
+ 4. **Consider mobile users** - use larger sizes on touch devices
176
+ 5. **Test with keyboard navigation** to ensure accessibility
177
+
178
+ ## Styling
179
+
180
+ The component supports various visual customizations:
181
+
182
+ ### Size Variants
183
+ - `xs`: Extra small (compact forms)
184
+ - `sm`: Small (mobile interfaces)
185
+ - `md`: Medium (default desktop)
186
+ - `lg`: Large (prominent forms)
187
+ - `xl`: Extra large (accessibility focus)
188
+
189
+ ### Color Themes
190
+ - `primary`: Main brand color
191
+ - `secondary`: Alternative brand color
192
+ - `success`: Positive feedback
193
+ - `warning`: Caution state
194
+ - `danger`: Error or critical state
195
+ - `neutral`: Subtle appearance
196
+
197
+ ### Visual Effects
198
+ - **Glass Morphism**: Modern frosted glass effect
199
+ - **Gradient**: Dynamic gradient on focus
200
+ - **Combined**: Both effects for premium feel
201
+
202
+ ## Performance Considerations
203
+
204
+ - **Controlled Component**: Use React.memo if parent re-renders frequently
205
+ - **Debounced Callbacks**: onChange fires on every keystroke, consider debouncing
206
+ - **Paste Handling**: Efficiently processes pasted content without blocking UI
207
+ - **Focus Management**: Uses refs to avoid unnecessary re-renders
208
+
209
+ ## Common Use Cases
210
+
211
+ 1. **SMS Verification**: 4-6 digit codes for phone number verification
212
+ 2. **Email Verification**: 6-8 character codes for email confirmation
213
+ 3. **Two-Factor Auth**: 6-digit TOTP codes from authenticator apps
214
+ 4. **Security PINs**: 4-digit masked inputs for banking/security
215
+ 5. **Product Keys**: 8-16 character alphanumeric activation codes
216
+ 6. **Coupon Codes**: Variable length promotional codes
217
+ 7. **Access Codes**: Meeting or session join codes
218
+
219
+ ## Migration Guide
220
+
221
+ If migrating from a text input to InputOTP:
222
+
223
+ ```tsx
224
+ // Before
225
+ <TextField
226
+ value={code}
227
+ onChange={(e) => setCode(e.target.value)}
228
+ maxLength={6}
229
+ />
230
+
231
+ // After
232
+ <InputOTP
233
+ value={code}
234
+ onChange={setCode}
235
+ length={6}
236
+ onComplete={handleVerification}
237
+ />
238
+ ```
239
+
240
+ ## Testing
241
+
242
+ The InputOTP component supports automated testing through the `dataTestId` prop. When provided, it generates consistent test identifiers for both the container and individual input slots.
243
+
244
+ ### Test ID Structure
245
+
246
+ - **Container**: Uses the `dataTestId` value directly
247
+ - **Individual Slots**: Appends `-slot-{index}` to the `dataTestId` value (zero-indexed)
248
+
249
+ ### Usage in Tests
250
+
251
+ ```tsx
252
+ // Component usage with testId
253
+ <InputOTP
254
+ length={6}
255
+ dataTestId="verification-code"
256
+ onChange={handleChange}
257
+ onComplete={handleComplete}
258
+ />
259
+
260
+ // Test implementation examples
261
+
262
+ // Using Testing Library
263
+ import { render, screen } from '@testing-library/react';
264
+ import userEvent from '@testing-library/user-event';
265
+
266
+ test('should allow entering verification code', async () => {
267
+ const handleComplete = jest.fn();
268
+
269
+ render(
270
+ <InputOTP
271
+ length={6}
272
+ dataTestId="verification-code"
273
+ onComplete={handleComplete}
274
+ />
275
+ );
276
+
277
+ // Access container
278
+ const container = screen.getByTestId('verification-code');
279
+ expect(container).toBeInTheDocument();
280
+
281
+ // Access individual slots
282
+ const firstSlot = screen.getByTestId('verification-code-slot-0');
283
+ const secondSlot = screen.getByTestId('verification-code-slot-1');
284
+
285
+ // Interact with slots
286
+ await userEvent.type(firstSlot, '1');
287
+ await userEvent.type(secondSlot, '2');
288
+
289
+ expect(firstSlot).toHaveValue('1');
290
+ expect(secondSlot).toHaveValue('2');
291
+ });
292
+
293
+ // Using Playwright
294
+ test('OTP input interaction', async ({ page }) => {
295
+ await page.goto('/verification');
296
+
297
+ // Access container
298
+ const otpContainer = page.getByTestId('verification-code');
299
+ await expect(otpContainer).toBeVisible();
300
+
301
+ // Access and interact with individual slots
302
+ await page.getByTestId('verification-code-slot-0').fill('1');
303
+ await page.getByTestId('verification-code-slot-1').fill('2');
304
+ await page.getByTestId('verification-code-slot-2').fill('3');
305
+ await page.getByTestId('verification-code-slot-3').fill('4');
306
+ await page.getByTestId('verification-code-slot-4').fill('5');
307
+ await page.getByTestId('verification-code-slot-5').fill('6');
308
+
309
+ // Verify completion
310
+ await expect(page.getByText('Code verified')).toBeVisible();
311
+ });
312
+
313
+ // Using Cypress
314
+ describe('InputOTP', () => {
315
+ it('should complete OTP entry', () => {
316
+ cy.visit('/verification');
317
+
318
+ // Verify container exists
319
+ cy.getByTestId('verification-code').should('be.visible');
320
+
321
+ // Enter OTP code
322
+ cy.getByTestId('verification-code-slot-0').type('1');
323
+ cy.getByTestId('verification-code-slot-1').type('2');
324
+ cy.getByTestId('verification-code-slot-2').type('3');
325
+ cy.getByTestId('verification-code-slot-3').type('4');
326
+ cy.getByTestId('verification-code-slot-4').type('5');
327
+ cy.getByTestId('verification-code-slot-5').type('6');
328
+
329
+ // Verify all slots filled
330
+ cy.getByTestId('verification-code-slot-0').should('have.value', '1');
331
+ cy.getByTestId('verification-code-slot-5').should('have.value', '6');
332
+ });
333
+ });
334
+ ```
335
+
336
+ ### Testing Best Practices
337
+
338
+ 1. **Always provide dataTestId in test scenarios** to ensure stable selectors
339
+ 2. **Use semantic test IDs** that describe the purpose (e.g., `sms-verification`, `2fa-code`)
340
+ 3. **Test both container and individual slots** to verify complete functionality
341
+ 4. **Verify slot indexing** is zero-based (first slot is `-slot-0`)
342
+ 5. **Test dynamic lengths** by verifying the correct number of slots exist
343
+ 6. **Test without dataTestId** to ensure component works when prop is omitted
344
+
345
+ ### Testing Different Configurations
346
+
347
+ ```tsx
348
+ // Short OTP (4 digits)
349
+ <InputOTP
350
+ length={4}
351
+ dataTestId="short-code"
352
+ />
353
+ // Access slots: short-code-slot-0 through short-code-slot-3
354
+
355
+ // Long OTP (8 characters)
356
+ <InputOTP
357
+ length={8}
358
+ variant="alphanumeric"
359
+ dataTestId="activation-key"
360
+ />
361
+ // Access slots: activation-key-slot-0 through activation-key-slot-7
362
+
363
+ // Masked PIN
364
+ <InputOTP
365
+ length={4}
366
+ variant="masked"
367
+ dataTestId="security-pin"
368
+ />
369
+ // Access slots: security-pin-slot-0 through security-pin-slot-3
370
+ ```
371
+
372
+ ### Accessibility Testing
373
+
374
+ The component maintains accessibility compliance when using testIds:
375
+
376
+ ```tsx
377
+ test('should be accessible with testIds', () => {
378
+ const { container } = render(
379
+ <InputOTP
380
+ length={6}
381
+ dataTestId="accessible-otp"
382
+ aria-label="Enter verification code"
383
+ />
384
+ );
385
+
386
+ // Run accessibility checks
387
+ const results = await axe(container);
388
+ expect(results).toHaveNoViolations();
389
+
390
+ // Verify ARIA attributes are preserved
391
+ const firstSlot = screen.getByTestId('accessible-otp-slot-0');
392
+ expect(firstSlot).toHaveAttribute('maxLength', '1');
393
+ });
394
+ ```
395
+
396
+ ### Visual Regression Testing
397
+
398
+ When using visual regression tools like Chromatic or Percy:
399
+
400
+ ```tsx
401
+ // Storybook story with testIds for visual testing
402
+ export const VisualTest: Story = {
403
+ args: {
404
+ length: 6,
405
+ dataTestId: 'visual-otp',
406
+ value: '123456',
407
+ },
408
+ parameters: {
409
+ chromatic: { disableSnapshot: false },
410
+ },
411
+ };
412
+ ```
413
+
414
+ ## Related Components
415
+
416
+ - `TextField`: For general text input needs
417
+ - `PasswordStrength`: For password creation with strength indicators
418
+ - `PhoneInput`: For international phone number input
419
+ - `Form`: For complete form management