@evolve.ui/core-components 1.0.0 → 1.1.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 (559) hide show
  1. package/Checkbox.d.cts +1 -1
  2. package/Checkbox.d.mts +1 -1
  3. package/{DateInput-B8XQZPTx.d.cts → DateInput-CFxTZu3m.d.mts} +2 -2
  4. package/{DateInput-B8XQZPTx.d.cts.map → DateInput-CFxTZu3m.d.mts.map} +1 -1
  5. package/{DateInput-CfNmywqQ.d.mts → DateInput-DstMICTl.d.cts} +2 -2
  6. package/{DateInput-CfNmywqQ.d.mts.map → DateInput-DstMICTl.d.cts.map} +1 -1
  7. package/{FavoriteButton-CowOPoqo.d.cts → FavoriteButton-BGF-3dze.d.cts} +2 -2
  8. package/{FavoriteButton-BRY8FVpV.d.mts.map → FavoriteButton-BGF-3dze.d.cts.map} +1 -1
  9. package/{FavoriteButton-BRY8FVpV.d.mts → FavoriteButton-BZEGWrRo.d.mts} +2 -2
  10. package/{FavoriteButton-CowOPoqo.d.cts.map → FavoriteButton-BZEGWrRo.d.mts.map} +1 -1
  11. package/Input.d.cts +1 -1
  12. package/Input.d.mts +1 -1
  13. package/Radio.d.cts +1 -1
  14. package/Radio.d.mts +1 -1
  15. package/{TextInput-BhkeQZh4.d.cts → TextInput-B7lqQ1gh.d.cts} +3 -3
  16. package/{TextInput-BhkeQZh4.d.cts.map → TextInput-B7lqQ1gh.d.cts.map} +1 -1
  17. package/{TextInput-CWCeR18b.d.mts → TextInput-CxoT3np_.d.mts} +3 -3
  18. package/{TextInput-CWCeR18b.d.mts.map → TextInput-CxoT3np_.d.mts.map} +1 -1
  19. package/dateInput.d.cts +1 -1
  20. package/dateInput.d.mts +1 -1
  21. package/datePicker.d.cts +1 -1
  22. package/datePicker.d.mts +1 -1
  23. package/evolve-ui.entries.json +556 -0
  24. package/favoriteButton.d.cts +1 -1
  25. package/favoriteButton.d.mts +1 -1
  26. package/featureFlags/hooks.d.cts +1 -1
  27. package/featureFlags/hooks.d.mts +1 -1
  28. package/fileUpload/testUtils/mockFilesAndImages.d.cts +3 -3
  29. package/fileUpload/testUtils/mockFilesAndImages.d.cts.map +1 -1
  30. package/fileUpload/testUtils/mockFilesAndImages.d.mts +3 -3
  31. package/fileUpload/testUtils/mockFilesAndImages.d.mts.map +1 -1
  32. package/fileUpload/testUtils/testUtils.d.cts +1 -1
  33. package/fileUpload/testUtils/testUtils.d.cts.map +1 -1
  34. package/fileUpload/testUtils/testUtils.d.mts +1 -1
  35. package/fileUpload/testUtils/testUtils.d.mts.map +1 -1
  36. package/{index-BVb-FJDo.d.mts → index-BYPklw8m.d.mts} +2 -2
  37. package/{index-BVb-FJDo.d.mts.map → index-BYPklw8m.d.mts.map} +1 -1
  38. package/{index-3V0Y3AU3.d.mts → index-Bvn6svaT.d.cts} +2 -2
  39. package/{index-3V0Y3AU3.d.mts.map → index-Bvn6svaT.d.cts.map} +1 -1
  40. package/{index-Bu7c6X7O.d.mts → index-C2zPeUs9.d.mts} +5 -5
  41. package/{index-Bu7c6X7O.d.mts.map → index-C2zPeUs9.d.mts.map} +1 -1
  42. package/{index-BXz3rMMk.d.cts → index-Cmz2OD6x.d.cts} +2 -2
  43. package/{index-BXz3rMMk.d.cts.map → index-Cmz2OD6x.d.cts.map} +1 -1
  44. package/{index-kchg551L.d.cts → index-DsZAxqnF.d.mts} +2 -2
  45. package/{index-kchg551L.d.cts.map → index-DsZAxqnF.d.mts.map} +1 -1
  46. package/{index-BzN9RaXe.d.cts → index-QtMvgJcp.d.cts} +5 -5
  47. package/{index-BzN9RaXe.d.cts.map → index-QtMvgJcp.d.cts.map} +1 -1
  48. package/{index-dpfLYhgI.d.mts → index-hrztez-b.d.mts} +2 -2
  49. package/{index-DBYqF9Sr.d.cts.map → index-hrztez-b.d.mts.map} +1 -1
  50. package/{index-DBYqF9Sr.d.cts → index-o9dwzLLE.d.cts} +2 -2
  51. package/{index-dpfLYhgI.d.mts.map → index-o9dwzLLE.d.cts.map} +1 -1
  52. package/index.d.cts +7 -7
  53. package/index.d.mts +7 -7
  54. package/package.json +2 -2
  55. package/providers.d.cts +1 -1
  56. package/providers.d.mts +1 -1
  57. package/src/Accordion/Accordion.tsx +233 -0
  58. package/src/AddressDisplay/AddressDisplay.tsx +43 -0
  59. package/src/AddressDisplay/components/addressComponents.tsx +111 -0
  60. package/src/AddressDisplay/components/addressField.tsx +25 -0
  61. package/src/AddressDisplay/components/addressSection.tsx +8 -0
  62. package/src/AddressDisplay/components/getCountryValue.tsx +31 -0
  63. package/src/AddressDisplay/types.ts +26 -0
  64. package/src/AutomatedCarousel/AutomatedCarousel.tsx +163 -0
  65. package/src/AutomatedCarousel/automatedCarousel.types.ts +7 -0
  66. package/src/AutomatedCarousel/components/CarouselProgressBar/CarouselProgressBar.tsx +139 -0
  67. package/src/AutomatedCarousel/components/CarouselProgressBar/components/CarouselProgressBarUnit/CarouselProgressBarUnit.tsx +165 -0
  68. package/src/Badge/Badge.tsx +104 -0
  69. package/src/Badge/Badge.types.ts +58 -0
  70. package/src/Badge/ItemBadge.tsx +97 -0
  71. package/src/Badge/LiveStatusBadge.tsx +93 -0
  72. package/src/BannerNotification/BannerNotification.tsx +157 -0
  73. package/src/BannerNotification/components/BannerNotificationSkeleton.tsx +39 -0
  74. package/src/BannerNotification/components/CalloutIcon/BannerIcon.tsx +48 -0
  75. package/src/BannerNotification/utils/getRandomTooltipId.ts +3 -0
  76. package/src/BottomSheet/BottomSheet.tsx +476 -0
  77. package/src/BottomSheet/components/BottomSheetBackdrop/BottomSheetBackdrop.tsx +47 -0
  78. package/src/BottomSheet/components/BottomSheetContentArea/BottomSheetContentArea.tsx +92 -0
  79. package/src/BottomSheet/components/BottomSheetOverlay/BottomSheetOverlayTranslate3d.tsx +196 -0
  80. package/src/BottomSheet/components/SheetDescription/SheetDescription.tsx +22 -0
  81. package/src/BottomSheet/components/SheetTitle/SheetTitle.tsx +21 -0
  82. package/src/BottomSheet/components/index.tsx +5 -0
  83. package/src/BottomSheet/hooks/index.tsx +13 -0
  84. package/src/BottomSheet/hooks/useAriaHider.tsx +91 -0
  85. package/src/BottomSheet/hooks/useBottomSheetServices.tsx +224 -0
  86. package/src/BottomSheet/hooks/useDragHandler.tsx +282 -0
  87. package/src/BottomSheet/hooks/useFocusTrap.tsx +113 -0
  88. package/src/BottomSheet/hooks/useLayoutEffect.tsx +4 -0
  89. package/src/BottomSheet/hooks/useOptimizedResizeObserver.tsx +94 -0
  90. package/src/BottomSheet/hooks/useOptimizedScrollState.tsx +87 -0
  91. package/src/BottomSheet/hooks/useReady.tsx +34 -0
  92. package/src/BottomSheet/hooks/useReducedMotion.tsx +22 -0
  93. package/src/BottomSheet/hooks/useScrollLock.tsx +143 -0
  94. package/src/BottomSheet/hooks/useSnapPoints.tsx +355 -0
  95. package/src/BottomSheet/hooks/useSpring.tsx +47 -0
  96. package/src/BottomSheet/hooks/useSpringInterpolationsTranslate3d.tsx +101 -0
  97. package/src/BottomSheet/index.tsx +237 -0
  98. package/src/BottomSheet/state/atoms.ts +147 -0
  99. package/src/BottomSheet/state/useBottomSheetStateMachine.ts +246 -0
  100. package/src/BottomSheet/types.ts +172 -0
  101. package/src/BottomSheet/utils.ts +65 -0
  102. package/src/Breadcrumbs/Breadcrumbs.tsx +126 -0
  103. package/src/Button/Button.tsx +164 -0
  104. package/src/Button/Button.types.ts +80 -0
  105. package/src/Button/buttonColorClasses.ts +53 -0
  106. package/src/Callout/Callout.tsx +136 -0
  107. package/src/Callout/Callout.types.ts +29 -0
  108. package/src/Callout/components/CalloutIcon/CalloutIcon.tsx +56 -0
  109. package/src/Card/CardGrid.tsx +263 -0
  110. package/src/Card/SingleCard.tsx +22 -0
  111. package/src/Card/cardFactory.tsx +176 -0
  112. package/src/Card/components/createBadge.tsx +34 -0
  113. package/src/Card/components/createFavoriteButton.tsx +40 -0
  114. package/src/Card/components/createImage.tsx +64 -0
  115. package/src/Card/components/createInfo.tsx +84 -0
  116. package/src/Card/components/createName.tsx +63 -0
  117. package/src/Card/components/createPriceStatus.tsx +100 -0
  118. package/src/Card/components/types.ts +4 -0
  119. package/src/Card/hooks/useCardVisibilityTracking.ts +82 -0
  120. package/src/Card/sharedProps.ts +12 -0
  121. package/src/Card/types.ts +62 -0
  122. package/src/Carousel/Carousel.tsx +513 -0
  123. package/src/Carousel/Carousel.types.ts +43 -0
  124. package/src/Carousel/Carousel.utils.ts +63 -0
  125. package/src/Carousel/components/DotButton/DotButton.tsx +42 -0
  126. package/src/Carousel/components/NavigationButtons/NavigationButtons.tsx +77 -0
  127. package/src/Carousel/components/TitleSection/TitleSection.tsx +61 -0
  128. package/src/Carousel/components/TitleSection/components/SubHeaderLeft/SubHeaderLeft.tsx +53 -0
  129. package/src/Carousel/components/TitleSection/components/Title/Title.tsx +46 -0
  130. package/src/Carousel/index.ts +2 -0
  131. package/src/Carousel/testUtils.ts +10 -0
  132. package/src/Chips/Chip.tsx +153 -0
  133. package/src/Chips/ChipGroup.tsx +173 -0
  134. package/src/Chips/SuggestionChip.tsx +15 -0
  135. package/src/Chips/chipTypes.ts +113 -0
  136. package/src/Chips/index.ts +4 -0
  137. package/src/ChoiceListItem/Checkbox.tsx +69 -0
  138. package/src/ChoiceListItem/Radio.tsx +61 -0
  139. package/src/ChoiceListItem/choiceListItem.tsx +99 -0
  140. package/src/ChoiceListItem/common.tsx +148 -0
  141. package/src/ChoiceListItem/index.ts +3 -0
  142. package/src/Collapsible/Collapsible.tsx +58 -0
  143. package/src/Confetti/Confetti.tsx +270 -0
  144. package/src/Confetti/index.ts +2 -0
  145. package/src/ContentPager/ContentPager.tsx +189 -0
  146. package/src/ContentPager/components/Page.tsx +24 -0
  147. package/src/CookieConsent/components/CookieCategoryRow/CookieCategoryRow.tsx +30 -0
  148. package/src/CookieConsent/components/CookieConsent/CookieConsent.tsx +74 -0
  149. package/src/CookieConsent/components/CookieConsentBanner/CookieConsentBanner.tsx +51 -0
  150. package/src/CookieConsent/components/CookieConsentModal/CookieConsentModal.tsx +64 -0
  151. package/src/CookieConsent/hooks/useCookieConsent.ts +170 -0
  152. package/src/CookieConsent/hooks/useCookieConsentState.ts +142 -0
  153. package/src/CookieConsent/index.ts +16 -0
  154. package/src/CookieConsent/types/cookieConsent.types.ts +79 -0
  155. package/src/CookieConsent/types/index.ts +7 -0
  156. package/src/Countdown/Countdown.tsx +161 -0
  157. package/src/Countdown/Countdown.types.ts +4 -0
  158. package/src/Countdown/hooks/useGetCountdown.ts +103 -0
  159. package/src/DateTimeInput/dateInput/DateInput.tsx +199 -0
  160. package/src/DateTimeInput/datePicker/DatePicker.tsx +138 -0
  161. package/src/DateTimeInput/datePicker/components/calendar/Calendar.tsx +72 -0
  162. package/src/DateTimeInput/datePicker/index.ts +2 -0
  163. package/src/DateTimeInput/timeInput/TimeInput.tsx +128 -0
  164. package/src/DateTimeInput/timePicker/TimePicker.tsx +118 -0
  165. package/src/DateTimeInput/timePicker/components/TimePopover/AmPmSwitch.tsx +103 -0
  166. package/src/DateTimeInput/timePicker/components/TimePopover/TimeFieldInput.tsx +26 -0
  167. package/src/DateTimeInput/timePicker/components/TimePopover/TimePopover.tsx +84 -0
  168. package/src/DateTimeInput/timePicker/components/TimePopover/TimePopover.utils.ts +67 -0
  169. package/src/DateTimeInput/timePicker/components/TimePopover/TimePopoverActions.tsx +26 -0
  170. package/src/DateTimeInput/timePicker/index.ts +2 -0
  171. package/src/DateTimeInput/utils/getDisplayDate.ts +15 -0
  172. package/src/DateTimeInput/utils/getDisplayTime.ts +15 -0
  173. package/src/DateTimeInput/utils/index.ts +2 -0
  174. package/src/DateTimeInput/utils/parseTimeValue.ts +54 -0
  175. package/src/Drawer/Drawer.tsx +446 -0
  176. package/src/Drawer/atoms.ts +4 -0
  177. package/src/Drawer/components/DialogActions/DialogActions.tsx +33 -0
  178. package/src/Drawer/components/DialogContent/DialogContent.tsx +80 -0
  179. package/src/Drawer/components/DialogHeader/DialogHeader.tsx +68 -0
  180. package/src/EducationalPopover/EducationalPopover.tsx +174 -0
  181. package/src/FavoriteButton/FavoriteButton.tsx +64 -0
  182. package/src/FavoriteButton/components/IconOnlyFavoriteButton/IconOnlyFavoriteButton.tsx +80 -0
  183. package/src/FavoriteButton/components/LabeledAnimatedFavoriteButton/LabeledAnimatedFavoriteButton.tsx +179 -0
  184. package/src/FavoriteButton/components/LabeledFavoriteButton/LabeledFavoriteButton.tsx +71 -0
  185. package/src/FavoriteButton/components/SmallHeartStraightIcon/SmallHeartStraightIcon.tsx +14 -0
  186. package/src/FavoriteButton/hooks/useFavoriteButtonState.ts +30 -0
  187. package/src/FavoriteButton/index.ts +2 -0
  188. package/src/FavoriteButton/types/favoriteButton.ts +87 -0
  189. package/src/FeatureFlags/devTools/FeatureFlagDevToolsUI.tsx +226 -0
  190. package/src/FeatureFlags/devTools/getFeatureFlagCookieOverrides.ts +30 -0
  191. package/src/FeatureFlags/devTools/utils/cookies.ts +169 -0
  192. package/src/FeatureFlags/hooks/index.ts +2 -0
  193. package/src/FeatureFlags/hooks/useFeatureFlag.tsx +19 -0
  194. package/src/FeatureFlags/hooks/useFeatureFlags.tsx +15 -0
  195. package/src/FileUpload/components/FileCard/FileCard.tsx +50 -0
  196. package/src/FileUpload/components/FileDropzone/FileDropzone.tsx +221 -0
  197. package/src/FileUpload/components/FileDropzone/components/DropzoneContent/DropzoneContent.tsx +28 -0
  198. package/src/FileUpload/components/FileDropzone/components/DropzoneContent/DropzoneText.tsx +81 -0
  199. package/src/FileUpload/components/FileDropzone/components/FileDropzoneDebugger/FileDropzoneDebugger.tsx +40 -0
  200. package/src/FileUpload/components/FileDropzone/components/FileDropzoneDebugger/FileRejectionsDisplay.tsx +110 -0
  201. package/src/FileUpload/components/FileDropzoneOverlay/FileDropzoneOverlay.tsx +183 -0
  202. package/src/FileUpload/components/FileDropzoneOverlay/components/OverlayDropzoneContent.tsx +146 -0
  203. package/src/FileUpload/components/FileDropzoneOverlay/components/OverlayDropzoneDragText.tsx +42 -0
  204. package/src/FileUpload/components/FileDropzoneOverlay/styles.ts +79 -0
  205. package/src/FileUpload/components/FilePreviewList/FilePreviewList.tsx +251 -0
  206. package/src/FileUpload/components/FilePreviewList/virtualizerComponents/FilePreviewVirtualizedList/FilePreviewVirtualizedList.tsx +88 -0
  207. package/src/FileUpload/components/FileUpload/FileUpload.tsx +63 -0
  208. package/src/FileUpload/components/FileUploadCanvas/FileUploadCanvas.tsx +125 -0
  209. package/src/FileUpload/components/GridFileCard/GridFileCard.tsx +364 -0
  210. package/src/FileUpload/components/GridFileCard/utils/sortable.ts +48 -0
  211. package/src/FileUpload/components/ListFileCard/ListFileCard.tsx +259 -0
  212. package/src/FileUpload/components/types.ts +78 -0
  213. package/src/FileUpload/hooks/filePreview/useImageFilePreviewUrl.ts +62 -0
  214. package/src/FileUpload/hooks/index.ts +11 -0
  215. package/src/FileUpload/hooks/upload/useHandleDragEnter/useHandleDragEnter.ts +154 -0
  216. package/src/FileUpload/hooks/upload/useHandleDrop/createFileRejectionHelpers.ts +273 -0
  217. package/src/FileUpload/hooks/upload/useHandleDrop/useHandleDrop.ts +153 -0
  218. package/src/FileUpload/hooks/upload/useUploadAvailability/useUploadAvailability.ts +44 -0
  219. package/src/FileUpload/hooks/validation/createDropzoneValidator.ts +41 -0
  220. package/src/FileUpload/hooks/validation/useFileValidation.ts +25 -0
  221. package/src/FileUpload/hooks/validation/useFileValidationLogic.ts +107 -0
  222. package/src/FileUpload/hooks/validation/useValidationMessages.ts +92 -0
  223. package/src/FileUpload/hooks/validation/useValidationState.ts +171 -0
  224. package/src/FileUpload/index.ts +57 -0
  225. package/src/FileUpload/providers/FileUploadProvider.tsx +219 -0
  226. package/src/FileUpload/providers/UploadValidationProvider.tsx +159 -0
  227. package/src/FileUpload/testUtils/mockFilesAndImages.ts +64 -0
  228. package/src/FileUpload/testUtils/testUtils.ts +111 -0
  229. package/src/FileUpload/types/commonTypes.ts +267 -0
  230. package/src/FileUpload/types/index.ts +31 -0
  231. package/src/FileUpload/types/sharedTypes.ts +159 -0
  232. package/src/FileUpload/utils/constants.ts +79 -0
  233. package/src/FileUpload/utils/createMessageContext.ts +180 -0
  234. package/src/FileUpload/utils/getFileExtensionsFromAcceptedTypes.ts +73 -0
  235. package/src/FileUpload/utils/getFilePluralizationText.ts +68 -0
  236. package/src/FileUpload/utils/getMimeTypes.ts +26 -0
  237. package/src/FileUpload/utils/messageUtils.ts +41 -0
  238. package/src/FileUpload/utils/styles.ts +68 -0
  239. package/src/FormLabel/FormLabel.tsx +212 -0
  240. package/src/IconButton/IconButton.tsx +154 -0
  241. package/src/Icons/CreditCardIcon/CreditCardIcon.tsx +73 -0
  242. package/src/Icons/CreditCardIcon/cardIcons.tsx +270 -0
  243. package/src/Icons/IconBase.tsx +133 -0
  244. package/src/Icons/anyIcon.ts +3 -0
  245. package/src/Icons/generatedIcons/Archive.tsx +48 -0
  246. package/src/Icons/generatedIcons/ArrowClockwise.tsx +48 -0
  247. package/src/Icons/generatedIcons/ArrowDown.tsx +48 -0
  248. package/src/Icons/generatedIcons/ArrowLeft.tsx +48 -0
  249. package/src/Icons/generatedIcons/ArrowRight.tsx +48 -0
  250. package/src/Icons/generatedIcons/ArrowSquareOut.tsx +51 -0
  251. package/src/Icons/generatedIcons/ArrowSquareRight.tsx +51 -0
  252. package/src/Icons/generatedIcons/ArrowUp.tsx +48 -0
  253. package/src/Icons/generatedIcons/ArrowsCounterClockwise.tsx +48 -0
  254. package/src/Icons/generatedIcons/ArrowsLeftRight.tsx +48 -0
  255. package/src/Icons/generatedIcons/ArrowsOutCardinal.tsx +48 -0
  256. package/src/Icons/generatedIcons/Bank.tsx +48 -0
  257. package/src/Icons/generatedIcons/Bell.tsx +51 -0
  258. package/src/Icons/generatedIcons/BookBookmark.tsx +51 -0
  259. package/src/Icons/generatedIcons/BookmarksSimple.tsx +51 -0
  260. package/src/Icons/generatedIcons/Broadcast.tsx +48 -0
  261. package/src/Icons/generatedIcons/CalendarBlank.tsx +48 -0
  262. package/src/Icons/generatedIcons/CalendarStar.tsx +51 -0
  263. package/src/Icons/generatedIcons/Camera.tsx +51 -0
  264. package/src/Icons/generatedIcons/CaretDown.tsx +48 -0
  265. package/src/Icons/generatedIcons/CaretLeft.tsx +48 -0
  266. package/src/Icons/generatedIcons/CaretRight.tsx +48 -0
  267. package/src/Icons/generatedIcons/CaretUp.tsx +48 -0
  268. package/src/Icons/generatedIcons/Certificate.tsx +51 -0
  269. package/src/Icons/generatedIcons/ChartBar.tsx +48 -0
  270. package/src/Icons/generatedIcons/Check.tsx +51 -0
  271. package/src/Icons/generatedIcons/CheckCircle.tsx +48 -0
  272. package/src/Icons/generatedIcons/CirclesFour.tsx +51 -0
  273. package/src/Icons/generatedIcons/Clock.tsx +48 -0
  274. package/src/Icons/generatedIcons/ClockCountdown.tsx +48 -0
  275. package/src/Icons/generatedIcons/Close.tsx +51 -0
  276. package/src/Icons/generatedIcons/CloudArrowUp.tsx +51 -0
  277. package/src/Icons/generatedIcons/CloudWarning.tsx +51 -0
  278. package/src/Icons/generatedIcons/Code.tsx +48 -0
  279. package/src/Icons/generatedIcons/Compass.tsx +51 -0
  280. package/src/Icons/generatedIcons/Confetti.tsx +51 -0
  281. package/src/Icons/generatedIcons/Copy.tsx +48 -0
  282. package/src/Icons/generatedIcons/CornersOut.tsx +48 -0
  283. package/src/Icons/generatedIcons/CreditCard.tsx +48 -0
  284. package/src/Icons/generatedIcons/Crown.tsx +51 -0
  285. package/src/Icons/generatedIcons/CrownSimple.tsx +51 -0
  286. package/src/Icons/generatedIcons/CurrencyCircleDollar.tsx +48 -0
  287. package/src/Icons/generatedIcons/CurrencyDollarSimple.tsx +51 -0
  288. package/src/Icons/generatedIcons/Desktop.tsx +51 -0
  289. package/src/Icons/generatedIcons/Detective.tsx +51 -0
  290. package/src/Icons/generatedIcons/DotOutline.tsx +46 -0
  291. package/src/Icons/generatedIcons/DotsSixVertical.tsx +51 -0
  292. package/src/Icons/generatedIcons/DotsThreeOutline.tsx +51 -0
  293. package/src/Icons/generatedIcons/DotsThreeOutlineVertical.tsx +51 -0
  294. package/src/Icons/generatedIcons/DownloadSimple.tsx +51 -0
  295. package/src/Icons/generatedIcons/EnvelopeSimple.tsx +48 -0
  296. package/src/Icons/generatedIcons/Eraser.tsx +51 -0
  297. package/src/Icons/generatedIcons/Eye.tsx +51 -0
  298. package/src/Icons/generatedIcons/EyeSlash.tsx +51 -0
  299. package/src/Icons/generatedIcons/FacebookLogo.tsx +48 -0
  300. package/src/Icons/generatedIcons/FileArchive.tsx +48 -0
  301. package/src/Icons/generatedIcons/FileArrowDown.tsx +48 -0
  302. package/src/Icons/generatedIcons/FileCsv.tsx +48 -0
  303. package/src/Icons/generatedIcons/FilePdf.tsx +48 -0
  304. package/src/Icons/generatedIcons/FileText.tsx +48 -0
  305. package/src/Icons/generatedIcons/Files.tsx +51 -0
  306. package/src/Icons/generatedIcons/Fire.tsx +51 -0
  307. package/src/Icons/generatedIcons/Flag.tsx +51 -0
  308. package/src/Icons/generatedIcons/FlagBannerFold.tsx +48 -0
  309. package/src/Icons/generatedIcons/FloppyDisk.tsx +51 -0
  310. package/src/Icons/generatedIcons/Gauge.tsx +51 -0
  311. package/src/Icons/generatedIcons/Gavel.tsx +51 -0
  312. package/src/Icons/generatedIcons/Gear.tsx +51 -0
  313. package/src/Icons/generatedIcons/GlobeHemisphereWest.tsx +51 -0
  314. package/src/Icons/generatedIcons/GoogleLogo.tsx +48 -0
  315. package/src/Icons/generatedIcons/GridNine.tsx +51 -0
  316. package/src/Icons/generatedIcons/HandCoins.tsx +51 -0
  317. package/src/Icons/generatedIcons/HandbagSimple.tsx +51 -0
  318. package/src/Icons/generatedIcons/Headset.tsx +51 -0
  319. package/src/Icons/generatedIcons/HeartStraight.tsx +51 -0
  320. package/src/Icons/generatedIcons/HourglassLow.tsx +48 -0
  321. package/src/Icons/generatedIcons/House.tsx +51 -0
  322. package/src/Icons/generatedIcons/Image.tsx +51 -0
  323. package/src/Icons/generatedIcons/ImageSquare.tsx +51 -0
  324. package/src/Icons/generatedIcons/ImagesSquare.tsx +51 -0
  325. package/src/Icons/generatedIcons/Info.tsx +48 -0
  326. package/src/Icons/generatedIcons/InstagramLogo.tsx +51 -0
  327. package/src/Icons/generatedIcons/Lightning.tsx +48 -0
  328. package/src/Icons/generatedIcons/Link.tsx +51 -0
  329. package/src/Icons/generatedIcons/LinkedinLogo.tsx +51 -0
  330. package/src/Icons/generatedIcons/List.tsx +48 -0
  331. package/src/Icons/generatedIcons/Lock.tsx +51 -0
  332. package/src/Icons/generatedIcons/LockOpen.tsx +51 -0
  333. package/src/Icons/generatedIcons/MagnifyingGlass.tsx +48 -0
  334. package/src/Icons/generatedIcons/MapPin.tsx +51 -0
  335. package/src/Icons/generatedIcons/MapPinSimpleArea.tsx +48 -0
  336. package/src/Icons/generatedIcons/Medal.tsx +48 -0
  337. package/src/Icons/generatedIcons/Megaphone.tsx +48 -0
  338. package/src/Icons/generatedIcons/Minus.tsx +45 -0
  339. package/src/Icons/generatedIcons/Money.tsx +51 -0
  340. package/src/Icons/generatedIcons/Notches.tsx +48 -0
  341. package/src/Icons/generatedIcons/NotePencil.tsx +48 -0
  342. package/src/Icons/generatedIcons/Package.tsx +51 -0
  343. package/src/Icons/generatedIcons/PaintBrush.tsx +51 -0
  344. package/src/Icons/generatedIcons/PaperPlaneTilt.tsx +51 -0
  345. package/src/Icons/generatedIcons/Paperclip.tsx +51 -0
  346. package/src/Icons/generatedIcons/Pause.tsx +51 -0
  347. package/src/Icons/generatedIcons/PencilLine.tsx +51 -0
  348. package/src/Icons/generatedIcons/PencilRuler.tsx +51 -0
  349. package/src/Icons/generatedIcons/PencilSimple.tsx +51 -0
  350. package/src/Icons/generatedIcons/Phone.tsx +51 -0
  351. package/src/Icons/generatedIcons/PinterestLogo.tsx +51 -0
  352. package/src/Icons/generatedIcons/Play.tsx +51 -0
  353. package/src/Icons/generatedIcons/Plus.tsx +51 -0
  354. package/src/Icons/generatedIcons/PlusCircle.tsx +48 -0
  355. package/src/Icons/generatedIcons/Printer.tsx +51 -0
  356. package/src/Icons/generatedIcons/Question.tsx +48 -0
  357. package/src/Icons/generatedIcons/Receipt.tsx +51 -0
  358. package/src/Icons/generatedIcons/Rows.tsx +51 -0
  359. package/src/Icons/generatedIcons/SealCheck.tsx +51 -0
  360. package/src/Icons/generatedIcons/SelectionSlash.tsx +48 -0
  361. package/src/Icons/generatedIcons/ShareNetwork.tsx +51 -0
  362. package/src/Icons/generatedIcons/ShieldCheck.tsx +51 -0
  363. package/src/Icons/generatedIcons/ShieldStar.tsx +51 -0
  364. package/src/Icons/generatedIcons/ShoppingCart.tsx +48 -0
  365. package/src/Icons/generatedIcons/ShuffleAngular.tsx +48 -0
  366. package/src/Icons/generatedIcons/SidebarSimple.tsx +48 -0
  367. package/src/Icons/generatedIcons/SlidersHorizontal.tsx +51 -0
  368. package/src/Icons/generatedIcons/Smiley.tsx +48 -0
  369. package/src/Icons/generatedIcons/Sparkle.tsx +51 -0
  370. package/src/Icons/generatedIcons/SpinnerGap.tsx +48 -0
  371. package/src/Icons/generatedIcons/StackPlus.tsx +48 -0
  372. package/src/Icons/generatedIcons/Star.tsx +51 -0
  373. package/src/Icons/generatedIcons/Storefront.tsx +51 -0
  374. package/src/Icons/generatedIcons/Swap.tsx +51 -0
  375. package/src/Icons/generatedIcons/Tag.tsx +51 -0
  376. package/src/Icons/generatedIcons/ThumbsDown.tsx +48 -0
  377. package/src/Icons/generatedIcons/ThumbsUp.tsx +48 -0
  378. package/src/Icons/generatedIcons/Toolbox.tsx +48 -0
  379. package/src/Icons/generatedIcons/Trash.tsx +48 -0
  380. package/src/Icons/generatedIcons/TrendUp.tsx +48 -0
  381. package/src/Icons/generatedIcons/Trophy.tsx +51 -0
  382. package/src/Icons/generatedIcons/Truck.tsx +51 -0
  383. package/src/Icons/generatedIcons/UploadSimple.tsx +51 -0
  384. package/src/Icons/generatedIcons/User.tsx +48 -0
  385. package/src/Icons/generatedIcons/Users.tsx +48 -0
  386. package/src/Icons/generatedIcons/UsersThree.tsx +51 -0
  387. package/src/Icons/generatedIcons/VideoCamera.tsx +51 -0
  388. package/src/Icons/generatedIcons/Warning.tsx +51 -0
  389. package/src/Icons/generatedIcons/WarningCircle.tsx +48 -0
  390. package/src/Icons/generatedIcons/WifiHigh.tsx +51 -0
  391. package/src/Icons/generatedIcons/XCircle.tsx +48 -0
  392. package/src/Icons/generatedIcons/XLogo.tsx +48 -0
  393. package/src/Icons/generatedIcons/YoutubeLogo.tsx +51 -0
  394. package/src/Icons/importedIcons.ts +152 -0
  395. package/src/Icons/index.ts +149 -0
  396. package/src/Icons/socialIcons/appleSocialIcon.tsx +50 -0
  397. package/src/Icons/socialIcons/facebookSocialIcon.tsx +41 -0
  398. package/src/Icons/socialIcons/googleSocialIcon.tsx +134 -0
  399. package/src/ImageCluster/ImageCluster.tsx +125 -0
  400. package/src/ImageSlider/ImageSlider.tsx +582 -0
  401. package/src/ImageSlider/ImageSlider.types.ts +90 -0
  402. package/src/ImageSlider/components/IndexIndicator/IndexIndicator.tsx +21 -0
  403. package/src/ImageSlider/components/NavigationButtons/NavigationButtons.tsx +113 -0
  404. package/src/ImageSlider/components/ResponsiveImage/ResponsiveImage.tsx +114 -0
  405. package/src/ImageSlider/components/ResponsiveImage/index.ts +1 -0
  406. package/src/ImageSlider/components/Thumbnails/Thumbnails.tsx +184 -0
  407. package/src/ImageSlider/constants.ts +59 -0
  408. package/src/ImageSlider/hooks/index.ts +3 -0
  409. package/src/ImageSlider/hooks/useImageSlider.ts +57 -0
  410. package/src/ImageSlider/hooks/useImageSliderNavigation.ts +133 -0
  411. package/src/ImageSlider/hooks/useImageSliderScrollHandler.ts +171 -0
  412. package/src/ImageSlider/index.ts +3 -0
  413. package/src/ImageSlider/utils/imageOptimization.ts +97 -0
  414. package/src/ImageSlider/utils/index.ts +1 -0
  415. package/src/InlineNotification/InlineNotification.tsx +95 -0
  416. package/src/JumpMenu/JumpMenu.tsx +395 -0
  417. package/src/JumpMenu/components/JumpMenuItem/JumpMenuItem.tsx +62 -0
  418. package/src/JumpMenu/hooks/useContainerTracking.ts +171 -0
  419. package/src/JumpMenu/hooks/useIntersectionObserver.ts +77 -0
  420. package/src/JumpMenu/hooks/useKeyboardNavigation.ts +102 -0
  421. package/src/JumpMenu/hooks/useResizeObserver.ts +53 -0
  422. package/src/JumpMenu/hooks/useSectionObserver.ts +102 -0
  423. package/src/JumpMenu/index.ts +2 -0
  424. package/src/JumpMenu/types/index.ts +19 -0
  425. package/src/Loading/Loading.tsx +39 -0
  426. package/src/Loading/components/LoadingDot/LoadingDot.tsx +16 -0
  427. package/src/LoadingSpinner/LoadingSpinner.tsx +20 -0
  428. package/src/Menu/Menu.tsx +372 -0
  429. package/src/Menu/components/MenuDivider/MenuDivider.tsx +5 -0
  430. package/src/Menu/components/MenuItem/MenuItem.tsx +298 -0
  431. package/src/Menu/context/menuContext.tsx +20 -0
  432. package/src/Menu/hooks/useMenu.tsx +18 -0
  433. package/src/Menu/index.ts +3 -0
  434. package/src/Modal/ComposableModal.tsx +313 -0
  435. package/src/Modal/Modal.tsx +231 -0
  436. package/src/Modal/components/BackButton/BackButton.tsx +43 -0
  437. package/src/Modal/components/Backdrop/Backdrop.tsx +62 -0
  438. package/src/Modal/components/CloseButton/CloseButton.tsx +55 -0
  439. package/src/Modal/components/ModalActions/ModalActions.tsx +135 -0
  440. package/src/Modal/components/ModalContent/ModalContent.tsx +163 -0
  441. package/src/Modal/components/ModalHeader/ModalHeader.tsx +84 -0
  442. package/src/Modal/components/ModalHeader/hooks/useHeaderAnimation.tsx +49 -0
  443. package/src/Modal/components/ModalProgressSteps/ModalProgressSteps.tsx +26 -0
  444. package/src/Modal/components/ModalSubTitle/ModalSubTitle.tsx +29 -0
  445. package/src/Modal/components/ModalTitle/ModalTitle.tsx +22 -0
  446. package/src/Modal/components/PreventModalScroll/PreventModalScroll.tsx +106 -0
  447. package/src/Modal/components/index.ts +12 -0
  448. package/src/Modal/context.ts +33 -0
  449. package/src/Modal/hooks/useCloseModal.ts +133 -0
  450. package/src/NotificationBadge/NotificationBadge.tsx +34 -0
  451. package/src/Pagination/AdvancedPagination.tsx +48 -0
  452. package/src/Pagination/Pagination.tsx +216 -0
  453. package/src/Pagination/components/AdvancedPaginator/AdvancedPaginator.tsx +52 -0
  454. package/src/Pagination/components/AdvancedPaginator/components/PageSelect/PageSelect.tsx +43 -0
  455. package/src/Pagination/components/ItemCountDisplay/ItemCountDisplay.tsx +32 -0
  456. package/src/Pagination/components/ItemCountSelect/ItemCountSelect.tsx +33 -0
  457. package/src/Pagination/index.tsx +3 -0
  458. package/src/Pagination/paginationProvider.tsx +234 -0
  459. package/src/Pagination/utils.tsx +36 -0
  460. package/src/PhoneInput/PhoneInput.tsx +509 -0
  461. package/src/PhoneInput/useDropdownLogic.tsx +163 -0
  462. package/src/ProgressCircle/ProgressCircle.tsx +246 -0
  463. package/src/ProgressCircle/hooks/useProgressStatusTransitions.ts +49 -0
  464. package/src/ProgressCircle/utils/progressCircle.constants.ts +27 -0
  465. package/src/ProgressSteps/ProgressSteps.tsx +160 -0
  466. package/src/SaveConfetti/SaveConfetti.tsx +277 -0
  467. package/src/SaveConfetti/index.ts +2 -0
  468. package/src/SearchInput/SearchInput.tsx +236 -0
  469. package/src/SegmentedControl/SegmentedControl.tsx +111 -0
  470. package/src/SegmentedControl/SegmentedControlGroup.tsx +94 -0
  471. package/src/SegmentedControl/index.ts +4 -0
  472. package/src/Select/Select.tsx +154 -0
  473. package/src/Select/SelectAsync.tsx +13 -0
  474. package/src/Select/SelectAsyncCreatable.tsx +14 -0
  475. package/src/Select/SelectCreatable.tsx +12 -0
  476. package/src/Select/reexportedComponents.tsx +5 -0
  477. package/src/Select/selectComponents.tsx +306 -0
  478. package/src/Skeleton/Skeleton.tsx +13 -0
  479. package/src/SplitButton/SplitButton.tsx +298 -0
  480. package/src/SplitButton/SplitButtonTrigger.tsx +55 -0
  481. package/src/StarRating/StarRating.tsx +165 -0
  482. package/src/StarRating/components/StarComponent/StarComponent.tsx +44 -0
  483. package/src/Table/Table.tsx +474 -0
  484. package/src/Table/components/TableHeader/TableHeader.tsx +166 -0
  485. package/src/Table/components/TablePagination/TablePagination.tsx +18 -0
  486. package/src/Table/components/TablePagination/components/ItemCountDisplay/ItemCountDisplay.tsx +17 -0
  487. package/src/Table/components/TablePagination/components/ItemCountSelect/ItemCountSelect.tsx +31 -0
  488. package/src/Table/components/TablePagination/components/TablePaginator/TablePaginator.tsx +37 -0
  489. package/src/Table/components/TablePagination/components/TablePaginator/components/PageSelect/PageSelect.tsx +32 -0
  490. package/src/Table/components/TableRow/TableRows.tsx +147 -0
  491. package/src/Table/components/TableRow/components/TableRowCell/TableRowCell.tsx +49 -0
  492. package/src/Table/components/TableShadow/TableShadow.tsx +46 -0
  493. package/src/Table/index.ts +2 -0
  494. package/src/Table/sharedState.ts +30 -0
  495. package/src/Table/sharedStyles.ts +1 -0
  496. package/src/Table/types.ts +55 -0
  497. package/src/Tabs/Tabs.tsx +358 -0
  498. package/src/TextArea/TextArea.tsx +157 -0
  499. package/src/TextInput/TextInput.tsx +173 -0
  500. package/src/Toast/Toast.tsx +64 -0
  501. package/src/Toast/components/ToastContainer/ToastContainer.tsx +48 -0
  502. package/src/Toast/index.ts +2 -0
  503. package/src/Toast/types/role.ts +1 -0
  504. package/src/Toast/utils/getIcon.tsx +41 -0
  505. package/src/ToggleSwitch/ToggleSwitch.tsx +188 -0
  506. package/src/Tooltip/InfoIconTooltip.tsx +47 -0
  507. package/src/Tooltip/Tooltip.tsx +41 -0
  508. package/src/Typography/InlineButton/InlineButton.tsx +166 -0
  509. package/src/Typography/Links/Links.tsx +113 -0
  510. package/src/Typography/Text/Text.tsx +239 -0
  511. package/src/ViewMore/ViewMore.tsx +226 -0
  512. package/src/WebRTCPlayer/WebRTCPlayer.tsx +325 -0
  513. package/src/WebRTCPlayer/adaptor/NativeWebRTCAdaptor.ts +588 -0
  514. package/src/WebRTCPlayer/hooks/useWebRTCStream.ts +571 -0
  515. package/src/WebRTCPlayer/index.ts +22 -0
  516. package/src/WebRTCPlayer/types.ts +95 -0
  517. package/src/breakpoints/index.tsx +1 -0
  518. package/src/breakpoints/utils.tsx +50 -0
  519. package/src/declarations.d.ts +7 -0
  520. package/src/grid/gridHighlighter.tsx +83 -0
  521. package/src/grid/index.ts +3 -0
  522. package/src/grid/pageGrid.tsx +37 -0
  523. package/src/grid/useSubGridCSS.tsx +214 -0
  524. package/src/hooks/useHorizontalScrollFade.ts +44 -0
  525. package/src/hooks/usePrevious.ts +14 -0
  526. package/src/index.ts +351 -0
  527. package/src/intl/index.ts +4 -0
  528. package/src/intl/utils.ts +67 -0
  529. package/src/mixins/horizontalScrollFadeMixin.ts +56 -0
  530. package/src/mixins/index.ts +18 -0
  531. package/src/mixins/propMixins.ts +389 -0
  532. package/src/providers/createContextProvider.ts +22 -0
  533. package/src/providers/designSystemProvider.tsx +218 -0
  534. package/src/providers/errorBoundaryProvider.tsx +179 -0
  535. package/src/providers/featureFlagProvider.tsx +18 -0
  536. package/src/providers/gridSizeProvider.tsx +23 -0
  537. package/src/providers/index.ts +12 -0
  538. package/src/providers/linkProvider.tsx +32 -0
  539. package/src/providers/normalize.tsx +93 -0
  540. package/src/providers/targets/DatePickerTarget.tsx +10 -0
  541. package/src/providers/targets/ModalTarget.tsx +14 -0
  542. package/src/providers/targets/TimePickerTarget.tsx +10 -0
  543. package/src/providers/themeContext.tsx +24 -0
  544. package/src/providers/windowSizeProvider.tsx +125 -0
  545. package/src/spacing/index.ts +1 -0
  546. package/src/spacing/spacing.ts +11 -0
  547. package/src/utils/countriesWithISOCodes.ts +1419 -0
  548. package/src/utils/dateTimeFormat.ts +257 -0
  549. package/src/utils/effectEventListener.ts +11 -0
  550. package/src/utils/formatFileSize.ts +18 -0
  551. package/src/utils/isClientSide.ts +1 -0
  552. package/src/utils/keepTransition.ts +15 -0
  553. package/src/utils/nodeEnv.ts +9 -0
  554. package/src/utils/smoothScrollTo.ts +47 -0
  555. package/src/utils/utilityTypes.ts +13 -0
  556. package/textInput.d.cts +1 -1
  557. package/textInput.d.mts +1 -1
  558. package/timePicker.d.cts +1 -1
  559. package/timePicker.d.mts +1 -1
