@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,196 @@
1
+ import { cn, wrapVarRgb } from '@evolve.ui/theme-system';
2
+ import { memo, ReactNode, RefObject } from 'react';
3
+
4
+ import type { DragBind } from '../../types';
5
+
6
+ import { SheetDescription, SheetTitle } from '..';
7
+ import { BottomSheetContentArea } from '../BottomSheetContentArea/BottomSheetContentArea';
8
+
9
+ /**
10
+ * Props for the BottomSheetOverlayTranslate3d component
11
+ */
12
+ type Props = {
13
+ /** Drag bind function */
14
+ bind: DragBind;
15
+ /** The main content to display */
16
+ children: ReactNode;
17
+ /** Reference to the content container */
18
+ contentRef: RefObject<HTMLDivElement | null>;
19
+ /** Whether to disable the BottomSheet's own scrolling (useful when children handle their own scrolling) */
20
+ disableScroll?: boolean;
21
+ /** Footer content */
22
+ footer?: ReactNode;
23
+ /** Reference to the footer container */
24
+ footerRef: RefObject<HTMLDivElement | null>;
25
+ /** Header configuration */
26
+ header?: {
27
+ description: ReactNode;
28
+ title: ReactNode;
29
+ };
30
+ /** Reference to the header container */
31
+ headerRef: RefObject<HTMLDivElement | null>;
32
+ /** Whether the content is scrollable */
33
+ isScrollable: boolean;
34
+ /** Whether the content is scrolled to the bottom */
35
+ isScrolledToBottom: boolean;
36
+ /** Dismiss handler function */
37
+ onDismiss?: () => void;
38
+ /** Reference to the overlay container */
39
+ overlayRef: RefObject<HTMLDivElement | null>;
40
+ /** Reference to the scroll container */
41
+ scrollRef: RefObject<HTMLDivElement | null>;
42
+ };
43
+
44
+ /**
45
+ * EXPERIMENTAL: BottomSheetOverlayTranslate3d - GPU-accelerated version using translate3d
46
+ *
47
+ * This version uses a static height and translate3d transforms for better performance.
48
+ * Key differences from the original:
49
+ * 1. Static height instead of animated height
50
+ * 2. translate3d for positioning (GPU accelerated)
51
+ * 3. Optimized for mobile device performance
52
+ * 4. Memoized to prevent unnecessary re-renders
53
+ */
54
+ export const BottomSheetOverlayTranslate3d = memo<Props>(
55
+ ({
56
+ bind,
57
+ children,
58
+ contentRef,
59
+ disableScroll,
60
+ footer,
61
+ footerRef,
62
+ header,
63
+ headerRef,
64
+ isScrollable,
65
+ isScrolledToBottom,
66
+ onDismiss,
67
+ overlayRef,
68
+ scrollRef,
69
+ }: Props) => {
70
+ return (
71
+ // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions
72
+ <div
73
+ aria-describedby={header?.description ? 'bottom-sheet-description' : undefined}
74
+ aria-label={header?.title ? undefined : 'Bottom Sheet'}
75
+ aria-labelledby={header?.title ? 'bottom-sheet-title' : undefined}
76
+ aria-modal="true"
77
+ className={cn(
78
+ // Base styling
79
+ 'bg-background-primary p-md',
80
+ // Layout
81
+ 'flex flex-col',
82
+ // Position relative for absolute drag handle
83
+ 'relative',
84
+ // Border radius (dynamic via CSS custom property with fallback)
85
+ 'rounded-t-xl',
86
+ // Focus outline
87
+ 'hui-focus-visible-outline focus:outline-none',
88
+ // EXPERIMENTAL: Static height instead of animated height
89
+ 'h-[var(--rsbs-overlay-h-static,100vh)]',
90
+ // EXPERIMENTAL: translate3d for GPU acceleration
91
+ // Using transform-gpu class to enable GPU acceleration
92
+ 'transform-gpu',
93
+ // Performance optimizations - specify only transform for will-change
94
+ 'will-change-transform',
95
+ // Drag handle positioned at the very top
96
+ 'before:absolute before:left-1/2 before:top-2xs before:block',
97
+ 'before:h-2xs before:w-9 before:-translate-x-1/2 before:rounded-sm',
98
+ 'before:bg-icon-secondary/20 before:content-[""]'
99
+ )}
100
+ key="overlay"
101
+ onKeyDown={(event) => {
102
+ if (event.key === 'Escape') {
103
+ // Always stop propagation, to avoid weirdness for bottom sheets inside other bottom sheets
104
+ event.stopPropagation();
105
+ if (onDismiss) {
106
+ onDismiss();
107
+ }
108
+ }
109
+ }}
110
+ ref={overlayRef}
111
+ role="dialog"
112
+ style={{
113
+ // EXPERIMENTAL: Apply translate3d transform via CSS custom property
114
+ // Fallback uses the static height variable to ensure proper initial positioning
115
+ transform:
116
+ 'var(--rsbs-overlay-translate3d, translate3d(0, var(--rsbs-overlay-h-static, 100vh), 0))',
117
+ }}
118
+ tabIndex={-1}
119
+ >
120
+ {/* Absolute drag area overlay - covers the top section including visual handle */}
121
+ <div
122
+ className={cn(
123
+ // Position absolutely to overlay the top section
124
+ 'absolute left-0 right-0 top-0',
125
+ // Height to cover visual handle + top padding space (4px + 8px + extra touch area)
126
+ 'h-md',
127
+ // Make it draggable
128
+ 'cursor-ns-resize select-none',
129
+ // Z-index to be above content but allow header text to be selectable
130
+ 'z-10'
131
+ )}
132
+ style={{ touchAction: 'none' }}
133
+ {...bind()}
134
+ />
135
+
136
+ {/* Header content - normal layout */}
137
+ {header && (
138
+ <div
139
+ className="flex flex-col gap-2xs pb-sm"
140
+ key="header"
141
+ ref={headerRef}
142
+ >
143
+ <SheetTitle id="bottom-sheet-title">{header.title}</SheetTitle>
144
+ <SheetDescription id="bottom-sheet-description">{header.description}</SheetDescription>
145
+ </div>
146
+ )}
147
+
148
+ {/* If no header, still need ref for measurements */}
149
+ {!header && (
150
+ <div
151
+ className="hidden"
152
+ ref={headerRef}
153
+ />
154
+ )}
155
+
156
+ <BottomSheetContentArea
157
+ contentRef={contentRef}
158
+ disableScroll={disableScroll}
159
+ scrollRef={scrollRef}
160
+ >
161
+ {children}
162
+ </BottomSheetContentArea>
163
+
164
+ {/* Footer area - always render for padding and gradient overlay */}
165
+ <div
166
+ className={cn(
167
+ // Base styling - always apply padding and ensure minimum height
168
+ 'relative flex-shrink-0',
169
+ footer ? 'pt-lg' : 'min-h-[1px] pb-md',
170
+ // Footer specific drag behavior - only when footer exists
171
+ footer && 'cursor-ns-resize'
172
+ )}
173
+ key="footer"
174
+ ref={footerRef}
175
+ style={footer ? { touchAction: 'none' } : undefined}
176
+ {...(footer ? bind() : {})}
177
+ >
178
+ {/* Gradient overlay - show when scrollable and not at bottom */}
179
+ {!disableScroll && isScrollable && !isScrolledToBottom && (
180
+ <div
181
+ className="pointer-events-none absolute -top-[42px] left-0 right-0 h-xl w-full"
182
+ data-testid="gradient-overlay"
183
+ style={{
184
+ background: `linear-gradient(to bottom, transparent, ${wrapVarRgb('--color-background-primary')})`,
185
+ }}
186
+ />
187
+ )}
188
+ {footer}
189
+ </div>
190
+ </div>
191
+ );
192
+ }
193
+ );
194
+
195
+ // Add display name for better debugging
196
+ BottomSheetOverlayTranslate3d.displayName = 'BottomSheetOverlayTranslate3d';
@@ -0,0 +1,22 @@
1
+ import { ReactNode } from 'react';
2
+
3
+ import { BodySecondary } from '../../../Typography/Text/Text';
4
+
5
+ type Props = {
6
+ children: ReactNode;
7
+ className?: string;
8
+ id?: string;
9
+ };
10
+
11
+ export const SheetDescription = ({ children, className, id }: Props) => {
12
+ return (
13
+ <BodySecondary
14
+ className={className}
15
+ color="secondary"
16
+ data-testid="sheet-description"
17
+ id={id}
18
+ >
19
+ {children}
20
+ </BodySecondary>
21
+ );
22
+ };
@@ -0,0 +1,21 @@
1
+ import { ReactNode } from 'react';
2
+
3
+ import { H2 } from '../../../Typography/Text/Text';
4
+
5
+ type Props = {
6
+ children: ReactNode;
7
+ className?: string;
8
+ id?: string;
9
+ };
10
+
11
+ export const SheetTitle = ({ children, className, id }: Props) => {
12
+ return (
13
+ <H2
14
+ className={className}
15
+ data-testid="sheet-title"
16
+ id={id}
17
+ >
18
+ {children}
19
+ </H2>
20
+ );
21
+ };
@@ -0,0 +1,5 @@
1
+ export { SheetDescription } from './SheetDescription/SheetDescription';
2
+ export { SheetTitle } from './SheetTitle/SheetTitle';
3
+ export { BottomSheetBackdrop } from './BottomSheetBackdrop/BottomSheetBackdrop';
4
+ export { BottomSheetContentArea } from './BottomSheetContentArea/BottomSheetContentArea';
5
+ export { BottomSheetOverlayTranslate3d as BottomSheetOverlay } from './BottomSheetOverlay/BottomSheetOverlayTranslate3d';
@@ -0,0 +1,13 @@
1
+ export { useAriaHider } from './useAriaHider';
2
+ export { useFocusTrap } from './useFocusTrap';
3
+ export { useLayoutEffect } from './useLayoutEffect';
4
+ export { useOptimizedResizeObserver } from './useOptimizedResizeObserver';
5
+ export { useOptimizedScrollState } from './useOptimizedScrollState';
6
+ export { useReady } from './useReady';
7
+ export { useReducedMotion } from './useReducedMotion';
8
+ export { useScrollLock } from './useScrollLock';
9
+ export { useSnapPoints } from './useSnapPoints';
10
+ export { useSpring } from './useSpring';
11
+ export { useSpringInterpolationsTranslate3d } from './useSpringInterpolationsTranslate3d';
12
+ export { useDragHandler } from './useDragHandler';
13
+ export { useBottomSheetServices } from './useBottomSheetServices';
@@ -0,0 +1,91 @@
1
+ import { RefObject, useDebugValue, useEffect, useRef } from 'react';
2
+
3
+ // Handle hiding and restoring aria-hidden attributes
4
+ export const useAriaHider = ({ enabled, targetRef }: { enabled: boolean; targetRef: RefObject<Element> }) => {
5
+ // eslint-disable-next-line func-call-spacing
6
+ const ref = useRef<{ activate: () => void; deactivate: () => void }>({
7
+ activate: () => {
8
+ throw new TypeError('Tried to activate aria hider too early');
9
+ },
10
+ deactivate: () => {},
11
+ });
12
+
13
+ useDebugValue(enabled ? 'Enabled' : 'Disabled');
14
+
15
+ useEffect(() => {
16
+ if (!enabled) {
17
+ ref.current.deactivate();
18
+ ref.current = { activate: () => {}, deactivate: () => {} };
19
+ return;
20
+ }
21
+
22
+ const target = targetRef.current;
23
+ let active = false;
24
+ let originalValues: (null | string)[] = [];
25
+ let rootNodes: Element[] = [];
26
+
27
+ ref.current = {
28
+ activate: () => {
29
+ if (active) {
30
+ return;
31
+ }
32
+ active = true;
33
+
34
+ // For fixed positioned elements (like BottomSheet), we need to hide siblings at the body level
35
+ // but exclude the target element itself and its ancestors
36
+ const targetElement = target;
37
+
38
+ // Find all elements to potentially hide
39
+ const candidates = Array.from(document.querySelectorAll('body > *'));
40
+
41
+ candidates.forEach((node) => {
42
+ // Don't hide the target element itself
43
+ if (node === targetElement) {
44
+ return;
45
+ }
46
+
47
+ // Don't hide if target is a descendant of this node (prevents hiding containers)
48
+ if (node.contains(targetElement)) {
49
+ return;
50
+ }
51
+
52
+ // Don't hide if already hidden
53
+ const attr = node.getAttribute('aria-hidden');
54
+ const alreadyHidden = attr !== null && attr !== 'false';
55
+ if (alreadyHidden) {
56
+ return;
57
+ }
58
+
59
+ // Don't hide script, style, or other non-interactive elements
60
+ const tagName = node.tagName.toLowerCase();
61
+ if (['script', 'style', 'meta', 'title', 'link'].includes(tagName)) {
62
+ return;
63
+ }
64
+
65
+ originalValues.push(attr);
66
+ rootNodes.push(node);
67
+ node.setAttribute('aria-hidden', 'true');
68
+ });
69
+ },
70
+ deactivate: () => {
71
+ if (!active) {
72
+ return;
73
+ }
74
+ active = false;
75
+
76
+ rootNodes.forEach((node, index) => {
77
+ const originalValue = originalValues[index];
78
+ if (originalValue === null) {
79
+ node.removeAttribute('aria-hidden');
80
+ } else {
81
+ node.setAttribute('aria-hidden', originalValue);
82
+ }
83
+ });
84
+ originalValues = [];
85
+ rootNodes = [];
86
+ },
87
+ };
88
+ }, [targetRef, enabled]);
89
+
90
+ return ref;
91
+ };
@@ -0,0 +1,224 @@
1
+ import { RefObject, useCallback } from 'react';
2
+
3
+ import type { BottomSheetServices } from '../state/useBottomSheetStateMachine';
4
+ import type { ResizeSource, SpringEvent } from '../types';
5
+ import type { SpringSetOptions } from './useSpring';
6
+
7
+ /**
8
+ * Props for the bottom sheet services hook
9
+ */
10
+ type UseBottomSheetServicesProps = {
11
+ /** Aria hider ref with activate/deactivate methods */
12
+ ariaHiderRef: RefObject<{ activate: () => void; deactivate: () => void }>;
13
+ /** Async spring setter function */
14
+ asyncSet: (config: SpringSetOptions) => Promise<void>;
15
+ /** Reference to track if dragging is allowed */
16
+ canDragRef: RefObject<boolean>;
17
+ /** Reference to the default snap value */
18
+ defaultSnapRef: RefObject<number>;
19
+ /** Reference to the find snap function */
20
+ findSnapRef: RefObject<(y: number, velocity?: number) => number>;
21
+ /** Focus trap ref with activate/deactivate methods */
22
+ focusTrapRef: RefObject<{ activate: () => void; deactivate: () => void }>;
23
+ /** Reference to the current height */
24
+ heightRef: RefObject<number>;
25
+ /** Reference to the last snap value */
26
+ lastSnapRef: RefObject<number | null>;
27
+ /** Reference to the current max height value */
28
+ maxHeightRef: RefObject<number>;
29
+ /** Reference to the current max snap value */
30
+ maxSnapRef: RefObject<number>;
31
+ /** Reference to the current min snap value */
32
+ minSnapRef: RefObject<number>;
33
+ /** Spring cancel callback ref */
34
+ onSpringCancelRef: RefObject<((event: SpringEvent) => void) | undefined>;
35
+ /** Spring end callback ref */
36
+ onSpringEndRef: RefObject<((event: SpringEvent) => void) | undefined>;
37
+ /** Spring start callback ref */
38
+ onSpringStartRef: RefObject<((event: SpringEvent) => void) | undefined>;
39
+ /** Reference to check if reduced motion is preferred */
40
+ prefersReducedMotion: RefObject<boolean | undefined>;
41
+ /** Reference to track resize source */
42
+ resizeSourceRef: RefObject<ResizeSource>;
43
+ /** Scroll lock ref with activate/deactivate methods */
44
+ scrollLockRef: RefObject<{ activate: () => void; deactivate: () => void }>;
45
+ };
46
+
47
+ /**
48
+ * Custom hook to provide state machine services for the bottom sheet
49
+ */
50
+ export const useBottomSheetServices = ({
51
+ ariaHiderRef,
52
+ asyncSet,
53
+ canDragRef,
54
+ defaultSnapRef,
55
+ findSnapRef,
56
+ focusTrapRef,
57
+ heightRef,
58
+ lastSnapRef,
59
+ maxHeightRef,
60
+ maxSnapRef,
61
+ minSnapRef,
62
+ onSpringEndRef,
63
+ onSpringStartRef,
64
+ prefersReducedMotion,
65
+ resizeSourceRef,
66
+ scrollLockRef,
67
+ }: UseBottomSheetServicesProps) => {
68
+ const services = useCallback(
69
+ (): BottomSheetServices => ({
70
+ activate: async () => {
71
+ canDragRef.current = true;
72
+ await Promise.all(
73
+ [
74
+ scrollLockRef.current.activate(),
75
+ focusTrapRef.current.activate(),
76
+ ariaHiderRef.current.activate(),
77
+ ].filter(Boolean)
78
+ );
79
+ },
80
+ closeSmoothly: async () => {
81
+ // Avoid animating the height property on close and stay within FLIP bounds by upping the minSnap
82
+ asyncSet({
83
+ immediate: true,
84
+ minSnap: heightRef.current,
85
+ });
86
+
87
+ heightRef.current = 0;
88
+
89
+ await asyncSet({
90
+ immediate: prefersReducedMotion.current || false,
91
+ maxHeight: maxHeightRef.current,
92
+ maxSnap: maxSnapRef.current,
93
+ y: 0,
94
+ });
95
+ },
96
+ deactivate: async () => {
97
+ // Deactivate focus trap to restore focus (if any element was previously focused)
98
+ focusTrapRef.current.deactivate();
99
+
100
+ // Deactivate scroll lock and aria hider
101
+ scrollLockRef.current.deactivate();
102
+ ariaHiderRef.current.deactivate();
103
+
104
+ canDragRef.current = false;
105
+ },
106
+ onCloseEnd: async () => {
107
+ // Final cleanup after close animation completes
108
+ // The spring end callback has already been called by this point
109
+ },
110
+ onCloseStart: async () => onSpringStartRef.current?.({ type: 'CLOSE' }),
111
+ onOpenEnd: async () => onSpringEndRef.current?.({ type: 'OPEN' }),
112
+ onOpenStart: async () => onSpringStartRef.current?.({ type: 'OPEN' }),
113
+ onResizeEnd: async () =>
114
+ onSpringEndRef.current?.({
115
+ source: resizeSourceRef.current,
116
+ type: 'RESIZE',
117
+ }),
118
+ onResizeStart: async () =>
119
+ onSpringStartRef.current?.({
120
+ source: resizeSourceRef.current,
121
+ type: 'RESIZE',
122
+ }),
123
+ onSnapEnd: async (context) =>
124
+ onSpringEndRef.current?.({
125
+ source: context.snapSource || 'custom',
126
+ type: 'SNAP',
127
+ }),
128
+ onSnapStart: async (context) =>
129
+ onSpringStartRef.current?.({
130
+ source: context.snapSource || 'custom',
131
+ type: 'SNAP',
132
+ }),
133
+ openImmediately: async () => {
134
+ heightRef.current = defaultSnapRef.current;
135
+ await asyncSet({
136
+ immediate: true,
137
+ maxHeight: maxHeightRef.current,
138
+ maxSnap: maxSnapRef.current,
139
+ // Using defaultSnapRef instead of minSnapRef to avoid animating `height` on open
140
+ minSnap: defaultSnapRef.current,
141
+ y: defaultSnapRef.current,
142
+ });
143
+ },
144
+ openSmoothly: async () => {
145
+ // Use fallback values if measurements aren't ready yet for faster initial render
146
+ const maxHeight = maxHeightRef.current || (typeof window !== 'undefined' ? window.innerHeight : 800);
147
+ const defaultSnap = defaultSnapRef.current || 300; // Fallback to reasonable default
148
+ const maxSnap = maxSnapRef.current || maxHeight;
149
+
150
+ // MOBILE OPTIMIZATION: Single animation instead of double animation
151
+ // This eliminates the jarring transition that causes FPS drops on mobile
152
+ heightRef.current = defaultSnap;
153
+
154
+ await asyncSet({
155
+ // Start from closed position and animate to open in one smooth motion
156
+ from: { maxHeight, maxSnap, minSnap: defaultSnap, y: 0 },
157
+ immediate: prefersReducedMotion.current || false,
158
+ to: { maxHeight, maxSnap, minSnap: defaultSnap, y: defaultSnap },
159
+ });
160
+ },
161
+ renderVisuallyHidden: async () => {
162
+ // Use fallback values if measurements aren't ready yet
163
+ const maxHeight = maxHeightRef.current || (typeof window !== 'undefined' ? window.innerHeight : 800);
164
+ const defaultSnap = defaultSnapRef.current || 300;
165
+ const maxSnap = maxSnapRef.current || maxHeight;
166
+
167
+ await asyncSet({
168
+ immediate: true,
169
+ maxHeight,
170
+ maxSnap,
171
+ // Using defaultSnapRef instead of minSnapRef to avoid animating `height` on open
172
+ minSnap: defaultSnap,
173
+ y: defaultSnap,
174
+ });
175
+ },
176
+ resizeSmoothly: async () => {
177
+ const snap = findSnapRef.current(heightRef.current);
178
+ heightRef.current = snap;
179
+ lastSnapRef.current = snap;
180
+ await asyncSet({
181
+ immediate: resizeSourceRef.current === 'element' ? prefersReducedMotion.current || false : true,
182
+ maxHeight: maxHeightRef.current,
183
+ maxSnap: maxSnapRef.current,
184
+ minSnap: minSnapRef.current,
185
+ y: snap,
186
+ });
187
+ },
188
+ snapSmoothly: async (context) => {
189
+ const snap = findSnapRef.current(context.y || 0, context.velocity);
190
+
191
+ heightRef.current = snap;
192
+ lastSnapRef.current = snap;
193
+ await asyncSet({
194
+ config: { velocity: context.velocity || 1 },
195
+ immediate: prefersReducedMotion.current || false,
196
+ maxHeight: maxHeightRef.current,
197
+ maxSnap: maxSnapRef.current,
198
+ minSnap: minSnapRef.current,
199
+ y: snap,
200
+ });
201
+ },
202
+ }),
203
+ [
204
+ canDragRef,
205
+ heightRef,
206
+ lastSnapRef,
207
+ defaultSnapRef,
208
+ maxHeightRef,
209
+ maxSnapRef,
210
+ minSnapRef,
211
+ findSnapRef,
212
+ resizeSourceRef,
213
+ prefersReducedMotion,
214
+ asyncSet,
215
+ scrollLockRef,
216
+ focusTrapRef,
217
+ ariaHiderRef,
218
+ onSpringStartRef,
219
+ onSpringEndRef,
220
+ ]
221
+ );
222
+
223
+ return services;
224
+ };