@evolve.ui/core-components 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (559) hide show
  1. package/Checkbox.d.cts +1 -1
  2. package/Checkbox.d.mts +1 -1
  3. package/{DateInput-B8XQZPTx.d.cts → DateInput-CFxTZu3m.d.mts} +2 -2
  4. package/{DateInput-B8XQZPTx.d.cts.map → DateInput-CFxTZu3m.d.mts.map} +1 -1
  5. package/{DateInput-CfNmywqQ.d.mts → DateInput-DstMICTl.d.cts} +2 -2
  6. package/{DateInput-CfNmywqQ.d.mts.map → DateInput-DstMICTl.d.cts.map} +1 -1
  7. package/{FavoriteButton-CowOPoqo.d.cts → FavoriteButton-BGF-3dze.d.cts} +2 -2
  8. package/{FavoriteButton-BRY8FVpV.d.mts.map → FavoriteButton-BGF-3dze.d.cts.map} +1 -1
  9. package/{FavoriteButton-BRY8FVpV.d.mts → FavoriteButton-BZEGWrRo.d.mts} +2 -2
  10. package/{FavoriteButton-CowOPoqo.d.cts.map → FavoriteButton-BZEGWrRo.d.mts.map} +1 -1
  11. package/Input.d.cts +1 -1
  12. package/Input.d.mts +1 -1
  13. package/Radio.d.cts +1 -1
  14. package/Radio.d.mts +1 -1
  15. package/{TextInput-BhkeQZh4.d.cts → TextInput-B7lqQ1gh.d.cts} +3 -3
  16. package/{TextInput-BhkeQZh4.d.cts.map → TextInput-B7lqQ1gh.d.cts.map} +1 -1
  17. package/{TextInput-CWCeR18b.d.mts → TextInput-CxoT3np_.d.mts} +3 -3
  18. package/{TextInput-CWCeR18b.d.mts.map → TextInput-CxoT3np_.d.mts.map} +1 -1
  19. package/dateInput.d.cts +1 -1
  20. package/dateInput.d.mts +1 -1
  21. package/datePicker.d.cts +1 -1
  22. package/datePicker.d.mts +1 -1
  23. package/evolve-ui.entries.json +556 -0
  24. package/favoriteButton.d.cts +1 -1
  25. package/favoriteButton.d.mts +1 -1
  26. package/featureFlags/hooks.d.cts +1 -1
  27. package/featureFlags/hooks.d.mts +1 -1
  28. package/fileUpload/testUtils/mockFilesAndImages.d.cts +3 -3
  29. package/fileUpload/testUtils/mockFilesAndImages.d.cts.map +1 -1
  30. package/fileUpload/testUtils/mockFilesAndImages.d.mts +3 -3
  31. package/fileUpload/testUtils/mockFilesAndImages.d.mts.map +1 -1
  32. package/fileUpload/testUtils/testUtils.d.cts +1 -1
  33. package/fileUpload/testUtils/testUtils.d.cts.map +1 -1
  34. package/fileUpload/testUtils/testUtils.d.mts +1 -1
  35. package/fileUpload/testUtils/testUtils.d.mts.map +1 -1
  36. package/{index-BVb-FJDo.d.mts → index-BYPklw8m.d.mts} +2 -2
  37. package/{index-BVb-FJDo.d.mts.map → index-BYPklw8m.d.mts.map} +1 -1
  38. package/{index-3V0Y3AU3.d.mts → index-Bvn6svaT.d.cts} +2 -2
  39. package/{index-3V0Y3AU3.d.mts.map → index-Bvn6svaT.d.cts.map} +1 -1
  40. package/{index-Bu7c6X7O.d.mts → index-C2zPeUs9.d.mts} +5 -5
  41. package/{index-Bu7c6X7O.d.mts.map → index-C2zPeUs9.d.mts.map} +1 -1
  42. package/{index-BXz3rMMk.d.cts → index-Cmz2OD6x.d.cts} +2 -2
  43. package/{index-BXz3rMMk.d.cts.map → index-Cmz2OD6x.d.cts.map} +1 -1
  44. package/{index-kchg551L.d.cts → index-DsZAxqnF.d.mts} +2 -2
  45. package/{index-kchg551L.d.cts.map → index-DsZAxqnF.d.mts.map} +1 -1
  46. package/{index-BzN9RaXe.d.cts → index-QtMvgJcp.d.cts} +5 -5
  47. package/{index-BzN9RaXe.d.cts.map → index-QtMvgJcp.d.cts.map} +1 -1
  48. package/{index-dpfLYhgI.d.mts → index-hrztez-b.d.mts} +2 -2
  49. package/{index-DBYqF9Sr.d.cts.map → index-hrztez-b.d.mts.map} +1 -1
  50. package/{index-DBYqF9Sr.d.cts → index-o9dwzLLE.d.cts} +2 -2
  51. package/{index-dpfLYhgI.d.mts.map → index-o9dwzLLE.d.cts.map} +1 -1
  52. package/index.d.cts +7 -7
  53. package/index.d.mts +7 -7
  54. package/package.json +2 -2
  55. package/providers.d.cts +1 -1
  56. package/providers.d.mts +1 -1
  57. package/src/Accordion/Accordion.tsx +233 -0
  58. package/src/AddressDisplay/AddressDisplay.tsx +43 -0
  59. package/src/AddressDisplay/components/addressComponents.tsx +111 -0
  60. package/src/AddressDisplay/components/addressField.tsx +25 -0
  61. package/src/AddressDisplay/components/addressSection.tsx +8 -0
  62. package/src/AddressDisplay/components/getCountryValue.tsx +31 -0
  63. package/src/AddressDisplay/types.ts +26 -0
  64. package/src/AutomatedCarousel/AutomatedCarousel.tsx +163 -0
  65. package/src/AutomatedCarousel/automatedCarousel.types.ts +7 -0
  66. package/src/AutomatedCarousel/components/CarouselProgressBar/CarouselProgressBar.tsx +139 -0
  67. package/src/AutomatedCarousel/components/CarouselProgressBar/components/CarouselProgressBarUnit/CarouselProgressBarUnit.tsx +165 -0
  68. package/src/Badge/Badge.tsx +104 -0
  69. package/src/Badge/Badge.types.ts +58 -0
  70. package/src/Badge/ItemBadge.tsx +97 -0
  71. package/src/Badge/LiveStatusBadge.tsx +93 -0
  72. package/src/BannerNotification/BannerNotification.tsx +157 -0
  73. package/src/BannerNotification/components/BannerNotificationSkeleton.tsx +39 -0
  74. package/src/BannerNotification/components/CalloutIcon/BannerIcon.tsx +48 -0
  75. package/src/BannerNotification/utils/getRandomTooltipId.ts +3 -0
  76. package/src/BottomSheet/BottomSheet.tsx +476 -0
  77. package/src/BottomSheet/components/BottomSheetBackdrop/BottomSheetBackdrop.tsx +47 -0
  78. package/src/BottomSheet/components/BottomSheetContentArea/BottomSheetContentArea.tsx +92 -0
  79. package/src/BottomSheet/components/BottomSheetOverlay/BottomSheetOverlayTranslate3d.tsx +196 -0
  80. package/src/BottomSheet/components/SheetDescription/SheetDescription.tsx +22 -0
  81. package/src/BottomSheet/components/SheetTitle/SheetTitle.tsx +21 -0
  82. package/src/BottomSheet/components/index.tsx +5 -0
  83. package/src/BottomSheet/hooks/index.tsx +13 -0
  84. package/src/BottomSheet/hooks/useAriaHider.tsx +91 -0
  85. package/src/BottomSheet/hooks/useBottomSheetServices.tsx +224 -0
  86. package/src/BottomSheet/hooks/useDragHandler.tsx +282 -0
  87. package/src/BottomSheet/hooks/useFocusTrap.tsx +113 -0
  88. package/src/BottomSheet/hooks/useLayoutEffect.tsx +4 -0
  89. package/src/BottomSheet/hooks/useOptimizedResizeObserver.tsx +94 -0
  90. package/src/BottomSheet/hooks/useOptimizedScrollState.tsx +87 -0
  91. package/src/BottomSheet/hooks/useReady.tsx +34 -0
  92. package/src/BottomSheet/hooks/useReducedMotion.tsx +22 -0
  93. package/src/BottomSheet/hooks/useScrollLock.tsx +143 -0
  94. package/src/BottomSheet/hooks/useSnapPoints.tsx +355 -0
  95. package/src/BottomSheet/hooks/useSpring.tsx +47 -0
  96. package/src/BottomSheet/hooks/useSpringInterpolationsTranslate3d.tsx +101 -0
  97. package/src/BottomSheet/index.tsx +237 -0
  98. package/src/BottomSheet/state/atoms.ts +147 -0
  99. package/src/BottomSheet/state/useBottomSheetStateMachine.ts +246 -0
  100. package/src/BottomSheet/types.ts +172 -0
  101. package/src/BottomSheet/utils.ts +65 -0
  102. package/src/Breadcrumbs/Breadcrumbs.tsx +126 -0
  103. package/src/Button/Button.tsx +164 -0
  104. package/src/Button/Button.types.ts +80 -0
  105. package/src/Button/buttonColorClasses.ts +53 -0
  106. package/src/Callout/Callout.tsx +136 -0
  107. package/src/Callout/Callout.types.ts +29 -0
  108. package/src/Callout/components/CalloutIcon/CalloutIcon.tsx +56 -0
  109. package/src/Card/CardGrid.tsx +263 -0
  110. package/src/Card/SingleCard.tsx +22 -0
  111. package/src/Card/cardFactory.tsx +176 -0
  112. package/src/Card/components/createBadge.tsx +34 -0
  113. package/src/Card/components/createFavoriteButton.tsx +40 -0
  114. package/src/Card/components/createImage.tsx +64 -0
  115. package/src/Card/components/createInfo.tsx +84 -0
  116. package/src/Card/components/createName.tsx +63 -0
  117. package/src/Card/components/createPriceStatus.tsx +100 -0
  118. package/src/Card/components/types.ts +4 -0
  119. package/src/Card/hooks/useCardVisibilityTracking.ts +82 -0
  120. package/src/Card/sharedProps.ts +12 -0
  121. package/src/Card/types.ts +62 -0
  122. package/src/Carousel/Carousel.tsx +513 -0
  123. package/src/Carousel/Carousel.types.ts +43 -0
  124. package/src/Carousel/Carousel.utils.ts +63 -0
  125. package/src/Carousel/components/DotButton/DotButton.tsx +42 -0
  126. package/src/Carousel/components/NavigationButtons/NavigationButtons.tsx +77 -0
  127. package/src/Carousel/components/TitleSection/TitleSection.tsx +61 -0
  128. package/src/Carousel/components/TitleSection/components/SubHeaderLeft/SubHeaderLeft.tsx +53 -0
  129. package/src/Carousel/components/TitleSection/components/Title/Title.tsx +46 -0
  130. package/src/Carousel/index.ts +2 -0
  131. package/src/Carousel/testUtils.ts +10 -0
  132. package/src/Chips/Chip.tsx +153 -0
  133. package/src/Chips/ChipGroup.tsx +173 -0
  134. package/src/Chips/SuggestionChip.tsx +15 -0
  135. package/src/Chips/chipTypes.ts +113 -0
  136. package/src/Chips/index.ts +4 -0
  137. package/src/ChoiceListItem/Checkbox.tsx +69 -0
  138. package/src/ChoiceListItem/Radio.tsx +61 -0
  139. package/src/ChoiceListItem/choiceListItem.tsx +99 -0
  140. package/src/ChoiceListItem/common.tsx +148 -0
  141. package/src/ChoiceListItem/index.ts +3 -0
  142. package/src/Collapsible/Collapsible.tsx +58 -0
  143. package/src/Confetti/Confetti.tsx +270 -0
  144. package/src/Confetti/index.ts +2 -0
  145. package/src/ContentPager/ContentPager.tsx +189 -0
  146. package/src/ContentPager/components/Page.tsx +24 -0
  147. package/src/CookieConsent/components/CookieCategoryRow/CookieCategoryRow.tsx +30 -0
  148. package/src/CookieConsent/components/CookieConsent/CookieConsent.tsx +74 -0
  149. package/src/CookieConsent/components/CookieConsentBanner/CookieConsentBanner.tsx +51 -0
  150. package/src/CookieConsent/components/CookieConsentModal/CookieConsentModal.tsx +64 -0
  151. package/src/CookieConsent/hooks/useCookieConsent.ts +170 -0
  152. package/src/CookieConsent/hooks/useCookieConsentState.ts +142 -0
  153. package/src/CookieConsent/index.ts +16 -0
  154. package/src/CookieConsent/types/cookieConsent.types.ts +79 -0
  155. package/src/CookieConsent/types/index.ts +7 -0
  156. package/src/Countdown/Countdown.tsx +161 -0
  157. package/src/Countdown/Countdown.types.ts +4 -0
  158. package/src/Countdown/hooks/useGetCountdown.ts +103 -0
  159. package/src/DateTimeInput/dateInput/DateInput.tsx +199 -0
  160. package/src/DateTimeInput/datePicker/DatePicker.tsx +138 -0
  161. package/src/DateTimeInput/datePicker/components/calendar/Calendar.tsx +72 -0
  162. package/src/DateTimeInput/datePicker/index.ts +2 -0
  163. package/src/DateTimeInput/timeInput/TimeInput.tsx +128 -0
  164. package/src/DateTimeInput/timePicker/TimePicker.tsx +118 -0
  165. package/src/DateTimeInput/timePicker/components/TimePopover/AmPmSwitch.tsx +103 -0
  166. package/src/DateTimeInput/timePicker/components/TimePopover/TimeFieldInput.tsx +26 -0
  167. package/src/DateTimeInput/timePicker/components/TimePopover/TimePopover.tsx +84 -0
  168. package/src/DateTimeInput/timePicker/components/TimePopover/TimePopover.utils.ts +67 -0
  169. package/src/DateTimeInput/timePicker/components/TimePopover/TimePopoverActions.tsx +26 -0
  170. package/src/DateTimeInput/timePicker/index.ts +2 -0
  171. package/src/DateTimeInput/utils/getDisplayDate.ts +15 -0
  172. package/src/DateTimeInput/utils/getDisplayTime.ts +15 -0
  173. package/src/DateTimeInput/utils/index.ts +2 -0
  174. package/src/DateTimeInput/utils/parseTimeValue.ts +54 -0
  175. package/src/Drawer/Drawer.tsx +446 -0
  176. package/src/Drawer/atoms.ts +4 -0
  177. package/src/Drawer/components/DialogActions/DialogActions.tsx +33 -0
  178. package/src/Drawer/components/DialogContent/DialogContent.tsx +80 -0
  179. package/src/Drawer/components/DialogHeader/DialogHeader.tsx +68 -0
  180. package/src/EducationalPopover/EducationalPopover.tsx +174 -0
  181. package/src/FavoriteButton/FavoriteButton.tsx +64 -0
  182. package/src/FavoriteButton/components/IconOnlyFavoriteButton/IconOnlyFavoriteButton.tsx +80 -0
  183. package/src/FavoriteButton/components/LabeledAnimatedFavoriteButton/LabeledAnimatedFavoriteButton.tsx +179 -0
  184. package/src/FavoriteButton/components/LabeledFavoriteButton/LabeledFavoriteButton.tsx +71 -0
  185. package/src/FavoriteButton/components/SmallHeartStraightIcon/SmallHeartStraightIcon.tsx +14 -0
  186. package/src/FavoriteButton/hooks/useFavoriteButtonState.ts +30 -0
  187. package/src/FavoriteButton/index.ts +2 -0
  188. package/src/FavoriteButton/types/favoriteButton.ts +87 -0
  189. package/src/FeatureFlags/devTools/FeatureFlagDevToolsUI.tsx +226 -0
  190. package/src/FeatureFlags/devTools/getFeatureFlagCookieOverrides.ts +30 -0
  191. package/src/FeatureFlags/devTools/utils/cookies.ts +169 -0
  192. package/src/FeatureFlags/hooks/index.ts +2 -0
  193. package/src/FeatureFlags/hooks/useFeatureFlag.tsx +19 -0
  194. package/src/FeatureFlags/hooks/useFeatureFlags.tsx +15 -0
  195. package/src/FileUpload/components/FileCard/FileCard.tsx +50 -0
  196. package/src/FileUpload/components/FileDropzone/FileDropzone.tsx +221 -0
  197. package/src/FileUpload/components/FileDropzone/components/DropzoneContent/DropzoneContent.tsx +28 -0
  198. package/src/FileUpload/components/FileDropzone/components/DropzoneContent/DropzoneText.tsx +81 -0
  199. package/src/FileUpload/components/FileDropzone/components/FileDropzoneDebugger/FileDropzoneDebugger.tsx +40 -0
  200. package/src/FileUpload/components/FileDropzone/components/FileDropzoneDebugger/FileRejectionsDisplay.tsx +110 -0
  201. package/src/FileUpload/components/FileDropzoneOverlay/FileDropzoneOverlay.tsx +183 -0
  202. package/src/FileUpload/components/FileDropzoneOverlay/components/OverlayDropzoneContent.tsx +146 -0
  203. package/src/FileUpload/components/FileDropzoneOverlay/components/OverlayDropzoneDragText.tsx +42 -0
  204. package/src/FileUpload/components/FileDropzoneOverlay/styles.ts +79 -0
  205. package/src/FileUpload/components/FilePreviewList/FilePreviewList.tsx +251 -0
  206. package/src/FileUpload/components/FilePreviewList/virtualizerComponents/FilePreviewVirtualizedList/FilePreviewVirtualizedList.tsx +88 -0
  207. package/src/FileUpload/components/FileUpload/FileUpload.tsx +63 -0
  208. package/src/FileUpload/components/FileUploadCanvas/FileUploadCanvas.tsx +125 -0
  209. package/src/FileUpload/components/GridFileCard/GridFileCard.tsx +364 -0
  210. package/src/FileUpload/components/GridFileCard/utils/sortable.ts +48 -0
  211. package/src/FileUpload/components/ListFileCard/ListFileCard.tsx +259 -0
  212. package/src/FileUpload/components/types.ts +78 -0
  213. package/src/FileUpload/hooks/filePreview/useImageFilePreviewUrl.ts +62 -0
  214. package/src/FileUpload/hooks/index.ts +11 -0
  215. package/src/FileUpload/hooks/upload/useHandleDragEnter/useHandleDragEnter.ts +154 -0
  216. package/src/FileUpload/hooks/upload/useHandleDrop/createFileRejectionHelpers.ts +273 -0
  217. package/src/FileUpload/hooks/upload/useHandleDrop/useHandleDrop.ts +153 -0
  218. package/src/FileUpload/hooks/upload/useUploadAvailability/useUploadAvailability.ts +44 -0
  219. package/src/FileUpload/hooks/validation/createDropzoneValidator.ts +41 -0
  220. package/src/FileUpload/hooks/validation/useFileValidation.ts +25 -0
  221. package/src/FileUpload/hooks/validation/useFileValidationLogic.ts +107 -0
  222. package/src/FileUpload/hooks/validation/useValidationMessages.ts +92 -0
  223. package/src/FileUpload/hooks/validation/useValidationState.ts +171 -0
  224. package/src/FileUpload/index.ts +57 -0
  225. package/src/FileUpload/providers/FileUploadProvider.tsx +219 -0
  226. package/src/FileUpload/providers/UploadValidationProvider.tsx +159 -0
  227. package/src/FileUpload/testUtils/mockFilesAndImages.ts +64 -0
  228. package/src/FileUpload/testUtils/testUtils.ts +111 -0
  229. package/src/FileUpload/types/commonTypes.ts +267 -0
  230. package/src/FileUpload/types/index.ts +31 -0
  231. package/src/FileUpload/types/sharedTypes.ts +159 -0
  232. package/src/FileUpload/utils/constants.ts +79 -0
  233. package/src/FileUpload/utils/createMessageContext.ts +180 -0
  234. package/src/FileUpload/utils/getFileExtensionsFromAcceptedTypes.ts +73 -0
  235. package/src/FileUpload/utils/getFilePluralizationText.ts +68 -0
  236. package/src/FileUpload/utils/getMimeTypes.ts +26 -0
  237. package/src/FileUpload/utils/messageUtils.ts +41 -0
  238. package/src/FileUpload/utils/styles.ts +68 -0
  239. package/src/FormLabel/FormLabel.tsx +212 -0
  240. package/src/IconButton/IconButton.tsx +154 -0
  241. package/src/Icons/CreditCardIcon/CreditCardIcon.tsx +73 -0
  242. package/src/Icons/CreditCardIcon/cardIcons.tsx +270 -0
  243. package/src/Icons/IconBase.tsx +133 -0
  244. package/src/Icons/anyIcon.ts +3 -0
  245. package/src/Icons/generatedIcons/Archive.tsx +48 -0
  246. package/src/Icons/generatedIcons/ArrowClockwise.tsx +48 -0
  247. package/src/Icons/generatedIcons/ArrowDown.tsx +48 -0
  248. package/src/Icons/generatedIcons/ArrowLeft.tsx +48 -0
  249. package/src/Icons/generatedIcons/ArrowRight.tsx +48 -0
  250. package/src/Icons/generatedIcons/ArrowSquareOut.tsx +51 -0
  251. package/src/Icons/generatedIcons/ArrowSquareRight.tsx +51 -0
  252. package/src/Icons/generatedIcons/ArrowUp.tsx +48 -0
  253. package/src/Icons/generatedIcons/ArrowsCounterClockwise.tsx +48 -0
  254. package/src/Icons/generatedIcons/ArrowsLeftRight.tsx +48 -0
  255. package/src/Icons/generatedIcons/ArrowsOutCardinal.tsx +48 -0
  256. package/src/Icons/generatedIcons/Bank.tsx +48 -0
  257. package/src/Icons/generatedIcons/Bell.tsx +51 -0
  258. package/src/Icons/generatedIcons/BookBookmark.tsx +51 -0
  259. package/src/Icons/generatedIcons/BookmarksSimple.tsx +51 -0
  260. package/src/Icons/generatedIcons/Broadcast.tsx +48 -0
  261. package/src/Icons/generatedIcons/CalendarBlank.tsx +48 -0
  262. package/src/Icons/generatedIcons/CalendarStar.tsx +51 -0
  263. package/src/Icons/generatedIcons/Camera.tsx +51 -0
  264. package/src/Icons/generatedIcons/CaretDown.tsx +48 -0
  265. package/src/Icons/generatedIcons/CaretLeft.tsx +48 -0
  266. package/src/Icons/generatedIcons/CaretRight.tsx +48 -0
  267. package/src/Icons/generatedIcons/CaretUp.tsx +48 -0
  268. package/src/Icons/generatedIcons/Certificate.tsx +51 -0
  269. package/src/Icons/generatedIcons/ChartBar.tsx +48 -0
  270. package/src/Icons/generatedIcons/Check.tsx +51 -0
  271. package/src/Icons/generatedIcons/CheckCircle.tsx +48 -0
  272. package/src/Icons/generatedIcons/CirclesFour.tsx +51 -0
  273. package/src/Icons/generatedIcons/Clock.tsx +48 -0
  274. package/src/Icons/generatedIcons/ClockCountdown.tsx +48 -0
  275. package/src/Icons/generatedIcons/Close.tsx +51 -0
  276. package/src/Icons/generatedIcons/CloudArrowUp.tsx +51 -0
  277. package/src/Icons/generatedIcons/CloudWarning.tsx +51 -0
  278. package/src/Icons/generatedIcons/Code.tsx +48 -0
  279. package/src/Icons/generatedIcons/Compass.tsx +51 -0
  280. package/src/Icons/generatedIcons/Confetti.tsx +51 -0
  281. package/src/Icons/generatedIcons/Copy.tsx +48 -0
  282. package/src/Icons/generatedIcons/CornersOut.tsx +48 -0
  283. package/src/Icons/generatedIcons/CreditCard.tsx +48 -0
  284. package/src/Icons/generatedIcons/Crown.tsx +51 -0
  285. package/src/Icons/generatedIcons/CrownSimple.tsx +51 -0
  286. package/src/Icons/generatedIcons/CurrencyCircleDollar.tsx +48 -0
  287. package/src/Icons/generatedIcons/CurrencyDollarSimple.tsx +51 -0
  288. package/src/Icons/generatedIcons/Desktop.tsx +51 -0
  289. package/src/Icons/generatedIcons/Detective.tsx +51 -0
  290. package/src/Icons/generatedIcons/DotOutline.tsx +46 -0
  291. package/src/Icons/generatedIcons/DotsSixVertical.tsx +51 -0
  292. package/src/Icons/generatedIcons/DotsThreeOutline.tsx +51 -0
  293. package/src/Icons/generatedIcons/DotsThreeOutlineVertical.tsx +51 -0
  294. package/src/Icons/generatedIcons/DownloadSimple.tsx +51 -0
  295. package/src/Icons/generatedIcons/EnvelopeSimple.tsx +48 -0
  296. package/src/Icons/generatedIcons/Eraser.tsx +51 -0
  297. package/src/Icons/generatedIcons/Eye.tsx +51 -0
  298. package/src/Icons/generatedIcons/EyeSlash.tsx +51 -0
  299. package/src/Icons/generatedIcons/FacebookLogo.tsx +48 -0
  300. package/src/Icons/generatedIcons/FileArchive.tsx +48 -0
  301. package/src/Icons/generatedIcons/FileArrowDown.tsx +48 -0
  302. package/src/Icons/generatedIcons/FileCsv.tsx +48 -0
  303. package/src/Icons/generatedIcons/FilePdf.tsx +48 -0
  304. package/src/Icons/generatedIcons/FileText.tsx +48 -0
  305. package/src/Icons/generatedIcons/Files.tsx +51 -0
  306. package/src/Icons/generatedIcons/Fire.tsx +51 -0
  307. package/src/Icons/generatedIcons/Flag.tsx +51 -0
  308. package/src/Icons/generatedIcons/FlagBannerFold.tsx +48 -0
  309. package/src/Icons/generatedIcons/FloppyDisk.tsx +51 -0
  310. package/src/Icons/generatedIcons/Gauge.tsx +51 -0
  311. package/src/Icons/generatedIcons/Gavel.tsx +51 -0
  312. package/src/Icons/generatedIcons/Gear.tsx +51 -0
  313. package/src/Icons/generatedIcons/GlobeHemisphereWest.tsx +51 -0
  314. package/src/Icons/generatedIcons/GoogleLogo.tsx +48 -0
  315. package/src/Icons/generatedIcons/GridNine.tsx +51 -0
  316. package/src/Icons/generatedIcons/HandCoins.tsx +51 -0
  317. package/src/Icons/generatedIcons/HandbagSimple.tsx +51 -0
  318. package/src/Icons/generatedIcons/Headset.tsx +51 -0
  319. package/src/Icons/generatedIcons/HeartStraight.tsx +51 -0
  320. package/src/Icons/generatedIcons/HourglassLow.tsx +48 -0
  321. package/src/Icons/generatedIcons/House.tsx +51 -0
  322. package/src/Icons/generatedIcons/Image.tsx +51 -0
  323. package/src/Icons/generatedIcons/ImageSquare.tsx +51 -0
  324. package/src/Icons/generatedIcons/ImagesSquare.tsx +51 -0
  325. package/src/Icons/generatedIcons/Info.tsx +48 -0
  326. package/src/Icons/generatedIcons/InstagramLogo.tsx +51 -0
  327. package/src/Icons/generatedIcons/Lightning.tsx +48 -0
  328. package/src/Icons/generatedIcons/Link.tsx +51 -0
  329. package/src/Icons/generatedIcons/LinkedinLogo.tsx +51 -0
  330. package/src/Icons/generatedIcons/List.tsx +48 -0
  331. package/src/Icons/generatedIcons/Lock.tsx +51 -0
  332. package/src/Icons/generatedIcons/LockOpen.tsx +51 -0
  333. package/src/Icons/generatedIcons/MagnifyingGlass.tsx +48 -0
  334. package/src/Icons/generatedIcons/MapPin.tsx +51 -0
  335. package/src/Icons/generatedIcons/MapPinSimpleArea.tsx +48 -0
  336. package/src/Icons/generatedIcons/Medal.tsx +48 -0
  337. package/src/Icons/generatedIcons/Megaphone.tsx +48 -0
  338. package/src/Icons/generatedIcons/Minus.tsx +45 -0
  339. package/src/Icons/generatedIcons/Money.tsx +51 -0
  340. package/src/Icons/generatedIcons/Notches.tsx +48 -0
  341. package/src/Icons/generatedIcons/NotePencil.tsx +48 -0
  342. package/src/Icons/generatedIcons/Package.tsx +51 -0
  343. package/src/Icons/generatedIcons/PaintBrush.tsx +51 -0
  344. package/src/Icons/generatedIcons/PaperPlaneTilt.tsx +51 -0
  345. package/src/Icons/generatedIcons/Paperclip.tsx +51 -0
  346. package/src/Icons/generatedIcons/Pause.tsx +51 -0
  347. package/src/Icons/generatedIcons/PencilLine.tsx +51 -0
  348. package/src/Icons/generatedIcons/PencilRuler.tsx +51 -0
  349. package/src/Icons/generatedIcons/PencilSimple.tsx +51 -0
  350. package/src/Icons/generatedIcons/Phone.tsx +51 -0
  351. package/src/Icons/generatedIcons/PinterestLogo.tsx +51 -0
  352. package/src/Icons/generatedIcons/Play.tsx +51 -0
  353. package/src/Icons/generatedIcons/Plus.tsx +51 -0
  354. package/src/Icons/generatedIcons/PlusCircle.tsx +48 -0
  355. package/src/Icons/generatedIcons/Printer.tsx +51 -0
  356. package/src/Icons/generatedIcons/Question.tsx +48 -0
  357. package/src/Icons/generatedIcons/Receipt.tsx +51 -0
  358. package/src/Icons/generatedIcons/Rows.tsx +51 -0
  359. package/src/Icons/generatedIcons/SealCheck.tsx +51 -0
  360. package/src/Icons/generatedIcons/SelectionSlash.tsx +48 -0
  361. package/src/Icons/generatedIcons/ShareNetwork.tsx +51 -0
  362. package/src/Icons/generatedIcons/ShieldCheck.tsx +51 -0
  363. package/src/Icons/generatedIcons/ShieldStar.tsx +51 -0
  364. package/src/Icons/generatedIcons/ShoppingCart.tsx +48 -0
  365. package/src/Icons/generatedIcons/ShuffleAngular.tsx +48 -0
  366. package/src/Icons/generatedIcons/SidebarSimple.tsx +48 -0
  367. package/src/Icons/generatedIcons/SlidersHorizontal.tsx +51 -0
  368. package/src/Icons/generatedIcons/Smiley.tsx +48 -0
  369. package/src/Icons/generatedIcons/Sparkle.tsx +51 -0
  370. package/src/Icons/generatedIcons/SpinnerGap.tsx +48 -0
  371. package/src/Icons/generatedIcons/StackPlus.tsx +48 -0
  372. package/src/Icons/generatedIcons/Star.tsx +51 -0
  373. package/src/Icons/generatedIcons/Storefront.tsx +51 -0
  374. package/src/Icons/generatedIcons/Swap.tsx +51 -0
  375. package/src/Icons/generatedIcons/Tag.tsx +51 -0
  376. package/src/Icons/generatedIcons/ThumbsDown.tsx +48 -0
  377. package/src/Icons/generatedIcons/ThumbsUp.tsx +48 -0
  378. package/src/Icons/generatedIcons/Toolbox.tsx +48 -0
  379. package/src/Icons/generatedIcons/Trash.tsx +48 -0
  380. package/src/Icons/generatedIcons/TrendUp.tsx +48 -0
  381. package/src/Icons/generatedIcons/Trophy.tsx +51 -0
  382. package/src/Icons/generatedIcons/Truck.tsx +51 -0
  383. package/src/Icons/generatedIcons/UploadSimple.tsx +51 -0
  384. package/src/Icons/generatedIcons/User.tsx +48 -0
  385. package/src/Icons/generatedIcons/Users.tsx +48 -0
  386. package/src/Icons/generatedIcons/UsersThree.tsx +51 -0
  387. package/src/Icons/generatedIcons/VideoCamera.tsx +51 -0
  388. package/src/Icons/generatedIcons/Warning.tsx +51 -0
  389. package/src/Icons/generatedIcons/WarningCircle.tsx +48 -0
  390. package/src/Icons/generatedIcons/WifiHigh.tsx +51 -0
  391. package/src/Icons/generatedIcons/XCircle.tsx +48 -0
  392. package/src/Icons/generatedIcons/XLogo.tsx +48 -0
  393. package/src/Icons/generatedIcons/YoutubeLogo.tsx +51 -0
  394. package/src/Icons/importedIcons.ts +152 -0
  395. package/src/Icons/index.ts +149 -0
  396. package/src/Icons/socialIcons/appleSocialIcon.tsx +50 -0
  397. package/src/Icons/socialIcons/facebookSocialIcon.tsx +41 -0
  398. package/src/Icons/socialIcons/googleSocialIcon.tsx +134 -0
  399. package/src/ImageCluster/ImageCluster.tsx +125 -0
  400. package/src/ImageSlider/ImageSlider.tsx +582 -0
  401. package/src/ImageSlider/ImageSlider.types.ts +90 -0
  402. package/src/ImageSlider/components/IndexIndicator/IndexIndicator.tsx +21 -0
  403. package/src/ImageSlider/components/NavigationButtons/NavigationButtons.tsx +113 -0
  404. package/src/ImageSlider/components/ResponsiveImage/ResponsiveImage.tsx +114 -0
  405. package/src/ImageSlider/components/ResponsiveImage/index.ts +1 -0
  406. package/src/ImageSlider/components/Thumbnails/Thumbnails.tsx +184 -0
  407. package/src/ImageSlider/constants.ts +59 -0
  408. package/src/ImageSlider/hooks/index.ts +3 -0
  409. package/src/ImageSlider/hooks/useImageSlider.ts +57 -0
  410. package/src/ImageSlider/hooks/useImageSliderNavigation.ts +133 -0
  411. package/src/ImageSlider/hooks/useImageSliderScrollHandler.ts +171 -0
  412. package/src/ImageSlider/index.ts +3 -0
  413. package/src/ImageSlider/utils/imageOptimization.ts +97 -0
  414. package/src/ImageSlider/utils/index.ts +1 -0
  415. package/src/InlineNotification/InlineNotification.tsx +95 -0
  416. package/src/JumpMenu/JumpMenu.tsx +395 -0
  417. package/src/JumpMenu/components/JumpMenuItem/JumpMenuItem.tsx +62 -0
  418. package/src/JumpMenu/hooks/useContainerTracking.ts +171 -0
  419. package/src/JumpMenu/hooks/useIntersectionObserver.ts +77 -0
  420. package/src/JumpMenu/hooks/useKeyboardNavigation.ts +102 -0
  421. package/src/JumpMenu/hooks/useResizeObserver.ts +53 -0
  422. package/src/JumpMenu/hooks/useSectionObserver.ts +102 -0
  423. package/src/JumpMenu/index.ts +2 -0
  424. package/src/JumpMenu/types/index.ts +19 -0
  425. package/src/Loading/Loading.tsx +39 -0
  426. package/src/Loading/components/LoadingDot/LoadingDot.tsx +16 -0
  427. package/src/LoadingSpinner/LoadingSpinner.tsx +20 -0
  428. package/src/Menu/Menu.tsx +372 -0
  429. package/src/Menu/components/MenuDivider/MenuDivider.tsx +5 -0
  430. package/src/Menu/components/MenuItem/MenuItem.tsx +298 -0
  431. package/src/Menu/context/menuContext.tsx +20 -0
  432. package/src/Menu/hooks/useMenu.tsx +18 -0
  433. package/src/Menu/index.ts +3 -0
  434. package/src/Modal/ComposableModal.tsx +313 -0
  435. package/src/Modal/Modal.tsx +231 -0
  436. package/src/Modal/components/BackButton/BackButton.tsx +43 -0
  437. package/src/Modal/components/Backdrop/Backdrop.tsx +62 -0
  438. package/src/Modal/components/CloseButton/CloseButton.tsx +55 -0
  439. package/src/Modal/components/ModalActions/ModalActions.tsx +135 -0
  440. package/src/Modal/components/ModalContent/ModalContent.tsx +163 -0
  441. package/src/Modal/components/ModalHeader/ModalHeader.tsx +84 -0
  442. package/src/Modal/components/ModalHeader/hooks/useHeaderAnimation.tsx +49 -0
  443. package/src/Modal/components/ModalProgressSteps/ModalProgressSteps.tsx +26 -0
  444. package/src/Modal/components/ModalSubTitle/ModalSubTitle.tsx +29 -0
  445. package/src/Modal/components/ModalTitle/ModalTitle.tsx +22 -0
  446. package/src/Modal/components/PreventModalScroll/PreventModalScroll.tsx +106 -0
  447. package/src/Modal/components/index.ts +12 -0
  448. package/src/Modal/context.ts +33 -0
  449. package/src/Modal/hooks/useCloseModal.ts +133 -0
  450. package/src/NotificationBadge/NotificationBadge.tsx +34 -0
  451. package/src/Pagination/AdvancedPagination.tsx +48 -0
  452. package/src/Pagination/Pagination.tsx +216 -0
  453. package/src/Pagination/components/AdvancedPaginator/AdvancedPaginator.tsx +52 -0
  454. package/src/Pagination/components/AdvancedPaginator/components/PageSelect/PageSelect.tsx +43 -0
  455. package/src/Pagination/components/ItemCountDisplay/ItemCountDisplay.tsx +32 -0
  456. package/src/Pagination/components/ItemCountSelect/ItemCountSelect.tsx +33 -0
  457. package/src/Pagination/index.tsx +3 -0
  458. package/src/Pagination/paginationProvider.tsx +234 -0
  459. package/src/Pagination/utils.tsx +36 -0
  460. package/src/PhoneInput/PhoneInput.tsx +509 -0
  461. package/src/PhoneInput/useDropdownLogic.tsx +163 -0
  462. package/src/ProgressCircle/ProgressCircle.tsx +246 -0
  463. package/src/ProgressCircle/hooks/useProgressStatusTransitions.ts +49 -0
  464. package/src/ProgressCircle/utils/progressCircle.constants.ts +27 -0
  465. package/src/ProgressSteps/ProgressSteps.tsx +160 -0
  466. package/src/SaveConfetti/SaveConfetti.tsx +277 -0
  467. package/src/SaveConfetti/index.ts +2 -0
  468. package/src/SearchInput/SearchInput.tsx +236 -0
  469. package/src/SegmentedControl/SegmentedControl.tsx +111 -0
  470. package/src/SegmentedControl/SegmentedControlGroup.tsx +94 -0
  471. package/src/SegmentedControl/index.ts +4 -0
  472. package/src/Select/Select.tsx +154 -0
  473. package/src/Select/SelectAsync.tsx +13 -0
  474. package/src/Select/SelectAsyncCreatable.tsx +14 -0
  475. package/src/Select/SelectCreatable.tsx +12 -0
  476. package/src/Select/reexportedComponents.tsx +5 -0
  477. package/src/Select/selectComponents.tsx +306 -0
  478. package/src/Skeleton/Skeleton.tsx +13 -0
  479. package/src/SplitButton/SplitButton.tsx +298 -0
  480. package/src/SplitButton/SplitButtonTrigger.tsx +55 -0
  481. package/src/StarRating/StarRating.tsx +165 -0
  482. package/src/StarRating/components/StarComponent/StarComponent.tsx +44 -0
  483. package/src/Table/Table.tsx +474 -0
  484. package/src/Table/components/TableHeader/TableHeader.tsx +166 -0
  485. package/src/Table/components/TablePagination/TablePagination.tsx +18 -0
  486. package/src/Table/components/TablePagination/components/ItemCountDisplay/ItemCountDisplay.tsx +17 -0
  487. package/src/Table/components/TablePagination/components/ItemCountSelect/ItemCountSelect.tsx +31 -0
  488. package/src/Table/components/TablePagination/components/TablePaginator/TablePaginator.tsx +37 -0
  489. package/src/Table/components/TablePagination/components/TablePaginator/components/PageSelect/PageSelect.tsx +32 -0
  490. package/src/Table/components/TableRow/TableRows.tsx +147 -0
  491. package/src/Table/components/TableRow/components/TableRowCell/TableRowCell.tsx +49 -0
  492. package/src/Table/components/TableShadow/TableShadow.tsx +46 -0
  493. package/src/Table/index.ts +2 -0
  494. package/src/Table/sharedState.ts +30 -0
  495. package/src/Table/sharedStyles.ts +1 -0
  496. package/src/Table/types.ts +55 -0
  497. package/src/Tabs/Tabs.tsx +358 -0
  498. package/src/TextArea/TextArea.tsx +157 -0
  499. package/src/TextInput/TextInput.tsx +173 -0
  500. package/src/Toast/Toast.tsx +64 -0
  501. package/src/Toast/components/ToastContainer/ToastContainer.tsx +48 -0
  502. package/src/Toast/index.ts +2 -0
  503. package/src/Toast/types/role.ts +1 -0
  504. package/src/Toast/utils/getIcon.tsx +41 -0
  505. package/src/ToggleSwitch/ToggleSwitch.tsx +188 -0
  506. package/src/Tooltip/InfoIconTooltip.tsx +47 -0
  507. package/src/Tooltip/Tooltip.tsx +41 -0
  508. package/src/Typography/InlineButton/InlineButton.tsx +166 -0
  509. package/src/Typography/Links/Links.tsx +113 -0
  510. package/src/Typography/Text/Text.tsx +239 -0
  511. package/src/ViewMore/ViewMore.tsx +226 -0
  512. package/src/WebRTCPlayer/WebRTCPlayer.tsx +325 -0
  513. package/src/WebRTCPlayer/adaptor/NativeWebRTCAdaptor.ts +588 -0
  514. package/src/WebRTCPlayer/hooks/useWebRTCStream.ts +571 -0
  515. package/src/WebRTCPlayer/index.ts +22 -0
  516. package/src/WebRTCPlayer/types.ts +95 -0
  517. package/src/breakpoints/index.tsx +1 -0
  518. package/src/breakpoints/utils.tsx +50 -0
  519. package/src/declarations.d.ts +7 -0
  520. package/src/grid/gridHighlighter.tsx +83 -0
  521. package/src/grid/index.ts +3 -0
  522. package/src/grid/pageGrid.tsx +37 -0
  523. package/src/grid/useSubGridCSS.tsx +214 -0
  524. package/src/hooks/useHorizontalScrollFade.ts +44 -0
  525. package/src/hooks/usePrevious.ts +14 -0
  526. package/src/index.ts +351 -0
  527. package/src/intl/index.ts +4 -0
  528. package/src/intl/utils.ts +67 -0
  529. package/src/mixins/horizontalScrollFadeMixin.ts +56 -0
  530. package/src/mixins/index.ts +18 -0
  531. package/src/mixins/propMixins.ts +389 -0
  532. package/src/providers/createContextProvider.ts +22 -0
  533. package/src/providers/designSystemProvider.tsx +218 -0
  534. package/src/providers/errorBoundaryProvider.tsx +179 -0
  535. package/src/providers/featureFlagProvider.tsx +18 -0
  536. package/src/providers/gridSizeProvider.tsx +23 -0
  537. package/src/providers/index.ts +12 -0
  538. package/src/providers/linkProvider.tsx +32 -0
  539. package/src/providers/normalize.tsx +93 -0
  540. package/src/providers/targets/DatePickerTarget.tsx +10 -0
  541. package/src/providers/targets/ModalTarget.tsx +14 -0
  542. package/src/providers/targets/TimePickerTarget.tsx +10 -0
  543. package/src/providers/themeContext.tsx +24 -0
  544. package/src/providers/windowSizeProvider.tsx +125 -0
  545. package/src/spacing/index.ts +1 -0
  546. package/src/spacing/spacing.ts +11 -0
  547. package/src/utils/countriesWithISOCodes.ts +1419 -0
  548. package/src/utils/dateTimeFormat.ts +257 -0
  549. package/src/utils/effectEventListener.ts +11 -0
  550. package/src/utils/formatFileSize.ts +18 -0
  551. package/src/utils/isClientSide.ts +1 -0
  552. package/src/utils/keepTransition.ts +15 -0
  553. package/src/utils/nodeEnv.ts +9 -0
  554. package/src/utils/smoothScrollTo.ts +47 -0
  555. package/src/utils/utilityTypes.ts +13 -0
  556. package/textInput.d.cts +1 -1
  557. package/textInput.d.mts +1 -1
  558. package/timePicker.d.cts +1 -1
  559. package/timePicker.d.mts +1 -1