@@ -0,0 +1,18 @@
1
+ import { atom, useAtom } from 'jotai';
2
+ import { useCallback } from 'react';
3
+
4
+ const showMenuAtom = atom(false);
5
+
6
+ export const useMenu = () => {
7
+ const [show, setShow] = useAtom(showMenuAtom);
8
+
9
+ const closeMenu = useCallback(() => {
10
+ setShow(false);
11
+ }, [setShow]);
12
+
13
+ return {
14
+ closeMenu,
15
+ setShow,
16
+ show,
17
+ };
18
+ };
@@ -0,0 +1,3 @@
1
+ export { MenuItem } from './components/MenuItem/MenuItem';
2
+ export { MenuDivider } from './components/MenuDivider/MenuDivider';
3
+ export { Menu } from './Menu';
@@ -0,0 +1,313 @@
1
+ import { cn } from '@evolve.ui/theme-system';
2
+ import { useAtom, useAtomValue } from 'jotai';
3
+ import { atomWithReset } from 'jotai/utils';
4
+ import { ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react';
5
+ import { createPortal } from 'react-dom';
6
+
7
+ import { usePrevious } from '../hooks/usePrevious';
8
+ import { useWindowIsMobile } from '../providers';
9
+ import { Backdrop } from './components/Backdrop/Backdrop';
10
+ import { PreventModalScroll } from './components/PreventModalScroll/PreventModalScroll';
11
+ import { ModalContext } from './context';
12
+ import { useCloseModal } from './hooks/useCloseModal';
13
+
14
+ type Props = {
15
+ /**
16
+ * Content of the modal.
17
+ *
18
+ * Generally, the structure for a modal is:
19
+ * ```tsx
20
+ * <Modal>
21
+ * <ModalHeader>
22
+ * <BackButton />
23
+ * <CloseButton />
24
+ * <ModalTitle>Modal Title</ModalTitle>
25
+ * </ModalHeader>
26
+ * <ModalContent>
27
+ * <ModalSubTitle>Modal Subtitle</ModalSubTitle>
28
+ * Content, whatever the main body of the modal is.
29
+ * </ModalContent>
30
+ * <ModalActions>Actions (usually buttons) go here</ModalActions>
31
+ * </Modal>
32
+ * ```
33
+ */
34
+ children: ReactNode;
35
+ className?: string;
36
+ /**
37
+ * If true, the modal will close when the backdrop is clicked.
38
+ */
39
+ closeModalOnBackdropClick?: boolean;
40
+ /**
41
+ * Optional data-testid for the dialog element
42
+ */
43
+ 'data-testid'?: string;
44
+ /**
45
+ * This is a callback that is called when the modal is trying to close itself.
46
+ *
47
+ * It should look something like
48
+ * ```tsx
49
+ * handleClose={() => setShow(false)}
50
+ * ```
51
+ *
52
+ * It optionally recieves a data object that is passed to the `useCloseModal` function.
53
+ * For the close button, this is by default `"closed"`.
54
+ * For the backdrop, this is by default `"backdrop"`
55
+ */
56
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- hammer-parity: handleCloseData is an arbitrary consumer-defined payload forwarded verbatim
57
+ handleClose: (handleCloseData?: any) => void;
58
+ /**
59
+ * If true, the modal will have a content pager.
60
+ * This is needed to prevent the modal from scaling upon opening.
61
+ */
62
+ hasContentPager?: boolean;
63
+ /**
64
+ * Needed for the progress steps to be shown with the correct animation.
65
+ */
66
+ hasProgressSteps?: boolean;
67
+ /**
68
+ * If true, the modal will be full screen on mobile.
69
+ */
70
+ mobileFullScreen?: boolean;
71
+ /**
72
+ * This is a callback that is called when the modal close animation ends.
73
+ */
74
+ onModalCloseAnimationEnd?: () => void;
75
+ /**
76
+ * This is the position of the modal.
77
+ * It can be either `'center'` or `'top'`.
78
+ */
79
+ position?: 'center' | 'top';
80
+ /**
81
+ * Prevents scrolling of the page while the modal is open.
82
+ *
83
+ * @default true
84
+ */
85
+ preventScrollWhileOpen?: boolean;
86
+ /**
87
+ * The `show` prop is used to control the visibility of the modal. Should be set to false by `handleClose`.
88
+ */
89
+ show: boolean;
90
+ };
91
+
92
+ /**
93
+ * The actual modal logic. This is the "composable" version of the modal.
94
+ */
95
+ export const ComposableModal = ({
96
+ children,
97
+ className,
98
+ closeModalOnBackdropClick = true,
99
+ 'data-testid': dataTestId,
100
+ handleClose: handleCloseProp,
101
+ hasContentPager = false,
102
+ hasProgressSteps = false,
103
+ mobileFullScreen = false,
104
+ onModalCloseAnimationEnd,
105
+ position = 'center',
106
+ preventScrollWhileOpen = true,
107
+ show: showProp,
108
+ }: Props) => {
109
+ const [modalTarget, setModalTarget] = useState<HTMLElement | null>(null);
110
+ const [show, setShow] = useState(showProp);
111
+ const isMobile = useWindowIsMobile();
112
+
113
+ const modalAtoms = useMemo(
114
+ () => ({
115
+ closeModalOnBackdropClickAtom: atomWithReset(true),
116
+ isMobileKeyboardOpen: atomWithReset<boolean>(false),
117
+ modalAnimationAtom: atomWithReset<'opening' | 'closing' | ''>(''),
118
+ modalFullScreenAtom: atomWithReset<boolean>(mobileFullScreen),
119
+ modalHasFooterAtom: atomWithReset<boolean>(false),
120
+ modalHasProgressStepsAtom: atomWithReset<boolean>(hasProgressSteps),
121
+ modalRefAtom: atomWithReset<{ current: HTMLDialogElement | null }>({ current: null }),
122
+ scrollTopAtom: atomWithReset(0),
123
+ showBottomScrollHintAtom: atomWithReset<boolean>(false),
124
+ showTopScrollHintAtom: atomWithReset<boolean>(false),
125
+ }),
126
+ [hasProgressSteps, mobileFullScreen]
127
+ );
128
+
129
+ const modalAnimation = useAtomValue(modalAtoms.modalAnimationAtom);
130
+ const [isMobileKeyboardOpen, setIsMobileKeyboardOpen] = useAtom(modalAtoms.isMobileKeyboardOpen);
131
+
132
+ const handleClose = useCallback(
133
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- hammer-parity: handleCloseData is an arbitrary consumer-defined payload forwarded verbatim
134
+ (handleCloseData?: any) => {
135
+ setShow(false); // Must be triggered before the handleCloseProp
136
+
137
+ handleCloseProp(handleCloseData);
138
+ },
139
+ [handleCloseProp]
140
+ );
141
+
142
+ useEffect(() => {
143
+ const target = document.querySelector('.hui-modal-target');
144
+
145
+ if (!target) {
146
+ throw new Error('Modal target not found, add one in the DOM tree.');
147
+ }
148
+
149
+ setModalTarget(target as HTMLElement);
150
+ }, []);
151
+
152
+ const ref = useRef<HTMLDialogElement | null>(null);
153
+
154
+ const [viewportHeight, setViewportHeight] = useState({ current: 0, initial: 0 });
155
+
156
+ const updateViewport = useCallback(() => {
157
+ if (typeof window === 'undefined' || typeof window.visualViewport === 'undefined') {
158
+ return;
159
+ }
160
+
161
+ const currentViewportHeight = window.visualViewport?.height ?? 0;
162
+
163
+ // Get initial viewport height
164
+ if (viewportHeight.initial === 0) {
165
+ setViewportHeight({
166
+ current: currentViewportHeight,
167
+ initial: window.visualViewport?.height ?? 0,
168
+ });
169
+ } else {
170
+ // Get the difference between the current viewport height and the initial viewport height
171
+ // This is to check if mobile keyboard is open
172
+ const isLessThanInitial = Boolean(currentViewportHeight < viewportHeight.initial);
173
+ setIsMobileKeyboardOpen(isLessThanInitial);
174
+ setViewportHeight((prev) => ({
175
+ current: currentViewportHeight,
176
+ initial: prev.initial,
177
+ }));
178
+ }
179
+ }, [setIsMobileKeyboardOpen, viewportHeight.initial]);
180
+
181
+ useEffect(() => {
182
+ if (typeof window !== 'undefined' && typeof window.visualViewport !== 'undefined' && isMobile) {
183
+ updateViewport();
184
+
185
+ window.visualViewport?.addEventListener('resize', updateViewport);
186
+
187
+ return () => window.visualViewport?.removeEventListener('resize', updateViewport);
188
+ }
189
+
190
+ return undefined;
191
+ }, [isMobile, updateViewport]);
192
+
193
+ if (!modalTarget || !show) {
194
+ return (
195
+ <ModalContext.Provider value={{ handleClose, onModalCloseAnimationEnd, ...modalAtoms }}>
196
+ <HandleShowProp
197
+ setShow={setShow}
198
+ show={show}
199
+ showProp={showProp}
200
+ />
201
+ </ModalContext.Provider>
202
+ );
203
+ }
204
+
205
+ const modal = createPortal(
206
+ <Backdrop
207
+ closeModalOnBackdropClick={closeModalOnBackdropClick}
208
+ show={show}
209
+ >
210
+ <dialog
211
+ aria-label="Modal"
212
+ className={cn(
213
+ // GENERAL CLOSED
214
+ 'hui-modal-container group relative flex',
215
+ // OPEN
216
+ 'max-h-[calc(100vh-64px)] w-[588px] flex-col overflow-hidden rounded-md border-none bg-background-primary p-0',
217
+ // MOBILE
218
+ 'xsMax:w-[375px]',
219
+ // SMALL MOBILE
220
+ 'mobileSmall:!w-full',
221
+ // POSITION
222
+ { 'absolute top-lg': position === 'top' },
223
+ // GENERAL ANIMATION
224
+ 'transition-opacity duration-100 ease-in',
225
+ // OPEN ANIMATION
226
+ {
227
+ 'animate-fadeIn': modalAnimation === 'opening' && hasContentPager,
228
+ 'animate-fadeInScaled': modalAnimation === 'opening' && !hasContentPager,
229
+ },
230
+ // CLOSE ANIMATION
231
+ { 'animate-fadeOut': modalAnimation === 'closing' },
232
+ // FULL SCREEN
233
+ {
234
+ 'group/fullscreen mobile:top-0 mobile:flex mobile:h-full mobile:max-h-full mobile:w-screen mobile:min-w-[100vw] mobile:rounded-none':
235
+ mobileFullScreen,
236
+ },
237
+ className
238
+ )}
239
+ data-hui-id="Modal"
240
+ data-testid={dataTestId}
241
+ onAnimationEnd={() => {
242
+ if (modalAnimation === 'closing') {
243
+ onModalCloseAnimationEnd?.();
244
+ }
245
+ }}
246
+ open={show}
247
+ ref={ref}
248
+ >
249
+ {preventScrollWhileOpen && <PreventModalScroll />}
250
+ {children}
251
+ <div
252
+ className={cn('relative', {
253
+ // Use CSS :has() selector to immediately apply min-height when footer exists
254
+ // Apply 148px on desktop, 74px on mobile fullscreen
255
+ 'mobile:group-only/fullscreen:has-[#modal-footer.flex]:min-h-[74px] smMin:has-[#modal-footer.flex]:min-h-[148px]':
256
+ hasContentPager,
257
+ // Hide the actions portal when the mobile keyboard is open
258
+ 'mobile:group-only/fullscreen:hidden': isMobileKeyboardOpen && hasContentPager,
259
+ })}
260
+ id="modal-actions-portal"
261
+ />
262
+ </dialog>
263
+ </Backdrop>,
264
+ modalTarget
265
+ );
266
+
267
+ return (
268
+ <ModalContext.Provider value={{ handleClose, onModalCloseAnimationEnd, ...modalAtoms }}>
269
+ <HandleShowProp
270
+ setShow={setShow}
271
+ show={show}
272
+ showProp={showProp}
273
+ />
274
+ {modal}
275
+ </ModalContext.Provider>
276
+ );
277
+ };
278
+
279
+ const HandleShowProp = ({
280
+ setShow,
281
+ show,
282
+ showProp,
283
+ }: {
284
+ setShow: (value: boolean) => void;
285
+ show: boolean;
286
+ showProp: boolean;
287
+ }) => {
288
+ const previousShowProp = usePrevious(showProp);
289
+ const closeModal = useCloseModal('setShow set to false');
290
+
291
+ useEffect(() => {
292
+ if (previousShowProp === undefined) {
293
+ return;
294
+ }
295
+
296
+ const propChanged = showProp !== previousShowProp;
297
+ if (!propChanged) {
298
+ return;
299
+ }
300
+
301
+ const showMustChange = show !== showProp;
302
+ if (!showMustChange) {
303
+ return;
304
+ }
305
+ if (showProp) {
306
+ setShow(true);
307
+ } else {
308
+ closeModal();
309
+ }
310
+ }, [show, previousShowProp, showProp, closeModal, setShow]);
311
+
312
+ return null;
313
+ };
@@ -0,0 +1,231 @@
1
+ import { ComponentProps, ReactNode } from 'react';
2
+
3
+ import {
4
+ BackButton,
5
+ CloseButton,
6
+ ModalActions,
7
+ ModalContent,
8
+ ModalHeader,
9
+ ModalSubTitle,
10
+ ModalTitle,
11
+ } from './components';
12
+ import { ComposableModal } from './ComposableModal';
13
+
14
+ type TemplatedModalProps = {
15
+ /**
16
+ * This is the actions of the modal. Usually buttons.
17
+ * It is rendered at the bottom of the modal.
18
+ *
19
+ * `ModalActions` is not rendered if this is not passed.
20
+ */
21
+ actions?: ReactNode;
22
+ /**
23
+ * This is the main content of the modal.
24
+ */
25
+ body?: ReactNode;
26
+ /**
27
+ * If you want to pass children, set `type="composable"`.
28
+ */
29
+ children?: never;
30
+ /**
31
+ * If true, the close button will not be shown.
32
+ */
33
+ hideClose?: boolean;
34
+ /**
35
+ * This is a callback that is called when the back button is clicked.
36
+ *
37
+ * When passed, the back button will be shown.
38
+ */
39
+ onBackClicked?: () => void;
40
+ /**
41
+ * If passed, this will be shown as a subtitle in the modal.
42
+ */
43
+ subtitle?: ReactNode;
44
+ /**
45
+ * If passed, this will be shown as a title in the modal.
46
+ *
47
+ * `ModalHeader` is not rendered if this is not passed.
48
+ */
49
+ title?: ReactNode;
50
+ /**
51
+ * Marks the type of modal as templated / simple.
52
+ */
53
+ type?: 'templated';
54
+ };
55
+
56
+ type ComposableModalProps = {
57
+ /**
58
+ * Content of the modal.
59
+ *
60
+ * Generally, the structure for a modal is:
61
+ * ```tsx
62
+ * <Modal>
63
+ * <ModalHeader>
64
+ * <BackButton />
65
+ * <CloseButton />
66
+ * <ModalTitle>Modal Title</ModalTitle>
67
+ * </ModalHeader>
68
+ * <ModalContent>
69
+ * <ModalSubTitle>Modal Subtitle</ModalSubTitle>
70
+ * Content, whatever the main body of the modal is.
71
+ * </ModalContent>
72
+ * <ModalActions>Actions (usually buttons) go here</ModalActions>
73
+ * </Modal>
74
+ * ```
75
+ */
76
+ children: ReactNode;
77
+ /**
78
+ * Marks the type of modal as composable.
79
+ */
80
+ type: 'composable';
81
+ };
82
+
83
+ type Props = {
84
+ className?: string;
85
+ /**
86
+ * If true, the modal will close when the backdrop is clicked.
87
+ */
88
+ closeModalOnBackdropClick?: ComponentProps<typeof ComposableModal>['closeModalOnBackdropClick'];
89
+ /**
90
+ * Optional data-testid for the dialog element
91
+ */
92
+ 'data-testid'?: string;
93
+ /**
94
+ * This is a callback that is called when the modal is trying to close itself.
95
+ *
96
+ * It should look something like
97
+ * ```tsx
98
+ * handleClose={() => setShow(false)}
99
+ * ```
100
+ *
101
+ * It optionally recieves a data object that is passed to the `useCloseModal` function.
102
+ * For the close button, this is by default `"closed"`.
103
+ * For the backdrop, this is by default `"backdrop"`
104
+ */
105
+ handleClose: ComponentProps<typeof ComposableModal>['handleClose'];
106
+ /**
107
+ * If true, the modal will have a content pager.
108
+ * This is needed to prevent the modal from scaling upon opening.
109
+ */
110
+ hasContentPager?: boolean;
111
+ /**
112
+ * Needed for the progress steps to be shown with the correct animation.
113
+ */
114
+ hasProgressSteps?: boolean;
115
+ /**
116
+ * If true, the modal will be full screen on mobile.
117
+ */
118
+ mobileFullScreen?: boolean;
119
+ /**
120
+ * This is a callback that is called when the modal close animation ends.
121
+ */
122
+ onModalCloseAnimationEnd?: ComponentProps<typeof ComposableModal>['onModalCloseAnimationEnd'];
123
+ /**
124
+ * This is the position of the modal.
125
+ * It can be either `'center'` or `'top'`.
126
+ */
127
+ position?: ComponentProps<typeof ComposableModal>['position'];
128
+ /**
129
+ * Prevents scrolling of the page while the modal is open.
130
+ *
131
+ * @default true
132
+ */
133
+ preventScrollWhileOpen?: ComponentProps<typeof ComposableModal>['preventScrollWhileOpen'];
134
+ /**
135
+ * The `show` prop is used to control the visibility of the modal. Should be set to false by `handleClose`.
136
+ */
137
+ show: ComponentProps<typeof ComposableModal>['show'];
138
+ } & (TemplatedModalProps | ComposableModalProps);
139
+
140
+ /**
141
+ * Primary component for creating modals.
142
+ * When rendered, it automatically opens the modal and backdrop.
143
+ *
144
+ * These preprovided components give you the styles of the modal.
145
+ *
146
+ * By default, you get a particular preset of the `Modal` component that is used for simple modals.
147
+ * It has (optionally) a title, subtitle, body, and actions.
148
+ *
149
+ * If you need to get a little bit more custom, be sure to read the docs and add `type="composable"` to the this component.
150
+ *
151
+ * Generally, the structure for a modal is:
152
+ * ```tsx
153
+ * <Modal>
154
+ * <ModalHeader>
155
+ * <BackButton />
156
+ * <CloseButton />
157
+ * <ModalTitle>Modal Title</ModalTitle>
158
+ * </ModalHeader>
159
+ * <ModalContent>
160
+ * <ModalSubTitle>Modal Subtitle</ModalSubTitle>
161
+ * Content, whatever the main body of the modal is.
162
+ * </ModalContent>
163
+ * <ModalActions>Actions (usually buttons) go here</ModalActions>
164
+ * </Modal>
165
+ * ```
166
+ */
167
+ export const Modal = ({
168
+ className,
169
+ closeModalOnBackdropClick,
170
+ 'data-testid': dataTestId,
171
+ handleClose,
172
+ hasContentPager,
173
+ hasProgressSteps,
174
+ mobileFullScreen,
175
+ onModalCloseAnimationEnd,
176
+ position,
177
+ preventScrollWhileOpen,
178
+ show,
179
+ ...rest
180
+ }: Props) => {
181
+ if (rest.type === 'composable') {
182
+ return (
183
+ <ComposableModal
184
+ className={className}
185
+ closeModalOnBackdropClick={closeModalOnBackdropClick}
186
+ data-testid={dataTestId}
187
+ handleClose={handleClose}
188
+ hasContentPager={hasContentPager}
189
+ hasProgressSteps={hasProgressSteps}
190
+ mobileFullScreen={mobileFullScreen}
191
+ onModalCloseAnimationEnd={onModalCloseAnimationEnd}
192
+ position={position}
193
+ preventScrollWhileOpen={preventScrollWhileOpen}
194
+ show={show}
195
+ >
196
+ {rest.children}
197
+ </ComposableModal>
198
+ );
199
+ }
200
+
201
+ const { actions, body, hideClose, onBackClicked, subtitle, title } = rest;
202
+
203
+ return (
204
+ <ComposableModal
205
+ className={className}
206
+ closeModalOnBackdropClick={closeModalOnBackdropClick}
207
+ data-testid={dataTestId}
208
+ handleClose={handleClose}
209
+ hasContentPager={hasContentPager}
210
+ hasProgressSteps={hasProgressSteps}
211
+ mobileFullScreen={mobileFullScreen}
212
+ onModalCloseAnimationEnd={onModalCloseAnimationEnd}
213
+ position={position}
214
+ preventScrollWhileOpen={preventScrollWhileOpen}
215
+ show={show}
216
+ >
217
+ {onBackClicked && <BackButton onClick={onBackClicked} />}
218
+ {!hideClose && <CloseButton />}
219
+ {Boolean(title) && (
220
+ <ModalHeader>
221
+ <ModalTitle>{title}</ModalTitle>
222
+ </ModalHeader>
223
+ )}
224
+ <ModalContent>
225
+ {Boolean(subtitle) && <ModalSubTitle>{subtitle}</ModalSubTitle>}
226
+ {Boolean(body) && body}
227
+ </ModalContent>
228
+ {Boolean(actions) && <ModalActions>{actions}</ModalActions>}
229
+ </ComposableModal>
230
+ );
231
+ };
@@ -0,0 +1,43 @@
1
+ import { cn } from '@evolve.ui/theme-system';
2
+
3
+ import { IconButton } from '../../../IconButton/IconButton';
4
+ import { ArrowLeft } from '../../../Icons';
5
+ import { useWindowIsMobile } from '../../../providers';
6
+
7
+ type Props = {
8
+ /**
9
+ * @default 'Go Back'
10
+ */
11
+ 'aria-label'?: string;
12
+ className?: string;
13
+ /**
14
+ * Function to be called when the button is clicked.
15
+ *
16
+ * This is intended to be a callback to control something like a `ContentPager`.
17
+ */
18
+ onClick: () => void;
19
+ };
20
+
21
+ /**
22
+ * Component for modal that triggers a callback when clicked.
23
+ */
24
+ export const BackButton = ({ 'aria-label': ariaLabel = 'Go Back', className, onClick }: Props) => {
25
+ const isMobile = useWindowIsMobile();
26
+
27
+ return (
28
+ <IconButton
29
+ aria-label={ariaLabel}
30
+ className={cn(
31
+ // GENERAL
32
+ 'absolute left-sm top-sm z-[2] cursor-pointer',
33
+ // MOBILE
34
+ 'xsMax:left-[12px] xsMax:top-[13px]',
35
+ className
36
+ )}
37
+ hideTooltip
38
+ icon={ArrowLeft}
39
+ onClick={onClick}
40
+ size={isMobile ? 'sm' : 'md'}
41
+ />
42
+ );
43
+ };
@@ -0,0 +1,62 @@
1
+ import { cn } from '@evolve.ui/theme-system';
2
+ import { useAtom } from 'jotai';
3
+ import { ReactNode, useContext, useEffect, useRef } from 'react';
4
+
5
+ import { effectEventListener } from '../../../utils/effectEventListener';
6
+ import { ModalContext } from '../../context';
7
+ import { useCloseModal } from '../../hooks/useCloseModal';
8
+
9
+ type Props = {
10
+ children?: ReactNode;
11
+ closeModalOnBackdropClick?: boolean;
12
+ show: boolean;
13
+ };
14
+
15
+ export const Backdrop = ({ children, closeModalOnBackdropClick, show }: Props) => {
16
+ const closeModal = useCloseModal('backdrop');
17
+ const { modalAnimationAtom } = useContext(ModalContext);
18
+ const backdropRef = useRef<HTMLDivElement>(null);
19
+ const [modalAnimation, setModalAnimation] = useAtom(modalAnimationAtom);
20
+
21
+ // NEEDS A DELAY TO ALLOW THE MODAL TO ANIMATE IN
22
+ useEffect(() => {
23
+ if (show && modalAnimation === '') {
24
+ setModalAnimation('opening');
25
+ }
26
+ }, [modalAnimation, setModalAnimation, show]);
27
+
28
+ useEffect(() => {
29
+ if (!closeModalOnBackdropClick) {
30
+ return;
31
+ }
32
+
33
+ return effectEventListener(window, 'mousedown', (event: Event) => {
34
+ if (event.target === backdropRef.current) {
35
+ closeModal();
36
+ }
37
+ });
38
+ }, [closeModal, closeModalOnBackdropClick]);
39
+
40
+ return (
41
+ <div
42
+ className={cn(
43
+ // GENERAL CLOSED
44
+ 'hui-modal-backdrop opacity-0',
45
+ // OPEN
46
+ {
47
+ 'fixed bottom-0 left-0 right-0 top-0 z-[1001] flex items-center justify-center bg-background-overlay':
48
+ show,
49
+ },
50
+ // GENERAL ANIMATION
51
+ 'transition-opacity duration-200 ease-in',
52
+ // OPEN ANIMATION
53
+ { 'opacity-100': modalAnimation === 'opening' },
54
+ // CLOSE ANIMATION
55
+ { 'opacity-0': modalAnimation === 'closing' }
56
+ )}
57
+ ref={backdropRef}
58
+ >
59
+ {children}
60
+ </div>
61
+ );
62
+ };