@evolve.ui/core-components 1.0.1 → 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 (509) hide show
  1. package/evolve-ui.entries.json +556 -0
  2. package/fileUpload/testUtils/mockFilesAndImages.d.cts +3 -3
  3. package/fileUpload/testUtils/mockFilesAndImages.d.cts.map +1 -1
  4. package/fileUpload/testUtils/mockFilesAndImages.d.mts +3 -3
  5. package/fileUpload/testUtils/mockFilesAndImages.d.mts.map +1 -1
  6. package/fileUpload/testUtils/testUtils.d.cts +1 -1
  7. package/fileUpload/testUtils/testUtils.d.cts.map +1 -1
  8. package/fileUpload/testUtils/testUtils.d.mts +1 -1
  9. package/fileUpload/testUtils/testUtils.d.mts.map +1 -1
  10. package/package.json +2 -2
  11. package/src/Accordion/Accordion.tsx +233 -0
  12. package/src/AddressDisplay/AddressDisplay.tsx +43 -0
  13. package/src/AddressDisplay/components/addressComponents.tsx +111 -0
  14. package/src/AddressDisplay/components/addressField.tsx +25 -0
  15. package/src/AddressDisplay/components/addressSection.tsx +8 -0
  16. package/src/AddressDisplay/components/getCountryValue.tsx +31 -0
  17. package/src/AddressDisplay/types.ts +26 -0
  18. package/src/AutomatedCarousel/AutomatedCarousel.tsx +163 -0
  19. package/src/AutomatedCarousel/automatedCarousel.types.ts +7 -0
  20. package/src/AutomatedCarousel/components/CarouselProgressBar/CarouselProgressBar.tsx +139 -0
  21. package/src/AutomatedCarousel/components/CarouselProgressBar/components/CarouselProgressBarUnit/CarouselProgressBarUnit.tsx +165 -0
  22. package/src/Badge/Badge.tsx +104 -0
  23. package/src/Badge/Badge.types.ts +58 -0
  24. package/src/Badge/ItemBadge.tsx +97 -0
  25. package/src/Badge/LiveStatusBadge.tsx +93 -0
  26. package/src/BannerNotification/BannerNotification.tsx +157 -0
  27. package/src/BannerNotification/components/BannerNotificationSkeleton.tsx +39 -0
  28. package/src/BannerNotification/components/CalloutIcon/BannerIcon.tsx +48 -0
  29. package/src/BannerNotification/utils/getRandomTooltipId.ts +3 -0
  30. package/src/BottomSheet/BottomSheet.tsx +476 -0
  31. package/src/BottomSheet/components/BottomSheetBackdrop/BottomSheetBackdrop.tsx +47 -0
  32. package/src/BottomSheet/components/BottomSheetContentArea/BottomSheetContentArea.tsx +92 -0
  33. package/src/BottomSheet/components/BottomSheetOverlay/BottomSheetOverlayTranslate3d.tsx +196 -0
  34. package/src/BottomSheet/components/SheetDescription/SheetDescription.tsx +22 -0
  35. package/src/BottomSheet/components/SheetTitle/SheetTitle.tsx +21 -0
  36. package/src/BottomSheet/components/index.tsx +5 -0
  37. package/src/BottomSheet/hooks/index.tsx +13 -0
  38. package/src/BottomSheet/hooks/useAriaHider.tsx +91 -0
  39. package/src/BottomSheet/hooks/useBottomSheetServices.tsx +224 -0
  40. package/src/BottomSheet/hooks/useDragHandler.tsx +282 -0
  41. package/src/BottomSheet/hooks/useFocusTrap.tsx +113 -0
  42. package/src/BottomSheet/hooks/useLayoutEffect.tsx +4 -0
  43. package/src/BottomSheet/hooks/useOptimizedResizeObserver.tsx +94 -0
  44. package/src/BottomSheet/hooks/useOptimizedScrollState.tsx +87 -0
  45. package/src/BottomSheet/hooks/useReady.tsx +34 -0
  46. package/src/BottomSheet/hooks/useReducedMotion.tsx +22 -0
  47. package/src/BottomSheet/hooks/useScrollLock.tsx +143 -0
  48. package/src/BottomSheet/hooks/useSnapPoints.tsx +355 -0
  49. package/src/BottomSheet/hooks/useSpring.tsx +47 -0
  50. package/src/BottomSheet/hooks/useSpringInterpolationsTranslate3d.tsx +101 -0
  51. package/src/BottomSheet/index.tsx +237 -0
  52. package/src/BottomSheet/state/atoms.ts +147 -0
  53. package/src/BottomSheet/state/useBottomSheetStateMachine.ts +246 -0
  54. package/src/BottomSheet/types.ts +172 -0
  55. package/src/BottomSheet/utils.ts +65 -0
  56. package/src/Breadcrumbs/Breadcrumbs.tsx +126 -0
  57. package/src/Button/Button.tsx +164 -0
  58. package/src/Button/Button.types.ts +80 -0
  59. package/src/Button/buttonColorClasses.ts +53 -0
  60. package/src/Callout/Callout.tsx +136 -0
  61. package/src/Callout/Callout.types.ts +29 -0
  62. package/src/Callout/components/CalloutIcon/CalloutIcon.tsx +56 -0
  63. package/src/Card/CardGrid.tsx +263 -0
  64. package/src/Card/SingleCard.tsx +22 -0
  65. package/src/Card/cardFactory.tsx +176 -0
  66. package/src/Card/components/createBadge.tsx +34 -0
  67. package/src/Card/components/createFavoriteButton.tsx +40 -0
  68. package/src/Card/components/createImage.tsx +64 -0
  69. package/src/Card/components/createInfo.tsx +84 -0
  70. package/src/Card/components/createName.tsx +63 -0
  71. package/src/Card/components/createPriceStatus.tsx +100 -0
  72. package/src/Card/components/types.ts +4 -0
  73. package/src/Card/hooks/useCardVisibilityTracking.ts +82 -0
  74. package/src/Card/sharedProps.ts +12 -0
  75. package/src/Card/types.ts +62 -0
  76. package/src/Carousel/Carousel.tsx +513 -0
  77. package/src/Carousel/Carousel.types.ts +43 -0
  78. package/src/Carousel/Carousel.utils.ts +63 -0
  79. package/src/Carousel/components/DotButton/DotButton.tsx +42 -0
  80. package/src/Carousel/components/NavigationButtons/NavigationButtons.tsx +77 -0
  81. package/src/Carousel/components/TitleSection/TitleSection.tsx +61 -0
  82. package/src/Carousel/components/TitleSection/components/SubHeaderLeft/SubHeaderLeft.tsx +53 -0
  83. package/src/Carousel/components/TitleSection/components/Title/Title.tsx +46 -0
  84. package/src/Carousel/index.ts +2 -0
  85. package/src/Carousel/testUtils.ts +10 -0
  86. package/src/Chips/Chip.tsx +153 -0
  87. package/src/Chips/ChipGroup.tsx +173 -0
  88. package/src/Chips/SuggestionChip.tsx +15 -0
  89. package/src/Chips/chipTypes.ts +113 -0
  90. package/src/Chips/index.ts +4 -0
  91. package/src/ChoiceListItem/Checkbox.tsx +69 -0
  92. package/src/ChoiceListItem/Radio.tsx +61 -0
  93. package/src/ChoiceListItem/choiceListItem.tsx +99 -0
  94. package/src/ChoiceListItem/common.tsx +148 -0
  95. package/src/ChoiceListItem/index.ts +3 -0
  96. package/src/Collapsible/Collapsible.tsx +58 -0
  97. package/src/Confetti/Confetti.tsx +270 -0
  98. package/src/Confetti/index.ts +2 -0
  99. package/src/ContentPager/ContentPager.tsx +189 -0
  100. package/src/ContentPager/components/Page.tsx +24 -0
  101. package/src/CookieConsent/components/CookieCategoryRow/CookieCategoryRow.tsx +30 -0
  102. package/src/CookieConsent/components/CookieConsent/CookieConsent.tsx +74 -0
  103. package/src/CookieConsent/components/CookieConsentBanner/CookieConsentBanner.tsx +51 -0
  104. package/src/CookieConsent/components/CookieConsentModal/CookieConsentModal.tsx +64 -0
  105. package/src/CookieConsent/hooks/useCookieConsent.ts +170 -0
  106. package/src/CookieConsent/hooks/useCookieConsentState.ts +142 -0
  107. package/src/CookieConsent/index.ts +16 -0
  108. package/src/CookieConsent/types/cookieConsent.types.ts +79 -0
  109. package/src/CookieConsent/types/index.ts +7 -0
  110. package/src/Countdown/Countdown.tsx +161 -0
  111. package/src/Countdown/Countdown.types.ts +4 -0
  112. package/src/Countdown/hooks/useGetCountdown.ts +103 -0
  113. package/src/DateTimeInput/dateInput/DateInput.tsx +199 -0
  114. package/src/DateTimeInput/datePicker/DatePicker.tsx +138 -0
  115. package/src/DateTimeInput/datePicker/components/calendar/Calendar.tsx +72 -0
  116. package/src/DateTimeInput/datePicker/index.ts +2 -0
  117. package/src/DateTimeInput/timeInput/TimeInput.tsx +128 -0
  118. package/src/DateTimeInput/timePicker/TimePicker.tsx +118 -0
  119. package/src/DateTimeInput/timePicker/components/TimePopover/AmPmSwitch.tsx +103 -0
  120. package/src/DateTimeInput/timePicker/components/TimePopover/TimeFieldInput.tsx +26 -0
  121. package/src/DateTimeInput/timePicker/components/TimePopover/TimePopover.tsx +84 -0
  122. package/src/DateTimeInput/timePicker/components/TimePopover/TimePopover.utils.ts +67 -0
  123. package/src/DateTimeInput/timePicker/components/TimePopover/TimePopoverActions.tsx +26 -0
  124. package/src/DateTimeInput/timePicker/index.ts +2 -0
  125. package/src/DateTimeInput/utils/getDisplayDate.ts +15 -0
  126. package/src/DateTimeInput/utils/getDisplayTime.ts +15 -0
  127. package/src/DateTimeInput/utils/index.ts +2 -0
  128. package/src/DateTimeInput/utils/parseTimeValue.ts +54 -0
  129. package/src/Drawer/Drawer.tsx +446 -0
  130. package/src/Drawer/atoms.ts +4 -0
  131. package/src/Drawer/components/DialogActions/DialogActions.tsx +33 -0
  132. package/src/Drawer/components/DialogContent/DialogContent.tsx +80 -0
  133. package/src/Drawer/components/DialogHeader/DialogHeader.tsx +68 -0
  134. package/src/EducationalPopover/EducationalPopover.tsx +174 -0
  135. package/src/FavoriteButton/FavoriteButton.tsx +64 -0
  136. package/src/FavoriteButton/components/IconOnlyFavoriteButton/IconOnlyFavoriteButton.tsx +80 -0
  137. package/src/FavoriteButton/components/LabeledAnimatedFavoriteButton/LabeledAnimatedFavoriteButton.tsx +179 -0
  138. package/src/FavoriteButton/components/LabeledFavoriteButton/LabeledFavoriteButton.tsx +71 -0
  139. package/src/FavoriteButton/components/SmallHeartStraightIcon/SmallHeartStraightIcon.tsx +14 -0
  140. package/src/FavoriteButton/hooks/useFavoriteButtonState.ts +30 -0
  141. package/src/FavoriteButton/index.ts +2 -0
  142. package/src/FavoriteButton/types/favoriteButton.ts +87 -0
  143. package/src/FeatureFlags/devTools/FeatureFlagDevToolsUI.tsx +226 -0
  144. package/src/FeatureFlags/devTools/getFeatureFlagCookieOverrides.ts +30 -0
  145. package/src/FeatureFlags/devTools/utils/cookies.ts +169 -0
  146. package/src/FeatureFlags/hooks/index.ts +2 -0
  147. package/src/FeatureFlags/hooks/useFeatureFlag.tsx +19 -0
  148. package/src/FeatureFlags/hooks/useFeatureFlags.tsx +15 -0
  149. package/src/FileUpload/components/FileCard/FileCard.tsx +50 -0
  150. package/src/FileUpload/components/FileDropzone/FileDropzone.tsx +221 -0
  151. package/src/FileUpload/components/FileDropzone/components/DropzoneContent/DropzoneContent.tsx +28 -0
  152. package/src/FileUpload/components/FileDropzone/components/DropzoneContent/DropzoneText.tsx +81 -0
  153. package/src/FileUpload/components/FileDropzone/components/FileDropzoneDebugger/FileDropzoneDebugger.tsx +40 -0
  154. package/src/FileUpload/components/FileDropzone/components/FileDropzoneDebugger/FileRejectionsDisplay.tsx +110 -0
  155. package/src/FileUpload/components/FileDropzoneOverlay/FileDropzoneOverlay.tsx +183 -0
  156. package/src/FileUpload/components/FileDropzoneOverlay/components/OverlayDropzoneContent.tsx +146 -0
  157. package/src/FileUpload/components/FileDropzoneOverlay/components/OverlayDropzoneDragText.tsx +42 -0
  158. package/src/FileUpload/components/FileDropzoneOverlay/styles.ts +79 -0
  159. package/src/FileUpload/components/FilePreviewList/FilePreviewList.tsx +251 -0
  160. package/src/FileUpload/components/FilePreviewList/virtualizerComponents/FilePreviewVirtualizedList/FilePreviewVirtualizedList.tsx +88 -0
  161. package/src/FileUpload/components/FileUpload/FileUpload.tsx +63 -0
  162. package/src/FileUpload/components/FileUploadCanvas/FileUploadCanvas.tsx +125 -0
  163. package/src/FileUpload/components/GridFileCard/GridFileCard.tsx +364 -0
  164. package/src/FileUpload/components/GridFileCard/utils/sortable.ts +48 -0
  165. package/src/FileUpload/components/ListFileCard/ListFileCard.tsx +259 -0
  166. package/src/FileUpload/components/types.ts +78 -0
  167. package/src/FileUpload/hooks/filePreview/useImageFilePreviewUrl.ts +62 -0
  168. package/src/FileUpload/hooks/index.ts +11 -0
  169. package/src/FileUpload/hooks/upload/useHandleDragEnter/useHandleDragEnter.ts +154 -0
  170. package/src/FileUpload/hooks/upload/useHandleDrop/createFileRejectionHelpers.ts +273 -0
  171. package/src/FileUpload/hooks/upload/useHandleDrop/useHandleDrop.ts +153 -0
  172. package/src/FileUpload/hooks/upload/useUploadAvailability/useUploadAvailability.ts +44 -0
  173. package/src/FileUpload/hooks/validation/createDropzoneValidator.ts +41 -0
  174. package/src/FileUpload/hooks/validation/useFileValidation.ts +25 -0
  175. package/src/FileUpload/hooks/validation/useFileValidationLogic.ts +107 -0
  176. package/src/FileUpload/hooks/validation/useValidationMessages.ts +92 -0
  177. package/src/FileUpload/hooks/validation/useValidationState.ts +171 -0
  178. package/src/FileUpload/index.ts +57 -0
  179. package/src/FileUpload/providers/FileUploadProvider.tsx +219 -0
  180. package/src/FileUpload/providers/UploadValidationProvider.tsx +159 -0
  181. package/src/FileUpload/testUtils/mockFilesAndImages.ts +64 -0
  182. package/src/FileUpload/testUtils/testUtils.ts +111 -0
  183. package/src/FileUpload/types/commonTypes.ts +267 -0
  184. package/src/FileUpload/types/index.ts +31 -0
  185. package/src/FileUpload/types/sharedTypes.ts +159 -0
  186. package/src/FileUpload/utils/constants.ts +79 -0
  187. package/src/FileUpload/utils/createMessageContext.ts +180 -0
  188. package/src/FileUpload/utils/getFileExtensionsFromAcceptedTypes.ts +73 -0
  189. package/src/FileUpload/utils/getFilePluralizationText.ts +68 -0
  190. package/src/FileUpload/utils/getMimeTypes.ts +26 -0
  191. package/src/FileUpload/utils/messageUtils.ts +41 -0
  192. package/src/FileUpload/utils/styles.ts +68 -0
  193. package/src/FormLabel/FormLabel.tsx +212 -0
  194. package/src/IconButton/IconButton.tsx +154 -0
  195. package/src/Icons/CreditCardIcon/CreditCardIcon.tsx +73 -0
  196. package/src/Icons/CreditCardIcon/cardIcons.tsx +270 -0
  197. package/src/Icons/IconBase.tsx +133 -0
  198. package/src/Icons/anyIcon.ts +3 -0
  199. package/src/Icons/generatedIcons/Archive.tsx +48 -0
  200. package/src/Icons/generatedIcons/ArrowClockwise.tsx +48 -0
  201. package/src/Icons/generatedIcons/ArrowDown.tsx +48 -0
  202. package/src/Icons/generatedIcons/ArrowLeft.tsx +48 -0
  203. package/src/Icons/generatedIcons/ArrowRight.tsx +48 -0
  204. package/src/Icons/generatedIcons/ArrowSquareOut.tsx +51 -0
  205. package/src/Icons/generatedIcons/ArrowSquareRight.tsx +51 -0
  206. package/src/Icons/generatedIcons/ArrowUp.tsx +48 -0
  207. package/src/Icons/generatedIcons/ArrowsCounterClockwise.tsx +48 -0
  208. package/src/Icons/generatedIcons/ArrowsLeftRight.tsx +48 -0
  209. package/src/Icons/generatedIcons/ArrowsOutCardinal.tsx +48 -0
  210. package/src/Icons/generatedIcons/Bank.tsx +48 -0
  211. package/src/Icons/generatedIcons/Bell.tsx +51 -0
  212. package/src/Icons/generatedIcons/BookBookmark.tsx +51 -0
  213. package/src/Icons/generatedIcons/BookmarksSimple.tsx +51 -0
  214. package/src/Icons/generatedIcons/Broadcast.tsx +48 -0
  215. package/src/Icons/generatedIcons/CalendarBlank.tsx +48 -0
  216. package/src/Icons/generatedIcons/CalendarStar.tsx +51 -0
  217. package/src/Icons/generatedIcons/Camera.tsx +51 -0
  218. package/src/Icons/generatedIcons/CaretDown.tsx +48 -0
  219. package/src/Icons/generatedIcons/CaretLeft.tsx +48 -0
  220. package/src/Icons/generatedIcons/CaretRight.tsx +48 -0
  221. package/src/Icons/generatedIcons/CaretUp.tsx +48 -0
  222. package/src/Icons/generatedIcons/Certificate.tsx +51 -0
  223. package/src/Icons/generatedIcons/ChartBar.tsx +48 -0
  224. package/src/Icons/generatedIcons/Check.tsx +51 -0
  225. package/src/Icons/generatedIcons/CheckCircle.tsx +48 -0
  226. package/src/Icons/generatedIcons/CirclesFour.tsx +51 -0
  227. package/src/Icons/generatedIcons/Clock.tsx +48 -0
  228. package/src/Icons/generatedIcons/ClockCountdown.tsx +48 -0
  229. package/src/Icons/generatedIcons/Close.tsx +51 -0
  230. package/src/Icons/generatedIcons/CloudArrowUp.tsx +51 -0
  231. package/src/Icons/generatedIcons/CloudWarning.tsx +51 -0
  232. package/src/Icons/generatedIcons/Code.tsx +48 -0
  233. package/src/Icons/generatedIcons/Compass.tsx +51 -0
  234. package/src/Icons/generatedIcons/Confetti.tsx +51 -0
  235. package/src/Icons/generatedIcons/Copy.tsx +48 -0
  236. package/src/Icons/generatedIcons/CornersOut.tsx +48 -0
  237. package/src/Icons/generatedIcons/CreditCard.tsx +48 -0
  238. package/src/Icons/generatedIcons/Crown.tsx +51 -0
  239. package/src/Icons/generatedIcons/CrownSimple.tsx +51 -0
  240. package/src/Icons/generatedIcons/CurrencyCircleDollar.tsx +48 -0
  241. package/src/Icons/generatedIcons/CurrencyDollarSimple.tsx +51 -0
  242. package/src/Icons/generatedIcons/Desktop.tsx +51 -0
  243. package/src/Icons/generatedIcons/Detective.tsx +51 -0
  244. package/src/Icons/generatedIcons/DotOutline.tsx +46 -0
  245. package/src/Icons/generatedIcons/DotsSixVertical.tsx +51 -0
  246. package/src/Icons/generatedIcons/DotsThreeOutline.tsx +51 -0
  247. package/src/Icons/generatedIcons/DotsThreeOutlineVertical.tsx +51 -0
  248. package/src/Icons/generatedIcons/DownloadSimple.tsx +51 -0
  249. package/src/Icons/generatedIcons/EnvelopeSimple.tsx +48 -0
  250. package/src/Icons/generatedIcons/Eraser.tsx +51 -0
  251. package/src/Icons/generatedIcons/Eye.tsx +51 -0
  252. package/src/Icons/generatedIcons/EyeSlash.tsx +51 -0
  253. package/src/Icons/generatedIcons/FacebookLogo.tsx +48 -0
  254. package/src/Icons/generatedIcons/FileArchive.tsx +48 -0
  255. package/src/Icons/generatedIcons/FileArrowDown.tsx +48 -0
  256. package/src/Icons/generatedIcons/FileCsv.tsx +48 -0
  257. package/src/Icons/generatedIcons/FilePdf.tsx +48 -0
  258. package/src/Icons/generatedIcons/FileText.tsx +48 -0
  259. package/src/Icons/generatedIcons/Files.tsx +51 -0
  260. package/src/Icons/generatedIcons/Fire.tsx +51 -0
  261. package/src/Icons/generatedIcons/Flag.tsx +51 -0
  262. package/src/Icons/generatedIcons/FlagBannerFold.tsx +48 -0
  263. package/src/Icons/generatedIcons/FloppyDisk.tsx +51 -0
  264. package/src/Icons/generatedIcons/Gauge.tsx +51 -0
  265. package/src/Icons/generatedIcons/Gavel.tsx +51 -0
  266. package/src/Icons/generatedIcons/Gear.tsx +51 -0
  267. package/src/Icons/generatedIcons/GlobeHemisphereWest.tsx +51 -0
  268. package/src/Icons/generatedIcons/GoogleLogo.tsx +48 -0
  269. package/src/Icons/generatedIcons/GridNine.tsx +51 -0
  270. package/src/Icons/generatedIcons/HandCoins.tsx +51 -0
  271. package/src/Icons/generatedIcons/HandbagSimple.tsx +51 -0
  272. package/src/Icons/generatedIcons/Headset.tsx +51 -0
  273. package/src/Icons/generatedIcons/HeartStraight.tsx +51 -0
  274. package/src/Icons/generatedIcons/HourglassLow.tsx +48 -0
  275. package/src/Icons/generatedIcons/House.tsx +51 -0
  276. package/src/Icons/generatedIcons/Image.tsx +51 -0
  277. package/src/Icons/generatedIcons/ImageSquare.tsx +51 -0
  278. package/src/Icons/generatedIcons/ImagesSquare.tsx +51 -0
  279. package/src/Icons/generatedIcons/Info.tsx +48 -0
  280. package/src/Icons/generatedIcons/InstagramLogo.tsx +51 -0
  281. package/src/Icons/generatedIcons/Lightning.tsx +48 -0
  282. package/src/Icons/generatedIcons/Link.tsx +51 -0
  283. package/src/Icons/generatedIcons/LinkedinLogo.tsx +51 -0
  284. package/src/Icons/generatedIcons/List.tsx +48 -0
  285. package/src/Icons/generatedIcons/Lock.tsx +51 -0
  286. package/src/Icons/generatedIcons/LockOpen.tsx +51 -0
  287. package/src/Icons/generatedIcons/MagnifyingGlass.tsx +48 -0
  288. package/src/Icons/generatedIcons/MapPin.tsx +51 -0
  289. package/src/Icons/generatedIcons/MapPinSimpleArea.tsx +48 -0
  290. package/src/Icons/generatedIcons/Medal.tsx +48 -0
  291. package/src/Icons/generatedIcons/Megaphone.tsx +48 -0
  292. package/src/Icons/generatedIcons/Minus.tsx +45 -0
  293. package/src/Icons/generatedIcons/Money.tsx +51 -0
  294. package/src/Icons/generatedIcons/Notches.tsx +48 -0
  295. package/src/Icons/generatedIcons/NotePencil.tsx +48 -0
  296. package/src/Icons/generatedIcons/Package.tsx +51 -0
  297. package/src/Icons/generatedIcons/PaintBrush.tsx +51 -0
  298. package/src/Icons/generatedIcons/PaperPlaneTilt.tsx +51 -0
  299. package/src/Icons/generatedIcons/Paperclip.tsx +51 -0
  300. package/src/Icons/generatedIcons/Pause.tsx +51 -0
  301. package/src/Icons/generatedIcons/PencilLine.tsx +51 -0
  302. package/src/Icons/generatedIcons/PencilRuler.tsx +51 -0
  303. package/src/Icons/generatedIcons/PencilSimple.tsx +51 -0
  304. package/src/Icons/generatedIcons/Phone.tsx +51 -0
  305. package/src/Icons/generatedIcons/PinterestLogo.tsx +51 -0
  306. package/src/Icons/generatedIcons/Play.tsx +51 -0
  307. package/src/Icons/generatedIcons/Plus.tsx +51 -0
  308. package/src/Icons/generatedIcons/PlusCircle.tsx +48 -0
  309. package/src/Icons/generatedIcons/Printer.tsx +51 -0
  310. package/src/Icons/generatedIcons/Question.tsx +48 -0
  311. package/src/Icons/generatedIcons/Receipt.tsx +51 -0
  312. package/src/Icons/generatedIcons/Rows.tsx +51 -0
  313. package/src/Icons/generatedIcons/SealCheck.tsx +51 -0
  314. package/src/Icons/generatedIcons/SelectionSlash.tsx +48 -0
  315. package/src/Icons/generatedIcons/ShareNetwork.tsx +51 -0
  316. package/src/Icons/generatedIcons/ShieldCheck.tsx +51 -0
  317. package/src/Icons/generatedIcons/ShieldStar.tsx +51 -0
  318. package/src/Icons/generatedIcons/ShoppingCart.tsx +48 -0
  319. package/src/Icons/generatedIcons/ShuffleAngular.tsx +48 -0
  320. package/src/Icons/generatedIcons/SidebarSimple.tsx +48 -0
  321. package/src/Icons/generatedIcons/SlidersHorizontal.tsx +51 -0
  322. package/src/Icons/generatedIcons/Smiley.tsx +48 -0
  323. package/src/Icons/generatedIcons/Sparkle.tsx +51 -0
  324. package/src/Icons/generatedIcons/SpinnerGap.tsx +48 -0
  325. package/src/Icons/generatedIcons/StackPlus.tsx +48 -0
  326. package/src/Icons/generatedIcons/Star.tsx +51 -0
  327. package/src/Icons/generatedIcons/Storefront.tsx +51 -0
  328. package/src/Icons/generatedIcons/Swap.tsx +51 -0
  329. package/src/Icons/generatedIcons/Tag.tsx +51 -0
  330. package/src/Icons/generatedIcons/ThumbsDown.tsx +48 -0
  331. package/src/Icons/generatedIcons/ThumbsUp.tsx +48 -0
  332. package/src/Icons/generatedIcons/Toolbox.tsx +48 -0
  333. package/src/Icons/generatedIcons/Trash.tsx +48 -0
  334. package/src/Icons/generatedIcons/TrendUp.tsx +48 -0
  335. package/src/Icons/generatedIcons/Trophy.tsx +51 -0
  336. package/src/Icons/generatedIcons/Truck.tsx +51 -0
  337. package/src/Icons/generatedIcons/UploadSimple.tsx +51 -0
  338. package/src/Icons/generatedIcons/User.tsx +48 -0
  339. package/src/Icons/generatedIcons/Users.tsx +48 -0
  340. package/src/Icons/generatedIcons/UsersThree.tsx +51 -0
  341. package/src/Icons/generatedIcons/VideoCamera.tsx +51 -0
  342. package/src/Icons/generatedIcons/Warning.tsx +51 -0
  343. package/src/Icons/generatedIcons/WarningCircle.tsx +48 -0
  344. package/src/Icons/generatedIcons/WifiHigh.tsx +51 -0
  345. package/src/Icons/generatedIcons/XCircle.tsx +48 -0
  346. package/src/Icons/generatedIcons/XLogo.tsx +48 -0
  347. package/src/Icons/generatedIcons/YoutubeLogo.tsx +51 -0
  348. package/src/Icons/importedIcons.ts +152 -0
  349. package/src/Icons/index.ts +149 -0
  350. package/src/Icons/socialIcons/appleSocialIcon.tsx +50 -0
  351. package/src/Icons/socialIcons/facebookSocialIcon.tsx +41 -0
  352. package/src/Icons/socialIcons/googleSocialIcon.tsx +134 -0
  353. package/src/ImageCluster/ImageCluster.tsx +125 -0
  354. package/src/ImageSlider/ImageSlider.tsx +582 -0
  355. package/src/ImageSlider/ImageSlider.types.ts +90 -0
  356. package/src/ImageSlider/components/IndexIndicator/IndexIndicator.tsx +21 -0
  357. package/src/ImageSlider/components/NavigationButtons/NavigationButtons.tsx +113 -0
  358. package/src/ImageSlider/components/ResponsiveImage/ResponsiveImage.tsx +114 -0
  359. package/src/ImageSlider/components/ResponsiveImage/index.ts +1 -0
  360. package/src/ImageSlider/components/Thumbnails/Thumbnails.tsx +184 -0
  361. package/src/ImageSlider/constants.ts +59 -0
  362. package/src/ImageSlider/hooks/index.ts +3 -0
  363. package/src/ImageSlider/hooks/useImageSlider.ts +57 -0
  364. package/src/ImageSlider/hooks/useImageSliderNavigation.ts +133 -0
  365. package/src/ImageSlider/hooks/useImageSliderScrollHandler.ts +171 -0
  366. package/src/ImageSlider/index.ts +3 -0
  367. package/src/ImageSlider/utils/imageOptimization.ts +97 -0
  368. package/src/ImageSlider/utils/index.ts +1 -0
  369. package/src/InlineNotification/InlineNotification.tsx +95 -0
  370. package/src/JumpMenu/JumpMenu.tsx +395 -0
  371. package/src/JumpMenu/components/JumpMenuItem/JumpMenuItem.tsx +62 -0
  372. package/src/JumpMenu/hooks/useContainerTracking.ts +171 -0
  373. package/src/JumpMenu/hooks/useIntersectionObserver.ts +77 -0
  374. package/src/JumpMenu/hooks/useKeyboardNavigation.ts +102 -0
  375. package/src/JumpMenu/hooks/useResizeObserver.ts +53 -0
  376. package/src/JumpMenu/hooks/useSectionObserver.ts +102 -0
  377. package/src/JumpMenu/index.ts +2 -0
  378. package/src/JumpMenu/types/index.ts +19 -0
  379. package/src/Loading/Loading.tsx +39 -0
  380. package/src/Loading/components/LoadingDot/LoadingDot.tsx +16 -0
  381. package/src/LoadingSpinner/LoadingSpinner.tsx +20 -0
  382. package/src/Menu/Menu.tsx +372 -0
  383. package/src/Menu/components/MenuDivider/MenuDivider.tsx +5 -0
  384. package/src/Menu/components/MenuItem/MenuItem.tsx +298 -0
  385. package/src/Menu/context/menuContext.tsx +20 -0
  386. package/src/Menu/hooks/useMenu.tsx +18 -0
  387. package/src/Menu/index.ts +3 -0
  388. package/src/Modal/ComposableModal.tsx +313 -0
  389. package/src/Modal/Modal.tsx +231 -0
  390. package/src/Modal/components/BackButton/BackButton.tsx +43 -0
  391. package/src/Modal/components/Backdrop/Backdrop.tsx +62 -0
  392. package/src/Modal/components/CloseButton/CloseButton.tsx +55 -0
  393. package/src/Modal/components/ModalActions/ModalActions.tsx +135 -0
  394. package/src/Modal/components/ModalContent/ModalContent.tsx +163 -0
  395. package/src/Modal/components/ModalHeader/ModalHeader.tsx +84 -0
  396. package/src/Modal/components/ModalHeader/hooks/useHeaderAnimation.tsx +49 -0
  397. package/src/Modal/components/ModalProgressSteps/ModalProgressSteps.tsx +26 -0
  398. package/src/Modal/components/ModalSubTitle/ModalSubTitle.tsx +29 -0
  399. package/src/Modal/components/ModalTitle/ModalTitle.tsx +22 -0
  400. package/src/Modal/components/PreventModalScroll/PreventModalScroll.tsx +106 -0
  401. package/src/Modal/components/index.ts +12 -0
  402. package/src/Modal/context.ts +33 -0
  403. package/src/Modal/hooks/useCloseModal.ts +133 -0
  404. package/src/NotificationBadge/NotificationBadge.tsx +34 -0
  405. package/src/Pagination/AdvancedPagination.tsx +48 -0
  406. package/src/Pagination/Pagination.tsx +216 -0
  407. package/src/Pagination/components/AdvancedPaginator/AdvancedPaginator.tsx +52 -0
  408. package/src/Pagination/components/AdvancedPaginator/components/PageSelect/PageSelect.tsx +43 -0
  409. package/src/Pagination/components/ItemCountDisplay/ItemCountDisplay.tsx +32 -0
  410. package/src/Pagination/components/ItemCountSelect/ItemCountSelect.tsx +33 -0
  411. package/src/Pagination/index.tsx +3 -0
  412. package/src/Pagination/paginationProvider.tsx +234 -0
  413. package/src/Pagination/utils.tsx +36 -0
  414. package/src/PhoneInput/PhoneInput.tsx +509 -0
  415. package/src/PhoneInput/useDropdownLogic.tsx +163 -0
  416. package/src/ProgressCircle/ProgressCircle.tsx +246 -0
  417. package/src/ProgressCircle/hooks/useProgressStatusTransitions.ts +49 -0
  418. package/src/ProgressCircle/utils/progressCircle.constants.ts +27 -0
  419. package/src/ProgressSteps/ProgressSteps.tsx +160 -0
  420. package/src/SaveConfetti/SaveConfetti.tsx +277 -0
  421. package/src/SaveConfetti/index.ts +2 -0
  422. package/src/SearchInput/SearchInput.tsx +236 -0
  423. package/src/SegmentedControl/SegmentedControl.tsx +111 -0
  424. package/src/SegmentedControl/SegmentedControlGroup.tsx +94 -0
  425. package/src/SegmentedControl/index.ts +4 -0
  426. package/src/Select/Select.tsx +154 -0
  427. package/src/Select/SelectAsync.tsx +13 -0
  428. package/src/Select/SelectAsyncCreatable.tsx +14 -0
  429. package/src/Select/SelectCreatable.tsx +12 -0
  430. package/src/Select/reexportedComponents.tsx +5 -0
  431. package/src/Select/selectComponents.tsx +306 -0
  432. package/src/Skeleton/Skeleton.tsx +13 -0
  433. package/src/SplitButton/SplitButton.tsx +298 -0
  434. package/src/SplitButton/SplitButtonTrigger.tsx +55 -0
  435. package/src/StarRating/StarRating.tsx +165 -0
  436. package/src/StarRating/components/StarComponent/StarComponent.tsx +44 -0
  437. package/src/Table/Table.tsx +474 -0
  438. package/src/Table/components/TableHeader/TableHeader.tsx +166 -0
  439. package/src/Table/components/TablePagination/TablePagination.tsx +18 -0
  440. package/src/Table/components/TablePagination/components/ItemCountDisplay/ItemCountDisplay.tsx +17 -0
  441. package/src/Table/components/TablePagination/components/ItemCountSelect/ItemCountSelect.tsx +31 -0
  442. package/src/Table/components/TablePagination/components/TablePaginator/TablePaginator.tsx +37 -0
  443. package/src/Table/components/TablePagination/components/TablePaginator/components/PageSelect/PageSelect.tsx +32 -0
  444. package/src/Table/components/TableRow/TableRows.tsx +147 -0
  445. package/src/Table/components/TableRow/components/TableRowCell/TableRowCell.tsx +49 -0
  446. package/src/Table/components/TableShadow/TableShadow.tsx +46 -0
  447. package/src/Table/index.ts +2 -0
  448. package/src/Table/sharedState.ts +30 -0
  449. package/src/Table/sharedStyles.ts +1 -0
  450. package/src/Table/types.ts +55 -0
  451. package/src/Tabs/Tabs.tsx +358 -0
  452. package/src/TextArea/TextArea.tsx +157 -0
  453. package/src/TextInput/TextInput.tsx +173 -0
  454. package/src/Toast/Toast.tsx +64 -0
  455. package/src/Toast/components/ToastContainer/ToastContainer.tsx +48 -0
  456. package/src/Toast/index.ts +2 -0
  457. package/src/Toast/types/role.ts +1 -0
  458. package/src/Toast/utils/getIcon.tsx +41 -0
  459. package/src/ToggleSwitch/ToggleSwitch.tsx +188 -0
  460. package/src/Tooltip/InfoIconTooltip.tsx +47 -0
  461. package/src/Tooltip/Tooltip.tsx +41 -0
  462. package/src/Typography/InlineButton/InlineButton.tsx +166 -0
  463. package/src/Typography/Links/Links.tsx +113 -0
  464. package/src/Typography/Text/Text.tsx +239 -0
  465. package/src/ViewMore/ViewMore.tsx +226 -0
  466. package/src/WebRTCPlayer/WebRTCPlayer.tsx +325 -0
  467. package/src/WebRTCPlayer/adaptor/NativeWebRTCAdaptor.ts +588 -0
  468. package/src/WebRTCPlayer/hooks/useWebRTCStream.ts +571 -0
  469. package/src/WebRTCPlayer/index.ts +22 -0
  470. package/src/WebRTCPlayer/types.ts +95 -0
  471. package/src/breakpoints/index.tsx +1 -0
  472. package/src/breakpoints/utils.tsx +50 -0
  473. package/src/declarations.d.ts +7 -0
  474. package/src/grid/gridHighlighter.tsx +83 -0
  475. package/src/grid/index.ts +3 -0
  476. package/src/grid/pageGrid.tsx +37 -0
  477. package/src/grid/useSubGridCSS.tsx +214 -0
  478. package/src/hooks/useHorizontalScrollFade.ts +44 -0
  479. package/src/hooks/usePrevious.ts +14 -0
  480. package/src/index.ts +351 -0
  481. package/src/intl/index.ts +4 -0
  482. package/src/intl/utils.ts +67 -0
  483. package/src/mixins/horizontalScrollFadeMixin.ts +56 -0
  484. package/src/mixins/index.ts +18 -0
  485. package/src/mixins/propMixins.ts +389 -0
  486. package/src/providers/createContextProvider.ts +22 -0
  487. package/src/providers/designSystemProvider.tsx +218 -0
  488. package/src/providers/errorBoundaryProvider.tsx +179 -0
  489. package/src/providers/featureFlagProvider.tsx +18 -0
  490. package/src/providers/gridSizeProvider.tsx +23 -0
  491. package/src/providers/index.ts +12 -0
  492. package/src/providers/linkProvider.tsx +32 -0
  493. package/src/providers/normalize.tsx +93 -0
  494. package/src/providers/targets/DatePickerTarget.tsx +10 -0
  495. package/src/providers/targets/ModalTarget.tsx +14 -0
  496. package/src/providers/targets/TimePickerTarget.tsx +10 -0
  497. package/src/providers/themeContext.tsx +24 -0
  498. package/src/providers/windowSizeProvider.tsx +125 -0
  499. package/src/spacing/index.ts +1 -0
  500. package/src/spacing/spacing.ts +11 -0
  501. package/src/utils/countriesWithISOCodes.ts +1419 -0
  502. package/src/utils/dateTimeFormat.ts +257 -0
  503. package/src/utils/effectEventListener.ts +11 -0
  504. package/src/utils/formatFileSize.ts +18 -0
  505. package/src/utils/isClientSide.ts +1 -0
  506. package/src/utils/keepTransition.ts +15 -0
  507. package/src/utils/nodeEnv.ts +9 -0
  508. package/src/utils/smoothScrollTo.ts +47 -0
  509. package/src/utils/utilityTypes.ts +13 -0