@@ -0,0 +1,143 @@
1
+ import { RefObject, useDebugValue, useEffect, useRef } from 'react';
2
+
3
+ /**
4
+ * Lightweight scroll lock implementation without external dependencies
5
+ * Handle scroll locking to ensure a good dragging experience on Android and iOS.
6
+ *
7
+ * On iOS the following may happen if scroll isn't locked:
8
+ * - When dragging the sheet the background gets dragged at the same time.
9
+ * - When dragging the page scroll is also affected, causing the drag to feel buggy and "slow".
10
+ *
11
+ * On Android it causes the chrome toolbar to pop down as you drag down, and hide as you drag up.
12
+ * When it's in between two toolbar states it causes the framerate to drop way below 60fps on
13
+ * the bottom sheet drag interaction.
14
+ */
15
+ export const useScrollLock = ({
16
+ enabled,
17
+ reserveScrollBarGap,
18
+ targetRef,
19
+ }: {
20
+ enabled: boolean;
21
+ reserveScrollBarGap: boolean;
22
+ targetRef: RefObject<Element>;
23
+ }) => {
24
+ // eslint-disable-next-line func-call-spacing
25
+ const ref = useRef<{ activate: () => void; deactivate: () => void }>({
26
+ activate: () => {
27
+ throw new TypeError('Tried to activate scroll lock too early');
28
+ },
29
+ deactivate: () => {},
30
+ });
31
+ const originalStyles = useRef<{
32
+ overflow: string;
33
+ paddingRight: string;
34
+ position: string;
35
+ } | null>(null);
36
+
37
+ useDebugValue(enabled ? 'Enabled' : 'Disabled');
38
+
39
+ useEffect(() => {
40
+ if (!enabled) {
41
+ ref.current.deactivate();
42
+ ref.current = { activate: () => {}, deactivate: () => {} };
43
+ return;
44
+ }
45
+
46
+ let active = false;
47
+
48
+ const getScrollbarWidth = (): number => {
49
+ const scrollDiv = document.createElement('div');
50
+ scrollDiv.style.cssText =
51
+ 'width: 100px; height: 100px; overflow: scroll; position: absolute; top: -9999px;';
52
+ document.body.appendChild(scrollDiv);
53
+ const scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;
54
+ document.body.removeChild(scrollDiv);
55
+ return scrollbarWidth;
56
+ };
57
+
58
+ const preventTouchMove = (e: TouchEvent) => {
59
+ const target = e.target as Element;
60
+ // Allow touch move on elements marked as scrollable or within the target ref
61
+ if (
62
+ target.closest('[data-body-scroll-lock-ignore]') ||
63
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition, @typescript-eslint/prefer-optional-chain
64
+ (targetRef.current && targetRef.current.contains(target))
65
+ ) {
66
+ return;
67
+ }
68
+ e.preventDefault();
69
+ };
70
+
71
+ ref.current = {
72
+ activate: () => {
73
+ if (active) {
74
+ return;
75
+ }
76
+ active = true;
77
+
78
+ const body = document.body;
79
+ const html = document.documentElement;
80
+
81
+ // Store original styles
82
+ originalStyles.current = {
83
+ overflow: body.style.overflow,
84
+ paddingRight: body.style.paddingRight,
85
+ position: body.style.position,
86
+ };
87
+
88
+ // Calculate scrollbar width if we need to reserve space
89
+ let scrollbarWidth = 0;
90
+ if (reserveScrollBarGap && window.innerWidth > html.clientWidth) {
91
+ scrollbarWidth = getScrollbarWidth();
92
+ }
93
+
94
+ // Apply scroll lock styles
95
+ body.style.overflow = 'hidden';
96
+ if (scrollbarWidth > 0) {
97
+ body.style.paddingRight = `${scrollbarWidth}px`;
98
+ }
99
+
100
+ // Prevent touch scrolling on mobile
101
+ document.addEventListener('touchmove', preventTouchMove, { passive: false });
102
+
103
+ // Prevent scroll restoration on iOS
104
+ if (typeof window !== 'undefined' && 'scrollY' in window) {
105
+ const scrollY = window.scrollY;
106
+ body.style.position = 'fixed';
107
+ body.style.top = `-${scrollY}px`;
108
+ body.style.width = '100%';
109
+ }
110
+ },
111
+ deactivate: () => {
112
+ if (!active) {
113
+ return;
114
+ }
115
+ active = false;
116
+
117
+ const body = document.body;
118
+
119
+ // Remove touch move listener
120
+ document.removeEventListener('touchmove', preventTouchMove);
121
+
122
+ // Restore original styles
123
+ if (originalStyles.current) {
124
+ body.style.overflow = originalStyles.current.overflow;
125
+ body.style.paddingRight = originalStyles.current.paddingRight;
126
+
127
+ // Restore scroll position on iOS
128
+ if (body.style.position === 'fixed') {
129
+ const scrollY = parseInt(body.style.top || '0', 10) * -1;
130
+ body.style.position = originalStyles.current.position;
131
+ body.style.top = '';
132
+ body.style.width = '';
133
+ window.scrollTo(0, scrollY);
134
+ }
135
+ }
136
+
137
+ originalStyles.current = null;
138
+ },
139
+ };
140
+ }, [enabled, targetRef, reserveScrollBarGap]);
141
+
142
+ return ref;
143
+ };
@@ -0,0 +1,355 @@
1
+ import { ResizeObserver, ResizeObserverEntry } from '@juggle/resize-observer';
2
+ import { ResizeObserverOptions } from '@juggle/resize-observer/lib/ResizeObserverOptions';
3
+ import { RefObject, useCallback, useDebugValue, useEffect, useMemo, useRef, useState } from 'react';
4
+
5
+ import type { defaultSnapProps, ResizeSource, snapPoints } from '../types';
6
+
7
+ import { processSnapPoints, roundAndCheckForNaN } from '../utils';
8
+ import { useLayoutEffect } from './useLayoutEffect';
9
+ import { useReady } from './useReady';
10
+
11
+ export const useSnapPoints = ({
12
+ contentRef,
13
+ controlledMaxHeight,
14
+ controlledMinHeight,
15
+ footerEnabled,
16
+ footerRef,
17
+ getSnapPoints,
18
+ headerEnabled,
19
+ headerRef,
20
+ heightRef,
21
+ lastSnapRef,
22
+ ready,
23
+ registerReady,
24
+ resizeSourceRef,
25
+ }: {
26
+ contentRef: RefObject<Element>;
27
+ controlledMaxHeight?: number;
28
+ controlledMinHeight?: number;
29
+ footerEnabled: boolean;
30
+ footerRef: RefObject<Element>;
31
+ getSnapPoints: snapPoints;
32
+ headerEnabled: boolean;
33
+ headerRef: RefObject<Element>;
34
+ heightRef: RefObject<number>;
35
+ lastSnapRef: RefObject<number>;
36
+ ready: boolean;
37
+ registerReady: ReturnType<typeof useReady>['registerReady'];
38
+ resizeSourceRef: RefObject<ResizeSource>;
39
+ }) => {
40
+ const { footerHeight, headerHeight, maxHeight, minHeight } = useDimensions({
41
+ contentRef: contentRef,
42
+ controlledMaxHeight,
43
+ controlledMinHeight,
44
+ footerEnabled,
45
+ footerRef,
46
+ headerEnabled,
47
+ headerRef,
48
+ registerReady,
49
+ resizeSourceRef,
50
+ });
51
+
52
+ const { maxSnap, minSnap, snapPoints } = processSnapPoints(
53
+ ready
54
+ ? getSnapPoints({
55
+ footerHeight,
56
+ headerHeight,
57
+ height: heightRef.current,
58
+ maxHeight,
59
+ minHeight,
60
+ })
61
+ : [0],
62
+ maxHeight
63
+ );
64
+
65
+ const findSnap = useCallback(
66
+ (numberOrCallback: number | ((state: defaultSnapProps) => number), velocity?: number) => {
67
+ let unsafeSearch: number;
68
+ if (typeof numberOrCallback === 'function') {
69
+ unsafeSearch = numberOrCallback({
70
+ footerHeight,
71
+ headerHeight,
72
+ height: heightRef.current,
73
+ lastSnap: lastSnapRef.current,
74
+ maxHeight,
75
+ minHeight,
76
+ snapPoints,
77
+ });
78
+ } else {
79
+ unsafeSearch = numberOrCallback;
80
+ }
81
+ const querySnap = roundAndCheckForNaN(unsafeSearch);
82
+
83
+ // If velocity is provided and significant, consider direction for smarter snapping
84
+ // But be much more conservative to avoid aggressive "pushing" behavior
85
+ if (velocity && Math.abs(velocity) > 0.3) {
86
+ // Higher threshold for velocity-based snapping
87
+ const currentSnap = heightRef.current || 0;
88
+ const direction = velocity > 0 ? 1 : -1; // positive velocity = upward motion
89
+
90
+ // Find snaps in the direction of movement
91
+ const snapsInDirection = snapPoints.filter((snap) =>
92
+ direction > 0 ? snap > currentSnap : snap < currentSnap
93
+ );
94
+
95
+ if (snapsInDirection.length > 0) {
96
+ // If moving with significant velocity, prefer the next snap in that direction
97
+ const targetSnap = direction > 0 ? Math.min(...snapsInDirection) : Math.max(...snapsInDirection);
98
+
99
+ // But only if the query position is reasonably close to that direction
100
+ const distanceToTarget = Math.abs(targetSnap - querySnap);
101
+ const distanceToClosest = Math.abs(
102
+ snapPoints.reduce(
103
+ (prev, curr) => (Math.abs(curr - querySnap) < Math.abs(prev - querySnap) ? curr : prev),
104
+ minSnap
105
+ ) - querySnap
106
+ );
107
+
108
+ // Be much more conservative - only use velocity-based snap if it's very close
109
+ // and the velocity is really significant
110
+ if (distanceToTarget < distanceToClosest * 1.2 && Math.abs(velocity) > 0.5) {
111
+ return targetSnap;
112
+ }
113
+ }
114
+ }
115
+
116
+ // Fallback to closest snap point
117
+ return snapPoints.reduce(
118
+ (prev, curr) => (Math.abs(curr - querySnap) < Math.abs(prev - querySnap) ? curr : prev),
119
+ minSnap
120
+ );
121
+ },
122
+ [snapPoints, minSnap, footerHeight, headerHeight, heightRef, lastSnapRef, maxHeight, minHeight]
123
+ );
124
+
125
+ useDebugValue(`minSnap: ${minSnap}, maxSnap:${maxSnap}`);
126
+
127
+ return { findSnap, maxHeight, maxSnap, minSnap };
128
+ };
129
+
130
+ function useDimensions({
131
+ contentRef,
132
+ controlledMaxHeight,
133
+ controlledMinHeight = 300,
134
+ footerEnabled,
135
+ footerRef,
136
+ headerEnabled,
137
+ headerRef,
138
+ registerReady,
139
+ resizeSourceRef,
140
+ }: {
141
+ contentRef: RefObject<Element>;
142
+ controlledMaxHeight?: number;
143
+ controlledMinHeight?: number;
144
+ footerEnabled: boolean;
145
+ footerRef: RefObject<Element>;
146
+ headerEnabled: boolean;
147
+ headerRef: RefObject<Element>;
148
+ registerReady: ReturnType<typeof useReady>['registerReady'];
149
+ resizeSourceRef: RefObject<ResizeSource>;
150
+ }) {
151
+ const setReady = useMemo(() => registerReady('contentHeight'), [registerReady]);
152
+ const maxHeight = useMaxHeight(controlledMaxHeight, registerReady, resizeSourceRef);
153
+
154
+ // Note: Future optimization could forward props instead of checking refs for enabled state
155
+ const headerHeight = useElementSizeObserver(headerRef, {
156
+ enabled: headerEnabled,
157
+ label: 'headerHeight',
158
+ resizeSourceRef,
159
+ });
160
+ const contentHeight = useElementSizeObserver(contentRef, {
161
+ enabled: true,
162
+ label: 'contentHeight',
163
+ resizeSourceRef,
164
+ });
165
+ const footerHeight = useElementSizeObserver(footerRef, {
166
+ enabled: footerEnabled,
167
+ label: 'footerHeight',
168
+ resizeSourceRef,
169
+ });
170
+
171
+ // Use the larger of calculated minHeight or controlled minHeight
172
+ // Ensure the calculated minHeight never exceeds maxHeight (which now includes viewport buffer)
173
+ const calculatedMinHeight =
174
+ Math.min(maxHeight - headerHeight - footerHeight, contentHeight) + headerHeight + footerHeight;
175
+ const minHeight = Math.min(Math.max(calculatedMinHeight, controlledMinHeight), maxHeight);
176
+
177
+ useDebugValue(`minHeight: ${minHeight}`);
178
+
179
+ const ready = contentHeight > 0;
180
+ useEffect(() => {
181
+ if (ready) {
182
+ setReady();
183
+ }
184
+ }, [ready, setReady]);
185
+
186
+ return {
187
+ footerHeight,
188
+ headerHeight,
189
+ maxHeight,
190
+ minHeight,
191
+ };
192
+ }
193
+
194
+ const observerOptions: ResizeObserverOptions = {
195
+ // And the user hides or shows the Safari browser toolbar
196
+ box: 'border-box',
197
+ };
198
+ /**
199
+ * Hook for determining the size of an element using the Resize Observer API.
200
+ *
201
+ * @param ref - A React ref to an element
202
+ */
203
+ function useElementSizeObserver(
204
+ ref: RefObject<Element>,
205
+ {
206
+ enabled,
207
+ label,
208
+ resizeSourceRef,
209
+ }: {
210
+ enabled: boolean;
211
+ label: string;
212
+ resizeSourceRef: RefObject<ResizeSource>;
213
+ }
214
+ ): number {
215
+ const [size, setSize] = useState(0);
216
+ const rafRef = useRef<number>(0);
217
+ const lastSizeRef = useRef<number>(0);
218
+
219
+ useDebugValue(`${label}: ${size}`);
220
+
221
+ const handleResize = useCallback(
222
+ (entries: ResizeObserverEntry[]) => {
223
+ // Cancel any pending RAF to throttle updates
224
+ if (rafRef.current) {
225
+ cancelAnimationFrame(rafRef.current);
226
+ }
227
+
228
+ rafRef.current = requestAnimationFrame(() => {
229
+ // we only observe one element, so accessing the first entry here is fine
230
+ const entry = entries[0];
231
+ const newSize = entry.borderBoxSize[0]?.blockSize || entry.contentRect.height;
232
+
233
+ // Only update if size actually changed by a meaningful amount (1px threshold)
234
+ if (Math.abs(newSize - lastSizeRef.current) >= 1) {
235
+ lastSizeRef.current = newSize;
236
+ setSize(newSize);
237
+ resizeSourceRef.current = 'element';
238
+ }
239
+
240
+ rafRef.current = 0;
241
+ });
242
+ },
243
+ [resizeSourceRef]
244
+ );
245
+
246
+ useLayoutEffect(() => {
247
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
248
+ if (!ref.current || !enabled) {
249
+ return;
250
+ }
251
+
252
+ const element = ref.current;
253
+ const resizeObserver = new ResizeObserver(handleResize);
254
+
255
+ // Get initial size synchronously for faster startup
256
+ const initialRect = element.getBoundingClientRect();
257
+ if (initialRect.height > 0 && lastSizeRef.current === 0) {
258
+ lastSizeRef.current = initialRect.height;
259
+ setSize(initialRect.height);
260
+ }
261
+
262
+ resizeObserver.observe(element, observerOptions);
263
+
264
+ return () => {
265
+ resizeObserver.disconnect();
266
+ if (rafRef.current) {
267
+ cancelAnimationFrame(rafRef.current);
268
+ }
269
+ };
270
+ }, [ref, handleResize, enabled]);
271
+
272
+ return enabled ? size : 0;
273
+ }
274
+
275
+ // Blazingly keep track of the current viewport height without blocking the thread, keeping that sweet 60fps on smartphones
276
+ function useMaxHeight(
277
+ controlledMaxHeight: number | undefined,
278
+ registerReady: ReturnType<typeof useReady>['registerReady'],
279
+ resizeSourceRef: RefObject<ResizeSource>
280
+ ) {
281
+ const setReady = useMemo(() => registerReady('maxHeight'), [registerReady]);
282
+
283
+ // Helper function to calculate safe viewport height with buffer
284
+ const getSafeViewportHeight = useCallback((viewportHeight: number) => {
285
+ // Apply a buffer to ensure bottom sheet never exceeds viewport height
286
+ // Use 64px buffer (approximately the height of mobile browser chrome/status bar)
287
+ const VIEWPORT_BUFFER = 64;
288
+ return Math.max(viewportHeight - VIEWPORT_BUFFER, 300); // Minimum 300px height
289
+ }, []);
290
+
291
+ const [maxHeight, setMaxHeight] = useState(() => {
292
+ const viewportHeight = typeof window !== 'undefined' ? window.innerHeight : 0;
293
+
294
+ if (controlledMaxHeight) {
295
+ const controlledHeight = roundAndCheckForNaN(controlledMaxHeight);
296
+ // Always cap controlled height at actual viewport height
297
+ return Math.min(controlledHeight, viewportHeight);
298
+ }
299
+
300
+ return getSafeViewportHeight(viewportHeight);
301
+ });
302
+
303
+ const ready = maxHeight > 0;
304
+ const raf = useRef(0);
305
+
306
+ useDebugValue(controlledMaxHeight ? 'controlled' : 'auto');
307
+
308
+ useEffect(() => {
309
+ if (ready) {
310
+ setReady();
311
+ }
312
+ }, [ready, setReady]);
313
+
314
+ useLayoutEffect(() => {
315
+ // Handle controlled max height with viewport capping
316
+ if (controlledMaxHeight) {
317
+ const controlledHeight = roundAndCheckForNaN(controlledMaxHeight);
318
+ // Always cap controlled height at actual viewport height
319
+ const cappedHeight = Math.min(controlledHeight, window.innerHeight);
320
+ setMaxHeight(cappedHeight);
321
+ resizeSourceRef.current = 'maxheightprop';
322
+
323
+ return;
324
+ }
325
+
326
+ const handleResize = () => {
327
+ if (raf.current) {
328
+ // bail to throttle the amount of resize changes
329
+ return;
330
+ }
331
+
332
+ // throttle state changes using rAF
333
+ raf.current = requestAnimationFrame(() => {
334
+ const safeHeight = getSafeViewportHeight(window.innerHeight);
335
+ setMaxHeight(safeHeight);
336
+ resizeSourceRef.current = 'window';
337
+
338
+ raf.current = 0;
339
+ });
340
+ };
341
+
342
+ window.addEventListener('resize', handleResize);
343
+ const initialSafeHeight = getSafeViewportHeight(window.innerHeight);
344
+ setMaxHeight(initialSafeHeight);
345
+ resizeSourceRef.current = 'window';
346
+ setReady();
347
+
348
+ return () => {
349
+ window.removeEventListener('resize', handleResize);
350
+ cancelAnimationFrame(raf.current);
351
+ };
352
+ }, [controlledMaxHeight, setReady, resizeSourceRef, getSafeViewportHeight]);
353
+
354
+ return maxHeight;
355
+ }
@@ -0,0 +1,47 @@
1
+ import { useSpring as useReactSpring } from '@react-spring/web';
2
+
3
+ // Behold, the engine of it all!
4
+ // Put in this file befause it makes it easier to type and I'm lazy! :D
5
+
6
+ export const useSpring = () => {
7
+ const [spring, api] = useReactSpring(() => ({
8
+ config: {
9
+ // Increase friction for less oscillation
10
+ friction: 32,
11
+ // Prevent spring from overshooting its target, eliminating final bounce
12
+ overshootClamping: true,
13
+ // End animation sooner when displacement is below this threshold (increased from 0.01)
14
+ restDisplacementThreshold: 0.1,
15
+ // End animation sooner when speed drops below this threshold (increased from 2)
16
+ restSpeedThreshold: 10,
17
+ // Increase tension slightly for snappier animations
18
+ tension: 280,
19
+ },
20
+ maxHeight: 0,
21
+ maxSnap: 0,
22
+ minSnap: 0,
23
+ y: 0,
24
+ }));
25
+
26
+ return [spring, api] as const;
27
+ };
28
+
29
+ export type Spring = ReturnType<typeof useSpring>[0];
30
+ export type SpringAPI = ReturnType<typeof useSpring>[1];
31
+
32
+ /** The animated values the sheet's spring tracks. */
33
+ type SpringTargetValues = {
34
+ maxHeight?: number;
35
+ maxSnap?: number;
36
+ minSnap?: number;
37
+ y?: number;
38
+ };
39
+
40
+ /** The subset of spring props the sheet animates via `api.start` / `asyncSet`. */
41
+ export type SpringSetOptions = SpringTargetValues & {
42
+ config?: { velocity?: number };
43
+ from?: SpringTargetValues;
44
+ immediate?: boolean;
45
+ onRest?: (result?: unknown) => void;
46
+ to?: SpringTargetValues;
47
+ };
@@ -0,0 +1,101 @@
1
+ import { to } from '@react-spring/web';
2
+ import { CSSProperties, useMemo } from 'react';
3
+
4
+ import type { Spring } from './useSpring';
5
+
6
+ /**
7
+ * `CSSProperties` widened to admit the sheet's `--rsbs-*` custom properties, whose
8
+ * values are react-spring interpolations rather than plain strings.
9
+ */
10
+ type SpringInterpolationStyles = CSSProperties & Record<`--rsbs-${string}`, unknown>;
11
+
12
+ /**
13
+ * Experimental translate3d-based interpolations for GPU-accelerated bottom sheet animations.
14
+ * This approach uses a static height and translates the entire sheet vertically using translate3d,
15
+ * which leverages GPU acceleration for better performance on mobile devices.
16
+ */
17
+ export const useSpringInterpolationsTranslate3d = ({ spring }: { spring: Spring }): SpringInterpolationStyles => {
18
+ // Memoize interpolation functions to prevent recreation on every render
19
+ const interpolations = useMemo(() => {
20
+ // Border radius animation - same as original
21
+ const interpolateBorderRadius = to([spring.y, spring.maxHeight], (y, maxHeight) => {
22
+ const clamped = Math.max(0, Math.min(16, maxHeight - y));
23
+ return `${Math.round(clamped)}px`;
24
+ });
25
+
26
+ /**
27
+ * EXPERIMENTAL: Static height calculation
28
+ * Instead of animating height, we calculate the maximum height once and keep it static.
29
+ * This avoids expensive height recalculations during animation.
30
+ */
31
+ const interpolateStaticHeight = to([spring.maxSnap], (maxSnap) => {
32
+ return `${Math.round(maxSnap)}px`;
33
+ });
34
+
35
+ /**
36
+ * EXPERIMENTAL: translate3d Y positioning
37
+ * This is the core of the GPU acceleration approach.
38
+ * We translate the entire bottom sheet vertically using translate3d.
39
+ *
40
+ * Logic based on spring system expectations:
41
+ * - When closed (y = 0): translate3d(0, maxSnap, 0) - hidden below viewport
42
+ * - When open (y = current snap): translate3d(0, 0, 0) - visible at normal position
43
+ * - During drag: interpolate between positions based on current y value
44
+ */
45
+ const interpolateTranslate3d = to([spring.y, spring.maxSnap], (y, maxSnap) => {
46
+ // The spring system uses:
47
+ // y = 0 for closed state (hidden)
48
+ // y = snap value for open state (visible)
49
+
50
+ // Fallback for when maxSnap isn't ready yet
51
+ const safeMaxSnap = maxSnap || (typeof window !== 'undefined' ? window.innerHeight : 800);
52
+
53
+ // When y = 0 (closed): we want translate down by maxSnap (hide sheet)
54
+ // When y = snap (open): we want translate3d(0, 0, 0) (show sheet)
55
+
56
+ if (y === 0) {
57
+ // Closed state - translate down by full height to hide
58
+ return `translate3d(0, ${Math.round(safeMaxSnap)}px, 0)`;
59
+ }
60
+
61
+ // Open state - calculate how much to show based on y value
62
+ // y represents the desired height, so we translate up to show that much
63
+ const offset = Math.max(0, safeMaxSnap - y);
64
+ return `translate3d(0, ${Math.round(offset)}px, 0)`;
65
+ });
66
+
67
+ // Anti-gap filler - same as original
68
+ const interpolateFiller = to([spring.y, spring.maxSnap], (y, maxSnap) => {
69
+ return Math.max(0, Math.ceil(y - maxSnap));
70
+ });
71
+
72
+ // Content and backdrop opacity - simplified to always 1 for performance
73
+ const interpolateContentOpacity = to([spring.y], () => 1);
74
+ const interpolateBackdrop = to([spring.y], () => 1);
75
+
76
+ return {
77
+ interpolateBackdrop,
78
+ interpolateBorderRadius,
79
+ interpolateContentOpacity,
80
+ interpolateFiller,
81
+ interpolateStaticHeight,
82
+ interpolateTranslate3d,
83
+ };
84
+ }, [spring.y, spring.maxSnap, spring.maxHeight]);
85
+
86
+ // Return CSS properties optimized for GPU acceleration
87
+ return {
88
+ // Content fade-in effect
89
+ '--rsbs-content-opacity': interpolations.interpolateContentOpacity,
90
+ // Backdrop fade-in
91
+ '--rsbs-backdrop-opacity': interpolations.interpolateBackdrop,
92
+ // Anti-gap scaling
93
+ '--rsbs-antigap-scale-y': interpolations.interpolateFiller,
94
+ // EXPERIMENTAL: Static height instead of animated height
95
+ '--rsbs-overlay-h-static': interpolations.interpolateStaticHeight,
96
+ // EXPERIMENTAL: translate3d for GPU acceleration
97
+ '--rsbs-overlay-translate3d': interpolations.interpolateTranslate3d,
98
+ // Border radius animation
99
+ '--rsbs-overlay-rounded': interpolations.interpolateBorderRadius,
100
+ };
101
+ };