@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,34 @@
|
|
|
1
|
+
import { ComponentProps } from 'react';
|
|
2
|
+
|
|
3
|
+
import { Badge } from '../../Badge/Badge';
|
|
4
|
+
import { CardComponent } from '../types';
|
|
5
|
+
import { CardHook } from './types';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Creates the card component that uses the provided hook `useGetBadgeState` to render a `Badge` for a Card. By default the props are `emphasis="bold"` and `round`.
|
|
9
|
+
*
|
|
10
|
+
* Returning `false` from the hook will render no badge.
|
|
11
|
+
*/
|
|
12
|
+
export const createBadge = <ExtraData,>({
|
|
13
|
+
useGetBadgeState,
|
|
14
|
+
}: {
|
|
15
|
+
/** Returns the props to pass to the badge, or `false` to render no badge. */
|
|
16
|
+
useGetBadgeState: CardHook<ExtraData, ComponentProps<typeof Badge> | false>;
|
|
17
|
+
}): CardComponent<ExtraData> => ({
|
|
18
|
+
Component: (props) => {
|
|
19
|
+
const badgeProps = useGetBadgeState(props);
|
|
20
|
+
|
|
21
|
+
if (badgeProps === false) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
return (
|
|
26
|
+
<Badge
|
|
27
|
+
className="absolute left-xs top-xs z-[1]"
|
|
28
|
+
emphasis="bold"
|
|
29
|
+
round
|
|
30
|
+
{...badgeProps}
|
|
31
|
+
/>
|
|
32
|
+
);
|
|
33
|
+
},
|
|
34
|
+
});
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { useCallback } from 'react';
|
|
2
|
+
|
|
3
|
+
import { FavoriteButton } from '../../FavoriteButton/FavoriteButton';
|
|
4
|
+
import { CardComponent } from '../types';
|
|
5
|
+
import { CardHook } from './types';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Creates the card component that adds a favorite button.
|
|
9
|
+
*
|
|
10
|
+
* Callbacks that modify the favorite button:
|
|
11
|
+
* - `isFavoriteButtonFavorited` - show the favorite button as favorited
|
|
12
|
+
* - `onFavoriteButtonClick` - handle the favorite button click
|
|
13
|
+
*/
|
|
14
|
+
export const createFavoriteButton = <ExtraData,>({
|
|
15
|
+
useIsFavorited,
|
|
16
|
+
useSetFavorited,
|
|
17
|
+
}: {
|
|
18
|
+
/** Returns whether the favorite button should be favorited. */
|
|
19
|
+
useIsFavorited: CardHook<ExtraData, boolean>;
|
|
20
|
+
/** Adds the onclick to the favorite button. */
|
|
21
|
+
useSetFavorited: CardHook<ExtraData, (favorited: boolean) => void>;
|
|
22
|
+
}): CardComponent<ExtraData> => ({
|
|
23
|
+
Component: (props) => {
|
|
24
|
+
const isFavoriteButtonFavorited = useIsFavorited(props);
|
|
25
|
+
const onFavoriteButtonClick = useSetFavorited(props);
|
|
26
|
+
|
|
27
|
+
// Memoize the click handler
|
|
28
|
+
const handleClick = useCallback(() => {
|
|
29
|
+
onFavoriteButtonClick(!isFavoriteButtonFavorited);
|
|
30
|
+
}, [isFavoriteButtonFavorited, onFavoriteButtonClick]);
|
|
31
|
+
|
|
32
|
+
return (
|
|
33
|
+
<FavoriteButton
|
|
34
|
+
className="absolute right-xs top-xs z-[2]"
|
|
35
|
+
favorited={isFavoriteButtonFavorited}
|
|
36
|
+
onClick={handleClick}
|
|
37
|
+
/>
|
|
38
|
+
);
|
|
39
|
+
},
|
|
40
|
+
});
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { ComponentType, useCallback } from 'react';
|
|
2
|
+
|
|
3
|
+
import { usePreventDefaultLinkOnClick } from '../../providers';
|
|
4
|
+
import { CardComponent } from '../types';
|
|
5
|
+
import { CardHook } from './types';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Helps style an image for a card.
|
|
9
|
+
*/
|
|
10
|
+
export const createImage = <ExtraData,>({
|
|
11
|
+
aspectRatio = 1,
|
|
12
|
+
ImageComponent,
|
|
13
|
+
useHref,
|
|
14
|
+
}: {
|
|
15
|
+
/** The your rendered image to use. Receives card data as props and `className`.
|
|
16
|
+
*
|
|
17
|
+
* **Do not forget to forward the className**
|
|
18
|
+
*/
|
|
19
|
+
ImageComponent: ComponentType<ExtraData & { className: string }>;
|
|
20
|
+
/** Optional parameter to set aspect ratio on the image (1:1 by default) */
|
|
21
|
+
aspectRatio?: number;
|
|
22
|
+
/** A hook that returns the href to use for the image (makes it a link) */
|
|
23
|
+
useHref?: CardHook<ExtraData, string>;
|
|
24
|
+
}): CardComponent<ExtraData> => ({
|
|
25
|
+
Component: (props) => {
|
|
26
|
+
const href = useHref?.(props);
|
|
27
|
+
const navigate = usePreventDefaultLinkOnClick();
|
|
28
|
+
|
|
29
|
+
const imageClasses = 'w-full object-cover';
|
|
30
|
+
const linkClasses = 'peer/card-image relative w-full cursor-pointer';
|
|
31
|
+
|
|
32
|
+
// Memoize click handler
|
|
33
|
+
const handleClick = useCallback((href: string) => navigate(href), [navigate]);
|
|
34
|
+
|
|
35
|
+
const image = (
|
|
36
|
+
<ImageComponent
|
|
37
|
+
className={imageClasses}
|
|
38
|
+
style={{ aspectRatio }}
|
|
39
|
+
{...props}
|
|
40
|
+
/>
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
if (href) {
|
|
44
|
+
return (
|
|
45
|
+
<a
|
|
46
|
+
className={linkClasses}
|
|
47
|
+
href={href}
|
|
48
|
+
onClick={handleClick(href)}
|
|
49
|
+
style={{ aspectRatio }}
|
|
50
|
+
tabIndex={-1}
|
|
51
|
+
>
|
|
52
|
+
{image}
|
|
53
|
+
</a>
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return image;
|
|
58
|
+
},
|
|
59
|
+
skeletonConfig: {
|
|
60
|
+
height: 282,
|
|
61
|
+
type: 'inline',
|
|
62
|
+
width: 282,
|
|
63
|
+
},
|
|
64
|
+
});
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { ReactNode, useCallback } from 'react';
|
|
2
|
+
|
|
3
|
+
import { usePreventDefaultLinkOnClick } from '../../providers';
|
|
4
|
+
import { SubtleWeakLink } from '../../Typography/Links/Links';
|
|
5
|
+
import { BodySecondary } from '../../Typography/Text/Text';
|
|
6
|
+
import { CardComponent } from '../types';
|
|
7
|
+
import { CardHook } from './types';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* The sizes of the shadows used in the card.
|
|
11
|
+
*
|
|
12
|
+
* Pass this to the shadowSize prop of `createInfo`.
|
|
13
|
+
*/
|
|
14
|
+
export const shadowSizes = {
|
|
15
|
+
footer: 141,
|
|
16
|
+
location: 282,
|
|
17
|
+
sellerName: 143,
|
|
18
|
+
shipping: 79,
|
|
19
|
+
} as const;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Creates the card component that uses the given key of the `CardData` as a piece of info.
|
|
23
|
+
*
|
|
24
|
+
* This info might include
|
|
25
|
+
* - Seller Name
|
|
26
|
+
* - Location
|
|
27
|
+
* - Shipping
|
|
28
|
+
* - Footer
|
|
29
|
+
*/
|
|
30
|
+
export const createInfo = <ExtraData,>({
|
|
31
|
+
className = 'line-clamp-2',
|
|
32
|
+
skeletonWidth,
|
|
33
|
+
useHref,
|
|
34
|
+
useText,
|
|
35
|
+
}: {
|
|
36
|
+
/**
|
|
37
|
+
* Pass styles down including line clamping
|
|
38
|
+
*
|
|
39
|
+
* @default 'line-clamp-2'
|
|
40
|
+
*/
|
|
41
|
+
className?: string;
|
|
42
|
+
/** The width of the shadow to use. See `shadowSizes` export for options. */
|
|
43
|
+
skeletonWidth?: number;
|
|
44
|
+
/** A hook that returns the href to use for the name (makes it a link) */
|
|
45
|
+
useHref?: CardHook<ExtraData, string>;
|
|
46
|
+
/** A hook that returns the text to use for the component */
|
|
47
|
+
useText: CardHook<ExtraData, ReactNode>;
|
|
48
|
+
}): CardComponent<ExtraData> => ({
|
|
49
|
+
Component: (props) => {
|
|
50
|
+
const info = useText(props);
|
|
51
|
+
const href = useHref?.(props);
|
|
52
|
+
const navigate = usePreventDefaultLinkOnClick();
|
|
53
|
+
|
|
54
|
+
// Memoize the click handler
|
|
55
|
+
const handleClick = useCallback((href: string) => navigate(href), [navigate]);
|
|
56
|
+
|
|
57
|
+
if (href) {
|
|
58
|
+
return (
|
|
59
|
+
<SubtleWeakLink
|
|
60
|
+
className={className}
|
|
61
|
+
href={href}
|
|
62
|
+
onClick={handleClick(href)}
|
|
63
|
+
size="sm"
|
|
64
|
+
>
|
|
65
|
+
{info}
|
|
66
|
+
</SubtleWeakLink>
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return (
|
|
71
|
+
<BodySecondary
|
|
72
|
+
className={className}
|
|
73
|
+
color="secondary"
|
|
74
|
+
>
|
|
75
|
+
{info}
|
|
76
|
+
</BodySecondary>
|
|
77
|
+
);
|
|
78
|
+
},
|
|
79
|
+
skeletonConfig: {
|
|
80
|
+
height: 22,
|
|
81
|
+
type: 'inline',
|
|
82
|
+
width: skeletonWidth,
|
|
83
|
+
},
|
|
84
|
+
});
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { cn } from '@evolve.ui/theme-system';
|
|
2
|
+
import { ReactNode, useMemo } from 'react';
|
|
3
|
+
|
|
4
|
+
import { usePreventDefaultLinkOnClick } from '../../providers';
|
|
5
|
+
import { SubtleMonochromeLink } from '../../Typography/Links/Links';
|
|
6
|
+
import { BodySecondary } from '../../Typography/Text/Text';
|
|
7
|
+
import { CardComponent } from '../types';
|
|
8
|
+
import { CardHook } from './types';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Creates the card component with default "name" styles
|
|
12
|
+
*/
|
|
13
|
+
export const createName = <ExtraData,>({
|
|
14
|
+
className = 'line-clamp-2',
|
|
15
|
+
useHref,
|
|
16
|
+
useText,
|
|
17
|
+
}: {
|
|
18
|
+
/**
|
|
19
|
+
* Pass styles down including line clamping
|
|
20
|
+
*
|
|
21
|
+
* @default 'line-clamp-2'
|
|
22
|
+
*/
|
|
23
|
+
className?: string;
|
|
24
|
+
/** The number of lines to wrap */
|
|
25
|
+
lineClamp?: number;
|
|
26
|
+
/** A hook that returns the href to use for the name (makes it a link) */
|
|
27
|
+
useHref?: CardHook<ExtraData, string>;
|
|
28
|
+
/** A hook that returns the text to use for the component */
|
|
29
|
+
useText: CardHook<ExtraData, ReactNode>;
|
|
30
|
+
}): CardComponent<ExtraData> => ({
|
|
31
|
+
Component: (props) => {
|
|
32
|
+
const navigate = usePreventDefaultLinkOnClick();
|
|
33
|
+
const name = useText(props);
|
|
34
|
+
const href = useHref?.(props);
|
|
35
|
+
|
|
36
|
+
// Memoize the full class names
|
|
37
|
+
const linkClasses = useMemo(
|
|
38
|
+
() =>
|
|
39
|
+
cn('hui-card-name peer-hover/card-image:text-link-primary peer-hover/card-image:underline', className),
|
|
40
|
+
[]
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
if (href) {
|
|
44
|
+
return (
|
|
45
|
+
<SubtleMonochromeLink
|
|
46
|
+
className={linkClasses}
|
|
47
|
+
href={href}
|
|
48
|
+
onClick={navigate(href)}
|
|
49
|
+
size="md"
|
|
50
|
+
>
|
|
51
|
+
{name}
|
|
52
|
+
</SubtleMonochromeLink>
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return <BodySecondary className={linkClasses}>{name}</BodySecondary>;
|
|
57
|
+
},
|
|
58
|
+
skeletonConfig: {
|
|
59
|
+
height: 24,
|
|
60
|
+
type: 'inline',
|
|
61
|
+
width: 230,
|
|
62
|
+
},
|
|
63
|
+
});
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { useMemo } from 'react';
|
|
2
|
+
import { useIntl } from 'react-intl';
|
|
3
|
+
|
|
4
|
+
import { InlineButton } from '../../Typography/InlineButton/InlineButton';
|
|
5
|
+
import { BodyPrimary } from '../../Typography/Text/Text';
|
|
6
|
+
import { CardComponent } from '../types';
|
|
7
|
+
import { CardHook } from './types';
|
|
8
|
+
|
|
9
|
+
export const priceStatusSeeSoldPriceIntlKey = 'hui.card.priceStatusSeeSoldPrice';
|
|
10
|
+
export const priceStatusPreviewOnlyIntlKey = 'hui.card.priceStatusPreviewOnly';
|
|
11
|
+
export const priceStatusSoldIntlKey = 'hui.card.priceStatusSold';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Creates the card component that represents price.
|
|
15
|
+
*/
|
|
16
|
+
export const createPriceStatus = <ExtraData,>({
|
|
17
|
+
useBidCount,
|
|
18
|
+
useIsPriceStatusHidden,
|
|
19
|
+
useIsPriceStatusPreviewOnly,
|
|
20
|
+
useIsPriceStatusSold,
|
|
21
|
+
useOnSeeSoldPriceClick,
|
|
22
|
+
usePrice,
|
|
23
|
+
useShouldPriceStatusShowBidCount,
|
|
24
|
+
}: {
|
|
25
|
+
/** A hook that returns the bid count to use for the component */
|
|
26
|
+
useBidCount?: CardHook<ExtraData, string>;
|
|
27
|
+
/** Returns whether the price status should be hidden. */
|
|
28
|
+
useIsPriceStatusHidden?: CardHook<ExtraData, boolean>;
|
|
29
|
+
/** Returns whether the price status should be "Preview Only". */
|
|
30
|
+
useIsPriceStatusPreviewOnly?: CardHook<ExtraData, boolean>;
|
|
31
|
+
/** Returns whether the price status should be "Sold for". */
|
|
32
|
+
useIsPriceStatusSold?: CardHook<ExtraData, boolean>;
|
|
33
|
+
/** Adds the onclick to the "See Sold Price" button. */
|
|
34
|
+
useOnSeeSoldPriceClick?: CardHook<ExtraData, () => void>;
|
|
35
|
+
/** A hook that returns the price to use for the component */
|
|
36
|
+
usePrice: CardHook<ExtraData, string>;
|
|
37
|
+
/** Returns whether the price status should show the bid count. */
|
|
38
|
+
useShouldPriceStatusShowBidCount?: CardHook<ExtraData, boolean>;
|
|
39
|
+
}): CardComponent<ExtraData> => ({
|
|
40
|
+
Component: (props) => {
|
|
41
|
+
const price = usePrice(props);
|
|
42
|
+
const bidCount = useBidCount?.(props);
|
|
43
|
+
const { formatMessage } = useIntl();
|
|
44
|
+
|
|
45
|
+
const isPriceStatusHidden = useIsPriceStatusHidden?.(props);
|
|
46
|
+
const isPriceStatusPreviewOnly = useIsPriceStatusPreviewOnly?.(props);
|
|
47
|
+
const isPriceStatusSold = useIsPriceStatusSold?.(props);
|
|
48
|
+
const onSeeSoldPriceClick = useOnSeeSoldPriceClick?.(props);
|
|
49
|
+
const shouldPriceStatusShowBidCount = useShouldPriceStatusShowBidCount?.(props);
|
|
50
|
+
|
|
51
|
+
// Memoize classes
|
|
52
|
+
const containerClasses = 'flex gap-xs';
|
|
53
|
+
const textClasses = 'hui-text-h5';
|
|
54
|
+
|
|
55
|
+
// Memoize formatMessage calls
|
|
56
|
+
const seeSoldPriceText = useMemo(
|
|
57
|
+
() => formatMessage({ defaultMessage: 'See Sold Price', id: priceStatusSeeSoldPriceIntlKey }),
|
|
58
|
+
[formatMessage]
|
|
59
|
+
);
|
|
60
|
+
const previewOnlyText = useMemo(
|
|
61
|
+
() => formatMessage({ defaultMessage: 'Preview Only', id: priceStatusPreviewOnlyIntlKey }),
|
|
62
|
+
[formatMessage]
|
|
63
|
+
);
|
|
64
|
+
const soldForText = useMemo(
|
|
65
|
+
() =>
|
|
66
|
+
formatMessage(
|
|
67
|
+
{
|
|
68
|
+
defaultMessage: 'Sold for {price}',
|
|
69
|
+
id: priceStatusSoldIntlKey,
|
|
70
|
+
},
|
|
71
|
+
{ price }
|
|
72
|
+
),
|
|
73
|
+
[formatMessage, price]
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
if (isPriceStatusHidden) {
|
|
77
|
+
return <InlineButton onClick={() => onSeeSoldPriceClick}>{seeSoldPriceText}</InlineButton>;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (isPriceStatusPreviewOnly) {
|
|
81
|
+
return <span className={textClasses}>{previewOnlyText}</span>;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (isPriceStatusSold) {
|
|
85
|
+
return <div className={containerClasses}>{soldForText}</div>;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return (
|
|
89
|
+
<div className={containerClasses}>
|
|
90
|
+
<span className={textClasses}>{price}</span>
|
|
91
|
+
{shouldPriceStatusShowBidCount && bidCount && <BodyPrimary color="secondary">{bidCount}</BodyPrimary>}
|
|
92
|
+
</div>
|
|
93
|
+
);
|
|
94
|
+
},
|
|
95
|
+
skeletonConfig: {
|
|
96
|
+
height: 22,
|
|
97
|
+
type: 'inline',
|
|
98
|
+
width: 56,
|
|
99
|
+
},
|
|
100
|
+
});
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { useCallback, useRef } from 'react';
|
|
2
|
+
|
|
3
|
+
import { useIntersectionObserver } from '../../JumpMenu/hooks/useIntersectionObserver';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Options for the useCardVisibilityTracking hook
|
|
7
|
+
*/
|
|
8
|
+
type UseCardVisibilityTrackingOptions = {
|
|
9
|
+
/**
|
|
10
|
+
* Threshold at which to trigger the visibility callback.
|
|
11
|
+
* 0.5 means the callback fires when 50% of the card is visible.
|
|
12
|
+
* @default 0.5
|
|
13
|
+
*/
|
|
14
|
+
threshold?: number;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Hook that tracks when a card becomes visible in the viewport
|
|
19
|
+
* and fires a callback only once per card.
|
|
20
|
+
*
|
|
21
|
+
* @param onVisible - Callback function to call when a card becomes visible
|
|
22
|
+
* @param options - Configuration options for visibility detection
|
|
23
|
+
* @returns A function that returns a ref callback for a specific card key
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```tsx
|
|
27
|
+
* const getVisibilityRef = useCardVisibilityTracking(
|
|
28
|
+
* (cardKey) => trackItemVisible(cardKey),
|
|
29
|
+
* { threshold: 0.5 }
|
|
30
|
+
* );
|
|
31
|
+
*
|
|
32
|
+
* <Card visibilityRef={getVisibilityRef('card-123')} />
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export const useCardVisibilityTracking = <CardKey extends string | number>(
|
|
36
|
+
onVisible: (cardKey: CardKey) => void,
|
|
37
|
+
options: UseCardVisibilityTrackingOptions = {}
|
|
38
|
+
) => {
|
|
39
|
+
const { threshold = 0.5 } = options;
|
|
40
|
+
|
|
41
|
+
// Track which cards have already triggered the callback
|
|
42
|
+
const seenCardsRef = useRef<Set<string>>(new Set());
|
|
43
|
+
|
|
44
|
+
// Handle intersection changes
|
|
45
|
+
const handleIntersection = useCallback(
|
|
46
|
+
(entries: IntersectionObserverEntry[]) => {
|
|
47
|
+
entries.forEach((entry) => {
|
|
48
|
+
// Only fire callback if card is intersecting and meets the threshold requirement
|
|
49
|
+
if (entry.isIntersecting && entry.intersectionRatio >= threshold) {
|
|
50
|
+
// Extract card key from the element's data attribute
|
|
51
|
+
const element = entry.target as HTMLElement;
|
|
52
|
+
const cardKey = element.getAttribute('data-card-key');
|
|
53
|
+
|
|
54
|
+
if (cardKey && !seenCardsRef.current.has(cardKey)) {
|
|
55
|
+
seenCardsRef.current.add(cardKey);
|
|
56
|
+
onVisible(cardKey as CardKey);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
},
|
|
61
|
+
[onVisible, threshold]
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
// Create intersection observer with specified threshold
|
|
65
|
+
const { observe } = useIntersectionObserver(handleIntersection, {
|
|
66
|
+
threshold,
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
// Return a function that creates a ref callback for a specific card key
|
|
70
|
+
const getRefCallback = useCallback(
|
|
71
|
+
(cardKey: CardKey) => (element: Element | null) => {
|
|
72
|
+
if (element) {
|
|
73
|
+
// Set the card key as a data attribute
|
|
74
|
+
(element as HTMLElement).setAttribute('data-card-key', String(cardKey));
|
|
75
|
+
observe(element);
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
[observe]
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
return getRefCallback;
|
|
82
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { CreatedCard } from './cardFactory';
|
|
2
|
+
|
|
3
|
+
export type SharedProps<CardData> = {
|
|
4
|
+
/**
|
|
5
|
+
* The card to render. Must be created by `cardFactory`.
|
|
6
|
+
*/
|
|
7
|
+
card: CreatedCard<CardData>;
|
|
8
|
+
/**
|
|
9
|
+
* Force render the skeleton card.
|
|
10
|
+
*/
|
|
11
|
+
forceSkeleton?: boolean;
|
|
12
|
+
};
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { JSX, ReactNode } from 'react';
|
|
2
|
+
|
|
3
|
+
export type CardComponent<ExtraData> = {
|
|
4
|
+
/**
|
|
5
|
+
* Component that gets rendered. Automatically gets passed all values from the card data.
|
|
6
|
+
*/
|
|
7
|
+
Component: (props: { key?: number } & ExtraData) => JSX.Element | null;
|
|
8
|
+
/**
|
|
9
|
+
* The skeleton size of the component.
|
|
10
|
+
*
|
|
11
|
+
* We are assuming the item card is `282px` wide.
|
|
12
|
+
*
|
|
13
|
+
* `inline` means that it will be tracked and spacing will be added accordingly.
|
|
14
|
+
*
|
|
15
|
+
* `absolute` means that it will not be tracked, so you just put a `rect` wherever you like.
|
|
16
|
+
*/
|
|
17
|
+
skeletonConfig?:
|
|
18
|
+
| {
|
|
19
|
+
height?: number;
|
|
20
|
+
rx?: number;
|
|
21
|
+
ry?: number;
|
|
22
|
+
type: 'inline';
|
|
23
|
+
width?: number;
|
|
24
|
+
}
|
|
25
|
+
| {
|
|
26
|
+
node: ReactNode;
|
|
27
|
+
type: 'absolute';
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export type Spacer = {
|
|
32
|
+
spacerPx: number;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- hammer-parity: the ExtraData generic is irrelevant to this Spacer type guard (only `spacerPx` is checked); `unknown` breaks callers via contravariance on CardComponent's Component param
|
|
36
|
+
export const isSpacer = (component: CardComponent<any> | Spacer): component is Spacer =>
|
|
37
|
+
(component as Spacer).spacerPx > 0;
|
|
38
|
+
|
|
39
|
+
export type CardSpec<ExtraData> = {
|
|
40
|
+
/**
|
|
41
|
+
* The styles for the container of the card.
|
|
42
|
+
*/
|
|
43
|
+
className?: string;
|
|
44
|
+
/**
|
|
45
|
+
* The components that make up the card.
|
|
46
|
+
*
|
|
47
|
+
* If you need space between components, do not style the components,
|
|
48
|
+
* instead, add a number to the array, which will be interpreted as
|
|
49
|
+
* margin-bottom to the above component.
|
|
50
|
+
*/
|
|
51
|
+
components: (CardComponent<ExtraData> | Spacer)[];
|
|
52
|
+
/**
|
|
53
|
+
* The name of the card.
|
|
54
|
+
*
|
|
55
|
+
* Needed for React for better dev experience.
|
|
56
|
+
*/
|
|
57
|
+
name: string;
|
|
58
|
+
/**
|
|
59
|
+
* The height of the skeleton card, if for some reason, the computed one is incorrect.
|
|
60
|
+
*/
|
|
61
|
+
overrideSkeletonHeightPx?: number;
|
|
62
|
+
};
|