@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.
- package/Checkbox.d.cts +1 -1
- package/Checkbox.d.mts +1 -1
- package/{DateInput-B8XQZPTx.d.cts → DateInput-CFxTZu3m.d.mts} +2 -2
- package/{DateInput-B8XQZPTx.d.cts.map → DateInput-CFxTZu3m.d.mts.map} +1 -1
- package/{DateInput-CfNmywqQ.d.mts → DateInput-DstMICTl.d.cts} +2 -2
- package/{DateInput-CfNmywqQ.d.mts.map → DateInput-DstMICTl.d.cts.map} +1 -1
- package/{FavoriteButton-CowOPoqo.d.cts → FavoriteButton-BGF-3dze.d.cts} +2 -2
- package/{FavoriteButton-BRY8FVpV.d.mts.map → FavoriteButton-BGF-3dze.d.cts.map} +1 -1
- package/{FavoriteButton-BRY8FVpV.d.mts → FavoriteButton-BZEGWrRo.d.mts} +2 -2
- package/{FavoriteButton-CowOPoqo.d.cts.map → FavoriteButton-BZEGWrRo.d.mts.map} +1 -1
- package/Input.d.cts +1 -1
- package/Input.d.mts +1 -1
- package/Radio.d.cts +1 -1
- package/Radio.d.mts +1 -1
- package/{TextInput-BhkeQZh4.d.cts → TextInput-B7lqQ1gh.d.cts} +3 -3
- package/{TextInput-BhkeQZh4.d.cts.map → TextInput-B7lqQ1gh.d.cts.map} +1 -1
- package/{TextInput-CWCeR18b.d.mts → TextInput-CxoT3np_.d.mts} +3 -3
- package/{TextInput-CWCeR18b.d.mts.map → TextInput-CxoT3np_.d.mts.map} +1 -1
- package/dateInput.d.cts +1 -1
- package/dateInput.d.mts +1 -1
- package/datePicker.d.cts +1 -1
- package/datePicker.d.mts +1 -1
- package/evolve-ui.entries.json +556 -0
- package/favoriteButton.d.cts +1 -1
- package/favoriteButton.d.mts +1 -1
- package/featureFlags/hooks.d.cts +1 -1
- package/featureFlags/hooks.d.mts +1 -1
- package/fileUpload/testUtils/mockFilesAndImages.d.cts +3 -3
- package/fileUpload/testUtils/mockFilesAndImages.d.cts.map +1 -1
- package/fileUpload/testUtils/mockFilesAndImages.d.mts +3 -3
- package/fileUpload/testUtils/mockFilesAndImages.d.mts.map +1 -1
- package/fileUpload/testUtils/testUtils.d.cts +1 -1
- package/fileUpload/testUtils/testUtils.d.cts.map +1 -1
- package/fileUpload/testUtils/testUtils.d.mts +1 -1
- package/fileUpload/testUtils/testUtils.d.mts.map +1 -1
- package/{index-BVb-FJDo.d.mts → index-BYPklw8m.d.mts} +2 -2
- package/{index-BVb-FJDo.d.mts.map → index-BYPklw8m.d.mts.map} +1 -1
- package/{index-3V0Y3AU3.d.mts → index-Bvn6svaT.d.cts} +2 -2
- package/{index-3V0Y3AU3.d.mts.map → index-Bvn6svaT.d.cts.map} +1 -1
- package/{index-Bu7c6X7O.d.mts → index-C2zPeUs9.d.mts} +5 -5
- package/{index-Bu7c6X7O.d.mts.map → index-C2zPeUs9.d.mts.map} +1 -1
- package/{index-BXz3rMMk.d.cts → index-Cmz2OD6x.d.cts} +2 -2
- package/{index-BXz3rMMk.d.cts.map → index-Cmz2OD6x.d.cts.map} +1 -1
- package/{index-kchg551L.d.cts → index-DsZAxqnF.d.mts} +2 -2
- package/{index-kchg551L.d.cts.map → index-DsZAxqnF.d.mts.map} +1 -1
- package/{index-BzN9RaXe.d.cts → index-QtMvgJcp.d.cts} +5 -5
- package/{index-BzN9RaXe.d.cts.map → index-QtMvgJcp.d.cts.map} +1 -1
- package/{index-dpfLYhgI.d.mts → index-hrztez-b.d.mts} +2 -2
- package/{index-DBYqF9Sr.d.cts.map → index-hrztez-b.d.mts.map} +1 -1
- package/{index-DBYqF9Sr.d.cts → index-o9dwzLLE.d.cts} +2 -2
- package/{index-dpfLYhgI.d.mts.map → index-o9dwzLLE.d.cts.map} +1 -1
- package/index.d.cts +7 -7
- package/index.d.mts +7 -7
- package/package.json +2 -2
- package/providers.d.cts +1 -1
- package/providers.d.mts +1 -1
- package/src/Accordion/Accordion.tsx +233 -0
- package/src/AddressDisplay/AddressDisplay.tsx +43 -0
- package/src/AddressDisplay/components/addressComponents.tsx +111 -0
- package/src/AddressDisplay/components/addressField.tsx +25 -0
- package/src/AddressDisplay/components/addressSection.tsx +8 -0
- package/src/AddressDisplay/components/getCountryValue.tsx +31 -0
- package/src/AddressDisplay/types.ts +26 -0
- package/src/AutomatedCarousel/AutomatedCarousel.tsx +163 -0
- package/src/AutomatedCarousel/automatedCarousel.types.ts +7 -0
- package/src/AutomatedCarousel/components/CarouselProgressBar/CarouselProgressBar.tsx +139 -0
- package/src/AutomatedCarousel/components/CarouselProgressBar/components/CarouselProgressBarUnit/CarouselProgressBarUnit.tsx +165 -0
- package/src/Badge/Badge.tsx +104 -0
- package/src/Badge/Badge.types.ts +58 -0
- package/src/Badge/ItemBadge.tsx +97 -0
- package/src/Badge/LiveStatusBadge.tsx +93 -0
- package/src/BannerNotification/BannerNotification.tsx +157 -0
- package/src/BannerNotification/components/BannerNotificationSkeleton.tsx +39 -0
- package/src/BannerNotification/components/CalloutIcon/BannerIcon.tsx +48 -0
- package/src/BannerNotification/utils/getRandomTooltipId.ts +3 -0
- package/src/BottomSheet/BottomSheet.tsx +476 -0
- package/src/BottomSheet/components/BottomSheetBackdrop/BottomSheetBackdrop.tsx +47 -0
- package/src/BottomSheet/components/BottomSheetContentArea/BottomSheetContentArea.tsx +92 -0
- package/src/BottomSheet/components/BottomSheetOverlay/BottomSheetOverlayTranslate3d.tsx +196 -0
- package/src/BottomSheet/components/SheetDescription/SheetDescription.tsx +22 -0
- package/src/BottomSheet/components/SheetTitle/SheetTitle.tsx +21 -0
- package/src/BottomSheet/components/index.tsx +5 -0
- package/src/BottomSheet/hooks/index.tsx +13 -0
- package/src/BottomSheet/hooks/useAriaHider.tsx +91 -0
- package/src/BottomSheet/hooks/useBottomSheetServices.tsx +224 -0
- package/src/BottomSheet/hooks/useDragHandler.tsx +282 -0
- package/src/BottomSheet/hooks/useFocusTrap.tsx +113 -0
- package/src/BottomSheet/hooks/useLayoutEffect.tsx +4 -0
- package/src/BottomSheet/hooks/useOptimizedResizeObserver.tsx +94 -0
- package/src/BottomSheet/hooks/useOptimizedScrollState.tsx +87 -0
- package/src/BottomSheet/hooks/useReady.tsx +34 -0
- package/src/BottomSheet/hooks/useReducedMotion.tsx +22 -0
- package/src/BottomSheet/hooks/useScrollLock.tsx +143 -0
- package/src/BottomSheet/hooks/useSnapPoints.tsx +355 -0
- package/src/BottomSheet/hooks/useSpring.tsx +47 -0
- package/src/BottomSheet/hooks/useSpringInterpolationsTranslate3d.tsx +101 -0
- package/src/BottomSheet/index.tsx +237 -0
- package/src/BottomSheet/state/atoms.ts +147 -0
- package/src/BottomSheet/state/useBottomSheetStateMachine.ts +246 -0
- package/src/BottomSheet/types.ts +172 -0
- package/src/BottomSheet/utils.ts +65 -0
- package/src/Breadcrumbs/Breadcrumbs.tsx +126 -0
- package/src/Button/Button.tsx +164 -0
- package/src/Button/Button.types.ts +80 -0
- package/src/Button/buttonColorClasses.ts +53 -0
- package/src/Callout/Callout.tsx +136 -0
- package/src/Callout/Callout.types.ts +29 -0
- package/src/Callout/components/CalloutIcon/CalloutIcon.tsx +56 -0
- package/src/Card/CardGrid.tsx +263 -0
- package/src/Card/SingleCard.tsx +22 -0
- package/src/Card/cardFactory.tsx +176 -0
- package/src/Card/components/createBadge.tsx +34 -0
- package/src/Card/components/createFavoriteButton.tsx +40 -0
- package/src/Card/components/createImage.tsx +64 -0
- package/src/Card/components/createInfo.tsx +84 -0
- package/src/Card/components/createName.tsx +63 -0
- package/src/Card/components/createPriceStatus.tsx +100 -0
- package/src/Card/components/types.ts +4 -0
- package/src/Card/hooks/useCardVisibilityTracking.ts +82 -0
- package/src/Card/sharedProps.ts +12 -0
- package/src/Card/types.ts +62 -0
- package/src/Carousel/Carousel.tsx +513 -0
- package/src/Carousel/Carousel.types.ts +43 -0
- package/src/Carousel/Carousel.utils.ts +63 -0
- package/src/Carousel/components/DotButton/DotButton.tsx +42 -0
- package/src/Carousel/components/NavigationButtons/NavigationButtons.tsx +77 -0
- package/src/Carousel/components/TitleSection/TitleSection.tsx +61 -0
- package/src/Carousel/components/TitleSection/components/SubHeaderLeft/SubHeaderLeft.tsx +53 -0
- package/src/Carousel/components/TitleSection/components/Title/Title.tsx +46 -0
- package/src/Carousel/index.ts +2 -0
- package/src/Carousel/testUtils.ts +10 -0
- package/src/Chips/Chip.tsx +153 -0
- package/src/Chips/ChipGroup.tsx +173 -0
- package/src/Chips/SuggestionChip.tsx +15 -0
- package/src/Chips/chipTypes.ts +113 -0
- package/src/Chips/index.ts +4 -0
- package/src/ChoiceListItem/Checkbox.tsx +69 -0
- package/src/ChoiceListItem/Radio.tsx +61 -0
- package/src/ChoiceListItem/choiceListItem.tsx +99 -0
- package/src/ChoiceListItem/common.tsx +148 -0
- package/src/ChoiceListItem/index.ts +3 -0
- package/src/Collapsible/Collapsible.tsx +58 -0
- package/src/Confetti/Confetti.tsx +270 -0
- package/src/Confetti/index.ts +2 -0
- package/src/ContentPager/ContentPager.tsx +189 -0
- package/src/ContentPager/components/Page.tsx +24 -0
- package/src/CookieConsent/components/CookieCategoryRow/CookieCategoryRow.tsx +30 -0
- package/src/CookieConsent/components/CookieConsent/CookieConsent.tsx +74 -0
- package/src/CookieConsent/components/CookieConsentBanner/CookieConsentBanner.tsx +51 -0
- package/src/CookieConsent/components/CookieConsentModal/CookieConsentModal.tsx +64 -0
- package/src/CookieConsent/hooks/useCookieConsent.ts +170 -0
- package/src/CookieConsent/hooks/useCookieConsentState.ts +142 -0
- package/src/CookieConsent/index.ts +16 -0
- package/src/CookieConsent/types/cookieConsent.types.ts +79 -0
- package/src/CookieConsent/types/index.ts +7 -0
- package/src/Countdown/Countdown.tsx +161 -0
- package/src/Countdown/Countdown.types.ts +4 -0
- package/src/Countdown/hooks/useGetCountdown.ts +103 -0
- package/src/DateTimeInput/dateInput/DateInput.tsx +199 -0
- package/src/DateTimeInput/datePicker/DatePicker.tsx +138 -0
- package/src/DateTimeInput/datePicker/components/calendar/Calendar.tsx +72 -0
- package/src/DateTimeInput/datePicker/index.ts +2 -0
- package/src/DateTimeInput/timeInput/TimeInput.tsx +128 -0
- package/src/DateTimeInput/timePicker/TimePicker.tsx +118 -0
- package/src/DateTimeInput/timePicker/components/TimePopover/AmPmSwitch.tsx +103 -0
- package/src/DateTimeInput/timePicker/components/TimePopover/TimeFieldInput.tsx +26 -0
- package/src/DateTimeInput/timePicker/components/TimePopover/TimePopover.tsx +84 -0
- package/src/DateTimeInput/timePicker/components/TimePopover/TimePopover.utils.ts +67 -0
- package/src/DateTimeInput/timePicker/components/TimePopover/TimePopoverActions.tsx +26 -0
- package/src/DateTimeInput/timePicker/index.ts +2 -0
- package/src/DateTimeInput/utils/getDisplayDate.ts +15 -0
- package/src/DateTimeInput/utils/getDisplayTime.ts +15 -0
- package/src/DateTimeInput/utils/index.ts +2 -0
- package/src/DateTimeInput/utils/parseTimeValue.ts +54 -0
- package/src/Drawer/Drawer.tsx +446 -0
- package/src/Drawer/atoms.ts +4 -0
- package/src/Drawer/components/DialogActions/DialogActions.tsx +33 -0
- package/src/Drawer/components/DialogContent/DialogContent.tsx +80 -0
- package/src/Drawer/components/DialogHeader/DialogHeader.tsx +68 -0
- package/src/EducationalPopover/EducationalPopover.tsx +174 -0
- package/src/FavoriteButton/FavoriteButton.tsx +64 -0
- package/src/FavoriteButton/components/IconOnlyFavoriteButton/IconOnlyFavoriteButton.tsx +80 -0
- package/src/FavoriteButton/components/LabeledAnimatedFavoriteButton/LabeledAnimatedFavoriteButton.tsx +179 -0
- package/src/FavoriteButton/components/LabeledFavoriteButton/LabeledFavoriteButton.tsx +71 -0
- package/src/FavoriteButton/components/SmallHeartStraightIcon/SmallHeartStraightIcon.tsx +14 -0
- package/src/FavoriteButton/hooks/useFavoriteButtonState.ts +30 -0
- package/src/FavoriteButton/index.ts +2 -0
- package/src/FavoriteButton/types/favoriteButton.ts +87 -0
- package/src/FeatureFlags/devTools/FeatureFlagDevToolsUI.tsx +226 -0
- package/src/FeatureFlags/devTools/getFeatureFlagCookieOverrides.ts +30 -0
- package/src/FeatureFlags/devTools/utils/cookies.ts +169 -0
- package/src/FeatureFlags/hooks/index.ts +2 -0
- package/src/FeatureFlags/hooks/useFeatureFlag.tsx +19 -0
- package/src/FeatureFlags/hooks/useFeatureFlags.tsx +15 -0
- package/src/FileUpload/components/FileCard/FileCard.tsx +50 -0
- package/src/FileUpload/components/FileDropzone/FileDropzone.tsx +221 -0
- package/src/FileUpload/components/FileDropzone/components/DropzoneContent/DropzoneContent.tsx +28 -0
- package/src/FileUpload/components/FileDropzone/components/DropzoneContent/DropzoneText.tsx +81 -0
- package/src/FileUpload/components/FileDropzone/components/FileDropzoneDebugger/FileDropzoneDebugger.tsx +40 -0
- package/src/FileUpload/components/FileDropzone/components/FileDropzoneDebugger/FileRejectionsDisplay.tsx +110 -0
- package/src/FileUpload/components/FileDropzoneOverlay/FileDropzoneOverlay.tsx +183 -0
- package/src/FileUpload/components/FileDropzoneOverlay/components/OverlayDropzoneContent.tsx +146 -0
- package/src/FileUpload/components/FileDropzoneOverlay/components/OverlayDropzoneDragText.tsx +42 -0
- package/src/FileUpload/components/FileDropzoneOverlay/styles.ts +79 -0
- package/src/FileUpload/components/FilePreviewList/FilePreviewList.tsx +251 -0
- package/src/FileUpload/components/FilePreviewList/virtualizerComponents/FilePreviewVirtualizedList/FilePreviewVirtualizedList.tsx +88 -0
- package/src/FileUpload/components/FileUpload/FileUpload.tsx +63 -0
- package/src/FileUpload/components/FileUploadCanvas/FileUploadCanvas.tsx +125 -0
- package/src/FileUpload/components/GridFileCard/GridFileCard.tsx +364 -0
- package/src/FileUpload/components/GridFileCard/utils/sortable.ts +48 -0
- package/src/FileUpload/components/ListFileCard/ListFileCard.tsx +259 -0
- package/src/FileUpload/components/types.ts +78 -0
- package/src/FileUpload/hooks/filePreview/useImageFilePreviewUrl.ts +62 -0
- package/src/FileUpload/hooks/index.ts +11 -0
- package/src/FileUpload/hooks/upload/useHandleDragEnter/useHandleDragEnter.ts +154 -0
- package/src/FileUpload/hooks/upload/useHandleDrop/createFileRejectionHelpers.ts +273 -0
- package/src/FileUpload/hooks/upload/useHandleDrop/useHandleDrop.ts +153 -0
- package/src/FileUpload/hooks/upload/useUploadAvailability/useUploadAvailability.ts +44 -0
- package/src/FileUpload/hooks/validation/createDropzoneValidator.ts +41 -0
- package/src/FileUpload/hooks/validation/useFileValidation.ts +25 -0
- package/src/FileUpload/hooks/validation/useFileValidationLogic.ts +107 -0
- package/src/FileUpload/hooks/validation/useValidationMessages.ts +92 -0
- package/src/FileUpload/hooks/validation/useValidationState.ts +171 -0
- package/src/FileUpload/index.ts +57 -0
- package/src/FileUpload/providers/FileUploadProvider.tsx +219 -0
- package/src/FileUpload/providers/UploadValidationProvider.tsx +159 -0
- package/src/FileUpload/testUtils/mockFilesAndImages.ts +64 -0
- package/src/FileUpload/testUtils/testUtils.ts +111 -0
- package/src/FileUpload/types/commonTypes.ts +267 -0
- package/src/FileUpload/types/index.ts +31 -0
- package/src/FileUpload/types/sharedTypes.ts +159 -0
- package/src/FileUpload/utils/constants.ts +79 -0
- package/src/FileUpload/utils/createMessageContext.ts +180 -0
- package/src/FileUpload/utils/getFileExtensionsFromAcceptedTypes.ts +73 -0
- package/src/FileUpload/utils/getFilePluralizationText.ts +68 -0
- package/src/FileUpload/utils/getMimeTypes.ts +26 -0
- package/src/FileUpload/utils/messageUtils.ts +41 -0
- package/src/FileUpload/utils/styles.ts +68 -0
- package/src/FormLabel/FormLabel.tsx +212 -0
- package/src/IconButton/IconButton.tsx +154 -0
- package/src/Icons/CreditCardIcon/CreditCardIcon.tsx +73 -0
- package/src/Icons/CreditCardIcon/cardIcons.tsx +270 -0
- package/src/Icons/IconBase.tsx +133 -0
- package/src/Icons/anyIcon.ts +3 -0
- package/src/Icons/generatedIcons/Archive.tsx +48 -0
- package/src/Icons/generatedIcons/ArrowClockwise.tsx +48 -0
- package/src/Icons/generatedIcons/ArrowDown.tsx +48 -0
- package/src/Icons/generatedIcons/ArrowLeft.tsx +48 -0
- package/src/Icons/generatedIcons/ArrowRight.tsx +48 -0
- package/src/Icons/generatedIcons/ArrowSquareOut.tsx +51 -0
- package/src/Icons/generatedIcons/ArrowSquareRight.tsx +51 -0
- package/src/Icons/generatedIcons/ArrowUp.tsx +48 -0
- package/src/Icons/generatedIcons/ArrowsCounterClockwise.tsx +48 -0
- package/src/Icons/generatedIcons/ArrowsLeftRight.tsx +48 -0
- package/src/Icons/generatedIcons/ArrowsOutCardinal.tsx +48 -0
- package/src/Icons/generatedIcons/Bank.tsx +48 -0
- package/src/Icons/generatedIcons/Bell.tsx +51 -0
- package/src/Icons/generatedIcons/BookBookmark.tsx +51 -0
- package/src/Icons/generatedIcons/BookmarksSimple.tsx +51 -0
- package/src/Icons/generatedIcons/Broadcast.tsx +48 -0
- package/src/Icons/generatedIcons/CalendarBlank.tsx +48 -0
- package/src/Icons/generatedIcons/CalendarStar.tsx +51 -0
- package/src/Icons/generatedIcons/Camera.tsx +51 -0
- package/src/Icons/generatedIcons/CaretDown.tsx +48 -0
- package/src/Icons/generatedIcons/CaretLeft.tsx +48 -0
- package/src/Icons/generatedIcons/CaretRight.tsx +48 -0
- package/src/Icons/generatedIcons/CaretUp.tsx +48 -0
- package/src/Icons/generatedIcons/Certificate.tsx +51 -0
- package/src/Icons/generatedIcons/ChartBar.tsx +48 -0
- package/src/Icons/generatedIcons/Check.tsx +51 -0
- package/src/Icons/generatedIcons/CheckCircle.tsx +48 -0
- package/src/Icons/generatedIcons/CirclesFour.tsx +51 -0
- package/src/Icons/generatedIcons/Clock.tsx +48 -0
- package/src/Icons/generatedIcons/ClockCountdown.tsx +48 -0
- package/src/Icons/generatedIcons/Close.tsx +51 -0
- package/src/Icons/generatedIcons/CloudArrowUp.tsx +51 -0
- package/src/Icons/generatedIcons/CloudWarning.tsx +51 -0
- package/src/Icons/generatedIcons/Code.tsx +48 -0
- package/src/Icons/generatedIcons/Compass.tsx +51 -0
- package/src/Icons/generatedIcons/Confetti.tsx +51 -0
- package/src/Icons/generatedIcons/Copy.tsx +48 -0
- package/src/Icons/generatedIcons/CornersOut.tsx +48 -0
- package/src/Icons/generatedIcons/CreditCard.tsx +48 -0
- package/src/Icons/generatedIcons/Crown.tsx +51 -0
- package/src/Icons/generatedIcons/CrownSimple.tsx +51 -0
- package/src/Icons/generatedIcons/CurrencyCircleDollar.tsx +48 -0
- package/src/Icons/generatedIcons/CurrencyDollarSimple.tsx +51 -0
- package/src/Icons/generatedIcons/Desktop.tsx +51 -0
- package/src/Icons/generatedIcons/Detective.tsx +51 -0
- package/src/Icons/generatedIcons/DotOutline.tsx +46 -0
- package/src/Icons/generatedIcons/DotsSixVertical.tsx +51 -0
- package/src/Icons/generatedIcons/DotsThreeOutline.tsx +51 -0
- package/src/Icons/generatedIcons/DotsThreeOutlineVertical.tsx +51 -0
- package/src/Icons/generatedIcons/DownloadSimple.tsx +51 -0
- package/src/Icons/generatedIcons/EnvelopeSimple.tsx +48 -0
- package/src/Icons/generatedIcons/Eraser.tsx +51 -0
- package/src/Icons/generatedIcons/Eye.tsx +51 -0
- package/src/Icons/generatedIcons/EyeSlash.tsx +51 -0
- package/src/Icons/generatedIcons/FacebookLogo.tsx +48 -0
- package/src/Icons/generatedIcons/FileArchive.tsx +48 -0
- package/src/Icons/generatedIcons/FileArrowDown.tsx +48 -0
- package/src/Icons/generatedIcons/FileCsv.tsx +48 -0
- package/src/Icons/generatedIcons/FilePdf.tsx +48 -0
- package/src/Icons/generatedIcons/FileText.tsx +48 -0
- package/src/Icons/generatedIcons/Files.tsx +51 -0
- package/src/Icons/generatedIcons/Fire.tsx +51 -0
- package/src/Icons/generatedIcons/Flag.tsx +51 -0
- package/src/Icons/generatedIcons/FlagBannerFold.tsx +48 -0
- package/src/Icons/generatedIcons/FloppyDisk.tsx +51 -0
- package/src/Icons/generatedIcons/Gauge.tsx +51 -0
- package/src/Icons/generatedIcons/Gavel.tsx +51 -0
- package/src/Icons/generatedIcons/Gear.tsx +51 -0
- package/src/Icons/generatedIcons/GlobeHemisphereWest.tsx +51 -0
- package/src/Icons/generatedIcons/GoogleLogo.tsx +48 -0
- package/src/Icons/generatedIcons/GridNine.tsx +51 -0
- package/src/Icons/generatedIcons/HandCoins.tsx +51 -0
- package/src/Icons/generatedIcons/HandbagSimple.tsx +51 -0
- package/src/Icons/generatedIcons/Headset.tsx +51 -0
- package/src/Icons/generatedIcons/HeartStraight.tsx +51 -0
- package/src/Icons/generatedIcons/HourglassLow.tsx +48 -0
- package/src/Icons/generatedIcons/House.tsx +51 -0
- package/src/Icons/generatedIcons/Image.tsx +51 -0
- package/src/Icons/generatedIcons/ImageSquare.tsx +51 -0
- package/src/Icons/generatedIcons/ImagesSquare.tsx +51 -0
- package/src/Icons/generatedIcons/Info.tsx +48 -0
- package/src/Icons/generatedIcons/InstagramLogo.tsx +51 -0
- package/src/Icons/generatedIcons/Lightning.tsx +48 -0
- package/src/Icons/generatedIcons/Link.tsx +51 -0
- package/src/Icons/generatedIcons/LinkedinLogo.tsx +51 -0
- package/src/Icons/generatedIcons/List.tsx +48 -0
- package/src/Icons/generatedIcons/Lock.tsx +51 -0
- package/src/Icons/generatedIcons/LockOpen.tsx +51 -0
- package/src/Icons/generatedIcons/MagnifyingGlass.tsx +48 -0
- package/src/Icons/generatedIcons/MapPin.tsx +51 -0
- package/src/Icons/generatedIcons/MapPinSimpleArea.tsx +48 -0
- package/src/Icons/generatedIcons/Medal.tsx +48 -0
- package/src/Icons/generatedIcons/Megaphone.tsx +48 -0
- package/src/Icons/generatedIcons/Minus.tsx +45 -0
- package/src/Icons/generatedIcons/Money.tsx +51 -0
- package/src/Icons/generatedIcons/Notches.tsx +48 -0
- package/src/Icons/generatedIcons/NotePencil.tsx +48 -0
- package/src/Icons/generatedIcons/Package.tsx +51 -0
- package/src/Icons/generatedIcons/PaintBrush.tsx +51 -0
- package/src/Icons/generatedIcons/PaperPlaneTilt.tsx +51 -0
- package/src/Icons/generatedIcons/Paperclip.tsx +51 -0
- package/src/Icons/generatedIcons/Pause.tsx +51 -0
- package/src/Icons/generatedIcons/PencilLine.tsx +51 -0
- package/src/Icons/generatedIcons/PencilRuler.tsx +51 -0
- package/src/Icons/generatedIcons/PencilSimple.tsx +51 -0
- package/src/Icons/generatedIcons/Phone.tsx +51 -0
- package/src/Icons/generatedIcons/PinterestLogo.tsx +51 -0
- package/src/Icons/generatedIcons/Play.tsx +51 -0
- package/src/Icons/generatedIcons/Plus.tsx +51 -0
- package/src/Icons/generatedIcons/PlusCircle.tsx +48 -0
- package/src/Icons/generatedIcons/Printer.tsx +51 -0
- package/src/Icons/generatedIcons/Question.tsx +48 -0
- package/src/Icons/generatedIcons/Receipt.tsx +51 -0
- package/src/Icons/generatedIcons/Rows.tsx +51 -0
- package/src/Icons/generatedIcons/SealCheck.tsx +51 -0
- package/src/Icons/generatedIcons/SelectionSlash.tsx +48 -0
- package/src/Icons/generatedIcons/ShareNetwork.tsx +51 -0
- package/src/Icons/generatedIcons/ShieldCheck.tsx +51 -0
- package/src/Icons/generatedIcons/ShieldStar.tsx +51 -0
- package/src/Icons/generatedIcons/ShoppingCart.tsx +48 -0
- package/src/Icons/generatedIcons/ShuffleAngular.tsx +48 -0
- package/src/Icons/generatedIcons/SidebarSimple.tsx +48 -0
- package/src/Icons/generatedIcons/SlidersHorizontal.tsx +51 -0
- package/src/Icons/generatedIcons/Smiley.tsx +48 -0
- package/src/Icons/generatedIcons/Sparkle.tsx +51 -0
- package/src/Icons/generatedIcons/SpinnerGap.tsx +48 -0
- package/src/Icons/generatedIcons/StackPlus.tsx +48 -0
- package/src/Icons/generatedIcons/Star.tsx +51 -0
- package/src/Icons/generatedIcons/Storefront.tsx +51 -0
- package/src/Icons/generatedIcons/Swap.tsx +51 -0
- package/src/Icons/generatedIcons/Tag.tsx +51 -0
- package/src/Icons/generatedIcons/ThumbsDown.tsx +48 -0
- package/src/Icons/generatedIcons/ThumbsUp.tsx +48 -0
- package/src/Icons/generatedIcons/Toolbox.tsx +48 -0
- package/src/Icons/generatedIcons/Trash.tsx +48 -0
- package/src/Icons/generatedIcons/TrendUp.tsx +48 -0
- package/src/Icons/generatedIcons/Trophy.tsx +51 -0
- package/src/Icons/generatedIcons/Truck.tsx +51 -0
- package/src/Icons/generatedIcons/UploadSimple.tsx +51 -0
- package/src/Icons/generatedIcons/User.tsx +48 -0
- package/src/Icons/generatedIcons/Users.tsx +48 -0
- package/src/Icons/generatedIcons/UsersThree.tsx +51 -0
- package/src/Icons/generatedIcons/VideoCamera.tsx +51 -0
- package/src/Icons/generatedIcons/Warning.tsx +51 -0
- package/src/Icons/generatedIcons/WarningCircle.tsx +48 -0
- package/src/Icons/generatedIcons/WifiHigh.tsx +51 -0
- package/src/Icons/generatedIcons/XCircle.tsx +48 -0
- package/src/Icons/generatedIcons/XLogo.tsx +48 -0
- package/src/Icons/generatedIcons/YoutubeLogo.tsx +51 -0
- package/src/Icons/importedIcons.ts +152 -0
- package/src/Icons/index.ts +149 -0
- package/src/Icons/socialIcons/appleSocialIcon.tsx +50 -0
- package/src/Icons/socialIcons/facebookSocialIcon.tsx +41 -0
- package/src/Icons/socialIcons/googleSocialIcon.tsx +134 -0
- package/src/ImageCluster/ImageCluster.tsx +125 -0
- package/src/ImageSlider/ImageSlider.tsx +582 -0
- package/src/ImageSlider/ImageSlider.types.ts +90 -0
- package/src/ImageSlider/components/IndexIndicator/IndexIndicator.tsx +21 -0
- package/src/ImageSlider/components/NavigationButtons/NavigationButtons.tsx +113 -0
- package/src/ImageSlider/components/ResponsiveImage/ResponsiveImage.tsx +114 -0
- package/src/ImageSlider/components/ResponsiveImage/index.ts +1 -0
- package/src/ImageSlider/components/Thumbnails/Thumbnails.tsx +184 -0
- package/src/ImageSlider/constants.ts +59 -0
- package/src/ImageSlider/hooks/index.ts +3 -0
- package/src/ImageSlider/hooks/useImageSlider.ts +57 -0
- package/src/ImageSlider/hooks/useImageSliderNavigation.ts +133 -0
- package/src/ImageSlider/hooks/useImageSliderScrollHandler.ts +171 -0
- package/src/ImageSlider/index.ts +3 -0
- package/src/ImageSlider/utils/imageOptimization.ts +97 -0
- package/src/ImageSlider/utils/index.ts +1 -0
- package/src/InlineNotification/InlineNotification.tsx +95 -0
- package/src/JumpMenu/JumpMenu.tsx +395 -0
- package/src/JumpMenu/components/JumpMenuItem/JumpMenuItem.tsx +62 -0
- package/src/JumpMenu/hooks/useContainerTracking.ts +171 -0
- package/src/JumpMenu/hooks/useIntersectionObserver.ts +77 -0
- package/src/JumpMenu/hooks/useKeyboardNavigation.ts +102 -0
- package/src/JumpMenu/hooks/useResizeObserver.ts +53 -0
- package/src/JumpMenu/hooks/useSectionObserver.ts +102 -0
- package/src/JumpMenu/index.ts +2 -0
- package/src/JumpMenu/types/index.ts +19 -0
- package/src/Loading/Loading.tsx +39 -0
- package/src/Loading/components/LoadingDot/LoadingDot.tsx +16 -0
- package/src/LoadingSpinner/LoadingSpinner.tsx +20 -0
- package/src/Menu/Menu.tsx +372 -0
- package/src/Menu/components/MenuDivider/MenuDivider.tsx +5 -0
- package/src/Menu/components/MenuItem/MenuItem.tsx +298 -0
- package/src/Menu/context/menuContext.tsx +20 -0
- package/src/Menu/hooks/useMenu.tsx +18 -0
- package/src/Menu/index.ts +3 -0
- package/src/Modal/ComposableModal.tsx +313 -0
- package/src/Modal/Modal.tsx +231 -0
- package/src/Modal/components/BackButton/BackButton.tsx +43 -0
- package/src/Modal/components/Backdrop/Backdrop.tsx +62 -0
- package/src/Modal/components/CloseButton/CloseButton.tsx +55 -0
- package/src/Modal/components/ModalActions/ModalActions.tsx +135 -0
- package/src/Modal/components/ModalContent/ModalContent.tsx +163 -0
- package/src/Modal/components/ModalHeader/ModalHeader.tsx +84 -0
- package/src/Modal/components/ModalHeader/hooks/useHeaderAnimation.tsx +49 -0
- package/src/Modal/components/ModalProgressSteps/ModalProgressSteps.tsx +26 -0
- package/src/Modal/components/ModalSubTitle/ModalSubTitle.tsx +29 -0
- package/src/Modal/components/ModalTitle/ModalTitle.tsx +22 -0
- package/src/Modal/components/PreventModalScroll/PreventModalScroll.tsx +106 -0
- package/src/Modal/components/index.ts +12 -0
- package/src/Modal/context.ts +33 -0
- package/src/Modal/hooks/useCloseModal.ts +133 -0
- package/src/NotificationBadge/NotificationBadge.tsx +34 -0
- package/src/Pagination/AdvancedPagination.tsx +48 -0
- package/src/Pagination/Pagination.tsx +216 -0
- package/src/Pagination/components/AdvancedPaginator/AdvancedPaginator.tsx +52 -0
- package/src/Pagination/components/AdvancedPaginator/components/PageSelect/PageSelect.tsx +43 -0
- package/src/Pagination/components/ItemCountDisplay/ItemCountDisplay.tsx +32 -0
- package/src/Pagination/components/ItemCountSelect/ItemCountSelect.tsx +33 -0
- package/src/Pagination/index.tsx +3 -0
- package/src/Pagination/paginationProvider.tsx +234 -0
- package/src/Pagination/utils.tsx +36 -0
- package/src/PhoneInput/PhoneInput.tsx +509 -0
- package/src/PhoneInput/useDropdownLogic.tsx +163 -0
- package/src/ProgressCircle/ProgressCircle.tsx +246 -0
- package/src/ProgressCircle/hooks/useProgressStatusTransitions.ts +49 -0
- package/src/ProgressCircle/utils/progressCircle.constants.ts +27 -0
- package/src/ProgressSteps/ProgressSteps.tsx +160 -0
- package/src/SaveConfetti/SaveConfetti.tsx +277 -0
- package/src/SaveConfetti/index.ts +2 -0
- package/src/SearchInput/SearchInput.tsx +236 -0
- package/src/SegmentedControl/SegmentedControl.tsx +111 -0
- package/src/SegmentedControl/SegmentedControlGroup.tsx +94 -0
- package/src/SegmentedControl/index.ts +4 -0
- package/src/Select/Select.tsx +154 -0
- package/src/Select/SelectAsync.tsx +13 -0
- package/src/Select/SelectAsyncCreatable.tsx +14 -0
- package/src/Select/SelectCreatable.tsx +12 -0
- package/src/Select/reexportedComponents.tsx +5 -0
- package/src/Select/selectComponents.tsx +306 -0
- package/src/Skeleton/Skeleton.tsx +13 -0
- package/src/SplitButton/SplitButton.tsx +298 -0
- package/src/SplitButton/SplitButtonTrigger.tsx +55 -0
- package/src/StarRating/StarRating.tsx +165 -0
- package/src/StarRating/components/StarComponent/StarComponent.tsx +44 -0
- package/src/Table/Table.tsx +474 -0
- package/src/Table/components/TableHeader/TableHeader.tsx +166 -0
- package/src/Table/components/TablePagination/TablePagination.tsx +18 -0
- package/src/Table/components/TablePagination/components/ItemCountDisplay/ItemCountDisplay.tsx +17 -0
- package/src/Table/components/TablePagination/components/ItemCountSelect/ItemCountSelect.tsx +31 -0
- package/src/Table/components/TablePagination/components/TablePaginator/TablePaginator.tsx +37 -0
- package/src/Table/components/TablePagination/components/TablePaginator/components/PageSelect/PageSelect.tsx +32 -0
- package/src/Table/components/TableRow/TableRows.tsx +147 -0
- package/src/Table/components/TableRow/components/TableRowCell/TableRowCell.tsx +49 -0
- package/src/Table/components/TableShadow/TableShadow.tsx +46 -0
- package/src/Table/index.ts +2 -0
- package/src/Table/sharedState.ts +30 -0
- package/src/Table/sharedStyles.ts +1 -0
- package/src/Table/types.ts +55 -0
- package/src/Tabs/Tabs.tsx +358 -0
- package/src/TextArea/TextArea.tsx +157 -0
- package/src/TextInput/TextInput.tsx +173 -0
- package/src/Toast/Toast.tsx +64 -0
- package/src/Toast/components/ToastContainer/ToastContainer.tsx +48 -0
- package/src/Toast/index.ts +2 -0
- package/src/Toast/types/role.ts +1 -0
- package/src/Toast/utils/getIcon.tsx +41 -0
- package/src/ToggleSwitch/ToggleSwitch.tsx +188 -0
- package/src/Tooltip/InfoIconTooltip.tsx +47 -0
- package/src/Tooltip/Tooltip.tsx +41 -0
- package/src/Typography/InlineButton/InlineButton.tsx +166 -0
- package/src/Typography/Links/Links.tsx +113 -0
- package/src/Typography/Text/Text.tsx +239 -0
- package/src/ViewMore/ViewMore.tsx +226 -0
- package/src/WebRTCPlayer/WebRTCPlayer.tsx +325 -0
- package/src/WebRTCPlayer/adaptor/NativeWebRTCAdaptor.ts +588 -0
- package/src/WebRTCPlayer/hooks/useWebRTCStream.ts +571 -0
- package/src/WebRTCPlayer/index.ts +22 -0
- package/src/WebRTCPlayer/types.ts +95 -0
- package/src/breakpoints/index.tsx +1 -0
- package/src/breakpoints/utils.tsx +50 -0
- package/src/declarations.d.ts +7 -0
- package/src/grid/gridHighlighter.tsx +83 -0
- package/src/grid/index.ts +3 -0
- package/src/grid/pageGrid.tsx +37 -0
- package/src/grid/useSubGridCSS.tsx +214 -0
- package/src/hooks/useHorizontalScrollFade.ts +44 -0
- package/src/hooks/usePrevious.ts +14 -0
- package/src/index.ts +351 -0
- package/src/intl/index.ts +4 -0
- package/src/intl/utils.ts +67 -0
- package/src/mixins/horizontalScrollFadeMixin.ts +56 -0
- package/src/mixins/index.ts +18 -0
- package/src/mixins/propMixins.ts +389 -0
- package/src/providers/createContextProvider.ts +22 -0
- package/src/providers/designSystemProvider.tsx +218 -0
- package/src/providers/errorBoundaryProvider.tsx +179 -0
- package/src/providers/featureFlagProvider.tsx +18 -0
- package/src/providers/gridSizeProvider.tsx +23 -0
- package/src/providers/index.ts +12 -0
- package/src/providers/linkProvider.tsx +32 -0
- package/src/providers/normalize.tsx +93 -0
- package/src/providers/targets/DatePickerTarget.tsx +10 -0
- package/src/providers/targets/ModalTarget.tsx +14 -0
- package/src/providers/targets/TimePickerTarget.tsx +10 -0
- package/src/providers/themeContext.tsx +24 -0
- package/src/providers/windowSizeProvider.tsx +125 -0
- package/src/spacing/index.ts +1 -0
- package/src/spacing/spacing.ts +11 -0
- package/src/utils/countriesWithISOCodes.ts +1419 -0
- package/src/utils/dateTimeFormat.ts +257 -0
- package/src/utils/effectEventListener.ts +11 -0
- package/src/utils/formatFileSize.ts +18 -0
- package/src/utils/isClientSide.ts +1 -0
- package/src/utils/keepTransition.ts +15 -0
- package/src/utils/nodeEnv.ts +9 -0
- package/src/utils/smoothScrollTo.ts +47 -0
- package/src/utils/utilityTypes.ts +13 -0
- package/textInput.d.cts +1 -1
- package/textInput.d.mts +1 -1
- package/timePicker.d.cts +1 -1
- 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
|
+
};
|