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