@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,476 @@
1
+ //
2
+ // GPU-accelerated BottomSheet using translate3d transforms for better mobile performance
3
+ //
4
+ // This component uses static height and translate3d transforms instead of height animations
5
+ // for improved performance on mobile devices. Key improvements:
6
+ // - GPU acceleration through translate3d
7
+ // - Static height calculation (no height animations)
8
+ // - Reduced layout thrashing
9
+ // - Optimized for mobile performance
10
+
11
+ import { cn } from '@evolve.ui/theme-system';
12
+ import { animated } from '@react-spring/web';
13
+ import { useDrag } from '@use-gesture/react';
14
+ import {
15
+ FC,
16
+ forwardRef,
17
+ HTMLProps,
18
+ RefObject,
19
+ useCallback,
20
+ useEffect,
21
+ useImperativeHandle,
22
+ useMemo,
23
+ useRef,
24
+ useState,
25
+ } from 'react';
26
+
27
+ import type { SpringSetOptions } from './hooks/useSpring';
28
+ import type { defaultSnapProps, Props, RefHandles, ResizeSource, SnapPointProps } from './types';
29
+
30
+ import { nodeEnv } from '../utils/nodeEnv';
31
+ import { BottomSheetBackdrop, BottomSheetOverlay } from './components';
32
+ import {
33
+ useAriaHider,
34
+ useBottomSheetServices,
35
+ useDragHandler,
36
+ useFocusTrap,
37
+ useLayoutEffect,
38
+ useOptimizedScrollState,
39
+ useReady,
40
+ useReducedMotion,
41
+ useScrollLock,
42
+ useSnapPoints,
43
+ useSpring,
44
+ useSpringInterpolationsTranslate3d,
45
+ } from './hooks';
46
+ import { type BottomSheetActions, useBottomSheetStateMachine } from './state/useBottomSheetStateMachine';
47
+
48
+ // react-spring 9.7.5's animated.div drops `children` from its props under TS 6 — alias
49
+ // it to a plain div component type (runtime identical), same adaptation as ContentPager.
50
+ type AnimatedDivProps = Omit<HTMLProps<HTMLDivElement>, 'style'> & { style?: object };
51
+ const AnimatedDiv = animated.div as unknown as FC<AnimatedDivProps>;
52
+
53
+ /**
54
+ * BottomSheet - GPU-accelerated version using translate3d transforms
55
+ *
56
+ * Key features:
57
+ * - Uses translate3d for positioning instead of height + translateY
58
+ * - Static height calculation for better performance
59
+ * - Optimized for mobile device GPU acceleration
60
+ * - Reduced layout thrashing during animations
61
+ * - Viewport height limiting with 64px buffer to prevent sheet from exceeding screen bounds
62
+ * - Hard cap at actual viewport height for all maxHeight props and snap points
63
+ */
64
+ export const BottomSheet = forwardRef<
65
+ RefHandles,
66
+ {
67
+ initialState: 'OPEN' | 'CLOSED';
68
+ lastSnapRef: RefObject<number | null>;
69
+ /**
70
+ * Preload the sheet measurements and setup when closed for faster opening.
71
+ * Useful when you know a sheet will be opened soon.
72
+ */
73
+ preload?: boolean;
74
+ } & Props
75
+ >(function BottomSheetInternal(
76
+ {
77
+ children,
78
+ className,
79
+ defaultSnap: getDefaultSnap = _defaultSnap,
80
+ disableScroll = false,
81
+ footer,
82
+ header,
83
+ initialFocusRef,
84
+ initialState,
85
+ lastSnapRef,
86
+ maxHeight: controlledMaxHeight,
87
+ minHeight: controlledMinHeight = 300,
88
+ onCloseEnd,
89
+ onDismiss,
90
+ onSpringCancel,
91
+ onSpringEnd,
92
+ onSpringStart,
93
+ open: _open,
94
+ preload = false,
95
+ scrollLocking = true,
96
+ snapPoints: getSnapPoints = _snapPoints,
97
+ style,
98
+ ...props
99
+ },
100
+ forwardRef
101
+ ) {
102
+ // Before any animations can start we need to measure a few things
103
+ const { ready, registerReady } = useReady();
104
+
105
+ // Controls the drag handler, used by spring operations that happen outside the render loop in React
106
+ const canDragRef = useRef(false);
107
+
108
+ // Callback refs to avoid breaking the sheet when callbacks change
109
+ const onCloseEndRef = useRef(onCloseEnd);
110
+ const onSpringStartRef = useRef(onSpringStart);
111
+ const onSpringCancelRef = useRef(onSpringCancel);
112
+ const onSpringEndRef = useRef(onSpringEnd);
113
+ useEffect(() => {
114
+ onCloseEndRef.current = onCloseEnd;
115
+ onSpringStartRef.current = onSpringStart;
116
+ onSpringCancelRef.current = onSpringCancel;
117
+ onSpringEndRef.current = onSpringEnd;
118
+ }, [onCloseEnd, onSpringCancel, onSpringStart, onSpringEnd]);
119
+
120
+ // The animation engine
121
+ const [spring, api] = useSpring();
122
+
123
+ // Use Tailwind transitions for fade animation like Drawer/Modal components
124
+ const [showContent, setShowContent] = useState(_open);
125
+
126
+ const containerRef = useRef<HTMLDivElement>(null);
127
+ const scrollRef = useRef<HTMLDivElement>(null);
128
+ const contentRef = useRef<HTMLDivElement>(null);
129
+ const headerRef = useRef<HTMLDivElement>(null);
130
+ const footerRef = useRef<HTMLDivElement>(null);
131
+ const overlayRef = useRef<HTMLDivElement | null>(null);
132
+
133
+ // Keeps track of the current height, or the height transitioning to
134
+ const heightRef = useRef(0);
135
+ const resizeSourceRef = useRef<ResizeSource>('window');
136
+ const preventScrollingRef = useRef(false);
137
+
138
+ // Use optimized scroll state hook for better performance
139
+ const { isScrollable, isScrolledToBottom } = useOptimizedScrollState(scrollRef, ready);
140
+
141
+ const prefersReducedMotion = useReducedMotion();
142
+
143
+ // Plugins
144
+ const scrollLockRef = useScrollLock({
145
+ enabled: ready && scrollLocking,
146
+ reserveScrollBarGap: true,
147
+ targetRef: scrollRef as RefObject<Element>,
148
+ });
149
+ const ariaHiderRef = useAriaHider({
150
+ enabled: ready,
151
+ targetRef: containerRef as RefObject<Element>,
152
+ });
153
+
154
+ const focusTrapRef = useFocusTrap({
155
+ enabled: ready && initialFocusRef !== false,
156
+ fallbackRef: overlayRef as RefObject<HTMLElement>,
157
+ initialFocusRef: initialFocusRef || undefined,
158
+ targetRef: containerRef as RefObject<HTMLElement>,
159
+ });
160
+
161
+ const { findSnap, maxHeight, maxSnap, minSnap } = useSnapPoints({
162
+ contentRef: contentRef as RefObject<Element>,
163
+ controlledMaxHeight,
164
+ controlledMinHeight,
165
+ footerEnabled: Boolean(footer),
166
+ footerRef: footerRef as RefObject<Element>,
167
+ getSnapPoints: getSnapPoints as (props: SnapPointProps) => number[],
168
+ headerEnabled: Boolean(header),
169
+ headerRef: headerRef as RefObject<Element>,
170
+ heightRef,
171
+ lastSnapRef: lastSnapRef as RefObject<number>,
172
+ ready,
173
+ registerReady,
174
+ resizeSourceRef,
175
+ });
176
+
177
+ // Setup refs for full control over when side effects execute
178
+ const maxHeightRef = useRef(maxHeight);
179
+ const minSnapRef = useRef(minSnap);
180
+ const maxSnapRef = useRef(maxSnap);
181
+ const findSnapRef = useRef(findSnap);
182
+ const defaultSnapRef = useRef(0);
183
+
184
+ // Sync refs with current state
185
+ useLayoutEffect(() => {
186
+ maxHeightRef.current = maxHeight;
187
+ maxSnapRef.current = maxSnap;
188
+ minSnapRef.current = minSnap;
189
+ findSnapRef.current = findSnap;
190
+ defaultSnapRef.current = findSnap(getDefaultSnap);
191
+ }, [findSnap, getDefaultSnap, maxHeight, maxSnap, minSnap]);
192
+
193
+ // Mobile-optimized spring animation with translate3d focus
194
+ const asyncSet = useCallback(
195
+ ({ onRest, ...opts }: SpringSetOptions) => {
196
+ return new Promise<void>((resolve) =>
197
+ api.start({
198
+ ...opts,
199
+ onRest: (result: unknown) => {
200
+ resolve();
201
+ onRest?.(result);
202
+ },
203
+ })
204
+ );
205
+ },
206
+ [api]
207
+ );
208
+ // Define services for the state machine using the custom hook
209
+ const services = useBottomSheetServices({
210
+ ariaHiderRef,
211
+ asyncSet,
212
+ canDragRef,
213
+ defaultSnapRef,
214
+ findSnapRef,
215
+ focusTrapRef,
216
+ heightRef,
217
+ lastSnapRef,
218
+ maxHeightRef,
219
+ maxSnapRef,
220
+ minSnapRef,
221
+ onSpringCancelRef,
222
+ onSpringEndRef,
223
+ onSpringStartRef,
224
+ prefersReducedMotion,
225
+ resizeSourceRef,
226
+ scrollLockRef,
227
+ });
228
+
229
+ // Define actions for the state machine
230
+ const actions = useCallback(
231
+ (): BottomSheetActions => ({
232
+ onCloseCancel: () => onSpringCancelRef.current?.({ type: 'CLOSE' }),
233
+ onCloseEnd: () => {
234
+ onSpringEndRef.current?.({ type: 'CLOSE' });
235
+ onCloseEndRef.current?.();
236
+ },
237
+ onOpenCancel: () => onSpringCancelRef.current?.({ type: 'OPEN' }),
238
+ onOpenEnd: () => onSpringEndRef.current?.({ type: 'OPEN' }),
239
+ onResizeCancel: () =>
240
+ onSpringCancelRef.current?.({
241
+ source: resizeSourceRef.current,
242
+ type: 'RESIZE',
243
+ }),
244
+ onResizeEnd: () =>
245
+ onSpringEndRef.current?.({
246
+ source: resizeSourceRef.current,
247
+ type: 'RESIZE',
248
+ }),
249
+ onSnapCancel: (context) =>
250
+ onSpringCancelRef.current?.({
251
+ source: context.snapSource || 'custom',
252
+ type: 'SNAP',
253
+ }),
254
+ onSnapEnd: (context) =>
255
+ onSpringEndRef.current?.({
256
+ source: context.snapSource || 'custom',
257
+ type: 'SNAP',
258
+ }),
259
+ }),
260
+ []
261
+ );
262
+
263
+ // Memoize the initial context to prevent infinite loops
264
+ const initialContext = useMemo(() => ({ initialState }), [initialState]);
265
+
266
+ // Use the Jotai-based state machine
267
+ const { current, reset, send } = useBottomSheetStateMachine(services(), actions(), initialContext);
268
+
269
+ useEffect(() => {
270
+ if (_open) {
271
+ send('OPEN');
272
+ } else {
273
+ // IMPORTANT: Blur any focused element within the sheet BEFORE deactivating aria-hider
274
+ // This prevents the warning: "Blocked aria-hidden on an element because its descendant retained focus"
275
+ // This happens when user clicks a button (e.g., Cancel) which triggers close while button has focus
276
+ const activeElement = document.activeElement;
277
+ if (activeElement instanceof HTMLElement && containerRef.current?.contains(activeElement)) {
278
+ activeElement.blur();
279
+ }
280
+ send('CLOSE');
281
+ }
282
+ }, [_open, send, current.value]);
283
+
284
+ // Control content visibility for Tailwind fade animation
285
+ useEffect(() => {
286
+ if (_open) {
287
+ setShowContent(true);
288
+ } else {
289
+ const timeoutId = setTimeout(() => setShowContent(false), 50);
290
+ return () => clearTimeout(timeoutId);
291
+ }
292
+ return undefined;
293
+ }, [_open]);
294
+
295
+ useLayoutEffect(() => {
296
+ // Adjust the height whenever the snap points are changed due to resize events
297
+ if (maxHeight || maxSnap || minSnap) {
298
+ send('RESIZE');
299
+ }
300
+ }, [maxHeight, maxSnap, minSnap, send]);
301
+
302
+ useEffect(
303
+ () => () => {
304
+ // Cleanup effects on unmount
305
+ try {
306
+ scrollLockRef.current.deactivate();
307
+ } catch (e) {
308
+ if (nodeEnv !== 'production') {
309
+ // eslint-disable-next-line no-console
310
+ console.error('❌ ScrollLock deactivation error:', e);
311
+ }
312
+ }
313
+
314
+ try {
315
+ focusTrapRef.current.deactivate();
316
+ } catch (e) {
317
+ if (nodeEnv !== 'production') {
318
+ // eslint-disable-next-line no-console
319
+ console.error('❌ FocusTrap deactivation error:', e);
320
+ }
321
+ }
322
+
323
+ try {
324
+ ariaHiderRef.current.deactivate();
325
+ } catch (e) {
326
+ if (nodeEnv !== 'production') {
327
+ // eslint-disable-next-line no-console
328
+ console.error('❌ AriaHider deactivation error:', e);
329
+ }
330
+ }
331
+
332
+ try {
333
+ api.stop();
334
+ } catch (e) {
335
+ if (nodeEnv !== 'production') {
336
+ // eslint-disable-next-line no-console
337
+ console.error('❌ Spring API stop error:', e);
338
+ }
339
+ }
340
+
341
+ // Reset state machine to ensure clean state on remount
342
+ try {
343
+ reset('CLOSED');
344
+ } catch (e) {
345
+ if (nodeEnv !== 'production') {
346
+ // eslint-disable-next-line no-console
347
+ console.error('❌ State machine reset error:', e);
348
+ }
349
+ }
350
+ },
351
+ [api, ariaHiderRef, focusTrapRef, reset, scrollLockRef]
352
+ );
353
+
354
+ useImperativeHandle(
355
+ forwardRef,
356
+ () => ({
357
+ get height() {
358
+ return heightRef.current;
359
+ },
360
+ snapTo: (numberOrCallback, { source = 'custom', velocity = 1 } = {}) => {
361
+ // Pass the payload flat: `send` wraps it into the SNAP event itself.
362
+ // (Upstream nested it under `payload`, double-wrapping the event so the
363
+ // reducer read undefined values — surfaced when `send` gained real types.)
364
+ send('SNAP', {
365
+ source,
366
+ velocity,
367
+ y: findSnapRef.current(numberOrCallback, velocity),
368
+ });
369
+ },
370
+ }),
371
+ [send]
372
+ );
373
+
374
+ // Use the custom drag handler hook
375
+ const { handleDrag } = useDragHandler({
376
+ api,
377
+ canDragRef,
378
+ maxHeightRef,
379
+ maxSnapRef,
380
+ minSnapRef,
381
+ onDismiss,
382
+ preventScrollingRef,
383
+ send,
384
+ spring,
385
+ });
386
+
387
+ // Memoize drag configuration to prevent recreation
388
+ const dragConfig = useMemo(
389
+ () => ({
390
+ filterTaps: true,
391
+ rubberband: true,
392
+ threshold: 5,
393
+ }),
394
+ []
395
+ );
396
+
397
+ const bind = useDrag(handleDrag, dragConfig);
398
+
399
+ if (nodeEnv === 'development') {
400
+ if (Number.isNaN(maxSnapRef.current)) {
401
+ throw new TypeError('maxSnapRef is NaN!!');
402
+ }
403
+ if (Number.isNaN(minSnapRef.current)) {
404
+ throw new TypeError('minSnapRef is NaN!!');
405
+ }
406
+ }
407
+
408
+ // Use translate3d interpolations for GPU acceleration
409
+ const interpolations = useSpringInterpolationsTranslate3d({ spring });
410
+
411
+ return (
412
+ <AnimatedDiv
413
+ {...props}
414
+ className={cn(
415
+ // Base positioning and layout
416
+ 'fixed bottom-0 left-0 right-0 z-[10001]',
417
+ // Touch and interaction optimizations
418
+ 'touch-none select-none',
419
+ // Transition - faster transition when preloaded
420
+ preload ? 'transition-opacity duration-150' : 'transition-opacity duration-300',
421
+ {
422
+ 'opacity-0': !showContent,
423
+ 'opacity-100': showContent,
424
+ },
425
+ className
426
+ )}
427
+ ref={containerRef}
428
+ style={{
429
+ // Use translate3d interpolations
430
+ ...interpolations,
431
+ ...style,
432
+ ...(preload && !_open && { pointerEvents: 'none', visibility: 'hidden' }),
433
+ }}
434
+ >
435
+ <BottomSheetBackdrop
436
+ bind={bind}
437
+ blocking
438
+ />
439
+ {/* Anti-gap filler */}
440
+ <div
441
+ className={cn(
442
+ 'fixed bottom-0 left-0 right-0',
443
+ 'h-px bg-background-primary',
444
+ 'origin-bottom',
445
+ 'scale-y-[var(--rsbs-antigap-scale-y,0)]',
446
+ 'pointer-events-none',
447
+ 'will-change-transform'
448
+ )}
449
+ />
450
+ <BottomSheetOverlay
451
+ bind={bind}
452
+ contentRef={contentRef}
453
+ disableScroll={disableScroll}
454
+ footer={footer}
455
+ footerRef={footerRef}
456
+ header={header}
457
+ headerRef={headerRef}
458
+ isScrollable={isScrollable}
459
+ isScrolledToBottom={isScrolledToBottom}
460
+ onDismiss={onDismiss}
461
+ overlayRef={overlayRef}
462
+ scrollRef={scrollRef}
463
+ >
464
+ {children}
465
+ </BottomSheetOverlay>
466
+ </AnimatedDiv>
467
+ );
468
+ });
469
+
470
+ // Default prop values that are callbacks, and it's nice to save some memory and reuse their instances since they're pure
471
+ function _defaultSnap({ lastSnap, snapPoints }: defaultSnapProps) {
472
+ return lastSnap ?? Math.min(...snapPoints);
473
+ }
474
+ function _snapPoints({ minHeight }: SnapPointProps) {
475
+ return minHeight;
476
+ }
@@ -0,0 +1,47 @@
1
+ import { cn } from '@evolve.ui/theme-system';
2
+ import React from 'react';
3
+
4
+ import type { DragBind } from '../../types';
5
+
6
+ /**
7
+ * Props for the BottomSheetBackdrop component
8
+ */
9
+ type Props = {
10
+ /** Drag bind function for backdrop interactions */
11
+ bind: DragBind;
12
+ /** Whether the backdrop should be rendered */
13
+ blocking: boolean;
14
+ };
15
+
16
+ /**
17
+ * BottomSheetBackdrop handles the backdrop overlay that appears behind the sheet
18
+ */
19
+ export const BottomSheetBackdrop = ({ bind, blocking }: Props) => {
20
+ if (!blocking) {
21
+ return null;
22
+ }
23
+
24
+ return (
25
+ <div
26
+ className={cn(
27
+ // Positioning - cover entire viewport
28
+ 'fixed inset-0',
29
+ // Extend beyond safe areas for mobile
30
+ '-bottom-[60px] -top-[60px]',
31
+ // Background
32
+ 'bg-background-overlay',
33
+ // Interaction
34
+ 'cursor-pointer',
35
+ // Touch optimizations
36
+ 'touch-none select-none',
37
+ // Opacity (always visible, parent controls overall opacity)
38
+ 'opacity-100'
39
+ )}
40
+ // This component needs to be placed outside bottom-sheet, as bottom-sheet uses transform and thus creates a new context
41
+ // that clips this element to the container, not allowing it to cover the full page.
42
+ data-testid="rsbs-backdrop"
43
+ key="backdrop"
44
+ {...bind({ closeOnTap: true })}
45
+ />
46
+ );
47
+ };
@@ -0,0 +1,92 @@
1
+ import { cn } from '@evolve.ui/theme-system';
2
+ import { memo, ReactNode, RefObject, useEffect, useLayoutEffect, useState } from 'react';
3
+
4
+ /**
5
+ * Props for the BottomSheetContentArea component
6
+ */
7
+ type Props = {
8
+ /** The main content to display */
9
+ children: ReactNode;
10
+ /** Reference to the content container */
11
+ contentRef: RefObject<HTMLDivElement | null>;
12
+ /** Whether to disable the BottomSheet's own scrolling (useful when children handle their own scrolling) */
13
+ disableScroll?: boolean;
14
+ /** Reference to the scroll container */
15
+ scrollRef: RefObject<HTMLDivElement | null>;
16
+ };
17
+
18
+ /**
19
+ * BottomSheetContentArea handles the scrollable content area of the sheet
20
+ * Memoized to prevent unnecessary re-renders when parent state changes
21
+ */
22
+ export const BottomSheetContentArea = memo<Props>(({ children, contentRef, disableScroll = false, scrollRef }) => {
23
+ // Delay disableScroll to allow initial measurement
24
+ const [isDisableScrollActive, setIsDisableScrollActive] = useState(false);
25
+
26
+ useEffect(() => {
27
+ if (disableScroll) {
28
+ // Delay enabling disableScroll until after opening animation completes
29
+ const timer = setTimeout(() => {
30
+ setIsDisableScrollActive(true);
31
+ }, 200); // Match typical BottomSheet opening animation duration
32
+
33
+ return () => clearTimeout(timer);
34
+ }
35
+ setIsDisableScrollActive(false);
36
+ return undefined;
37
+ }, [disableScroll]);
38
+
39
+ useLayoutEffect(() => {
40
+ if (!scrollRef.current) {
41
+ return;
42
+ }
43
+
44
+ // Reset scroll position immediately
45
+ scrollRef.current.scrollTop = 0;
46
+
47
+ // Sometimes you need a short delay if layout/paint hasn't happened yet
48
+ const timer = setTimeout(() => {
49
+ if (scrollRef.current) {
50
+ scrollRef.current.scrollTop = 0;
51
+ }
52
+ }, 50);
53
+
54
+ return () => clearTimeout(timer);
55
+ }, [scrollRef]);
56
+
57
+ return (
58
+ <div
59
+ className={cn(
60
+ // Layout - flexible scrollable area
61
+ 'min-h-0 flex-shrink flex-grow',
62
+ // When disableScroll is active (after delay), make this a flex container for children to handle their own scrolling
63
+ {
64
+ 'flex flex-col overflow-hidden': isDisableScrollActive,
65
+ 'overflow-auto overscroll-contain': !isDisableScrollActive,
66
+ },
67
+ // Focus
68
+ 'focus:outline-none'
69
+ )}
70
+ data-testid="rsbs-scroll"
71
+ key="scroll"
72
+ ref={scrollRef}
73
+ >
74
+ <div
75
+ className={cn(
76
+ // Content container
77
+ {
78
+ 'flex min-h-0 flex-grow flex-col': isDisableScrollActive, // Allow children to handle their own scrolling
79
+ 'overflow-hidden': !isDisableScrollActive, // Ensures margin collapse works correctly for height measurements
80
+ }
81
+ )}
82
+ data-testid="rsbs-content"
83
+ ref={contentRef}
84
+ >
85
+ {children}
86
+ </div>
87
+ </div>
88
+ );
89
+ });
90
+
91
+ // Add display name for better debugging
92
+ BottomSheetContentArea.displayName = 'BottomSheetContentArea';