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