@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,1785 @@
1
+ import {
2
+ Add as AddIcon,
3
+ CheckCircle as CheckCircleIcon,
4
+ CloudUpload as CloudUploadIcon,
5
+ Delete as DeleteIcon,
6
+ Download as DownloadIcon,
7
+ Edit as EditIcon,
8
+ FilterList as FilterListIcon,
9
+ Info as InfoIcon,
10
+ MoreVert as MoreVertIcon,
11
+ Save as SaveIcon,
12
+ Search as SearchIcon,
13
+ Settings as SettingsIcon,
14
+ Share as ShareIcon,
15
+ } from '@mui/icons-material';
16
+ import {
17
+ Alert,
18
+ Avatar,
19
+ Box,
20
+ Button,
21
+ Card,
22
+ CardActions,
23
+ CardContent,
24
+ Chip,
25
+ Divider,
26
+ FormControl,
27
+ FormControlLabel,
28
+ Grid,
29
+ IconButton,
30
+ InputLabel,
31
+ LinearProgress,
32
+ List,
33
+ ListItem,
34
+ ListItemText,
35
+ MenuItem,
36
+ Paper,
37
+ Select,
38
+ Stack,
39
+ Step,
40
+ StepLabel,
41
+ Stepper,
42
+ Switch,
43
+ Tab,
44
+ Table,
45
+ TableBody,
46
+ TableCell,
47
+ TableContainer,
48
+ TableHead,
49
+ TableRow,
50
+ Tabs,
51
+ TextField,
52
+ Typography,
53
+ useMediaQuery,
54
+ useTheme,
55
+ } from '@mui/material';
56
+ import type { Meta, StoryObj } from '@storybook/react-vite';
57
+ import React, { useEffect,useState } from 'react';
58
+
59
+ import {
60
+ StackedModalActions,
61
+ StackedModalContent,
62
+ ModalStackProvider,
63
+ StackedModal,
64
+ useModalStack,
65
+ } from './StackedModal';
66
+
67
+ const meta: Meta<typeof StackedModal> = {
68
+ title: 'Enhanced/StackedModal',
69
+ component: StackedModal,
70
+ parameters: {
71
+ layout: 'fullscreen',
72
+ docs: {
73
+ description: {
74
+ component:
75
+ "A sophisticated nested modal system inspired by Google Tag Manager's UI with glass morphism, smart transitions, and responsive design.",
76
+ },
77
+ },
78
+ },
79
+ decorators: [
80
+ (Story) => (
81
+ <ModalStackProvider>
82
+ <Box sx={{ p: 3, minHeight: '100vh', bgcolor: 'grey.50' }}>
83
+ <Story />
84
+ </Box>
85
+ </ModalStackProvider>
86
+ ),
87
+ ],
88
+ tags: ['autodocs', 'component:StackedModal'],
89
+ };
90
+
91
+ export default meta;
92
+ type Story = StoryObj<typeof StackedModal>;
93
+
94
+ // Basic usage story
95
+ const DefaultComponent = () => {
96
+ const BasicModal = () => {
97
+ const [open, setOpen] = useState(false);
98
+
99
+ return (
100
+ <>
101
+ <Button variant="contained" onClick={() => setOpen(true)}>
102
+ Open Basic Modal
103
+ </Button>
104
+ <StackedModal
105
+ open={open}
106
+ onClose={() => setOpen(false)}
107
+ navigationTitle="Basic Modal"
108
+ actions={
109
+ <Button variant="contained" size="small">
110
+ Save Changes
111
+ </Button>
112
+ }
113
+ >
114
+ <StackedModalContent>
115
+ <Typography variant="h5" gutterBottom>
116
+ Welcome to StackedModal
117
+ </Typography>
118
+ <Typography paragraph>
119
+ This is a basic implementation of the StackedModal component. It provides a clean and
120
+ modern interface for displaying content.
121
+ </Typography>
122
+ <TextField fullWidth label="Enter your name" variant="outlined" margin="normal" />
123
+ </StackedModalContent>
124
+ </StackedModal>
125
+ </>
126
+ );
127
+ };
128
+
129
+ return <BasicModal />;
130
+ };
131
+
132
+ export const Default: Story = {
133
+ render: () => <DefaultComponent />,
134
+ };
135
+
136
+ // Glass morphism effect
137
+ const GlassMorphismComponent = () => {
138
+ const GlassModal = () => {
139
+ const [open, setOpen] = useState(false);
140
+
141
+ return (
142
+ <>
143
+ <Box
144
+ sx={{
145
+ p: 4,
146
+ background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
147
+ borderRadius: 2,
148
+ }}
149
+ >
150
+ <Typography variant="h4" color="white" gutterBottom>
151
+ Beautiful Background
152
+ </Typography>
153
+ <Typography color="white" paragraph>
154
+ This colorful background will be visible through the glass effect
155
+ </Typography>
156
+ <Button
157
+ variant="contained"
158
+ onClick={() => setOpen(true)}
159
+ sx={{ bgcolor: 'white', color: 'primary.main' }}
160
+ >
161
+ Open Glass Modal
162
+ </Button>
163
+ </Box>
164
+
165
+ <StackedModal
166
+ open={open}
167
+ onClose={() => setOpen(false)}
168
+ glass={true}
169
+ navigationTitle="Glass Morphism Modal"
170
+ >
171
+ <StackedModalContent>
172
+ <Typography variant="h5" gutterBottom>
173
+ Glass Effect Active
174
+ </Typography>
175
+ <Typography paragraph>
176
+ Notice the beautiful blur effect that reveals the content behind the modal. This
177
+ creates a modern, sophisticated UI that maintains context while focusing attention.
178
+ </Typography>
179
+ <Alert severity="info">
180
+ The glass effect automatically adjusts based on the theme and provides excellent
181
+ readability while maintaining visual appeal.
182
+ </Alert>
183
+ </StackedModalContent>
184
+ <StackedModalActions>
185
+ <Button variant="outlined" size="small" onClick={() => setOpen(false)}>
186
+ Cancel
187
+ </Button>
188
+ <Button variant="contained" size="small">
189
+ Confirm
190
+ </Button>
191
+ </StackedModalActions>
192
+ </StackedModal>
193
+ </>
194
+ );
195
+ };
196
+
197
+ return <GlassModal />;
198
+ };
199
+
200
+ export const GlassMorphism: Story = {
201
+ render: () => <GlassMorphismComponent />,
202
+ };
203
+
204
+ // Multi-level stacking demonstration
205
+ const MultiLevelStackingComponent = () => {
206
+ const StackingDemo = () => {
207
+ const [firstOpen, setFirstOpen] = useState(false);
208
+ const [secondOpen, setSecondOpen] = useState(false);
209
+ const [thirdOpen, setThirdOpen] = useState(false);
210
+ const [fourthOpen, setFourthOpen] = useState(false);
211
+
212
+ return (
213
+ <>
214
+ <Card>
215
+ <CardContent>
216
+ <Typography variant="h5" gutterBottom>
217
+ Multi-Level Modal Stacking
218
+ </Typography>
219
+ <Typography paragraph color="text.secondary">
220
+ This demonstrates how modals stack and transition smoothly between states. Each modal
221
+ becomes secondary when a new one opens.
222
+ </Typography>
223
+ </CardContent>
224
+ <CardActions>
225
+ <Button variant="contained" onClick={() => setFirstOpen(true)} startIcon={<AddIcon />}>
226
+ Start Workflow
227
+ </Button>
228
+ </CardActions>
229
+ </Card>
230
+
231
+ {/* Level 1 Modal */}
232
+ <StackedModal
233
+ open={firstOpen}
234
+ onClose={() => setFirstOpen(false)}
235
+ glass={true}
236
+ navigationTitle="Step 1: Choose Project"
237
+ modalId="modal-level-1"
238
+ >
239
+ <StackedModalContent>
240
+ <Typography variant="h5" gutterBottom>
241
+ Select Project Type
242
+ </Typography>
243
+ <Grid container spacing={2} sx={{ mt: 2 }}>
244
+ <Grid item xs={12} md={6}>
245
+ <Card
246
+ sx={{ cursor: 'pointer', '&:hover': { boxShadow: 4 } }}
247
+ onClick={() => setSecondOpen(true)}
248
+ >
249
+ <CardContent>
250
+ <Typography variant="h6">Web Application</Typography>
251
+ <Typography color="text.secondary">
252
+ Create a responsive web application
253
+ </Typography>
254
+ </CardContent>
255
+ </Card>
256
+ </Grid>
257
+ <Grid item xs={12} md={6}>
258
+ <Card
259
+ sx={{ cursor: 'pointer', '&:hover': { boxShadow: 4 } }}
260
+ onClick={() => setSecondOpen(true)}
261
+ >
262
+ <CardContent>
263
+ <Typography variant="h6">Mobile App</Typography>
264
+ <Typography color="text.secondary">
265
+ Build a native mobile application
266
+ </Typography>
267
+ </CardContent>
268
+ </Card>
269
+ </Grid>
270
+ </Grid>
271
+ </StackedModalContent>
272
+ </StackedModal>
273
+
274
+ {/* Level 2 Modal */}
275
+ <StackedModal
276
+ open={secondOpen}
277
+ onClose={() => setSecondOpen(false)}
278
+ navigationTitle="Step 2: Configuration"
279
+ modalId="modal-level-2"
280
+ actions={
281
+ <Button variant="contained" size="small" onClick={() => setThirdOpen(true)}>
282
+ Next Step
283
+ </Button>
284
+ }
285
+ >
286
+ <StackedModalContent>
287
+ <Typography variant="h5" gutterBottom>
288
+ Configure Your Project
289
+ </Typography>
290
+ <Stack spacing={3} sx={{ mt: 3 }}>
291
+ <TextField fullWidth label="Project Name" defaultValue="My Awesome Project" />
292
+ <FormControl fullWidth>
293
+ <InputLabel>Framework</InputLabel>
294
+ <Select label="Framework" defaultValue="react">
295
+ <MenuItem value="react">React</MenuItem>
296
+ <MenuItem value="vue">Vue.js</MenuItem>
297
+ <MenuItem value="angular">Angular</MenuItem>
298
+ </Select>
299
+ </FormControl>
300
+ <FormControlLabel control={<Switch defaultChecked />} label="Enable TypeScript" />
301
+ <FormControlLabel
302
+ control={<Switch defaultChecked />}
303
+ label="Include Testing Framework"
304
+ />
305
+ </Stack>
306
+ </StackedModalContent>
307
+ </StackedModal>
308
+
309
+ {/* Level 3 Modal */}
310
+ <StackedModal
311
+ open={thirdOpen}
312
+ onClose={() => setThirdOpen(false)}
313
+ navigationTitle="Step 3: Features"
314
+ modalId="modal-level-3"
315
+ actions={
316
+ <Button variant="contained" size="small" onClick={() => setFourthOpen(true)}>
317
+ Add Dependencies
318
+ </Button>
319
+ }
320
+ >
321
+ <StackedModalContent>
322
+ <Typography variant="h5" gutterBottom>
323
+ Select Features
324
+ </Typography>
325
+ <List>
326
+ <ListItem>
327
+ <ListItemText primary="Authentication" secondary="User login and registration" />
328
+ <Switch defaultChecked />
329
+ </ListItem>
330
+ <ListItem>
331
+ <ListItemText primary="Database" secondary="PostgreSQL integration" />
332
+ <Switch defaultChecked />
333
+ </ListItem>
334
+ <ListItem>
335
+ <ListItemText primary="API" secondary="RESTful API endpoints" />
336
+ <Switch />
337
+ </ListItem>
338
+ <ListItem>
339
+ <ListItemText primary="Real-time" secondary="WebSocket support" />
340
+ <Switch />
341
+ </ListItem>
342
+ </List>
343
+ </StackedModalContent>
344
+ </StackedModal>
345
+
346
+ {/* Level 4 Modal */}
347
+ <StackedModal
348
+ open={fourthOpen}
349
+ onClose={() => setFourthOpen(false)}
350
+ navigationTitle="Step 4: Review"
351
+ modalId="modal-level-4"
352
+ actions={
353
+ <Stack direction="row" spacing={1}>
354
+ <Button
355
+ variant="outlined"
356
+ size="small"
357
+ onClick={() => {
358
+ setFourthOpen(false);
359
+ setThirdOpen(false);
360
+ setSecondOpen(false);
361
+ setFirstOpen(false);
362
+ }}
363
+ >
364
+ Cancel All
365
+ </Button>
366
+ <Button
367
+ variant="contained"
368
+ color="success"
369
+ size="small"
370
+ startIcon={<CheckCircleIcon />}
371
+ onClick={() => {
372
+ window.alert('Project created successfully!');
373
+ setFourthOpen(false);
374
+ setThirdOpen(false);
375
+ setSecondOpen(false);
376
+ setFirstOpen(false);
377
+ }}
378
+ >
379
+ Create Project
380
+ </Button>
381
+ </Stack>
382
+ }
383
+ >
384
+ <StackedModalContent>
385
+ <Alert severity="success" sx={{ mb: 3 }}>
386
+ Your project is ready to be created!
387
+ </Alert>
388
+ <Typography variant="h5" gutterBottom>
389
+ Project Summary
390
+ </Typography>
391
+ <Paper sx={{ p: 2, bgcolor: 'grey.50' }}>
392
+ <Stack spacing={2}>
393
+ <Box>
394
+ <Typography variant="caption" color="text.secondary">
395
+ Project Type
396
+ </Typography>
397
+ <Typography>Web Application</Typography>
398
+ </Box>
399
+ <Divider />
400
+ <Box>
401
+ <Typography variant="caption" color="text.secondary">
402
+ Framework
403
+ </Typography>
404
+ <Typography>React with TypeScript</Typography>
405
+ </Box>
406
+ <Divider />
407
+ <Box>
408
+ <Typography variant="caption" color="text.secondary">
409
+ Features
410
+ </Typography>
411
+ <Stack direction="row" spacing={1} sx={{ mt: 1 }}>
412
+ <Chip label="Authentication" size="small" />
413
+ <Chip label="Database" size="small" />
414
+ <Chip label="Testing" size="small" />
415
+ </Stack>
416
+ </Box>
417
+ </Stack>
418
+ </Paper>
419
+ <Typography variant="caption" color="text.secondary" sx={{ mt: 2, display: 'block' }}>
420
+ Note: Only the current and previous modals are rendered for optimal performance.
421
+ </Typography>
422
+ </StackedModalContent>
423
+ </StackedModal>
424
+ </>
425
+ );
426
+ };
427
+
428
+ return <StackingDemo />;
429
+ };
430
+
431
+ export const MultiLevelStacking: Story = {
432
+ render: () => <MultiLevelStackingComponent />,
433
+ };
434
+
435
+ // Mobile responsive bottom sheet
436
+ export const MobileResponsive: Story = {
437
+ parameters: {
438
+ viewport: {
439
+ defaultViewport: 'mobile1',
440
+ },
441
+ },
442
+ render: () => {
443
+ const MobileDemo = () => {
444
+ const [open, setOpen] = useState(false);
445
+ const theme = useTheme();
446
+ const isMobile = useMediaQuery(theme.breakpoints.down('sm'));
447
+
448
+ return (
449
+ <>
450
+ <Alert severity="info" sx={{ mb: 2 }}>
451
+ {isMobile
452
+ ? 'Mobile view active - Modal will slide from bottom'
453
+ : 'Desktop view - Switch to mobile viewport to see bottom sheet behavior'}
454
+ </Alert>
455
+ <Button
456
+ variant="contained"
457
+ fullWidth={isMobile}
458
+ onClick={() => setOpen(true)}
459
+ startIcon={<AddIcon />}
460
+ >
461
+ Open Mobile Modal
462
+ </Button>
463
+
464
+ <StackedModal
465
+ open={open}
466
+ onClose={() => setOpen(false)}
467
+ navigationTitle="Mobile Optimized"
468
+ actions={
469
+ <Button variant="contained" size="small" onClick={() => setOpen(false)}>
470
+ Close
471
+ </Button>
472
+ }
473
+ >
474
+ <StackedModalContent>
475
+ <Typography variant="h5" gutterBottom>
476
+ Mobile-First Design
477
+ </Typography>
478
+ <Typography paragraph>
479
+ On mobile devices, the modal slides up from the bottom like a native mobile sheet.
480
+ On desktop, it fades in with responsive sizing.
481
+ </Typography>
482
+ <Stack spacing={2}>
483
+ <Button variant="outlined" fullWidth startIcon={<CloudUploadIcon />}>
484
+ Upload File
485
+ </Button>
486
+ <Button variant="outlined" fullWidth startIcon={<DownloadIcon />}>
487
+ Download Report
488
+ </Button>
489
+ <Button variant="outlined" fullWidth startIcon={<ShareIcon />}>
490
+ Share Document
491
+ </Button>
492
+ </Stack>
493
+ </StackedModalContent>
494
+ </StackedModal>
495
+ </>
496
+ );
497
+ };
498
+
499
+ return <MobileDemo />;
500
+ },
501
+ };
502
+
503
+ // Async content with loading states
504
+ const AsyncContentLoadingComponent = () => {
505
+ const AsyncModal = () => {
506
+ const [open, setOpen] = useState(false);
507
+ const [addUserOpen, setAddUserOpen] = useState(false);
508
+ const [loading, setLoading] = useState(false);
509
+ const [data, setData] = useState<{
510
+ users: Array<{ id: number; name: string; role: string; status: string }>;
511
+ } | null>(null);
512
+
513
+ const loadData = () => {
514
+ setOpen(true);
515
+ setLoading(true);
516
+ setData(null);
517
+
518
+ // Simulate API call
519
+ window.window.setTimeout(() => {
520
+ setData({
521
+ users: [
522
+ { id: 1, name: 'John Doe', role: 'Admin', status: 'Active' },
523
+ { id: 2, name: 'Jane Smith', role: 'User', status: 'Active' },
524
+ { id: 3, name: 'Bob Johnson', role: 'User', status: 'Inactive' },
525
+ { id: 4, name: 'Alice Brown', role: 'Moderator', status: 'Active' },
526
+ ],
527
+ });
528
+ setLoading(false);
529
+ }, 2000);
530
+ };
531
+
532
+ return (
533
+ <>
534
+ <Card>
535
+ <CardContent>
536
+ <Typography variant="h6" gutterBottom>
537
+ Async Data Loading
538
+ </Typography>
539
+ <Typography color="text.secondary">
540
+ Modal with skeleton loading state while fetching data
541
+ </Typography>
542
+ </CardContent>
543
+ <CardActions>
544
+ <Button variant="contained" onClick={loadData}>
545
+ Load User Data
546
+ </Button>
547
+ </CardActions>
548
+ </Card>
549
+
550
+ <StackedModal
551
+ open={open}
552
+ onClose={() => setOpen(false)}
553
+ navigationTitle="User Management"
554
+ loading={loading}
555
+ loadingText="Fetching user data..."
556
+ actions={
557
+ !loading && (
558
+ <Button
559
+ variant="contained"
560
+ size="small"
561
+ startIcon={<AddIcon />}
562
+ onClick={() => setAddUserOpen(true)}
563
+ >
564
+ Add User
565
+ </Button>
566
+ )
567
+ }
568
+ >
569
+ {!loading && data && (
570
+ <Box>
571
+ <TableContainer>
572
+ <Table>
573
+ <TableHead>
574
+ <TableRow>
575
+ <TableCell>Name</TableCell>
576
+ <TableCell>Role</TableCell>
577
+ <TableCell>Status</TableCell>
578
+ <TableCell>Actions</TableCell>
579
+ </TableRow>
580
+ </TableHead>
581
+ <TableBody>
582
+ {data.users.map((user) => (
583
+ <TableRow key={user.id}>
584
+ <TableCell>
585
+ <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>
586
+ <Avatar sx={{ width: 32, height: 32 }}>{user.name.charAt(0)}</Avatar>
587
+ {user.name}
588
+ </Box>
589
+ </TableCell>
590
+ <TableCell>
591
+ <Chip
592
+ label={user.role}
593
+ size="small"
594
+ color={user.role === 'Admin' ? 'primary' : 'default'}
595
+ />
596
+ </TableCell>
597
+ <TableCell>
598
+ <Chip
599
+ label={user.status}
600
+ size="small"
601
+ color={user.status === 'Active' ? 'success' : 'default'}
602
+ />
603
+ </TableCell>
604
+ <TableCell>
605
+ <IconButton size="small">
606
+ <EditIcon fontSize="small" />
607
+ </IconButton>
608
+ <IconButton size="small">
609
+ <DeleteIcon fontSize="small" />
610
+ </IconButton>
611
+ </TableCell>
612
+ </TableRow>
613
+ ))}
614
+ </TableBody>
615
+ </Table>
616
+ </TableContainer>
617
+ </Box>
618
+ )}
619
+ </StackedModal>
620
+
621
+ {/* Add User Modal */}
622
+ <StackedModal
623
+ open={addUserOpen}
624
+ onClose={() => setAddUserOpen(false)}
625
+ navigationTitle="Add New User"
626
+ modalId="add-user-modal"
627
+ >
628
+ <StackedModalContent>
629
+ <Typography variant="h5" gutterBottom>
630
+ Create New User
631
+ </Typography>
632
+ <Stack spacing={3} sx={{ mt: 3 }}>
633
+ <TextField
634
+ fullWidth
635
+ label="Full Name"
636
+ required
637
+ helperText="Enter the user's full name"
638
+ />
639
+ <TextField
640
+ fullWidth
641
+ label="Email Address"
642
+ type="email"
643
+ required
644
+ helperText="This will be used for login"
645
+ />
646
+ <FormControl fullWidth>
647
+ <InputLabel>Role</InputLabel>
648
+ <Select label="Role" defaultValue="">
649
+ <MenuItem value="admin">Admin</MenuItem>
650
+ <MenuItem value="user">User</MenuItem>
651
+ <MenuItem value="moderator">Moderator</MenuItem>
652
+ </Select>
653
+ </FormControl>
654
+ <FormControlLabel control={<Switch defaultChecked />} label="Send invitation email" />
655
+ <Alert severity="info">
656
+ The user will receive an email invitation to set their password and complete
657
+ registration.
658
+ </Alert>
659
+ </Stack>
660
+ </StackedModalContent>
661
+ <StackedModalActions>
662
+ <Button variant="outlined" onClick={() => setAddUserOpen(false)}>
663
+ Cancel
664
+ </Button>
665
+ <Button
666
+ variant="contained"
667
+ startIcon={<AddIcon />}
668
+ onClick={() => {
669
+ window.alert('User added successfully!');
670
+ setAddUserOpen(false);
671
+ }}
672
+ >
673
+ Create User
674
+ </Button>
675
+ </StackedModalActions>
676
+ </StackedModal>
677
+ </>
678
+ );
679
+ };
680
+
681
+ return <AsyncModal />;
682
+ };
683
+
684
+ export const AsyncContentLoading: Story = {
685
+ render: () => <AsyncContentLoadingComponent />,
686
+ };
687
+
688
+ // Custom actions and buttons
689
+ const CustomActionsComponent = () => {
690
+ const CustomActionsModal = () => {
691
+ const [open, setOpen] = useState(false);
692
+ const [progress, setProgress] = useState(0);
693
+
694
+ useEffect(() => {
695
+ if (open && progress < 100) {
696
+ const timer = window.window.setTimeout(() => {
697
+ setProgress((prev) => Math.min(prev + 10, 100));
698
+ }, 500);
699
+ return () => window.window.clearTimeout(timer);
700
+ }
701
+ }, [open, progress]);
702
+
703
+ return (
704
+ <>
705
+ <Button
706
+ variant="contained"
707
+ onClick={() => {
708
+ setOpen(true);
709
+ setProgress(0);
710
+ }}
711
+ startIcon={<SettingsIcon />}
712
+ >
713
+ Open Settings Modal
714
+ </Button>
715
+
716
+ <StackedModal
717
+ open={open}
718
+ onClose={() => setOpen(false)}
719
+ navigationTitle="Advanced Settings"
720
+ actions={
721
+ <Stack direction="row" spacing={1}>
722
+ <IconButton size="small">
723
+ <SearchIcon />
724
+ </IconButton>
725
+ <IconButton size="small">
726
+ <FilterListIcon />
727
+ </IconButton>
728
+ <IconButton size="small">
729
+ <MoreVertIcon />
730
+ </IconButton>
731
+ <Divider orientation="vertical" flexItem />
732
+ <Button variant="outlined" size="small" startIcon={<InfoIcon />}>
733
+ Help
734
+ </Button>
735
+ <Button
736
+ variant="contained"
737
+ size="small"
738
+ color="success"
739
+ startIcon={<SaveIcon />}
740
+ disabled={progress < 100}
741
+ >
742
+ Save
743
+ </Button>
744
+ </Stack>
745
+ }
746
+ >
747
+ <StackedModalContent>
748
+ <Tabs value={0}>
749
+ <Tab label="General" />
750
+ <Tab label="Privacy" />
751
+ <Tab label="Notifications" />
752
+ <Tab label="Advanced" />
753
+ </Tabs>
754
+
755
+ <Box sx={{ mt: 3 }}>
756
+ <Typography variant="h6" gutterBottom>
757
+ General Settings
758
+ </Typography>
759
+
760
+ <Stack spacing={3}>
761
+ <TextField fullWidth label="Display Name" defaultValue="John Doe" />
762
+ <TextField
763
+ fullWidth
764
+ label="Email"
765
+ type="email"
766
+ defaultValue="john.doe@example.com"
767
+ />
768
+ <FormControlLabel control={<Switch defaultChecked />} label="Enable dark mode" />
769
+ <FormControlLabel control={<Switch defaultChecked />} label="Show notifications" />
770
+
771
+ <Box>
772
+ <Typography variant="body2" color="text.secondary" gutterBottom>
773
+ Profile completion: {progress}%
774
+ </Typography>
775
+ <LinearProgress variant="determinate" value={progress} />
776
+ </Box>
777
+ </Stack>
778
+ </Box>
779
+ </StackedModalContent>
780
+ </StackedModal>
781
+ </>
782
+ );
783
+ };
784
+
785
+ return <CustomActionsModal />;
786
+ };
787
+
788
+ export const CustomActions: Story = {
789
+ render: () => <CustomActionsComponent />,
790
+ };
791
+
792
+ // Complex workflow example (multi-step form)
793
+ const ComplexWorkflowComponent = () => {
794
+ const WorkflowModal = () => {
795
+ const [open, setOpen] = useState(false);
796
+ const [activeStep, setActiveStep] = useState(0);
797
+ const [nestedOpen, setNestedOpen] = useState(false);
798
+
799
+ const steps = ['Basic Info', 'Address', 'Payment', 'Review'];
800
+
801
+ const handleNext = () => {
802
+ setActiveStep((prev) => prev + 1);
803
+ };
804
+
805
+ const handleBack = () => {
806
+ setActiveStep((prev) => prev - 1);
807
+ };
808
+
809
+ const handleReset = () => {
810
+ setActiveStep(0);
811
+ };
812
+
813
+ return (
814
+ <>
815
+ <Card>
816
+ <CardContent>
817
+ <Typography variant="h5" gutterBottom>
818
+ Multi-Step Registration
819
+ </Typography>
820
+ <Typography color="text.secondary" paragraph>
821
+ Complex workflow with nested modals and step-by-step process
822
+ </Typography>
823
+ </CardContent>
824
+ <CardActions>
825
+ <Button
826
+ variant="contained"
827
+ size="large"
828
+ onClick={() => setOpen(true)}
829
+ startIcon={<AddIcon />}
830
+ >
831
+ Start Registration
832
+ </Button>
833
+ </CardActions>
834
+ </Card>
835
+
836
+ <StackedModal
837
+ open={open}
838
+ onClose={() => {
839
+ setOpen(false);
840
+ handleReset();
841
+ }}
842
+ navigationTitle="User Registration"
843
+ modalId="workflow-main"
844
+ actions={
845
+ activeStep === steps.length ? (
846
+ <Button
847
+ variant="contained"
848
+ color="success"
849
+ onClick={() => {
850
+ setOpen(false);
851
+ handleReset();
852
+ }}
853
+ >
854
+ Complete
855
+ </Button>
856
+ ) : (
857
+ <Typography variant="body2" color="text.secondary">
858
+ Step {activeStep + 1} of {steps.length}
859
+ </Typography>
860
+ )
861
+ }
862
+ >
863
+ <StackedModalContent>
864
+ <Stepper activeStep={activeStep} sx={{ mb: 4 }}>
865
+ {steps.map((label) => (
866
+ <Step key={label}>
867
+ <StepLabel>{label}</StepLabel>
868
+ </Step>
869
+ ))}
870
+ </Stepper>
871
+
872
+ {activeStep === steps.length ? (
873
+ <Box sx={{ textAlign: 'center', py: 4 }}>
874
+ <CheckCircleIcon sx={{ fontSize: 64, color: 'success.main', mb: 2 }} />
875
+ <Typography variant="h5" gutterBottom>
876
+ Registration Complete!
877
+ </Typography>
878
+ <Typography color="text.secondary">
879
+ Your account has been successfully created.
880
+ </Typography>
881
+ </Box>
882
+ ) : (
883
+ <>
884
+ <Box sx={{ mb: 4 }}>
885
+ {activeStep === 0 && (
886
+ <Stack spacing={2}>
887
+ <Typography variant="h6">Basic Information</Typography>
888
+ <TextField fullWidth label="First Name" />
889
+ <TextField fullWidth label="Last Name" />
890
+ <TextField fullWidth label="Email" type="email" />
891
+ <TextField fullWidth label="Phone" />
892
+ <Button variant="outlined" onClick={() => setNestedOpen(true)}>
893
+ Add Additional Contact
894
+ </Button>
895
+ </Stack>
896
+ )}
897
+
898
+ {activeStep === 1 && (
899
+ <Stack spacing={2}>
900
+ <Typography variant="h6">Address Information</Typography>
901
+ <TextField fullWidth label="Street Address" />
902
+ <TextField fullWidth label="City" />
903
+ <Grid container spacing={2}>
904
+ <Grid item xs={6}>
905
+ <TextField fullWidth label="State" />
906
+ </Grid>
907
+ <Grid item xs={6}>
908
+ <TextField fullWidth label="ZIP Code" />
909
+ </Grid>
910
+ </Grid>
911
+ <TextField fullWidth label="Country" />
912
+ </Stack>
913
+ )}
914
+
915
+ {activeStep === 2 && (
916
+ <Stack spacing={2}>
917
+ <Typography variant="h6">Payment Information</Typography>
918
+ <TextField fullWidth label="Card Number" />
919
+ <TextField fullWidth label="Cardholder Name" />
920
+ <Grid container spacing={2}>
921
+ <Grid item xs={6}>
922
+ <TextField fullWidth label="Expiry Date" placeholder="MM/YY" />
923
+ </Grid>
924
+ <Grid item xs={6}>
925
+ <TextField fullWidth label="CVV" />
926
+ </Grid>
927
+ </Grid>
928
+ <FormControlLabel
929
+ control={<Switch />}
930
+ label="Save payment method for future use"
931
+ />
932
+ </Stack>
933
+ )}
934
+
935
+ {activeStep === 3 && (
936
+ <Stack spacing={2}>
937
+ <Typography variant="h6">Review Your Information</Typography>
938
+ <Paper sx={{ p: 2, bgcolor: 'grey.50' }}>
939
+ <Typography variant="subtitle2" gutterBottom>
940
+ Personal Details
941
+ </Typography>
942
+ <Typography variant="body2" color="text.secondary">
943
+ John Doe - john.doe@example.com
944
+ </Typography>
945
+ </Paper>
946
+ <Paper sx={{ p: 2, bgcolor: 'grey.50' }}>
947
+ <Typography variant="subtitle2" gutterBottom>
948
+ Address
949
+ </Typography>
950
+ <Typography variant="body2" color="text.secondary">
951
+ 123 Main St, New York, NY 10001
952
+ </Typography>
953
+ </Paper>
954
+ <Paper sx={{ p: 2, bgcolor: 'grey.50' }}>
955
+ <Typography variant="subtitle2" gutterBottom>
956
+ Payment Method
957
+ </Typography>
958
+ <Typography variant="body2" color="text.secondary">
959
+ Card ending in 1234
960
+ </Typography>
961
+ </Paper>
962
+ <FormControlLabel
963
+ control={<Switch defaultChecked />}
964
+ label="I agree to the terms and conditions"
965
+ />
966
+ </Stack>
967
+ )}
968
+ </Box>
969
+
970
+ <Box sx={{ display: 'flex', justifyContent: 'space-between' }}>
971
+ <Button disabled={activeStep === 0} onClick={handleBack}>
972
+ Back
973
+ </Button>
974
+ <Button variant="contained" onClick={handleNext}>
975
+ {activeStep === steps.length - 1 ? 'Finish' : 'Continue'}
976
+ </Button>
977
+ </Box>
978
+ </>
979
+ )}
980
+
981
+ {/* Nested Modal for Additional Contact */}
982
+ <StackedModal
983
+ open={nestedOpen}
984
+ onClose={() => setNestedOpen(false)}
985
+ navigationTitle="Additional Contact"
986
+ modalId="workflow-nested"
987
+ actions={
988
+ <Button variant="contained" size="small" onClick={() => setNestedOpen(false)}>
989
+ Add Contact
990
+ </Button>
991
+ }
992
+ >
993
+ <StackedModalContent>
994
+ <Typography variant="h6" gutterBottom>
995
+ Emergency Contact Information
996
+ </Typography>
997
+ <Stack spacing={2}>
998
+ <TextField fullWidth label="Contact Name" />
999
+ <TextField fullWidth label="Relationship" />
1000
+ <TextField fullWidth label="Phone Number" />
1001
+ <TextField fullWidth label="Email" type="email" />
1002
+ </Stack>
1003
+ </StackedModalContent>
1004
+ </StackedModal>
1005
+ </StackedModalContent>
1006
+ </StackedModal>
1007
+ </>
1008
+ );
1009
+ };
1010
+
1011
+ return <WorkflowModal />;
1012
+ };
1013
+
1014
+ export const ComplexWorkflow: Story = {
1015
+ render: () => <ComplexWorkflowComponent />,
1016
+ };
1017
+
1018
+ // Performance demo with many modals
1019
+ const PerformanceDemoComponent = () => {
1020
+ const PerformanceTest = () => {
1021
+ const [modals, setModals] = useState<boolean[]>(Array(10).fill(false));
1022
+ const { stack } = useModalStack();
1023
+
1024
+ const openModal = (index: number) => {
1025
+ setModals((prev) => {
1026
+ const newModals = [...prev];
1027
+ newModals[index] = true;
1028
+ return newModals;
1029
+ });
1030
+ };
1031
+
1032
+ const closeModal = (index: number) => {
1033
+ setModals((prev) => {
1034
+ const newModals = [...prev];
1035
+ newModals[index] = false;
1036
+ return newModals;
1037
+ });
1038
+ };
1039
+
1040
+ return (
1041
+ <>
1042
+ <Card>
1043
+ <CardContent>
1044
+ <Typography variant="h5" gutterBottom>
1045
+ Performance Test
1046
+ </Typography>
1047
+ <Typography color="text.secondary" paragraph>
1048
+ Test the modal system with multiple nested modals. Only 2 modals are rendered at once
1049
+ for optimal performance.
1050
+ </Typography>
1051
+ <Alert severity="info" sx={{ mt: 2 }}>
1052
+ Current stack depth: {stack.length} modal(s)
1053
+ </Alert>
1054
+ </CardContent>
1055
+ <CardActions>
1056
+ <Button variant="contained" onClick={() => openModal(0)} startIcon={<AddIcon />}>
1057
+ Open First Modal
1058
+ </Button>
1059
+ </CardActions>
1060
+ </Card>
1061
+
1062
+ {modals.map((isOpen, index) => (
1063
+ <StackedModal
1064
+ key={index}
1065
+ open={isOpen}
1066
+ onClose={() => closeModal(index)}
1067
+ navigationTitle={`Modal Level ${index + 1}`}
1068
+ modalId={`perf-modal-${index}`}
1069
+ glass={index === 0}
1070
+ actions={
1071
+ index === modals.length - 1 ? (
1072
+ <Button
1073
+ variant="contained"
1074
+ color="error"
1075
+ size="small"
1076
+ onClick={() => {
1077
+ setModals(Array(10).fill(false));
1078
+ }}
1079
+ >
1080
+ Close All
1081
+ </Button>
1082
+ ) : (
1083
+ <Button
1084
+ variant="contained"
1085
+ size="small"
1086
+ onClick={() => openModal(index + 1)}
1087
+ disabled={index >= 9}
1088
+ >
1089
+ Open Next
1090
+ </Button>
1091
+ )
1092
+ }
1093
+ >
1094
+ <StackedModalContent>
1095
+ <Typography variant="h5" gutterBottom>
1096
+ Level {index + 1} Content
1097
+ </Typography>
1098
+ <Typography paragraph>
1099
+ This is modal number {index + 1} in the stack.
1100
+ {index > 1 && ' Only this modal and its parent are rendered.'}
1101
+ </Typography>
1102
+
1103
+ <Grid container spacing={2}>
1104
+ {Array.from({ length: 6 }).map((_, i) => (
1105
+ <Grid item xs={12} md={6} key={i}>
1106
+ <Card>
1107
+ <CardContent>
1108
+ <Typography variant="h6">Card {i + 1}</Typography>
1109
+ <Typography color="text.secondary">
1110
+ Sample content to test rendering performance
1111
+ </Typography>
1112
+ </CardContent>
1113
+ </Card>
1114
+ </Grid>
1115
+ ))}
1116
+ </Grid>
1117
+
1118
+ {index < 9 && (
1119
+ <Box sx={{ mt: 3 }}>
1120
+ <Button variant="outlined" fullWidth onClick={() => openModal(index + 1)}>
1121
+ Open Modal {index + 2}
1122
+ </Button>
1123
+ </Box>
1124
+ )}
1125
+ </StackedModalContent>
1126
+ </StackedModal>
1127
+ ))}
1128
+ </>
1129
+ );
1130
+ };
1131
+
1132
+ return <PerformanceTest />;
1133
+ };
1134
+
1135
+ export const PerformanceDemo: Story = {
1136
+ render: () => <PerformanceDemoComponent />,
1137
+ };
1138
+
1139
+ // RTL Support
1140
+ const RTLSupportComponent = () => {
1141
+ const RTLModal = () => {
1142
+ const [open, setOpen] = useState(false);
1143
+ const [rtl, setRtl] = useState(false);
1144
+
1145
+ return (
1146
+ <>
1147
+ <Card>
1148
+ <CardContent>
1149
+ <Typography variant="h5" gutterBottom>
1150
+ RTL Language Support
1151
+ </Typography>
1152
+ <Typography color="text.secondary" paragraph>
1153
+ Toggle RTL mode to see how the modal adapts to right-to-left languages
1154
+ </Typography>
1155
+ <FormControlLabel
1156
+ control={<Switch checked={rtl} onChange={(e) => setRtl(e.target.checked)} />}
1157
+ label="Enable RTL Mode"
1158
+ />
1159
+ </CardContent>
1160
+ <CardActions>
1161
+ <Button variant="contained" onClick={() => setOpen(true)}>
1162
+ {rtl ? 'فتح مشروط' : 'Open Modal'}
1163
+ </Button>
1164
+ </CardActions>
1165
+ </Card>
1166
+
1167
+ <StackedModal
1168
+ open={open}
1169
+ onClose={() => setOpen(false)}
1170
+ navigationTitle={rtl ? 'نموذج مع دعم RTL' : 'Modal with RTL Support'}
1171
+ rtl={rtl}
1172
+ glass={true}
1173
+ actions={
1174
+ <Stack direction="row" spacing={1}>
1175
+ <Button variant="outlined" size="small" onClick={() => setOpen(false)}>
1176
+ {rtl ? 'إلغاء' : 'Cancel'}
1177
+ </Button>
1178
+ <Button variant="contained" size="small">
1179
+ {rtl ? 'حفظ' : 'Save'}
1180
+ </Button>
1181
+ </Stack>
1182
+ }
1183
+ >
1184
+ <StackedModalContent>
1185
+ <Typography variant="h5" gutterBottom>
1186
+ {rtl ? 'مرحبا بالعالم' : 'Hello World'}
1187
+ </Typography>
1188
+ <Typography paragraph>
1189
+ {rtl
1190
+ ? 'هذا مثال على النص العربي في واجهة المستخدم. يتكيف التخطيط تلقائيًا مع اتجاه RTL.'
1191
+ : 'This is an example of English text in the UI. The layout automatically adapts to LTR direction.'}
1192
+ </Typography>
1193
+ <Stack spacing={2}>
1194
+ <TextField fullWidth label={rtl ? 'الاسم' : 'Name'} dir={rtl ? 'rtl' : 'ltr'} />
1195
+ <TextField
1196
+ fullWidth
1197
+ label={rtl ? 'البريد الإلكتروني' : 'Email'}
1198
+ dir={rtl ? 'rtl' : 'ltr'}
1199
+ />
1200
+ </Stack>
1201
+ </StackedModalContent>
1202
+ </StackedModal>
1203
+ </>
1204
+ );
1205
+ };
1206
+
1207
+ return <RTLModal />;
1208
+ };
1209
+
1210
+ export const RTLSupport: Story = {
1211
+ render: () => <RTLSupportComponent />,
1212
+ };
1213
+
1214
+ // Accessibility Features
1215
+ const AccessibilityShowcaseComponent = () => {
1216
+ const AccessibleModal = () => {
1217
+ const [open, setOpen] = useState(false);
1218
+ const [announcement, setAnnouncement] = useState('');
1219
+
1220
+ return (
1221
+ <>
1222
+ <Card>
1223
+ <CardContent>
1224
+ <Typography variant="h5" gutterBottom>
1225
+ Accessibility Features
1226
+ </Typography>
1227
+ <Typography color="text.secondary" paragraph>
1228
+ Full ARIA support, keyboard navigation, and focus management
1229
+ </Typography>
1230
+ <Alert severity="success" sx={{ mt: 2 }}>
1231
+ <Typography variant="body2">
1232
+ • Press ESC to close modal
1233
+ <br />
1234
+ • Use Tab/Shift+Tab to navigate
1235
+ <br />
1236
+ • Focus is trapped within modal
1237
+ <br />• Screen reader announcements
1238
+ </Typography>
1239
+ </Alert>
1240
+ </CardContent>
1241
+ <CardActions>
1242
+ <Button
1243
+ variant="contained"
1244
+ onClick={() => {
1245
+ setOpen(true);
1246
+ setAnnouncement('Modal opened. Use Tab to navigate.');
1247
+ }}
1248
+ >
1249
+ Open Accessible Modal
1250
+ </Button>
1251
+ </CardActions>
1252
+ </Card>
1253
+
1254
+ {announcement && (
1255
+ <Alert severity="info" onClose={() => setAnnouncement('')} sx={{ mt: 2 }}>
1256
+ {announcement}
1257
+ </Alert>
1258
+ )}
1259
+
1260
+ <StackedModal
1261
+ open={open}
1262
+ onClose={() => {
1263
+ setOpen(false);
1264
+ setAnnouncement('Modal closed.');
1265
+ }}
1266
+ navigationTitle="Accessible Form"
1267
+ closeOnEsc={true}
1268
+ closeOnClickOutside={true}
1269
+ aria-labelledby="accessible-modal-title"
1270
+ aria-describedby="accessible-modal-description"
1271
+ actions={
1272
+ <Stack direction="row" spacing={1}>
1273
+ <Button
1274
+ variant="outlined"
1275
+ size="small"
1276
+ onClick={() => {
1277
+ setOpen(false);
1278
+ setAnnouncement('Modal closed without saving.');
1279
+ }}
1280
+ >
1281
+ Cancel
1282
+ </Button>
1283
+ <Button
1284
+ variant="contained"
1285
+ size="small"
1286
+ onClick={() => {
1287
+ setOpen(false);
1288
+ setAnnouncement('Form submitted successfully.');
1289
+ }}
1290
+ >
1291
+ Submit
1292
+ </Button>
1293
+ </Stack>
1294
+ }
1295
+ >
1296
+ <StackedModalContent>
1297
+ <Typography id="accessible-modal-title" variant="h5" gutterBottom>
1298
+ Fully Accessible Modal
1299
+ </Typography>
1300
+ <Typography id="accessible-modal-description" paragraph>
1301
+ This modal demonstrates all accessibility features including proper ARIA labels,
1302
+ keyboard navigation, and focus management.
1303
+ </Typography>
1304
+
1305
+ <Stack spacing={3}>
1306
+ <TextField
1307
+ fullWidth
1308
+ label="First Name"
1309
+ helperText="Press Tab to move to next field"
1310
+ inputProps={{
1311
+ 'aria-label': 'First name input field',
1312
+ 'aria-required': 'true',
1313
+ }}
1314
+ />
1315
+ <TextField
1316
+ fullWidth
1317
+ label="Last Name"
1318
+ helperText="Press Shift+Tab to move to previous field"
1319
+ inputProps={{
1320
+ 'aria-label': 'Last name input field',
1321
+ 'aria-required': 'true',
1322
+ }}
1323
+ />
1324
+ <FormControlLabel
1325
+ control={
1326
+ <Switch
1327
+ inputProps={{
1328
+ 'aria-label': 'Subscribe to newsletter',
1329
+ }}
1330
+ />
1331
+ }
1332
+ label="Subscribe to newsletter"
1333
+ />
1334
+ </Stack>
1335
+ </StackedModalContent>
1336
+ </StackedModal>
1337
+ </>
1338
+ );
1339
+ };
1340
+
1341
+ return <AccessibleModal />;
1342
+ };
1343
+
1344
+ export const AccessibilityShowcase: Story = {
1345
+ render: () => <AccessibilityShowcaseComponent />,
1346
+ };
1347
+
1348
+ // Required story exports for validation
1349
+ const AllVariantsComponent = () => {
1350
+ const [basicOpen, setBasicOpen] = useState(false);
1351
+ const [glassOpen, setGlassOpen] = useState(false);
1352
+ const [loadingOpen, setLoadingOpen] = useState(false);
1353
+
1354
+ return (
1355
+ <>
1356
+ <Stack spacing={2}>
1357
+ <Button variant="contained" onClick={() => setBasicOpen(true)}>
1358
+ Basic Modal
1359
+ </Button>
1360
+ <Button variant="contained" onClick={() => setGlassOpen(true)}>
1361
+ Glass Modal
1362
+ </Button>
1363
+ <Button variant="contained" onClick={() => setLoadingOpen(true)}>
1364
+ Loading Modal
1365
+ </Button>
1366
+ </Stack>
1367
+
1368
+ <StackedModal
1369
+ open={basicOpen}
1370
+ onClose={() => setBasicOpen(false)}
1371
+ navigationTitle="Basic Variant"
1372
+ >
1373
+ <StackedModalContent>
1374
+ <Typography>Basic modal variant without special effects</Typography>
1375
+ </StackedModalContent>
1376
+ </StackedModal>
1377
+
1378
+ <StackedModal
1379
+ open={glassOpen}
1380
+ onClose={() => setGlassOpen(false)}
1381
+ glass
1382
+ navigationTitle="Glass Variant"
1383
+ >
1384
+ <StackedModalContent>
1385
+ <Typography>Glass morphism modal variant</Typography>
1386
+ </StackedModalContent>
1387
+ </StackedModal>
1388
+
1389
+ <StackedModal
1390
+ open={loadingOpen}
1391
+ onClose={() => setLoadingOpen(false)}
1392
+ loading
1393
+ loadingText="Loading data..."
1394
+ navigationTitle="Loading Variant"
1395
+ >
1396
+ <StackedModalContent>
1397
+ <Typography>This content won't show during loading</Typography>
1398
+ </StackedModalContent>
1399
+ </StackedModal>
1400
+ </>
1401
+ );
1402
+ };
1403
+
1404
+ export const AllVariants: Story = {
1405
+ render: () => <AllVariantsComponent />,
1406
+ };
1407
+
1408
+ const AllSizesComponent = () => {
1409
+ const [smallOpen, setSmallOpen] = useState(false);
1410
+ const [mediumOpen, setMediumOpen] = useState(false);
1411
+ const [largeOpen, setLargeOpen] = useState(false);
1412
+ const [fullscreenOpen, setFullscreenOpen] = useState(false);
1413
+
1414
+ return (
1415
+ <>
1416
+ <Stack spacing={2}>
1417
+ <Button variant="contained" onClick={() => setSmallOpen(true)}>
1418
+ Small Modal
1419
+ </Button>
1420
+ <Button variant="contained" onClick={() => setMediumOpen(true)}>
1421
+ Medium Modal
1422
+ </Button>
1423
+ <Button variant="contained" onClick={() => setLargeOpen(true)}>
1424
+ Large Modal
1425
+ </Button>
1426
+ <Button variant="contained" onClick={() => setFullscreenOpen(true)}>
1427
+ Fullscreen Modal
1428
+ </Button>
1429
+ </Stack>
1430
+
1431
+ <StackedModal
1432
+ open={smallOpen}
1433
+ onClose={() => setSmallOpen(false)}
1434
+ navigationTitle="Small Size"
1435
+ maxWidth="sm"
1436
+ >
1437
+ <StackedModalContent>
1438
+ <Typography>Small modal content (max-width: sm)</Typography>
1439
+ </StackedModalContent>
1440
+ </StackedModal>
1441
+
1442
+ <StackedModal
1443
+ open={mediumOpen}
1444
+ onClose={() => setMediumOpen(false)}
1445
+ navigationTitle="Medium Size"
1446
+ maxWidth="md"
1447
+ >
1448
+ <StackedModalContent>
1449
+ <Typography>Medium modal content (max-width: md)</Typography>
1450
+ </StackedModalContent>
1451
+ </StackedModal>
1452
+
1453
+ <StackedModal
1454
+ open={largeOpen}
1455
+ onClose={() => setLargeOpen(false)}
1456
+ navigationTitle="Large Size"
1457
+ maxWidth="lg"
1458
+ >
1459
+ <StackedModalContent>
1460
+ <Typography>Large modal content (max-width: lg)</Typography>
1461
+ </StackedModalContent>
1462
+ </StackedModal>
1463
+
1464
+ <StackedModal
1465
+ open={fullscreenOpen}
1466
+ onClose={() => setFullscreenOpen(false)}
1467
+ navigationTitle="Fullscreen"
1468
+ fullScreen
1469
+ >
1470
+ <StackedModalContent>
1471
+ <Typography>Fullscreen modal content</Typography>
1472
+ </StackedModalContent>
1473
+ </StackedModal>
1474
+ </>
1475
+ );
1476
+ };
1477
+
1478
+ export const AllSizes: Story = {
1479
+ render: () => <AllSizesComponent />,
1480
+ };
1481
+
1482
+ const AllStatesComponent = () => {
1483
+ const [normalOpen, setNormalOpen] = useState(false);
1484
+ const [loadingOpen, setLoadingOpen] = useState(false);
1485
+ const [errorOpen, setErrorOpen] = useState(false);
1486
+ const [disabledActionsOpen, setDisabledActionsOpen] = useState(false);
1487
+
1488
+ return (
1489
+ <>
1490
+ <Stack spacing={2}>
1491
+ <Button variant="contained" onClick={() => setNormalOpen(true)}>
1492
+ Normal State
1493
+ </Button>
1494
+ <Button variant="contained" onClick={() => setLoadingOpen(true)}>
1495
+ Loading State
1496
+ </Button>
1497
+ <Button variant="contained" onClick={() => setErrorOpen(true)}>
1498
+ Error State
1499
+ </Button>
1500
+ <Button variant="contained" onClick={() => setDisabledActionsOpen(true)}>
1501
+ Disabled Actions
1502
+ </Button>
1503
+ </Stack>
1504
+
1505
+ <StackedModal
1506
+ open={normalOpen}
1507
+ onClose={() => setNormalOpen(false)}
1508
+ navigationTitle="Normal State"
1509
+ >
1510
+ <StackedModalContent>
1511
+ <Typography>Normal modal state with default styling</Typography>
1512
+ </StackedModalContent>
1513
+ </StackedModal>
1514
+
1515
+ <StackedModal
1516
+ open={loadingOpen}
1517
+ onClose={() => setLoadingOpen(false)}
1518
+ loading
1519
+ loadingText="Processing..."
1520
+ navigationTitle="Loading State"
1521
+ >
1522
+ <StackedModalContent>
1523
+ <Typography>Content hidden during loading</Typography>
1524
+ </StackedModalContent>
1525
+ </StackedModal>
1526
+
1527
+ <StackedModal
1528
+ open={errorOpen}
1529
+ onClose={() => setErrorOpen(false)}
1530
+ navigationTitle="Error State"
1531
+ >
1532
+ <StackedModalContent>
1533
+ <Alert severity="error" sx={{ mb: 2 }}>
1534
+ An error occurred while processing your request
1535
+ </Alert>
1536
+ <Typography>Modal with error state displayed</Typography>
1537
+ </StackedModalContent>
1538
+ </StackedModal>
1539
+
1540
+ <StackedModal
1541
+ open={disabledActionsOpen}
1542
+ onClose={() => setDisabledActionsOpen(false)}
1543
+ navigationTitle="Disabled Actions"
1544
+ actions={
1545
+ <Button variant="contained" size="small" disabled>
1546
+ Disabled Action
1547
+ </Button>
1548
+ }
1549
+ >
1550
+ <StackedModalContent>
1551
+ <Typography>Modal with disabled action buttons</Typography>
1552
+ </StackedModalContent>
1553
+ </StackedModal>
1554
+ </>
1555
+ );
1556
+ };
1557
+
1558
+ export const AllStates: Story = {
1559
+ render: () => <AllStatesComponent />,
1560
+ };
1561
+
1562
+ const InteractiveStatesComponent = () => {
1563
+ const [formOpen, setFormOpen] = useState(false);
1564
+ const [confirmOpen, setConfirmOpen] = useState(false);
1565
+ const [formData, setFormData] = useState({ name: '', email: '' });
1566
+ const [submitting, setSubmitting] = useState(false);
1567
+
1568
+ const handleSubmit = () => {
1569
+ setSubmitting(true);
1570
+ window.setTimeout(() => {
1571
+ setSubmitting(false);
1572
+ setFormOpen(false);
1573
+ setConfirmOpen(true);
1574
+ }, 2000);
1575
+ };
1576
+
1577
+ return (
1578
+ <>
1579
+ <Button variant="contained" onClick={() => setFormOpen(true)}>
1580
+ Interactive Form Modal
1581
+ </Button>
1582
+
1583
+ <StackedModal
1584
+ open={formOpen}
1585
+ onClose={() => setFormOpen(false)}
1586
+ navigationTitle="Interactive Form"
1587
+ loading={submitting}
1588
+ loadingText="Submitting form..."
1589
+ actions={
1590
+ !submitting && (
1591
+ <Stack direction="row" spacing={1}>
1592
+ <Button variant="outlined" size="small" onClick={() => setFormOpen(false)}>
1593
+ Cancel
1594
+ </Button>
1595
+ <Button
1596
+ variant="contained"
1597
+ size="small"
1598
+ onClick={handleSubmit}
1599
+ disabled={!formData.name || !formData.email}
1600
+ >
1601
+ Submit
1602
+ </Button>
1603
+ </Stack>
1604
+ )
1605
+ }
1606
+ >
1607
+ <StackedModalContent>
1608
+ <Typography variant="h6" gutterBottom>
1609
+ Interactive Form
1610
+ </Typography>
1611
+ <Stack spacing={2}>
1612
+ <TextField
1613
+ fullWidth
1614
+ label="Name"
1615
+ value={formData.name}
1616
+ onChange={(e) => setFormData({ ...formData, name: e.target.value })}
1617
+ helperText={!formData.name ? 'Name is required' : ''}
1618
+ error={!formData.name}
1619
+ />
1620
+ <TextField
1621
+ fullWidth
1622
+ label="Email"
1623
+ type="email"
1624
+ value={formData.email}
1625
+ onChange={(e) => setFormData({ ...formData, email: e.target.value })}
1626
+ helperText={!formData.email ? 'Email is required' : ''}
1627
+ error={!formData.email}
1628
+ />
1629
+ </Stack>
1630
+ </StackedModalContent>
1631
+ </StackedModal>
1632
+
1633
+ <StackedModal
1634
+ open={confirmOpen}
1635
+ onClose={() => setConfirmOpen(false)}
1636
+ navigationTitle="Success"
1637
+ actions={
1638
+ <Button variant="contained" size="small" onClick={() => setConfirmOpen(false)}>
1639
+ Close
1640
+ </Button>
1641
+ }
1642
+ >
1643
+ <StackedModalContent>
1644
+ <Alert severity="success">Form submitted successfully!</Alert>
1645
+ <Typography sx={{ mt: 2 }}>Thank you for your submission, {formData.name}.</Typography>
1646
+ </StackedModalContent>
1647
+ </StackedModal>
1648
+ </>
1649
+ );
1650
+ };
1651
+
1652
+ export const InteractiveStates: Story = {
1653
+ render: () => <InteractiveStatesComponent />,
1654
+ };
1655
+
1656
+ const ResponsiveComponent = () => {
1657
+ const [mobileOpen, setMobileOpen] = useState(false);
1658
+ const [tabletOpen, setTabletOpen] = useState(false);
1659
+ const [desktopOpen, setDesktopOpen] = useState(false);
1660
+ const theme = useTheme();
1661
+ const isMobile = useMediaQuery(theme.breakpoints.down('sm'));
1662
+ const isTablet = useMediaQuery(theme.breakpoints.down('md'));
1663
+
1664
+ const getDeviceInfo = () => {
1665
+ if (isMobile) return 'Mobile (< 600px)';
1666
+ if (isTablet) return 'Tablet (600px - 960px)';
1667
+ return 'Desktop (> 960px)';
1668
+ };
1669
+
1670
+ return (
1671
+ <>
1672
+ <Alert severity="info" sx={{ mb: 2 }}>
1673
+ Current viewport: {getDeviceInfo()}
1674
+ </Alert>
1675
+
1676
+ <Stack spacing={2}>
1677
+ <Button variant="contained" onClick={() => setMobileOpen(true)}>
1678
+ Mobile Optimized Modal
1679
+ </Button>
1680
+ <Button variant="contained" onClick={() => setTabletOpen(true)}>
1681
+ Tablet Optimized Modal
1682
+ </Button>
1683
+ <Button variant="contained" onClick={() => setDesktopOpen(true)}>
1684
+ Desktop Modal
1685
+ </Button>
1686
+ </Stack>
1687
+
1688
+ <StackedModal
1689
+ open={mobileOpen}
1690
+ onClose={() => setMobileOpen(false)}
1691
+ navigationTitle="Mobile Modal"
1692
+ maxWidth={isMobile ? false : 'sm'}
1693
+ >
1694
+ <StackedModalContent>
1695
+ <Typography variant="h6" gutterBottom>
1696
+ Mobile-Optimized Content
1697
+ </Typography>
1698
+ <Typography paragraph>
1699
+ This modal adapts to mobile screens with bottom sheet behavior and touch-friendly
1700
+ interactions.
1701
+ </Typography>
1702
+ <Stack spacing={2}>
1703
+ <Button variant="outlined" fullWidth>
1704
+ Mobile Action 1
1705
+ </Button>
1706
+ <Button variant="outlined" fullWidth>
1707
+ Mobile Action 2
1708
+ </Button>
1709
+ </Stack>
1710
+ </StackedModalContent>
1711
+ </StackedModal>
1712
+
1713
+ <StackedModal
1714
+ open={tabletOpen}
1715
+ onClose={() => setTabletOpen(false)}
1716
+ navigationTitle="Tablet Modal"
1717
+ maxWidth="md"
1718
+ >
1719
+ <StackedModalContent>
1720
+ <Typography variant="h5" gutterBottom>
1721
+ Tablet-Optimized Layout
1722
+ </Typography>
1723
+ <Grid container spacing={2}>
1724
+ <Grid item xs={12} sm={6}>
1725
+ <Paper sx={{ p: 2 }}>
1726
+ <Typography variant="h6">Left Panel</Typography>
1727
+ <Typography>Content optimized for tablet screens</Typography>
1728
+ </Paper>
1729
+ </Grid>
1730
+ <Grid item xs={12} sm={6}>
1731
+ <Paper sx={{ p: 2 }}>
1732
+ <Typography variant="h6">Right Panel</Typography>
1733
+ <Typography>Multi-column layout on tablets</Typography>
1734
+ </Paper>
1735
+ </Grid>
1736
+ </Grid>
1737
+ </StackedModalContent>
1738
+ </StackedModal>
1739
+
1740
+ <StackedModal
1741
+ open={desktopOpen}
1742
+ onClose={() => setDesktopOpen(false)}
1743
+ navigationTitle="Desktop Modal"
1744
+ maxWidth="lg"
1745
+ >
1746
+ <StackedModalContent>
1747
+ <Typography variant="h4" gutterBottom>
1748
+ Desktop-Optimized Experience
1749
+ </Typography>
1750
+ <Typography paragraph>
1751
+ Large modal with extensive content suitable for desktop viewing.
1752
+ </Typography>
1753
+ <Grid container spacing={3}>
1754
+ {Array.from({ length: 6 }).map((_, i) => (
1755
+ <Grid item xs={12} md={4} key={i}>
1756
+ <Card>
1757
+ <CardContent>
1758
+ <Typography variant="h6">Feature {i + 1}</Typography>
1759
+ <Typography color="text.secondary">
1760
+ Desktop users can see more content at once
1761
+ </Typography>
1762
+ </CardContent>
1763
+ </Card>
1764
+ </Grid>
1765
+ ))}
1766
+ </Grid>
1767
+ </StackedModalContent>
1768
+ </StackedModal>
1769
+ </>
1770
+ );
1771
+ };
1772
+
1773
+ export const Responsive: Story = {
1774
+ parameters: {
1775
+ viewport: {
1776
+ viewports: {
1777
+ mobile: { name: 'Mobile', styles: { width: '375px', height: '667px' } },
1778
+ tablet: { name: 'Tablet', styles: { width: '768px', height: '1024px' } },
1779
+ desktop: { name: 'Desktop', styles: { width: '1440px', height: '900px' } },
1780
+ },
1781
+ defaultViewport: 'mobile',
1782
+ },
1783
+ },
1784
+ render: () => <ResponsiveComponent />,
1785
+ };