@@ -0,0 +1,446 @@
1
+ import { cn } from '@evolve.ui/theme-system';
2
+ import { ReactNode, useCallback, useEffect, useRef, useState } from 'react';
3
+
4
+ import { effectEventListener } from '../utils/effectEventListener';
5
+ import { keepTransition } from '../utils/keepTransition';
6
+ import { nodeEnv } from '../utils/nodeEnv';
7
+ import { DialogActions } from './components/DialogActions/DialogActions';
8
+ import { DialogContent } from './components/DialogContent/DialogContent';
9
+ import { DialogHeader } from './components/DialogHeader/DialogHeader';
10
+
11
+ type ReasonForClose = 'backdrop' | 'closeButton' | 'escape' | 'external';
12
+
13
+ type Props = {
14
+ /**
15
+ * Optional actions to display at the bottom of the drawer
16
+ * Actions container has these styles:
17
+ * ```css
18
+ * display: flex;
19
+ * gap: 16px;
20
+ * > button {
21
+ * flex-grow: 1;
22
+ * }
23
+ * ```
24
+ *
25
+ * Usage:
26
+ * ```tsx
27
+ * <Drawer actions={<Button>Save</Button>} />
28
+ * ```
29
+ *
30
+ */
31
+ actions?: ReactNode;
32
+ /**
33
+ * Optional anchor for the drawer
34
+ *
35
+ * Usage:
36
+ * ```tsx
37
+ * <Drawer anchor="left" />
38
+ * ```
39
+ *
40
+ * @default 'right'
41
+ */
42
+ anchor?: 'left' | 'right';
43
+ /**
44
+ * Children of the drawer are the content of the drawer
45
+ *
46
+ * Usage:
47
+ * ```tsx
48
+ * <Drawer><div>Hello World</div></Drawer>
49
+ * ```
50
+ *
51
+ */
52
+ children?: ReactNode;
53
+ /**
54
+ * Optional class name for the drawer
55
+ *
56
+ * Usage:
57
+ * ```tsx
58
+ * <Drawer className="bg-red-500" />
59
+ * ```
60
+ *
61
+ */
62
+ className?: string;
63
+ /**
64
+ * Optional flag to close the drawer when the user clicks outside
65
+ *
66
+ * Usage:
67
+ * ```tsx
68
+ * <Drawer closeOnOutsideClick={false} />
69
+ * ```
70
+ *
71
+ * @default true
72
+ */
73
+ closeOnOutsideClick?: boolean;
74
+ /**
75
+ * Optional flag to close the drawer when the user presses the Escape key
76
+ *
77
+ * Usage:
78
+ * ```tsx
79
+ * <Drawer closeOnEscape={false} />
80
+ * ```
81
+ *
82
+ * @default true
83
+ */
84
+ closeOnEscape?: boolean;
85
+ /**
86
+ * Optional custom header to replace the default DialogHeader
87
+ *
88
+ * Usage:
89
+ * ```tsx
90
+ * <Drawer customHeader={<div>Custom Header</div>} />
91
+ * ```
92
+ *
93
+ */
94
+ customHeader?: ReactNode;
95
+ /**
96
+ * Optional density for the drawer
97
+ *
98
+ * Usage:
99
+ * ```tsx
100
+ * <Drawer density="compact" />
101
+ * ```
102
+ *
103
+ * @default 'comfortable'
104
+ */
105
+ density?: 'compact' | 'comfortable';
106
+ /**
107
+ * Optional flag to disable scrolling in the drawer content area
108
+ * Useful when the content has its own scrollable areas (e.g., tabs)
109
+ *
110
+ * Usage:
111
+ * ```tsx
112
+ * <Drawer disableScroll />
113
+ * ```
114
+ *
115
+ * @default false
116
+ */
117
+ disableScroll?: boolean;
118
+ /**
119
+ * Required function call when drawer closes, this will almost always be a call to `setShowState(false)`
120
+ *
121
+ * Usage:
122
+ * ```tsx
123
+ * const [show, setShow] = useState(false);
124
+ * ...
125
+ * <Drawer handleClose={() => setShow(false)} />
126
+ * ```
127
+ *
128
+ */
129
+ handleClose: (reason?: ReasonForClose) => void;
130
+ /**
131
+ * Optional flag that controls whether the drawer has a drop shadow
132
+ *
133
+ * Usage:
134
+ * ```tsx
135
+ * <Drawer hasShadow />
136
+ * ```
137
+ *
138
+ */
139
+ hasShadow?: boolean;
140
+ /**
141
+ * Optional header text for the drawer, appears at the top of the drawer
142
+ *
143
+ * Usage:
144
+ * ```tsx
145
+ * <Drawer headerText="Hello World" />
146
+ * ```
147
+ *
148
+ */
149
+ headerText?: string | ReactNode;
150
+ /**
151
+ * Optional alignment for the header text
152
+ *
153
+ * Usage:
154
+ * ```tsx
155
+ * <Drawer headerTextAlign="left" />
156
+ * ```
157
+ *
158
+ * @default 'center'
159
+ */
160
+ headerTextAlign?: 'center' | 'left' | 'right';
161
+ /**
162
+ * Optional flag to keep the drawer in the DOM while closed
163
+ *
164
+ * Usage:
165
+ * ```tsx
166
+ * <Drawer keepInDOMWhileClosed={false} />
167
+ * ```
168
+ * @default true
169
+ */
170
+ keepInDOMWhileClosed?: boolean;
171
+
172
+ /**
173
+ * Optional function call when the back button is clicked
174
+ *
175
+ * Usage:
176
+ * ```tsx
177
+ * <Drawer onBackButtonClick={() => console.log('Back button clicked')} />
178
+ * ```
179
+ *
180
+ */
181
+ onBackButtonClick?: () => void;
182
+ /**
183
+ * Required flag to show the drawer
184
+ *
185
+ * Usage:
186
+ * ```tsx
187
+ * <Drawer show />
188
+ * ```
189
+ *
190
+ */
191
+ show: boolean;
192
+ /**
193
+ * Optional size for the drawer
194
+ *
195
+ * Usage:
196
+ * ```tsx
197
+ * <Drawer size="wide" />
198
+ * ```
199
+ *
200
+ * @default 'narrow'
201
+ */
202
+ size?: 'narrow' | 'wide' | 'extended' | 'full';
203
+ /**
204
+ * Optional flag to control the action container
205
+ *
206
+ * Usage:
207
+ * ```tsx
208
+ * <Drawer useCustomButtonContainer />
209
+ * ```
210
+ *
211
+ */
212
+ useCustomButtonContainer?: boolean;
213
+ };
214
+
215
+ // Open drawers share a single body scroll-lock. Module-scoped so the lock is
216
+ // released only when the last open drawer closes, and so the body's original
217
+ // overflow / padding are captured once (when the first drawer opens) and
218
+ // restored at the end rather than hardcoding values.
219
+ let openDrawerCount = 0;
220
+ let previousBodyOverflow = '';
221
+ let previousBodyPaddingRight = '';
222
+
223
+ // Identities of currently-open drawers, in open order. Escape only closes the
224
+ // last one pushed (the top-most), so stacked drawers close one at a time
225
+ // instead of all collapsing on a single keypress. Per-instance ref objects are
226
+ // used as identities rather than useId so this doesn't consume React's id
227
+ // sequence and shift autogenerated ids in consumer snapshots.
228
+ const openDrawerStack: object[] = [];
229
+
230
+ /**
231
+ * A drawer component using the `dialog` element
232
+ * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dialog
233
+ */
234
+ export const Drawer = ({
235
+ actions,
236
+ anchor = 'right',
237
+ children,
238
+ className,
239
+ closeOnEscape = true,
240
+ closeOnOutsideClick = true,
241
+ customHeader,
242
+ density = 'comfortable',
243
+ disableScroll = false,
244
+ handleClose,
245
+ hasShadow = false,
246
+ headerText,
247
+ headerTextAlign = 'center',
248
+ keepInDOMWhileClosed = true,
249
+ onBackButtonClick,
250
+ show,
251
+ size = 'narrow',
252
+ useCustomButtonContainer = false,
253
+ }: Props) => {
254
+ const reasonForClose = useRef<ReasonForClose>('external');
255
+ // Per-instance ref instead of a shared id: several Drawers can be mounted at
256
+ // once, and a duplicate id would make a lookup match the wrong backdrop.
257
+ const backdropRef = useRef<HTMLDivElement>(null);
258
+ const drawerIdRef = useRef<object>({});
259
+ const [renderDrawer, setRenderDrawer] = useState(show);
260
+
261
+ const removeTransitionForTest = Boolean(nodeEnv === 'test') && Boolean(keepTransition() !== 'true');
262
+
263
+ const startCloseTransition = useCallback(
264
+ (reason: ReasonForClose) => {
265
+ setRenderDrawer(false);
266
+ reasonForClose.current = reason;
267
+
268
+ // Close the drawer immediately in test environment
269
+ if (removeTransitionForTest) {
270
+ handleClose(reason);
271
+ }
272
+ },
273
+ [handleClose, removeTransitionForTest]
274
+ );
275
+
276
+ // Close the drawer when the show prop changes to false
277
+ useEffect(() => {
278
+ if (renderDrawer && !show) {
279
+ startCloseTransition('external');
280
+ }
281
+ }, [renderDrawer, show, startCloseTransition]);
282
+
283
+ // Show the drawer when the show prop changes to true
284
+ useEffect(() => {
285
+ if (show) {
286
+ setRenderDrawer(true);
287
+ }
288
+ }, [show]);
289
+
290
+ // Close the drawer when the escape key is pressed. Only listen while this
291
+ // drawer is open so a closed instance never preventDefaults Escape for
292
+ // other components, and only the top-most open drawer reacts so stacked
293
+ // drawers close one at a time rather than all at once.
294
+ useEffect(() => {
295
+ if (!renderDrawer || !closeOnEscape) {
296
+ return;
297
+ }
298
+
299
+ const drawerIdentity = drawerIdRef.current;
300
+ openDrawerStack.push(drawerIdentity);
301
+
302
+ const removeListener = effectEventListener(window, 'keydown', (event) => {
303
+ if (!(event instanceof KeyboardEvent) || event.key !== 'Escape') {
304
+ return;
305
+ }
306
+ if (openDrawerStack[openDrawerStack.length - 1] !== drawerIdentity) {
307
+ return;
308
+ }
309
+ event.preventDefault();
310
+ startCloseTransition('escape');
311
+ });
312
+
313
+ return () => {
314
+ const index = openDrawerStack.lastIndexOf(drawerIdentity);
315
+ if (index !== -1) {
316
+ openDrawerStack.splice(index, 1);
317
+ }
318
+ removeListener();
319
+ };
320
+ }, [renderDrawer, closeOnEscape, startCloseTransition]);
321
+
322
+ // Close the drawer when the backdrop is clicked
323
+ useEffect(() => {
324
+ const handleBackdropClick = (event: MouseEvent) => {
325
+ if (event.target === backdropRef.current && closeOnOutsideClick) {
326
+ startCloseTransition('backdrop');
327
+ }
328
+ };
329
+
330
+ window.addEventListener('click', handleBackdropClick);
331
+
332
+ return () => {
333
+ window.removeEventListener('click', handleBackdropClick);
334
+ };
335
+ }, [closeOnOutsideClick, startCloseTransition]);
336
+
337
+ // Prevent body scrolling while any drawer is open. Ref-counted across
338
+ // instances so closing one drawer does not unlock scroll while another is
339
+ // still open; the first drawer to open captures the body's prior overflow
340
+ // and padding and the last to close restores them. The scrollbar's width is
341
+ // added as padding-right while locked so hiding the scrollbar doesn't shift
342
+ // the page (mirrors modal/PreventModalScroll).
343
+ useEffect(() => {
344
+ if (!show) {
345
+ return;
346
+ }
347
+
348
+ if (openDrawerCount === 0) {
349
+ previousBodyOverflow = document.body.style.overflow;
350
+ previousBodyPaddingRight = document.body.style.paddingRight;
351
+
352
+ const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;
353
+ if (scrollbarWidth > 0) {
354
+ document.body.style.paddingRight = `${scrollbarWidth}px`;
355
+ }
356
+ }
357
+ openDrawerCount += 1;
358
+ document.body.style.overflow = 'hidden';
359
+
360
+ return () => {
361
+ openDrawerCount -= 1;
362
+ if (openDrawerCount === 0) {
363
+ document.body.style.overflow = previousBodyOverflow;
364
+ document.body.style.paddingRight = previousBodyPaddingRight;
365
+ }
366
+ };
367
+ }, [show]);
368
+
369
+ // Render children when the drawer is closed and keepInDOMWhileClosed is true
370
+ const renderWhenClosed = keepInDOMWhileClosed || renderDrawer;
371
+
372
+ return (
373
+ <>
374
+ <div
375
+ className={cn(
376
+ 'hui-focus-visible-outline invisible fixed inset-0 z-30 bg-background-overlay opacity-0 duration-500 focus:m-2xs focus:transition-none',
377
+ {
378
+ 'opacity-1 visible': renderDrawer,
379
+ 'pointer-events-none invisible opacity-0': !renderDrawer,
380
+ 'transition-none': removeTransitionForTest,
381
+ }
382
+ )}
383
+ data-testid="drawer-backdrop"
384
+ ref={backdropRef}
385
+ />
386
+ <dialog
387
+ aria-label="Drawer Menu"
388
+ className={cn(
389
+ // GENERAL
390
+ 'm-w-[320px] fixed top-0 z-40 flex h-full max-h-full w-full flex-col p-0',
391
+ // SIZE
392
+ {
393
+ 'h-[100vh] w-[100vw]': size === 'full',
394
+ 'max-w-[320px]': size === 'narrow',
395
+ 'max-w-[480px]': size === 'wide',
396
+ 'max-w-[720px]': size === 'extended',
397
+ },
398
+ // SHADOW
399
+ { 'shadow-04': hasShadow },
400
+ // ANCHOR
401
+ { 'left-0 ml-0': anchor === 'left', 'right-0 mr-0': anchor === 'right' },
402
+ // ANIMATION
403
+ {
404
+ 'invisible -translate-x-full opacity-0 transition-all': !renderDrawer && anchor === 'left',
405
+ 'invisible translate-x-full opacity-0 transition-all': !renderDrawer && anchor === 'right',
406
+ 'opacity-1 -translate-x-0 transition-all': renderDrawer && anchor === 'left',
407
+ 'opacity-1 translate-x-0 transition-all': renderDrawer && anchor === 'right',
408
+ 'transition-none': removeTransitionForTest,
409
+ },
410
+ className
411
+ )}
412
+ data-hui-id="Drawer"
413
+ onTransitionEnd={() => !renderDrawer && handleClose(reasonForClose.current)}
414
+ open={renderDrawer}
415
+ >
416
+ {customHeader !== undefined ? (
417
+ customHeader
418
+ ) : (
419
+ <DialogHeader
420
+ density={density}
421
+ onBackButtonClick={onBackButtonClick}
422
+ onCloseButtonClick={() => startCloseTransition('closeButton')}
423
+ textAlign={headerTextAlign}
424
+ >
425
+ {headerText}
426
+ </DialogHeader>
427
+ )}
428
+ <DialogContent
429
+ density={density}
430
+ disableScroll={disableScroll}
431
+ renderWhenClosed={renderWhenClosed}
432
+ >
433
+ {children}
434
+ </DialogContent>
435
+ {actions && (
436
+ <DialogActions
437
+ density={density}
438
+ useCustomButtonContainer={useCustomButtonContainer}
439
+ >
440
+ {actions}
441
+ </DialogActions>
442
+ )}
443
+ </dialog>
444
+ </>
445
+ );
446
+ };
@@ -0,0 +1,4 @@
1
+ import { atomWithReset } from 'jotai/utils';
2
+
3
+ export const showBottomScrollHintAtom = atomWithReset<boolean>(false);
4
+ export const showTopScrollHintAtom = atomWithReset<boolean>(false);
@@ -0,0 +1,33 @@
1
+ import { cn } from '@evolve.ui/theme-system';
2
+ import { useAtomValue } from 'jotai';
3
+ import { ReactNode, useContext } from 'react';
4
+
5
+ import { ModalContext } from '../../../Modal/context';
6
+
7
+ type Props = {
8
+ children: ReactNode;
9
+ className?: string;
10
+ density?: 'compact' | 'comfortable';
11
+ useCustomButtonContainer?: boolean;
12
+ };
13
+
14
+ export const DialogActions = ({ children, className, density, useCustomButtonContainer }: Props) => {
15
+ const { showBottomScrollHintAtom } = useContext(ModalContext);
16
+ const showBottomScrollHint = useAtomValue(showBottomScrollHintAtom);
17
+
18
+ return (
19
+ <div
20
+ className={cn(
21
+ 'flex grow-0 gap-sm p-sm',
22
+ {
23
+ '[&_button]:grow-[1]': !useCustomButtonContainer,
24
+ 'p-xs': density === 'compact',
25
+ 'shadow-05': showBottomScrollHint,
26
+ },
27
+ className
28
+ )}
29
+ >
30
+ {children}
31
+ </div>
32
+ );
33
+ };
@@ -0,0 +1,80 @@
1
+ import { cn } from '@evolve.ui/theme-system';
2
+ import { useSetAtom } from 'jotai';
3
+ import { ReactNode, useCallback, useContext, useEffect, useRef } from 'react';
4
+
5
+ import { ModalContext } from '../../../Modal/context';
6
+ import { effectEventListener } from '../../../utils/effectEventListener';
7
+
8
+ type Props = {
9
+ children: ReactNode;
10
+ density?: 'compact' | 'comfortable';
11
+ disableScroll?: boolean;
12
+ renderWhenClosed: boolean;
13
+ };
14
+
15
+ export const DialogContent = ({ children, density, disableScroll = false, renderWhenClosed }: Props) => {
16
+ const { showBottomScrollHintAtom, showTopScrollHintAtom } = useContext(ModalContext);
17
+ const setShowBottomScrollHint = useSetAtom(showBottomScrollHintAtom);
18
+ const setShowTopScrollHint = useSetAtom(showTopScrollHintAtom);
19
+
20
+ const handleScroll = useCallback(
21
+ (contentRef: HTMLDivElement) => () => {
22
+ if (contentRef.scrollHeight > contentRef.clientHeight + 32) {
23
+ const atTheBottom =
24
+ Math.round(contentRef.scrollHeight - contentRef.scrollTop) - 5 < contentRef.clientHeight;
25
+ const atTheTop = contentRef.scrollTop < 25;
26
+
27
+ setShowBottomScrollHint(!atTheBottom);
28
+ setShowTopScrollHint(!atTheTop);
29
+ } else if (contentRef.scrollTop === 0) {
30
+ setShowBottomScrollHint(false);
31
+ setShowTopScrollHint(false);
32
+ }
33
+ },
34
+ [setShowBottomScrollHint, setShowTopScrollHint]
35
+ );
36
+
37
+ const onScrollRef = useRef<ReturnType<typeof handleScroll>>(null);
38
+
39
+ // Trigger handleScroll on window resize
40
+ useEffect(() => {
41
+ return effectEventListener(window, 'resize', () => onScrollRef.current?.());
42
+ }, [handleScroll]);
43
+
44
+ return (
45
+ <div
46
+ className={cn('grow-[1] border-y border-solid border-border-secondary', {
47
+ 'flex flex-col overflow-hidden': disableScroll,
48
+ 'h-[100vh] overflow-y-auto': !disableScroll,
49
+ 'p-sm': !disableScroll && density !== 'compact',
50
+ 'p-xs': !disableScroll && density === 'compact',
51
+ })}
52
+ data-testid="dialog-content"
53
+ ref={(ref) => {
54
+ if (!ref) {
55
+ return;
56
+ }
57
+
58
+ const onScroll = handleScroll(ref);
59
+ onScrollRef.current = onScroll;
60
+
61
+ const resizeObserver = new ResizeObserver(() => {
62
+ const scrollHeight = ref.scrollHeight;
63
+ const clientHeight = ref.clientHeight;
64
+
65
+ if (scrollHeight === clientHeight + 32) {
66
+ setShowBottomScrollHint(false);
67
+ setShowTopScrollHint(false);
68
+ } else {
69
+ onScroll();
70
+ }
71
+ });
72
+
73
+ resizeObserver.observe(ref);
74
+ ref.addEventListener('scroll', onScroll);
75
+ }}
76
+ >
77
+ {renderWhenClosed ? children : null}
78
+ </div>
79
+ );
80
+ };
@@ -0,0 +1,68 @@
1
+ import { cn } from '@evolve.ui/theme-system';
2
+ import { useAtomValue } from 'jotai';
3
+ import { ReactNode, useContext } from 'react';
4
+
5
+ import { IconButton } from '../../../IconButton/IconButton';
6
+ import { ArrowLeft, Close } from '../../../Icons';
7
+ import { ModalContext } from '../../../Modal/context';
8
+ import { H2 } from '../../../Typography/Text/Text';
9
+
10
+ type Props = {
11
+ children?: ReactNode;
12
+ density: 'compact' | 'comfortable';
13
+ onBackButtonClick?: () => void;
14
+ onCloseButtonClick: () => void;
15
+ textAlign?: 'center' | 'left' | 'right';
16
+ };
17
+
18
+ export const DialogHeader = ({
19
+ children,
20
+ density = 'comfortable',
21
+ onBackButtonClick,
22
+ onCloseButtonClick,
23
+ textAlign = 'center',
24
+ }: Props) => {
25
+ const { showTopScrollHintAtom } = useContext(ModalContext);
26
+ const showTopScrollHint = useAtomValue(showTopScrollHintAtom);
27
+
28
+ return (
29
+ <div
30
+ className={cn('relative grid grid-cols-[42px_1fr_42px] gap-[4px] p-sm', {
31
+ 'p-xs': density === 'compact',
32
+ 'shadow-01': showTopScrollHint,
33
+ })}
34
+ >
35
+ {onBackButtonClick !== undefined && (
36
+ <IconButton
37
+ aria-label="Go Back"
38
+ className={cn('col-start-1 col-end-2')}
39
+ data-testid="back-button"
40
+ hideTooltip
41
+ icon={ArrowLeft}
42
+ onClick={onBackButtonClick}
43
+ size="md"
44
+ type="button"
45
+ />
46
+ )}
47
+ <div
48
+ className={cn('col-start-2 col-end-3 flex', {
49
+ 'justify-center text-center': textAlign === 'center',
50
+ 'justify-end text-right': textAlign === 'right',
51
+ 'justify-start text-left': textAlign === 'left',
52
+ })}
53
+ data-testid="dialog-header-text-container"
54
+ >
55
+ {typeof children === 'string' ? <H2 className="pt-[6px]">{children}</H2> : children}
56
+ </div>
57
+ <IconButton
58
+ className={cn('col-start-3 col-end-4')}
59
+ data-testid="close-button"
60
+ hideTooltip
61
+ icon={Close}
62
+ onClick={onCloseButtonClick}
63
+ size="md"
64
+ type="button"
65
+ />
66
+ </div>
67
+ );
68
+ };