@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,110 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import { fireEvent, render, screen, waitFor } from '@testing-library/react';
3
+
4
+ import { MultiSelectDropdown } from '../MultiSelectDropdown';
5
+
6
+ const MANY_OPTIONS = [
7
+ { value: 'bebidas', label: 'Bebidas' },
8
+ { value: 'sobremesas', label: 'Sobremesas' },
9
+ { value: 'lanches', label: 'Lanches' },
10
+ { value: 'saladas', label: 'Saladas' },
11
+ { value: 'massas', label: 'Massas' },
12
+ { value: 'carnes', label: 'Carnes' },
13
+ { value: 'peixes', label: 'Peixes' },
14
+ { value: 'vegano', label: 'Vegano' },
15
+ { value: 'infantil', label: 'Infantil' },
16
+ ];
17
+
18
+ function open(): void {
19
+ fireEvent.click(screen.getByTestId('cat'));
20
+ }
21
+
22
+ describe('MultiSelectDropdown search (FUT-169)', () => {
23
+ it('auto-shows a search box for long lists and filters options case-insensitively', async () => {
24
+ render(
25
+ <MultiSelectDropdown
26
+ label="Categoria"
27
+ options={MANY_OPTIONS}
28
+ selected={new Set<string>()}
29
+ onToggle={vi.fn()}
30
+ onClear={vi.fn()}
31
+ searchPlaceholder="Buscar…"
32
+ noResultsLabel="Nenhum resultado"
33
+ data-testid="cat"
34
+ />,
35
+ );
36
+ open();
37
+
38
+ const search = await screen.findByTestId('cat-search');
39
+ expect(screen.getByText('Lanches')).toBeInTheDocument();
40
+
41
+ fireEvent.change(search, { target: { value: 'SOBRE' } });
42
+
43
+ await waitFor(() => expect(screen.queryByText('Lanches')).not.toBeInTheDocument());
44
+ expect(screen.getByText('Sobremesas')).toBeInTheDocument();
45
+ });
46
+
47
+ it('shows the empty state when nothing matches', async () => {
48
+ render(
49
+ <MultiSelectDropdown
50
+ label="Categoria"
51
+ options={MANY_OPTIONS}
52
+ selected={new Set<string>()}
53
+ onToggle={vi.fn()}
54
+ onClear={vi.fn()}
55
+ noResultsLabel="Nenhum resultado"
56
+ data-testid="cat"
57
+ />,
58
+ );
59
+ open();
60
+
61
+ fireEvent.change(await screen.findByTestId('cat-search'), { target: { value: 'zzz' } });
62
+
63
+ expect(await screen.findByTestId('cat-no-results')).toHaveTextContent('Nenhum resultado');
64
+ });
65
+
66
+ it('does NOT render a search box for short lists', async () => {
67
+ render(
68
+ <MultiSelectDropdown
69
+ label="Ativo"
70
+ options={[
71
+ { value: 'sim', label: 'Sim' },
72
+ { value: 'nao', label: 'Não' },
73
+ ]}
74
+ selected={new Set<string>()}
75
+ onToggle={vi.fn()}
76
+ onClear={vi.fn()}
77
+ data-testid="cat"
78
+ />,
79
+ );
80
+ open();
81
+
82
+ // Presence evidence first (menu open), then assert the search box was never
83
+ // rendered — wrapped in waitFor per the anti-flake rule.
84
+ expect(await screen.findByText('Sim')).toBeInTheDocument();
85
+ await waitFor(() => expect(screen.queryByTestId('cat-search')).not.toBeInTheDocument());
86
+ });
87
+
88
+ it('toggles a filtered option and keeps the menu open (search still visible)', async () => {
89
+ const onToggle = vi.fn();
90
+ render(
91
+ <MultiSelectDropdown
92
+ label="Categoria"
93
+ options={MANY_OPTIONS}
94
+ selected={new Set<string>()}
95
+ onToggle={onToggle}
96
+ onClear={vi.fn()}
97
+ data-testid="cat"
98
+ />,
99
+ );
100
+ open();
101
+
102
+ const search = await screen.findByTestId('cat-search');
103
+ fireEvent.change(search, { target: { value: 'peix' } });
104
+ fireEvent.click(await screen.findByText('Peixes'));
105
+
106
+ expect(onToggle).toHaveBeenCalledWith('peixes', true);
107
+ // Multi-select: the menu stays open, so the search box is still mounted.
108
+ expect(screen.getByTestId('cat-search')).toBeInTheDocument();
109
+ });
110
+ });
@@ -0,0 +1,99 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+ import { fireEvent, render, screen, waitFor, within } from "@testing-library/react";
3
+
4
+ import { SavedViewsMenu } from "../SavedViewsMenu";
5
+ import type { SavedViewLike } from "../ContentToolbar.types";
6
+
7
+ const views: SavedViewLike[] = [
8
+ { id: "v1", name: "Meus ativos", shared: false, pinned: true, isDefault: true, isOwner: true },
9
+ { id: "v2", name: "Da equipe", shared: true, pinned: false, isDefault: false, isOwner: false },
10
+ ];
11
+
12
+ function renderMenu(overrides: Partial<React.ComponentProps<typeof SavedViewsMenu>> = {}) {
13
+ const handlers = {
14
+ onApply: vi.fn(),
15
+ onSelectMain: vi.fn(),
16
+ onSaveCurrent: vi.fn(),
17
+ onEdit: vi.fn(),
18
+ onDelete: vi.fn(),
19
+ onSetDefault: vi.fn(),
20
+ onTogglePin: vi.fn(),
21
+ onToggleShare: vi.fn(),
22
+ onManageAll: vi.fn(),
23
+ };
24
+ render(<SavedViewsMenu views={views} testIdPrefix="views" {...handlers} {...overrides} />);
25
+ return handlers;
26
+ }
27
+
28
+ describe("SavedViewsMenu", () => {
29
+ it("lists pinned + recent sections and a default badge", () => {
30
+ renderMenu();
31
+ fireEvent.click(screen.getByTestId("views-button"));
32
+ expect(screen.getByTestId("views-section-pinned")).toBeInTheDocument();
33
+ expect(screen.getByTestId("views-section-recent")).toBeInTheDocument();
34
+ expect(screen.getByTestId("views-default-v1")).toBeInTheDocument();
35
+ });
36
+
37
+ it("labels the trigger 'Visão principal' by default and the active view name when set", () => {
38
+ const noop = {
39
+ onApply: vi.fn(),
40
+ onSelectMain: vi.fn(),
41
+ onSaveCurrent: vi.fn(),
42
+ onEdit: vi.fn(),
43
+ onDelete: vi.fn(),
44
+ onSetDefault: vi.fn(),
45
+ onTogglePin: vi.fn(),
46
+ onToggleShare: vi.fn(),
47
+ onManageAll: vi.fn(),
48
+ };
49
+ const { rerender } = render(<SavedViewsMenu views={views} testIdPrefix="views" {...noop} />);
50
+ expect(screen.getByTestId("views-button")).toHaveTextContent("Visão principal");
51
+ rerender(<SavedViewsMenu views={views} activeViewName="Meus ativos" testIdPrefix="views" {...noop} />);
52
+ expect(screen.getByTestId("views-button")).toHaveTextContent("Meus ativos");
53
+ });
54
+
55
+ it("offers a Main vision default that resets to the no-filter view", () => {
56
+ const handlers = renderMenu();
57
+ fireEvent.click(screen.getByTestId("views-button"));
58
+ fireEvent.click(screen.getByTestId("views-main"));
59
+ expect(handlers.onSelectMain).toHaveBeenCalled();
60
+ });
61
+
62
+ it("applies a view when its name is clicked", () => {
63
+ const handlers = renderMenu();
64
+ fireEvent.click(screen.getByTestId("views-button"));
65
+ fireEvent.click(screen.getByTestId("views-apply-v1"));
66
+ expect(handlers.onApply).toHaveBeenCalledWith(expect.objectContaining({ id: "v1" }));
67
+ });
68
+
69
+ it("shows full owner actions (incl. Excluir) for an owned view", () => {
70
+ renderMenu();
71
+ fireEvent.click(screen.getByTestId("views-button"));
72
+ fireEvent.click(screen.getByTestId("views-kebab-v1"));
73
+ expect(screen.getByTestId("views-item-delete-v1")).toBeInTheDocument();
74
+ expect(screen.getByText("Excluir")).toBeInTheDocument();
75
+ });
76
+
77
+ it("shows apply-only for a non-owned shared view", async () => {
78
+ renderMenu();
79
+ fireEvent.click(screen.getByTestId("views-button"));
80
+ fireEvent.click(screen.getByTestId("views-kebab-v2"));
81
+ expect(screen.getByTestId("views-item-apply-v2")).toBeInTheDocument();
82
+ await waitFor(() => {
83
+ expect(screen.queryByTestId("views-item-delete-v2")).not.toBeInTheDocument();
84
+ });
85
+ });
86
+
87
+ it("offers save-current and manage-all", () => {
88
+ const handlers = renderMenu();
89
+ fireEvent.click(screen.getByTestId("views-button"));
90
+ fireEvent.click(screen.getByTestId("views-save-current"));
91
+ expect(handlers.onSaveCurrent).toHaveBeenCalled();
92
+ });
93
+
94
+ it("shows an empty hint when there are no views", () => {
95
+ renderMenu({ views: [] });
96
+ fireEvent.click(screen.getByTestId("views-button"));
97
+ expect(within(screen.getByTestId("views-popover")).getByText(/Nenhuma visão salva/i)).toBeInTheDocument();
98
+ });
99
+ });
@@ -0,0 +1,24 @@
1
+ export { ContentToolbar } from './ContentToolbar';
2
+ export { ViewSelector } from './ViewSelector';
3
+ export { SortByDropdown } from './SortByDropdown';
4
+ export { MultiSelectDropdown } from './MultiSelectDropdown';
5
+ export { FilterTrigger } from './FilterTrigger';
6
+ export { ColumnsMenu } from './ColumnsMenu';
7
+ export { SavedViewsMenu } from './SavedViewsMenu';
8
+ export type {
9
+ ContentToolbarProps,
10
+ ViewMode,
11
+ ViewSelectorProps,
12
+ SortOrderOption,
13
+ SortFieldDefinition,
14
+ SortByDropdownProps,
15
+ MultiSelectOption,
16
+ MultiSelectExtraOption,
17
+ MultiSelectDropdownProps,
18
+ FilterTriggerProps,
19
+ ColumnVisibilityOption,
20
+ ColumnsMenuProps,
21
+ SavedViewLike,
22
+ SavedViewsLabels,
23
+ SavedViewsMenuProps,
24
+ } from './ContentToolbar.types';
@@ -0,0 +1,42 @@
1
+ # ContentToolbar Test Status Tracking
2
+
3
+ ## Test Files Status
4
+
5
+ - [x] ContentToolbar.test.stories.tsx created
6
+ - [x] Core interaction categories implemented
7
+
8
+ ## Storybook Tests Status
9
+
10
+ ### Test Results
11
+
12
+ | Test Name | Status | Pass/Fail | Notes |
13
+ | ---------------------------------- | ------- | --------- | ----------------------------------------- |
14
+ | Select All → chrome → Clear All | Pending | - | Selection count + Clear All appear/reset |
15
+ | Sort By opens and changes field | Pending | - | Menu opens; picking a field updates trigger |
16
+ | Content Type toggles stay open | Pending | - | Multi-select keeps menu open; Clear shown |
17
+ | Filter trigger toggles + dot | Pending | - | aria-expanded flips; active dot renders |
18
+
19
+ Legend: Pending | Running | PASS | FAIL
20
+
21
+ ## Static Stories Status
22
+
23
+ - [x] Default (full reference bar)
24
+ - [x] WithSelection
25
+
26
+ ## Lint Status
27
+
28
+ - [ ] No lint errors
29
+ - [ ] No warnings
30
+
31
+ ## TypeCheck Status
32
+
33
+ - [ ] No type errors
34
+ - [ ] All props properly typed
35
+
36
+ ## Overall Component Status
37
+
38
+ - [ ] All tests passing
39
+ - [ ] Lint clean
40
+ - [ ] TypeCheck clean
41
+ - [ ] Stories working
42
+ - [ ] Ready for production
@@ -0,0 +1,41 @@
1
+ # ContentToolbar
2
+
3
+ MUI port of a reference content-page toolbar. A bar shell (`ContentToolbar`)
4
+ with a left selection cluster (Select All / Clear All / count / `actions`) and a
5
+ right `rightControls` slot, plus the controls that populate that slot:
6
+ `ViewSelector`, `SortByDropdown`, `MultiSelectDropdown`, `FilterTrigger`.
7
+ Generic/agnostic — no domain coupling; the reference's content-item action
8
+ dropdown is deliberately left to the consumer's `actions` slot.
9
+
10
+ ## Props (per component)
11
+
12
+ - **ContentToolbar** — hasSelection, selectedCount, selectAll, clearSelection,
13
+ rightControls, actions?, selectAllTestId?, clearAllTestId?, edgeAlign?.
14
+ - **ViewSelector** — viewMode, onViewModeChange, zoom (number[]), onZoomChange.
15
+ - **SortByDropdown** — fields, activeField, activeOrder?, onFieldChange,
16
+ onOrderChange?; generic over the field type; Order/Sort sections.
17
+ - **MultiSelectDropdown** — label, options (value/label/count), selected (Set),
18
+ onToggle, onClear, allLabel?, extraOptions?.
19
+ - **FilterTrigger** — open, onOpenChange, hasActiveFilters?.
20
+
21
+ ## Lint
22
+
23
+ - Clean (`pnpm lint:files src/components/layout/ContentToolbar`).
24
+
25
+ ## Type Errors
26
+
27
+ - None (`pnpm typecheck`).
28
+
29
+ ## Testing Scenarios
30
+
31
+ - Select All → count + Clear All → reset; Sort By open + field change;
32
+ Content-Type multi-select keeps menu open + Clear; filter funnel toggle + dot.
33
+
34
+ ## Storybook Tests List
35
+
36
+ - Layout/ContentToolbar/Tests → 4 interaction stories.
37
+
38
+ ## Current
39
+
40
+ - v1 ported from the reference (tabwoah `ContentPageToolbar` + controls),
41
+ translated to MUI. Next: wire into an admin page as the first consumer.
@@ -0,0 +1,71 @@
1
+ # Dashboard
2
+
3
+ A **composable page shell** for list/detail admin pages. `<Dashboard>` is a
4
+ context provider and layout; every sub-component is **opt-in**. Compose only the
5
+ parts a page needs — omit `<Dashboard.Filters>` and there is no filter UI at all.
6
+ Authoring order does not matter: recognised parts always render in the slot order
7
+ **Breadcrumb → Header → Filters → Body**.
8
+
9
+ ## Why
10
+
11
+ Every data page (products, inventory, suppliers, …) shares the same chrome: a
12
+ breadcrumb, a title with contextual controls (info, filter toggle, settings,
13
+ export), a collapsible filter region, and a body. `Dashboard` captures that shape
14
+ once so pages stay consistent and new pages are a composition, not a rebuild.
15
+ It is framework-agnostic (pure MUI, no app coupling) so other projects can reuse it.
16
+
17
+ ## Composition
18
+
19
+ ```tsx
20
+ import { Dashboard } from '@12-apps/ui/layout/Dashboard';
21
+
22
+ <Dashboard activeFilterCount={activeCount}>
23
+ <Dashboard.Breadcrumb items={[{ label: 'Admin', href: '/admin' }, { label: 'Products' }]} />
24
+ <Dashboard.Header title="Products">
25
+ <Dashboard.Info title="About Products">What this page does…</Dashboard.Info>
26
+ <Dashboard.FilterToggle />
27
+ <Dashboard.Settings title="Product settings">In development</Dashboard.Settings>
28
+ <Dashboard.Spacer />
29
+ <Dashboard.Export onExport={(id) => exportAs(id)} />
30
+ <Dashboard.Action><Button variant="contained">New product</Button></Dashboard.Action>
31
+ </Dashboard.Header>
32
+ <Dashboard.Filters>
33
+ <SearchInput />
34
+ <Dashboard.MoreFilters>
35
+ <MinMaxRange field="price" />
36
+ </Dashboard.MoreFilters>
37
+ </Dashboard.Filters>
38
+ <Dashboard.Body>{table}</Dashboard.Body>
39
+ </Dashboard>
40
+ ```
41
+
42
+ ## Parts
43
+
44
+ | Part | Slot | Purpose |
45
+ | --- | --- | --- |
46
+ | `Dashboard` | — | Provider + layout. Owns `filtersVisible` / `moreFiltersOpen` via context. |
47
+ | `Dashboard.Breadcrumb` | breadcrumb | Breadcrumb trail. `renderLink` lets you inject a router link. |
48
+ | `Dashboard.Header` | header | Title row hosting the action parts below. |
49
+ | `Dashboard.Info` | (in header) | `[i]` popover summarising the page. |
50
+ | `Dashboard.FilterToggle` | (in header) | Funnel icon; toggles the filter region, badges `activeFilterCount`. |
51
+ | `Dashboard.Settings` | (in header) | Gear icon. Default: opens a dialog with `children`. With `href` (+ optional `linkComponent`): renders as a link to a settings route (e.g. the page's Configuração section) — no dialog. |
52
+ | `Dashboard.Export` | (in header) | Export dropdown (CSV/Excel/JSON by default); calls `onExport(id)`. |
53
+ | `Dashboard.Spacer` | (in header) | Pushes following controls to the right edge. |
54
+ | `Dashboard.Action` | (in header) | Slot for a primary/secondary button. |
55
+ | `Dashboard.Filters` | filters | Collapsible search/filter region; visibility driven by `FilterToggle`. |
56
+ | `Dashboard.MoreFilters` | (in filters) | Expandable advanced panel for ranges/dates. |
57
+ | `Dashboard.Body` | body | Main content area (the table/grid). |
58
+
59
+ ## State
60
+
61
+ `Dashboard` owns only **UI** state (which regions are open) through
62
+ `DashboardContext`. Search text and filter values stay owned by the page and are
63
+ passed to whatever controls you compose inside `Dashboard.Filters`. Read the
64
+ context directly with `useDashboardContext()` when building custom parts.
65
+
66
+ ## Accessibility
67
+
68
+ - Icon triggers have tooltips + `aria-label`; `FilterToggle` exposes `aria-pressed`.
69
+ - `Info`/`Settings` triggers declare `aria-haspopup`; the settings dialog and info
70
+ popover are focus-trapped by MUI and closable via the close button / `Esc`.
71
+ - Breadcrumb marks the current page with `aria-current="page"`.
@@ -0,0 +1,104 @@
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
+ import { Box, Button, TextField, Typography } from '@mui/material';
3
+ import { fn } from 'storybook/test';
4
+
5
+ import { Dashboard } from './Dashboard';
6
+
7
+ const meta: Meta<typeof Dashboard> = {
8
+ title: 'Layout/Dashboard',
9
+ component: Dashboard,
10
+ parameters: {
11
+ layout: 'padded',
12
+ docs: {
13
+ description: {
14
+ component:
15
+ 'Composable page shell. `<Dashboard>` is a context provider; every part — `Dashboard.Header`, `Dashboard.Breadcrumb`, `Dashboard.Filters`, `Dashboard.Info`, `Dashboard.FilterToggle`, `Dashboard.Settings`, `Dashboard.Export`, `Dashboard.MoreFilters`, `Dashboard.Body` — is opt-in. Compose only what you need; authoring order does not matter, parts render in a fixed slot order.',
16
+ },
17
+ },
18
+ },
19
+ tags: ['autodocs'],
20
+ };
21
+
22
+ export default meta;
23
+ type Story = StoryObj<typeof meta>;
24
+
25
+ const table = (
26
+ <Box sx={{ p: 4, borderRadius: 1, border: '1px dashed', borderColor: 'divider', textAlign: 'center', color: 'text.secondary' }}>
27
+ Your table / grid goes here
28
+ </Box>
29
+ );
30
+
31
+ export const FullComposition: Story = {
32
+ args: { activeFilterCount: 2 },
33
+ render: (args) => (
34
+ <Dashboard {...args}>
35
+ <Dashboard.Breadcrumb items={[{ label: 'Admin', href: '#' }, { label: 'Products' }]} />
36
+ <Dashboard.Header title="Products">
37
+ <Dashboard.Info title="About Products">
38
+ Manage your catalog: create products, set prices, and control stock visibility.
39
+ </Dashboard.Info>
40
+ <Dashboard.FilterToggle />
41
+ <Dashboard.Settings title="Product settings">
42
+ <Typography>In development — coming in the next version.</Typography>
43
+ </Dashboard.Settings>
44
+ <Dashboard.Spacer />
45
+ <Dashboard.Export onExport={fn()} />
46
+ <Dashboard.Action>
47
+ <Button variant="contained">New product</Button>
48
+ </Dashboard.Action>
49
+ </Dashboard.Header>
50
+ <Dashboard.Filters>
51
+ <TextField size="small" placeholder="Search across all columns…" fullWidth />
52
+ <Dashboard.MoreFilters>
53
+ <Box sx={{ display: 'flex', gap: 2 }}>
54
+ <TextField size="small" label="Min price" type="number" />
55
+ <TextField size="small" label="Max price" type="number" />
56
+ </Box>
57
+ </Dashboard.MoreFilters>
58
+ </Dashboard.Filters>
59
+ <Dashboard.Body>{table}</Dashboard.Body>
60
+ </Dashboard>
61
+ ),
62
+ };
63
+
64
+ export const HeaderOnly: Story = {
65
+ render: () => (
66
+ <Dashboard>
67
+ <Dashboard.Header title="Simple page">
68
+ <Dashboard.Action>
69
+ <Button variant="contained">Primary action</Button>
70
+ </Dashboard.Action>
71
+ </Dashboard.Header>
72
+ <Dashboard.Body>{table}</Dashboard.Body>
73
+ </Dashboard>
74
+ ),
75
+ };
76
+
77
+ export const WithoutFilters: Story = {
78
+ render: () => (
79
+ <Dashboard>
80
+ <Dashboard.Breadcrumb items={[{ label: 'Admin', href: '#' }, { label: 'Team' }]} />
81
+ <Dashboard.Header title="Team">
82
+ <Dashboard.Info>Invite teammates and manage their roles.</Dashboard.Info>
83
+ </Dashboard.Header>
84
+ <Dashboard.Body>{table}</Dashboard.Body>
85
+ </Dashboard>
86
+ ),
87
+ };
88
+
89
+ export const OrderIndependent: Story = {
90
+ name: 'Order-independent authoring',
91
+ render: () => (
92
+ <Dashboard>
93
+ {/* Deliberately authored out of order — still renders breadcrumb → header → filters → body. */}
94
+ <Dashboard.Body>{table}</Dashboard.Body>
95
+ <Dashboard.Filters>
96
+ <TextField size="small" placeholder="Search…" fullWidth />
97
+ </Dashboard.Filters>
98
+ <Dashboard.Header title="Reordered">
99
+ <Dashboard.FilterToggle />
100
+ </Dashboard.Header>
101
+ <Dashboard.Breadcrumb items={[{ label: 'Admin', href: '#' }, { label: 'Reordered' }]} />
102
+ </Dashboard>
103
+ ),
104
+ };
@@ -0,0 +1,164 @@
1
+ import { Box, Button, TextField, Typography } from '@mui/material';
2
+ import type { Meta, StoryObj } from '@storybook/react-vite';
3
+ import { expect, fn, userEvent, waitFor, within } from 'storybook/test';
4
+
5
+ import { Dashboard } from './Dashboard';
6
+
7
+ const meta: Meta<typeof Dashboard> = {
8
+ title: 'Layout/Dashboard/Tests',
9
+ component: Dashboard,
10
+ parameters: {
11
+ layout: 'padded',
12
+ chromatic: { disableSnapshot: false },
13
+ },
14
+ tags: ['autodocs', 'test', 'component:Dashboard', 'checked'],
15
+ };
16
+
17
+ export default meta;
18
+ type Story = StoryObj<typeof meta>;
19
+
20
+ const body = <Box data-testid="content">content</Box>;
21
+
22
+ /** Full composition reused across tests. */
23
+ const Composed = ({ onExport = fn() }: { onExport?: (id: string) => void }) => (
24
+ <Dashboard activeFilterCount={2}>
25
+ <Dashboard.Breadcrumb items={[{ label: 'Admin', href: '#' }, { label: 'Products' }]} />
26
+ <Dashboard.Header title="Products">
27
+ <Dashboard.Info title="About Products">Manage your catalog.</Dashboard.Info>
28
+ <Dashboard.FilterToggle />
29
+ <Dashboard.Settings title="Product settings">
30
+ <Typography>In development.</Typography>
31
+ </Dashboard.Settings>
32
+ <Dashboard.Spacer />
33
+ <Dashboard.Export onExport={onExport} />
34
+ <Dashboard.Action>
35
+ <Button variant="contained">New product</Button>
36
+ </Dashboard.Action>
37
+ </Dashboard.Header>
38
+ <Dashboard.Filters>
39
+ <TextField size="small" placeholder="Search…" fullWidth inputProps={{ 'data-testid': 'search' }} />
40
+ <Dashboard.MoreFilters>
41
+ <TextField size="small" label="Min price" type="number" />
42
+ </Dashboard.MoreFilters>
43
+ </Dashboard.Filters>
44
+ <Dashboard.Body>{body}</Dashboard.Body>
45
+ </Dashboard>
46
+ );
47
+
48
+ export const FilterToggleInteraction: Story = {
49
+ name: '🧪 Filter toggle shows/hides filters',
50
+ render: () => <Composed />,
51
+ play: async ({ canvasElement, step }) => {
52
+ const canvas = within(canvasElement);
53
+ await step('Filters visible by default', async () => {
54
+ await expect(canvas.getByTestId('search')).toBeVisible();
55
+ });
56
+ await step('Toggle hides the filter region', async () => {
57
+ await userEvent.click(canvas.getByTestId('dashboard-filter-toggle'));
58
+ await waitFor(() => expect(canvas.queryByTestId('search')).not.toBeInTheDocument());
59
+ });
60
+ await step('Toggle again restores it', async () => {
61
+ await userEvent.click(canvas.getByTestId('dashboard-filter-toggle'));
62
+ await waitFor(() => expect(canvas.getByTestId('search')).toBeVisible());
63
+ });
64
+ },
65
+ };
66
+
67
+ export const InfoPopover: Story = {
68
+ name: '🧪 Info popover opens',
69
+ render: () => <Composed />,
70
+ play: async ({ canvasElement, step }) => {
71
+ const canvas = within(canvasElement);
72
+ await step('Open the info popover', async () => {
73
+ await userEvent.click(canvas.getByTestId('dashboard-info-trigger'));
74
+ await waitFor(() => expect(within(document.body).getByText('About Products')).toBeVisible());
75
+ });
76
+ },
77
+ };
78
+
79
+ export const SettingsDialog: Story = {
80
+ name: '🧪 Settings gear opens dialog',
81
+ render: () => <Composed />,
82
+ play: async ({ canvasElement, step }) => {
83
+ const canvas = within(canvasElement);
84
+ await step('Open the settings dialog', async () => {
85
+ await userEvent.click(canvas.getByTestId('dashboard-settings-trigger'));
86
+ await waitFor(() => expect(within(document.body).getByText('In development.')).toBeVisible());
87
+ });
88
+ },
89
+ };
90
+
91
+ export const SettingsLink: Story = {
92
+ name: '🧪 Settings gear links to a settings route (no dialog)',
93
+ render: () => (
94
+ <Dashboard>
95
+ <Dashboard.Header title="Estoque">
96
+ <Dashboard.Settings ariaLabel="Configurações de estoque" href="/admin/acme/config/inventory" />
97
+ </Dashboard.Header>
98
+ <Dashboard.Body>{body}</Dashboard.Body>
99
+ </Dashboard>
100
+ ),
101
+ play: async ({ canvasElement, step }) => {
102
+ const canvas = within(canvasElement);
103
+ await step('Gear renders as an anchor pointing at the config route', async () => {
104
+ const gear = canvas.getByTestId('dashboard-settings-trigger');
105
+ await expect(gear.tagName).toBe('A');
106
+ await expect(gear).toHaveAttribute('href', '/admin/acme/config/inventory');
107
+ });
108
+ await step('Clicking it opens no dialog', async () => {
109
+ await userEvent.click(canvas.getByTestId('dashboard-settings-trigger'));
110
+ await expect(canvas.queryAllByTestId('dashboard-settings-dialog')).toHaveLength(0);
111
+ });
112
+ },
113
+ };
114
+
115
+ export const ExportMenu: Story = {
116
+ name: '🧪 Export menu invokes handler',
117
+ render: () => {
118
+ const onExport = fn();
119
+ return <Composed onExport={onExport} />;
120
+ },
121
+ play: async ({ canvasElement, step }) => {
122
+ const canvas = within(canvasElement);
123
+ await step('Open export menu and choose CSV', async () => {
124
+ await userEvent.click(canvas.getByTestId('dashboard-export-trigger'));
125
+ await waitFor(() => expect(within(document.body).getByTestId('dashboard-export-csv')).toBeVisible());
126
+ await userEvent.click(within(document.body).getByTestId('dashboard-export-csv'));
127
+ });
128
+ },
129
+ };
130
+
131
+ export const MoreFiltersExpands: Story = {
132
+ name: '🧪 More filters expands advanced panel',
133
+ render: () => <Composed />,
134
+ play: async ({ canvasElement, step }) => {
135
+ const canvas = within(canvasElement);
136
+ await step('Expand advanced filters', async () => {
137
+ await userEvent.click(canvas.getByTestId('dashboard-more-filters-toggle'));
138
+ await waitFor(() => expect(canvas.getByLabelText('Min price')).toBeVisible());
139
+ });
140
+ },
141
+ };
142
+
143
+ export const OrderIndependentRendering: Story = {
144
+ name: '🧪 Renders in slot order regardless of authoring order',
145
+ render: () => (
146
+ <Dashboard>
147
+ <Dashboard.Body>{body}</Dashboard.Body>
148
+ <Dashboard.Header title="Reordered" />
149
+ <Dashboard.Breadcrumb items={[{ label: 'Admin', href: '#' }, { label: 'Reordered' }]} />
150
+ </Dashboard>
151
+ ),
152
+ play: async ({ canvasElement, step }) => {
153
+ const canvas = within(canvasElement);
154
+ await step('Breadcrumb renders before header, header before body', async () => {
155
+ const breadcrumb = canvas.getByTestId('dashboard-breadcrumb');
156
+ const header = canvas.getByTestId('dashboard-header');
157
+ const content = canvas.getByTestId('dashboard-body');
158
+ const bcBeforeHeader = breadcrumb.compareDocumentPosition(header) & Node.DOCUMENT_POSITION_FOLLOWING;
159
+ const headerBeforeBody = header.compareDocumentPosition(content) & Node.DOCUMENT_POSITION_FOLLOWING;
160
+ await expect(Boolean(bcBeforeHeader)).toBe(true);
161
+ await expect(Boolean(headerBeforeBody)).toBe(true);
162
+ });
163
+ },
164
+ };