@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,909 @@
1
+ import InfoIcon from '@mui/icons-material/Info';
2
+ import { Box, Stack,TextField } from '@mui/material';
3
+ import type { Meta, StoryObj } from '@storybook/react-vite';
4
+ import React from 'react';
5
+ import { expect, fn,userEvent, waitFor, within } from 'storybook/test';
6
+
7
+ import { Label } from './Label';
8
+
9
+ const meta: Meta<typeof Label> = {
10
+ title: 'Form/Label/Tests',
11
+ component: Label,
12
+ parameters: {
13
+ layout: 'centered',
14
+ chromatic: { disableSnapshot: false },
15
+ },
16
+ tags: ['autodocs', 'test', 'component:Label'],
17
+ };
18
+
19
+ export default meta;
20
+ type Story = StoryObj<typeof meta>;
21
+
22
+ // ====================================
23
+ // TestId Tests
24
+ // ====================================
25
+
26
+ export const DataTestIdVerification: Story = {
27
+ name: '🔍 Data TestId Verification',
28
+ args: {
29
+ children: 'Test Label',
30
+ dataTestId: 'custom-label-testid',
31
+ },
32
+ play: async ({ canvasElement, step }) => {
33
+ const canvas = within(canvasElement);
34
+
35
+ await step('Verify dataTestId prop applies to label element', async () => {
36
+ const label = canvas.getByTestId('custom-label-testid');
37
+ await expect(label).toBeInTheDocument();
38
+ await expect(label.tagName.toLowerCase()).toBe('label');
39
+ await expect(label).toHaveTextContent('Test Label');
40
+ });
41
+
42
+ await step('Verify dataTestId works with all variants', async () => {
43
+ const label = canvas.getByTestId('custom-label-testid');
44
+ await expect(label).toHaveAttribute('data-testid', 'custom-label-testid');
45
+ });
46
+ },
47
+ };
48
+
49
+ export const DataTestIdWithSrOnly: Story = {
50
+ name: '🔍 Data TestId with Screen Reader Only',
51
+ args: {
52
+ children: 'SR Only Label',
53
+ dataTestId: 'sr-only-testid',
54
+ srOnly: true,
55
+ },
56
+ play: async ({ canvasElement, step }) => {
57
+ const canvas = within(canvasElement);
58
+
59
+ await step('Verify dataTestId applies to srOnly label', async () => {
60
+ const label = canvas.getByTestId('sr-only-testid');
61
+ await expect(label).toBeInTheDocument();
62
+ await expect(label.tagName.toLowerCase()).toBe('label');
63
+
64
+ const computedStyle = window.getComputedStyle(label);
65
+ await expect(computedStyle.position).toBe('absolute');
66
+ await expect(computedStyle.width).toBe('1px');
67
+ await expect(computedStyle.height).toBe('1px');
68
+ });
69
+ },
70
+ };
71
+
72
+ // ====================================
73
+ // Interaction Tests
74
+ // ====================================
75
+
76
+ export const BasicInteraction: Story = {
77
+ name: '🧪 Basic Interaction Test',
78
+ args: {
79
+ children: 'Interactive Label',
80
+ htmlFor: 'test-input',
81
+ onClick: fn(),
82
+ 'data-testid': 'interactive-label',
83
+ },
84
+ play: async ({ canvasElement, step, args }) => {
85
+ const canvas = within(canvasElement);
86
+
87
+ await step('Initial render verification', async () => {
88
+ const label = canvas.getByTestId('interactive-label');
89
+ await expect(label).toBeInTheDocument();
90
+ await expect(label).toHaveTextContent('Interactive Label');
91
+ });
92
+
93
+ await step('Click interaction', async () => {
94
+ const label = canvas.getByTestId('interactive-label');
95
+ await userEvent.click(label);
96
+ await expect(args.onClick).toHaveBeenCalledTimes(1);
97
+ });
98
+
99
+ await step('Hover interaction', async () => {
100
+ const label = canvas.getByTestId('interactive-label');
101
+ await userEvent.hover(label);
102
+ // Visual state should change (verified through visual regression)
103
+ await userEvent.unhover(label);
104
+ });
105
+
106
+ await step('Verify htmlFor attribute', async () => {
107
+ const label = canvas.getByTestId('interactive-label');
108
+ await expect(label).toHaveAttribute('for', 'test-input');
109
+ });
110
+ },
111
+ };
112
+
113
+ export const RequiredFieldTest: Story = {
114
+ name: '📝 Required Field Test',
115
+ args: {
116
+ children: 'Required Field',
117
+ required: true,
118
+ asteriskPlacement: 'end',
119
+ 'data-testid': 'required-label',
120
+ },
121
+ play: async ({ canvasElement, step }) => {
122
+ const canvas = within(canvasElement);
123
+
124
+ await step('Verify required asterisk is present', async () => {
125
+ const label = canvas.getByTestId('required-label');
126
+ await expect(label).toBeInTheDocument();
127
+
128
+ // Check for asterisk
129
+ const asterisk = within(label).getByText('*');
130
+ await expect(asterisk).toBeInTheDocument();
131
+
132
+ // Verify asterisk color (should be error color)
133
+ const computedStyle = window.getComputedStyle(asterisk);
134
+ await expect(computedStyle.color).toContain('rgb');
135
+ });
136
+
137
+ await step('Test asterisk placement at start', async () => {
138
+ // This would require prop change - verified through separate story
139
+ const label = canvas.getByTestId('required-label');
140
+ await expect(label.textContent).toContain('*');
141
+ });
142
+ },
143
+ };
144
+
145
+ export const StateChangeTest: Story = {
146
+ name: '🔄 State Change Test',
147
+ render: function StateChangeComponent() {
148
+ const [state, setState] = React.useState<'normal' | 'disabled' | 'error' | 'loading'>('normal');
149
+
150
+ return (
151
+ <Stack spacing={2}>
152
+ <Label
153
+ disabled={state === 'disabled'}
154
+ error={state === 'error'}
155
+ loading={state === 'loading'}
156
+ data-testid="stateful-label"
157
+ >
158
+ Stateful Label
159
+ </Label>
160
+ <Stack direction="row" spacing={1}>
161
+ <button onClick={() => setState('normal')}>Normal</button>
162
+ <button onClick={() => setState('disabled')}>Disabled</button>
163
+ <button onClick={() => setState('error')}>Error</button>
164
+ <button onClick={() => setState('loading')}>Loading</button>
165
+ </Stack>
166
+ </Stack>
167
+ );
168
+ },
169
+ play: async ({ canvasElement, step }) => {
170
+ const canvas = within(canvasElement);
171
+
172
+ await step('Verify initial normal state', async () => {
173
+ const label = canvas.getByTestId('stateful-label');
174
+ await expect(label).toBeInTheDocument();
175
+ await expect(label).not.toHaveStyle({ opacity: '0.5' });
176
+ });
177
+
178
+ await step('Change to disabled state', async () => {
179
+ const disabledButton = canvas.getByRole('button', { name: 'Disabled' });
180
+ await userEvent.click(disabledButton);
181
+
182
+ const label = canvas.getByTestId('stateful-label');
183
+ const computedStyle = window.getComputedStyle(label);
184
+ // Disabled state should have different color
185
+ await expect(computedStyle.color).toBeDefined();
186
+ });
187
+
188
+ await step('Change to error state', async () => {
189
+ const errorButton = canvas.getByRole('button', { name: 'Error' });
190
+ await userEvent.click(errorButton);
191
+
192
+ const label = canvas.getByTestId('stateful-label');
193
+ const computedStyle = window.getComputedStyle(label);
194
+ // Error state should have error color
195
+ await expect(computedStyle.color).toBeDefined();
196
+ });
197
+
198
+ await step('Change to loading state', async () => {
199
+ const loadingButton = canvas.getByRole('button', { name: 'Loading' });
200
+ await userEvent.click(loadingButton);
201
+
202
+ await waitFor(() => {
203
+ const spinner = canvas.queryByRole('progressbar');
204
+ expect(spinner).toBeInTheDocument();
205
+ });
206
+ });
207
+ },
208
+ };
209
+
210
+ // ====================================
211
+ // Accessibility Tests
212
+ // ====================================
213
+
214
+ export const KeyboardNavigation: Story = {
215
+ name: '⌨️ Keyboard Navigation Test',
216
+ render: () => (
217
+ <Stack spacing={2}>
218
+ <Label htmlFor="input-1" onClick={fn()} data-testid="first-label" tabIndex={0}>
219
+ First Label
220
+ </Label>
221
+ <TextField id="input-1" data-testid="first-input" />
222
+
223
+ <Label htmlFor="input-2" onClick={fn()} data-testid="second-label" tabIndex={0}>
224
+ Second Label
225
+ </Label>
226
+ <TextField id="input-2" data-testid="second-input" />
227
+ </Stack>
228
+ ),
229
+ parameters: {
230
+ a11y: {
231
+ element: '#storybook-root',
232
+ config: {
233
+ rules: [
234
+ { id: 'color-contrast', enabled: true },
235
+ { id: 'label', enabled: true },
236
+ { id: 'aria-valid-attr-value', enabled: true },
237
+ ],
238
+ },
239
+ },
240
+ },
241
+ play: async ({ canvasElement, step }) => {
242
+ const canvas = within(canvasElement);
243
+
244
+ await step('Tab navigation forward', async () => {
245
+ const firstLabel = canvas.getByTestId('first-label');
246
+ const firstInputContainer = canvas.getByTestId('first-input');
247
+ const firstInput = firstInputContainer.querySelector('input');
248
+
249
+ // Focus first label
250
+ firstLabel.focus();
251
+ await expect(firstLabel).toHaveFocus();
252
+
253
+ // Tab to input
254
+ await userEvent.tab();
255
+ await expect(firstInput).toHaveFocus();
256
+ });
257
+
258
+ await step('Tab navigation backward', async () => {
259
+ await userEvent.tab({ shift: true });
260
+ const firstLabel = canvas.getByTestId('first-label');
261
+ await expect(firstLabel).toHaveFocus();
262
+ });
263
+
264
+ await step('Enter key activation on clickable label', async () => {
265
+ const firstLabel = canvas.getByTestId('first-label');
266
+ firstLabel.focus();
267
+ await userEvent.keyboard('{Enter}');
268
+ // Verify click handler would be called
269
+ });
270
+ },
271
+ };
272
+
273
+ export const ScreenReaderTest: Story = {
274
+ name: '🔊 Screen Reader Test',
275
+ args: {
276
+ children: 'Accessible Label',
277
+ htmlFor: 'accessible-input',
278
+ required: true,
279
+ helperText: 'This field is required',
280
+ tooltip: 'Additional information about this field',
281
+ 'aria-label': 'Accessible form label',
282
+ 'aria-describedby': 'helper-text',
283
+ 'data-testid': 'accessible-label',
284
+ },
285
+ render: (args) => (
286
+ <Stack spacing={1}>
287
+ <Label {...args} />
288
+ <TextField id="accessible-input" aria-describedby="helper-text" />
289
+ <span id="helper-text" style={{ display: 'none' }}>
290
+ This field is required for accessibility
291
+ </span>
292
+ </Stack>
293
+ ),
294
+ play: async ({ canvasElement, step }) => {
295
+ const canvas = within(canvasElement);
296
+
297
+ await step('Verify ARIA attributes', async () => {
298
+ const label = canvas.getByTestId('accessible-label');
299
+ await expect(label).toHaveAttribute('aria-label', 'Accessible form label');
300
+ await expect(label).toHaveAttribute('aria-describedby', 'helper-text');
301
+ });
302
+
303
+ await step('Verify htmlFor association', async () => {
304
+ const label = canvas.getByTestId('accessible-label');
305
+ await expect(label.tagName.toLowerCase()).toBe('label');
306
+ await expect(label).toHaveAttribute('for', 'accessible-input');
307
+ });
308
+
309
+ await step('Verify helper text presence', async () => {
310
+ const helperText = canvas.getByText('This field is required');
311
+ await expect(helperText).toBeInTheDocument();
312
+ });
313
+
314
+ await step('Verify screen reader only label', async () => {
315
+ const srDescription = canvas.getByText('This field is required for accessibility');
316
+ await expect(srDescription).toBeInTheDocument();
317
+ await expect(srDescription).toHaveStyle({ display: 'none' });
318
+ });
319
+ },
320
+ };
321
+
322
+ export const ScreenReaderOnlyTest: Story = {
323
+ name: '👁️‍🗨️ Screen Reader Only Test',
324
+ args: {
325
+ children: 'This label is only for screen readers',
326
+ srOnly: true,
327
+ htmlFor: 'sr-only-input',
328
+ 'data-testid': 'sr-only-label',
329
+ },
330
+ render: (args) => (
331
+ <Box>
332
+ <Label {...args} />
333
+ <TextField id="sr-only-input" placeholder="Field with screen reader only label" fullWidth />
334
+ </Box>
335
+ ),
336
+ play: async ({ canvasElement, step }) => {
337
+ const canvas = within(canvasElement);
338
+
339
+ await step('Verify label is visually hidden', async () => {
340
+ // The label should be in the document but visually hidden
341
+ const hiddenLabel = canvas.getByText('This label is only for screen readers');
342
+ await expect(hiddenLabel).toBeInTheDocument();
343
+
344
+ // For srOnly labels, the text is inside a label element with special styles
345
+ // Get the parent label element which should have the srOnly styles
346
+ const labelElement = hiddenLabel.parentElement;
347
+
348
+ if (labelElement && labelElement.tagName === 'LABEL') {
349
+ const computedStyle = window.getComputedStyle(labelElement);
350
+ // The srOnly label should be absolutely positioned
351
+ await expect(computedStyle.position).toBe('absolute');
352
+ // Check for visually hidden styles - srOnly uses 1px width/height
353
+ const widthValue = computedStyle.width;
354
+ const heightValue = computedStyle.height;
355
+ // MUI Box with sx might return '1px' as string
356
+ await expect(widthValue).toBe('1px');
357
+ await expect(heightValue).toBe('1px');
358
+ } else {
359
+ // If the direct parent isn't the label, find it
360
+ const label = hiddenLabel.closest('label');
361
+ if (label) {
362
+ const computedStyle = window.getComputedStyle(label);
363
+ await expect(computedStyle.position).toBe('absolute');
364
+ }
365
+ }
366
+ });
367
+
368
+ await step('Verify input association', async () => {
369
+ const input = canvas.getByPlaceholderText('Field with screen reader only label');
370
+ await expect(input).toBeInTheDocument();
371
+ await expect(input).toHaveAttribute('id', 'sr-only-input');
372
+ });
373
+ },
374
+ };
375
+
376
+ // ====================================
377
+ // Visual Tests
378
+ // ====================================
379
+
380
+ export const ResponsiveDesign: Story = {
381
+ name: '📱 Responsive Design Test',
382
+ render: () => (
383
+ <Stack spacing={2} sx={{ width: '100%' }}>
384
+ <Label size="xs" variant="filled">
385
+ Extra Small Label
386
+ </Label>
387
+ <Label size="sm" variant="outlined">
388
+ Small Label
389
+ </Label>
390
+ <Label size="md" variant="glass">
391
+ Medium Label
392
+ </Label>
393
+ <Label size="lg" variant="gradient" color="primary">
394
+ Large Label
395
+ </Label>
396
+ <Label size="xl" variant="default">
397
+ Extra Large Label
398
+ </Label>
399
+ </Stack>
400
+ ),
401
+ parameters: {
402
+ viewport: {
403
+ viewports: {
404
+ mobile: {
405
+ name: 'Mobile',
406
+ styles: { width: '375px', height: '667px' },
407
+ type: 'mobile',
408
+ },
409
+ tablet: {
410
+ name: 'Tablet',
411
+ styles: { width: '768px', height: '1024px' },
412
+ type: 'tablet',
413
+ },
414
+ desktop: {
415
+ name: 'Desktop',
416
+ styles: { width: '1920px', height: '1080px' },
417
+ type: 'desktop',
418
+ },
419
+ },
420
+ defaultViewport: 'mobile',
421
+ },
422
+ chromatic: {
423
+ viewports: [375, 768, 1920],
424
+ delay: 300,
425
+ },
426
+ },
427
+ play: async ({ canvasElement, step }) => {
428
+ const canvas = within(canvasElement);
429
+
430
+ await step('Verify all size variants render', async () => {
431
+ await expect(canvas.getByText('Extra Small Label')).toBeInTheDocument();
432
+ await expect(canvas.getByText('Small Label')).toBeInTheDocument();
433
+ await expect(canvas.getByText('Medium Label')).toBeInTheDocument();
434
+ await expect(canvas.getByText('Large Label')).toBeInTheDocument();
435
+ await expect(canvas.getByText('Extra Large Label')).toBeInTheDocument();
436
+ });
437
+
438
+ await step('Verify responsive sizing', async () => {
439
+ const labels = canvas.getAllByText(/Label/);
440
+ labels.forEach((label) => {
441
+ const computedStyle = window.getComputedStyle(label);
442
+ expect(parseFloat(computedStyle.fontSize)).toBeGreaterThan(0);
443
+ });
444
+ });
445
+ },
446
+ };
447
+
448
+ export const ThemeVariations: Story = {
449
+ name: '🎨 Theme Variations Test',
450
+ render: () => (
451
+ <Stack spacing={2}>
452
+ <Box sx={{ p: 2, backgroundColor: '#ffffff' }}>
453
+ <Label color="primary">Light Theme Primary</Label>
454
+ </Box>
455
+ <Box sx={{ p: 2, backgroundColor: '#1a1a1a' }}>
456
+ <Label color="primary">Dark Theme Primary</Label>
457
+ </Box>
458
+ <Label variant="glass" glow>
459
+ Glass with Glow
460
+ </Label>
461
+ <Label variant="gradient" color="secondary">
462
+ Gradient Secondary
463
+ </Label>
464
+ </Stack>
465
+ ),
466
+ parameters: {
467
+ backgrounds: {
468
+ default: 'light',
469
+ values: [
470
+ { name: 'light', value: '#ffffff' },
471
+ { name: 'dark', value: '#1a1a1a' },
472
+ ],
473
+ },
474
+ },
475
+ play: async ({ canvasElement, step }) => {
476
+ const canvas = within(canvasElement);
477
+
478
+ await step('Verify theme-aware rendering', async () => {
479
+ const labels = canvas.getAllByText(/Theme/);
480
+ labels.forEach((label) => {
481
+ const computedStyle = window.getComputedStyle(label);
482
+ expect(computedStyle.color).toBeDefined();
483
+ });
484
+ });
485
+
486
+ await step('Verify glass effect', async () => {
487
+ const glassLabel = canvas.getByText('Glass with Glow');
488
+ const computedStyle = window.getComputedStyle(glassLabel);
489
+ // Glass effect uses backdrop-filter
490
+ expect(computedStyle.backdropFilter || computedStyle.webkitBackdropFilter).toBeDefined();
491
+ });
492
+ },
493
+ };
494
+
495
+ export const VisualStates: Story = {
496
+ name: '👁️ Visual States Test',
497
+ render: function VisualStatesComponent() {
498
+ const [hovered, setHovered] = React.useState(false);
499
+ const [active, setActive] = React.useState(false);
500
+
501
+ return (
502
+ <Stack spacing={2}>
503
+ <Label data-testid="normal-label">Normal State</Label>
504
+
505
+ <Label
506
+ data-testid="hover-label"
507
+ variant="filled"
508
+ color="primary"
509
+ onMouseEnter={() => setHovered(true)}
510
+ onMouseLeave={() => setHovered(false)}
511
+ style={{ transform: hovered ? 'scale(1.02)' : 'scale(1)' }}
512
+ >
513
+ Hover State (hover me)
514
+ </Label>
515
+
516
+ <Label
517
+ data-testid="active-label"
518
+ variant="outlined"
519
+ onClick={() => setActive(!active)}
520
+ className={active ? 'active' : ''}
521
+ >
522
+ Active State (click me)
523
+ </Label>
524
+
525
+ <Label disabled data-testid="disabled-label">
526
+ Disabled State
527
+ </Label>
528
+
529
+ <Label loading data-testid="loading-label">
530
+ Loading State
531
+ </Label>
532
+
533
+ <Label error data-testid="error-label">
534
+ Error State
535
+ </Label>
536
+
537
+ <Label glow pulse data-testid="animated-label">
538
+ Animated State
539
+ </Label>
540
+ </Stack>
541
+ );
542
+ },
543
+ play: async ({ canvasElement, step }) => {
544
+ const canvas = within(canvasElement);
545
+
546
+ await step('Default state', async () => {
547
+ const label = canvas.getByTestId('normal-label');
548
+ await expect(label).toHaveStyle({ opacity: '1' });
549
+ });
550
+
551
+ await step('Hover state', async () => {
552
+ const label = canvas.getByTestId('hover-label');
553
+ await userEvent.hover(label);
554
+ await waitFor(() => {
555
+ // Browsers may convert scale() to matrix(), so we check for either format
556
+ const computedStyle = window.getComputedStyle(label);
557
+ const transform = computedStyle.transform;
558
+ const isScaled =
559
+ transform === 'scale(1.02)' || transform === 'matrix(1.02, 0, 0, 1.02, 0, 0)';
560
+ expect(isScaled).toBe(true);
561
+ });
562
+ await userEvent.unhover(label);
563
+ });
564
+
565
+ await step('Active state', async () => {
566
+ const label = canvas.getByTestId('active-label');
567
+ await userEvent.click(label);
568
+ await expect(label).toHaveClass('active');
569
+ });
570
+
571
+ await step('Disabled state', async () => {
572
+ const label = canvas.getByTestId('disabled-label');
573
+ const computedStyle = window.getComputedStyle(label);
574
+ // Disabled labels should have reduced opacity or different color
575
+ expect(computedStyle.color).toBeDefined();
576
+ });
577
+
578
+ await step('Loading state', async () => {
579
+ const label = canvas.getByTestId('loading-label');
580
+ const spinner = within(label.parentElement!).queryByRole('progressbar');
581
+ await expect(spinner).toBeInTheDocument();
582
+ });
583
+
584
+ await step('Error state', async () => {
585
+ const label = canvas.getByTestId('error-label');
586
+ const computedStyle = window.getComputedStyle(label);
587
+ // Error state should have error color
588
+ expect(computedStyle.color).toContain('rgb');
589
+ });
590
+ },
591
+ };
592
+
593
+ // ====================================
594
+ // Performance Tests
595
+ // ====================================
596
+
597
+ export const PerformanceTest: Story = {
598
+ name: '⚡ Performance Test',
599
+ render: () => {
600
+ const labels = Array.from({ length: 100 }, (_, i) => ({
601
+ id: i,
602
+ text: `Label ${i}`,
603
+ variant: (['default', 'filled', 'outlined', 'glass', 'gradient'] as const)[i % 5],
604
+ color: (['primary', 'secondary', 'success', 'error', 'warning'] as const)[i % 5],
605
+ }));
606
+
607
+ return (
608
+ <Box sx={{ maxHeight: 400, overflow: 'auto' }} data-testid="scroll-container">
609
+ <Stack spacing={1}>
610
+ {labels.map((label) => (
611
+ <Label
612
+ key={label.id}
613
+ variant={label.variant}
614
+ color={label.color}
615
+ data-testid={`label-${label.id}`}
616
+ >
617
+ {label.text}
618
+ </Label>
619
+ ))}
620
+ </Stack>
621
+ </Box>
622
+ );
623
+ },
624
+ play: async ({ canvasElement, step }) => {
625
+ const canvas = within(canvasElement);
626
+
627
+ await step('Measure render time', async () => {
628
+ const startTime = window.performance.now();
629
+ const labels = canvas.getAllByTestId(/label-\d+/);
630
+ const endTime = window.performance.now();
631
+
632
+ const renderTime = endTime - startTime;
633
+ // Log render time for debugging (commented out for production)
634
+ // console.log(`Render time for ${labels.length} labels: ${renderTime}ms`);
635
+
636
+ // Assert reasonable render time
637
+ await expect(renderTime).toBeLessThan(1000);
638
+ await expect(labels).toHaveLength(100);
639
+ });
640
+
641
+ await step('Test scroll performance', async () => {
642
+ const scrollContainer = canvas.getByTestId('scroll-container');
643
+
644
+ // Simulate rapid scrolling
645
+ for (let i = 0; i < 10; i++) {
646
+ scrollContainer.scrollTop = i * 40;
647
+ await new Promise((resolve) => window.setTimeout(resolve, 50));
648
+ }
649
+
650
+ // Verify no janky behavior
651
+ await expect(scrollContainer).toBeInTheDocument();
652
+ });
653
+ },
654
+ };
655
+
656
+ // ====================================
657
+ // Edge Cases Tests
658
+ // ====================================
659
+
660
+ export const EdgeCases: Story = {
661
+ name: '🔧 Edge Cases Test',
662
+ render: () => (
663
+ <Stack spacing={2}>
664
+ <Box sx={{ width: 200 }}>
665
+ <Label truncate data-testid="truncate-label">
666
+ This is a very long label text that should be truncated when it exceeds the container
667
+ width
668
+ </Label>
669
+ </Box>
670
+
671
+ <Label data-testid="empty-label"></Label>
672
+
673
+ <Label data-testid="special-chars">{`Label with special chars: !@#$%^&*()_+{}|:"<>?`}</Label>
674
+
675
+ <Label
676
+ data-testid="multiple-props"
677
+ variant="gradient"
678
+ color="primary"
679
+ size="lg"
680
+ weight="bold"
681
+ transform="uppercase"
682
+ glow
683
+ pulse
684
+ ripple
685
+ required
686
+ icon={<InfoIcon />}
687
+ tooltip="Complex tooltip"
688
+ helperText="Complex helper text"
689
+ >
690
+ All Props Label
691
+ </Label>
692
+
693
+ <Label nowrap data-testid="nowrap-label">
694
+ {`This label has nowrap and will not break to a new line even if it's very long`}
695
+ </Label>
696
+ </Stack>
697
+ ),
698
+ play: async ({ canvasElement, step }) => {
699
+ const canvas = within(canvasElement);
700
+
701
+ await step('Text truncation handling', async () => {
702
+ const label = canvas.getByTestId('truncate-label');
703
+ const computedStyle = window.getComputedStyle(label);
704
+ // The truncate prop should apply text-overflow: ellipsis
705
+ await expect(computedStyle.textOverflow).toBe('ellipsis');
706
+ // Overflow should be hidden for truncation to work
707
+ await expect(['hidden', 'clip']).toContain(computedStyle.overflow);
708
+ });
709
+
710
+ await step('Empty content handling', async () => {
711
+ const label = canvas.getByTestId('empty-label');
712
+ await expect(label).toBeInTheDocument();
713
+ await expect(label.textContent).toBe('');
714
+ });
715
+
716
+ await step('Special characters handling', async () => {
717
+ const label = canvas.getByTestId('special-chars');
718
+ await expect(label).toHaveTextContent('!@#$%^&*()_+{}|:"<>?');
719
+ });
720
+
721
+ await step('Multiple props combination', async () => {
722
+ const label = canvas.getByTestId('multiple-props');
723
+ await expect(label).toBeInTheDocument();
724
+
725
+ // Check for required asterisk
726
+ const asterisk = within(label.parentElement!).getByText('*');
727
+ await expect(asterisk).toBeInTheDocument();
728
+
729
+ // Check for icon
730
+ const icon = label.querySelector('svg');
731
+ await expect(icon).toBeInTheDocument();
732
+ });
733
+
734
+ await step('No wrap handling', async () => {
735
+ const label = canvas.getByTestId('nowrap-label');
736
+ const computedStyle = window.getComputedStyle(label);
737
+ await expect(computedStyle.whiteSpace).toBe('nowrap');
738
+ });
739
+ },
740
+ };
741
+
742
+ // ====================================
743
+ // Integration Tests
744
+ // ====================================
745
+
746
+ export const FormIntegration: Story = {
747
+ name: '🔗 Form Integration Test',
748
+ render: function FormIntegrationComponent() {
749
+ const [email, setEmail] = React.useState('');
750
+ const [password, setPassword] = React.useState('');
751
+ const [errors, setErrors] = React.useState<{ email?: string; password?: string }>({});
752
+
753
+ const handleSubmit = (e: React.FormEvent) => {
754
+ e.preventDefault();
755
+ const newErrors: typeof errors = {};
756
+
757
+ if (!email) newErrors.email = 'Email is required';
758
+ if (!password) newErrors.password = 'Password is required';
759
+
760
+ setErrors(newErrors);
761
+
762
+ if (Object.keys(newErrors).length === 0) {
763
+ window.alert('Form submitted successfully!');
764
+ }
765
+ };
766
+
767
+ return (
768
+ <form onSubmit={handleSubmit}>
769
+ <Stack spacing={2}>
770
+ <Box>
771
+ <Label
772
+ htmlFor="email-field"
773
+ required
774
+ error={!!errors.email}
775
+ helperText={errors.email}
776
+ data-testid="email-label"
777
+ >
778
+ Email Address
779
+ </Label>
780
+ <TextField
781
+ id="email-field"
782
+ fullWidth
783
+ value={email}
784
+ onChange={(e) => setEmail(e.target.value)}
785
+ error={!!errors.email}
786
+ size="small"
787
+ sx={{ mt: 1 }}
788
+ data-testid="email-input"
789
+ />
790
+ </Box>
791
+
792
+ <Box>
793
+ <Label
794
+ htmlFor="password-field"
795
+ required
796
+ error={!!errors.password}
797
+ helperText={errors.password}
798
+ data-testid="password-label"
799
+ >
800
+ Password
801
+ </Label>
802
+ <TextField
803
+ id="password-field"
804
+ type="password"
805
+ fullWidth
806
+ value={password}
807
+ onChange={(e) => setPassword(e.target.value)}
808
+ error={!!errors.password}
809
+ size="small"
810
+ sx={{ mt: 1 }}
811
+ data-testid="password-input"
812
+ />
813
+ </Box>
814
+
815
+ <button type="submit" data-testid="submit-button">
816
+ Submit
817
+ </button>
818
+ </Stack>
819
+ </form>
820
+ );
821
+ },
822
+ play: async ({ canvasElement, step }) => {
823
+ const canvas = within(canvasElement);
824
+
825
+ await step('Initial form state', async () => {
826
+ const emailLabel = canvas.getByTestId('email-label');
827
+ const passwordLabel = canvas.getByTestId('password-label');
828
+
829
+ await expect(emailLabel).toBeInTheDocument();
830
+ await expect(passwordLabel).toBeInTheDocument();
831
+
832
+ // Both should show required asterisks
833
+ const asterisks = canvas.getAllByText('*');
834
+ await expect(asterisks).toHaveLength(2);
835
+ });
836
+
837
+ await step('Submit empty form shows errors', async () => {
838
+ const submitButton = canvas.getByTestId('submit-button');
839
+ await userEvent.click(submitButton);
840
+
841
+ await waitFor(() => {
842
+ const emailError = canvas.getByText('Email is required');
843
+ const passwordError = canvas.getByText('Password is required');
844
+ expect(emailError).toBeInTheDocument();
845
+ expect(passwordError).toBeInTheDocument();
846
+ });
847
+ });
848
+
849
+ await step('Fill form and submit', async () => {
850
+ const emailInputContainer = canvas.getByTestId('email-input');
851
+ const passwordInputContainer = canvas.getByTestId('password-input');
852
+
853
+ // Get the actual input elements within the MUI TextFields
854
+ const emailInput = emailInputContainer.querySelector('input') as HTMLInputElement;
855
+ const passwordInput = passwordInputContainer.querySelector('input') as HTMLInputElement;
856
+
857
+ await userEvent.clear(emailInput);
858
+ await userEvent.type(emailInput, 'test@example.com');
859
+
860
+ await userEvent.clear(passwordInput);
861
+ await userEvent.type(passwordInput, 'password123');
862
+
863
+ const submitButton = canvas.getByTestId('submit-button');
864
+ await userEvent.click(submitButton);
865
+
866
+ // Form should submit successfully (alert would show)
867
+ });
868
+ },
869
+ };
870
+
871
+ export const TooltipIntegration: Story = {
872
+ name: '💡 Tooltip Integration Test',
873
+ args: {
874
+ children: 'Hover for more info',
875
+ tooltip: 'This is additional information about the label',
876
+ icon: <InfoIcon fontSize="small" />,
877
+ iconPosition: 'end',
878
+ 'data-testid': 'tooltip-label',
879
+ },
880
+ play: async ({ canvasElement, step }) => {
881
+ const canvas = within(canvasElement);
882
+
883
+ await step('Verify label with icon renders', async () => {
884
+ const label = canvas.getByTestId('tooltip-label');
885
+ await expect(label).toBeInTheDocument();
886
+
887
+ const icon = label.querySelector('svg');
888
+ await expect(icon).toBeInTheDocument();
889
+ });
890
+
891
+ await step('Tooltip appears on hover', async () => {
892
+ const label = canvas.getByTestId('tooltip-label');
893
+
894
+ await userEvent.hover(label);
895
+
896
+ // MUI tooltips appear in a portal, so we need to search in the whole document
897
+ await waitFor(
898
+ () => {
899
+ const tooltip = document.querySelector('[role="tooltip"]');
900
+ expect(tooltip).toBeInTheDocument();
901
+ expect(tooltip).toHaveTextContent('This is additional information about the label');
902
+ },
903
+ { timeout: 3000 },
904
+ );
905
+
906
+ await userEvent.unhover(label);
907
+ });
908
+ },
909
+ };