@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,133 @@
|
|
|
1
|
+
import { RefObject, useCallback, useEffect, useState } from 'react';
|
|
2
|
+
|
|
3
|
+
import { ImageSliderCard, ThumbnailDisplay } from '../ImageSlider.types';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Props for the useImageSliderNavigation hook
|
|
7
|
+
*/
|
|
8
|
+
type UseImageSliderNavigationProps = {
|
|
9
|
+
/** The cards in the slider */
|
|
10
|
+
cards: ImageSliderCard[];
|
|
11
|
+
/** Optional key to identify when content has changed (e.g., an item id) */
|
|
12
|
+
contentKey?: string | number;
|
|
13
|
+
/** Ref to the content container */
|
|
14
|
+
contentRef: RefObject<HTMLDivElement | null>;
|
|
15
|
+
/** Whether the slider is currently scrolling */
|
|
16
|
+
isScrolling: boolean;
|
|
17
|
+
/** Total number of pages/slides */
|
|
18
|
+
numberOfPages: number;
|
|
19
|
+
/** Function to reset the gallery hover state when content changes (new URL/different images) */
|
|
20
|
+
setHasHoveredGallery: (hasHovered: boolean) => void;
|
|
21
|
+
/** Display mode for navigation controls; 'index' uses same button visibility as horizontal */
|
|
22
|
+
thumbnailDisplay?: ThumbnailDisplay;
|
|
23
|
+
/** Orientation of the thumbnail previews */
|
|
24
|
+
thumbnailOrientation?: 'vertical' | 'horizontal';
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Hook for managing navigation state and handlers in the ImageSlider.
|
|
29
|
+
* Implements wraparound navigation where clicking previous on the first image
|
|
30
|
+
* jumps to the last image, and clicking next on the last image jumps to the first.
|
|
31
|
+
* @param props - Navigation configuration
|
|
32
|
+
* @returns Navigation state and handlers
|
|
33
|
+
*/
|
|
34
|
+
export const useImageSliderNavigation = ({
|
|
35
|
+
contentKey,
|
|
36
|
+
contentRef,
|
|
37
|
+
isScrolling,
|
|
38
|
+
numberOfPages,
|
|
39
|
+
setHasHoveredGallery,
|
|
40
|
+
thumbnailDisplay = ThumbnailDisplay.Thumbnails,
|
|
41
|
+
thumbnailOrientation = 'vertical',
|
|
42
|
+
}: UseImageSliderNavigationProps) => {
|
|
43
|
+
const [currentPage, setCurrentPage] = useState(1);
|
|
44
|
+
|
|
45
|
+
// For horizontal thumbnails or index display, always show buttons even with single image
|
|
46
|
+
// For vertical thumbnails, hide buttons when there's only one image
|
|
47
|
+
const showNavButtonsWithSingleImage =
|
|
48
|
+
thumbnailOrientation === 'horizontal' || thumbnailDisplay === ThumbnailDisplay.Index;
|
|
49
|
+
const showPreviousPageButton = showNavButtonsWithSingleImage ? true : numberOfPages > 1;
|
|
50
|
+
const showNextPageButton = showNavButtonsWithSingleImage ? true : numberOfPages > 1;
|
|
51
|
+
|
|
52
|
+
// For horizontal/index with single image, disable buttons
|
|
53
|
+
// For vertical or multiple images, use wraparound navigation (never disabled)
|
|
54
|
+
const isPreviousPageDisabled = showNavButtonsWithSingleImage && numberOfPages <= 1;
|
|
55
|
+
const isNextPageDisabled = showNavButtonsWithSingleImage && numberOfPages <= 1;
|
|
56
|
+
|
|
57
|
+
const goToPreviousPage = useCallback(() => {
|
|
58
|
+
if (!isScrolling) {
|
|
59
|
+
// Trigger hover state to load all images when navigation is used
|
|
60
|
+
setHasHoveredGallery(true);
|
|
61
|
+
if (currentPage > 1) {
|
|
62
|
+
setCurrentPage(currentPage - 1);
|
|
63
|
+
} else {
|
|
64
|
+
// Wrap to last page when on first page
|
|
65
|
+
setCurrentPage(numberOfPages);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}, [currentPage, numberOfPages, isScrolling, setCurrentPage, setHasHoveredGallery]);
|
|
69
|
+
|
|
70
|
+
const goToNextPage = useCallback(() => {
|
|
71
|
+
if (!isScrolling) {
|
|
72
|
+
// Trigger hover state to load all images when navigation is used
|
|
73
|
+
setHasHoveredGallery(true);
|
|
74
|
+
if (currentPage < numberOfPages) {
|
|
75
|
+
setCurrentPage(currentPage + 1);
|
|
76
|
+
} else {
|
|
77
|
+
// Wrap to first page when on last page
|
|
78
|
+
setCurrentPage(1);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}, [currentPage, numberOfPages, isScrolling, setCurrentPage, setHasHoveredGallery]);
|
|
82
|
+
|
|
83
|
+
const handleThumbnailClick = useCallback(
|
|
84
|
+
(pageNumber: number) => {
|
|
85
|
+
if (!isScrolling) {
|
|
86
|
+
// Trigger hover state to load all images when thumbnail navigation is used
|
|
87
|
+
setHasHoveredGallery(true);
|
|
88
|
+
setCurrentPage(pageNumber);
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
[isScrolling, setCurrentPage, setHasHoveredGallery]
|
|
92
|
+
);
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Handles keyboard navigation for the slider.
|
|
96
|
+
* Allows using Left and Right arrow keys to navigate between images.
|
|
97
|
+
*/
|
|
98
|
+
const onKeyNavigation = useCallback(
|
|
99
|
+
(event: React.KeyboardEvent) => {
|
|
100
|
+
if (event.key === 'ArrowRight') {
|
|
101
|
+
goToNextPage();
|
|
102
|
+
} else if (event.key === 'ArrowLeft') {
|
|
103
|
+
goToPreviousPage();
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
[goToNextPage, goToPreviousPage]
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
useEffect(() => {
|
|
110
|
+
setCurrentPage(1);
|
|
111
|
+
// Reset hover state when content changes (new content key/different images)
|
|
112
|
+
setHasHoveredGallery(false);
|
|
113
|
+
if (contentRef.current && typeof contentRef.current.scrollTo === 'function') {
|
|
114
|
+
contentRef.current.scrollTo({
|
|
115
|
+
behavior: 'instant',
|
|
116
|
+
left: 0,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}, [contentKey, contentRef, setHasHoveredGallery]);
|
|
120
|
+
|
|
121
|
+
return {
|
|
122
|
+
currentPage,
|
|
123
|
+
goToNextPage,
|
|
124
|
+
goToPreviousPage,
|
|
125
|
+
handleThumbnailClick,
|
|
126
|
+
isNextPageDisabled,
|
|
127
|
+
isPreviousPageDisabled,
|
|
128
|
+
onKeyNavigation,
|
|
129
|
+
setCurrentPage,
|
|
130
|
+
showNextPageButton,
|
|
131
|
+
showPreviousPageButton,
|
|
132
|
+
};
|
|
133
|
+
};
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { debounce } from 'es-toolkit';
|
|
2
|
+
import { RefObject, useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
3
|
+
|
|
4
|
+
import { useWindowIsMobile } from '../../providers';
|
|
5
|
+
import { ANIMATION, MOBILE_CARD, SPACING } from '../constants';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Props for the useImageSliderScrollHandler hook
|
|
9
|
+
*/
|
|
10
|
+
type UseImageSliderScrollHandlerProps = {
|
|
11
|
+
/** Ref to the content container */
|
|
12
|
+
contentRef: RefObject<HTMLDivElement | null>;
|
|
13
|
+
/** Current page number */
|
|
14
|
+
currentPage: number;
|
|
15
|
+
/**
|
|
16
|
+
* Max width in px of each carousel card on mobile (matches `responsiveImageConfig.desktopSize` on the slider).
|
|
17
|
+
* @default MOBILE_CARD.MAX_WIDTH
|
|
18
|
+
*/
|
|
19
|
+
maxMobileCardWidth?: number;
|
|
20
|
+
/** Total number of pages */
|
|
21
|
+
numberOfPages: number;
|
|
22
|
+
/** Function to update the current page */
|
|
23
|
+
setCurrentPage: (page: number) => void;
|
|
24
|
+
/** Function to update the scrolling state */
|
|
25
|
+
setIsScrolling?: (isScrolling: boolean) => void;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Hook for managing scroll behavior and page tracking in the ImageSlider
|
|
30
|
+
* @param props - Scroll handler configuration
|
|
31
|
+
* @returns Scroll handlers and scrolling state
|
|
32
|
+
*/
|
|
33
|
+
export const useImageSliderScrollHandler = ({
|
|
34
|
+
contentRef,
|
|
35
|
+
currentPage,
|
|
36
|
+
maxMobileCardWidth = MOBILE_CARD.MAX_WIDTH,
|
|
37
|
+
numberOfPages,
|
|
38
|
+
setCurrentPage,
|
|
39
|
+
setIsScrolling,
|
|
40
|
+
}: UseImageSliderScrollHandlerProps) => {
|
|
41
|
+
const [internalIsScrolling, setInternalIsScrolling] = useState(false);
|
|
42
|
+
const isScrollingState = setIsScrolling ? internalIsScrolling : false;
|
|
43
|
+
const isMobile = useWindowIsMobile();
|
|
44
|
+
const previousPageRef = useRef<number>(currentPage);
|
|
45
|
+
|
|
46
|
+
// Handle programmatic scrolling on page changes (desktop only)
|
|
47
|
+
useEffect(() => {
|
|
48
|
+
if (contentRef.current) {
|
|
49
|
+
// Skip programmatic scrolling on mobile - let natural snap scrolling handle it
|
|
50
|
+
if (isMobile) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const pageChanged = previousPageRef.current !== currentPage;
|
|
55
|
+
|
|
56
|
+
// Set scrolling state to prevent rapid navigation
|
|
57
|
+
if (setIsScrolling) {
|
|
58
|
+
setIsScrolling(true);
|
|
59
|
+
} else {
|
|
60
|
+
setInternalIsScrolling(true);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Calculate scroll position including gap for desktop
|
|
64
|
+
const containerWidth = contentRef.current.offsetWidth;
|
|
65
|
+
const gap = SPACING.GAP_MD; // md gap in pixels for desktop
|
|
66
|
+
const scrollPosition = (currentPage - 1) * (containerWidth + gap);
|
|
67
|
+
|
|
68
|
+
// Use 'auto' (instant) instead of 'smooth' if page hasn't changed
|
|
69
|
+
// This prevents page scrolling on resize/mount while keeping smooth scrolling for navigation
|
|
70
|
+
contentRef.current.scrollTo({
|
|
71
|
+
behavior: pageChanged ? 'smooth' : 'auto',
|
|
72
|
+
left: scrollPosition,
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
// Reset scrolling state after animation completes
|
|
76
|
+
// Smooth scroll animation typically takes ~300-400ms
|
|
77
|
+
const scrollTimeout = setTimeout(() => {
|
|
78
|
+
if (setIsScrolling) {
|
|
79
|
+
setIsScrolling(false);
|
|
80
|
+
} else {
|
|
81
|
+
setInternalIsScrolling(false);
|
|
82
|
+
}
|
|
83
|
+
}, ANIMATION.SCROLL_TIMEOUT);
|
|
84
|
+
|
|
85
|
+
// Update previous page reference
|
|
86
|
+
previousPageRef.current = currentPage;
|
|
87
|
+
|
|
88
|
+
return () => {
|
|
89
|
+
clearTimeout(scrollTimeout);
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
return undefined;
|
|
93
|
+
}, [currentPage, contentRef, setIsScrolling, isMobile]);
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Memoized debounced scroll handler for desktop scroll tracking.
|
|
97
|
+
* Updates the current page when user scrolls to reflect active thumbnail.
|
|
98
|
+
*/
|
|
99
|
+
const debouncedDesktopScrollHandler = useMemo(
|
|
100
|
+
() =>
|
|
101
|
+
debounce(() => {
|
|
102
|
+
if (contentRef.current && !isMobile) {
|
|
103
|
+
const scrollLeft = contentRef.current.scrollLeft;
|
|
104
|
+
const containerWidth = contentRef.current.offsetWidth;
|
|
105
|
+
const gap = SPACING.GAP_MD; // md gap in pixels for desktop
|
|
106
|
+
const newPage = Math.round(scrollLeft / (containerWidth + gap)) + 1;
|
|
107
|
+
|
|
108
|
+
if (newPage !== currentPage && newPage >= 1 && newPage <= numberOfPages) {
|
|
109
|
+
setCurrentPage(newPage);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}, ANIMATION.DEBOUNCE_DELAY),
|
|
113
|
+
[currentPage, numberOfPages, contentRef, setCurrentPage, isMobile]
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Memoized debounced scroll handler for mobile scroll tracking.
|
|
118
|
+
* Updates the current page based on mobile card layout with gaps and margins.
|
|
119
|
+
*/
|
|
120
|
+
const debouncedMobileScrollHandler = useMemo(
|
|
121
|
+
() =>
|
|
122
|
+
debounce(() => {
|
|
123
|
+
if (contentRef.current && isMobile) {
|
|
124
|
+
const { clientWidth, scrollLeft, scrollWidth } = contentRef.current;
|
|
125
|
+
const maxScroll = scrollWidth - clientWidth;
|
|
126
|
+
|
|
127
|
+
// Prevent scrolling beyond bounds
|
|
128
|
+
if (scrollLeft < 0) {
|
|
129
|
+
contentRef.current.scrollLeft = 0;
|
|
130
|
+
} else if (scrollLeft > maxScroll) {
|
|
131
|
+
contentRef.current.scrollLeft = maxScroll;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Calculate current page based on scroll position
|
|
135
|
+
// Mobile cards: min(calc(100% - 64px), maxMobileCardWidth) with 4px gaps
|
|
136
|
+
// First card has 16px left margin, last card has 16px right margin
|
|
137
|
+
const gap = SPACING.GAP_2XS;
|
|
138
|
+
const margin = SPACING.MARGIN_SM;
|
|
139
|
+
const cardWidth = Math.min(clientWidth - MOBILE_CARD.WIDTH_REDUCTION, maxMobileCardWidth);
|
|
140
|
+
const cardWithGap = cardWidth + gap;
|
|
141
|
+
|
|
142
|
+
// Calculate which card is most visible based on scroll position
|
|
143
|
+
// Account for the initial margin offset
|
|
144
|
+
const adjustedScrollLeft = scrollLeft + margin;
|
|
145
|
+
const newPage = Math.round(adjustedScrollLeft / cardWithGap) + 1;
|
|
146
|
+
|
|
147
|
+
if (newPage !== currentPage && newPage >= 1 && newPage <= numberOfPages) {
|
|
148
|
+
setCurrentPage(newPage);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}, ANIMATION.DEBOUNCE_DELAY),
|
|
152
|
+
[currentPage, maxMobileCardWidth, numberOfPages, contentRef, setCurrentPage, isMobile]
|
|
153
|
+
);
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Handles scroll events within the slider content area.
|
|
157
|
+
* Uses debounced handlers for both mobile and desktop to improve performance.
|
|
158
|
+
*/
|
|
159
|
+
const onScrollCards = useCallback(() => {
|
|
160
|
+
if (isMobile) {
|
|
161
|
+
debouncedMobileScrollHandler();
|
|
162
|
+
} else {
|
|
163
|
+
debouncedDesktopScrollHandler();
|
|
164
|
+
}
|
|
165
|
+
}, [isMobile, debouncedMobileScrollHandler, debouncedDesktopScrollHandler]);
|
|
166
|
+
|
|
167
|
+
return {
|
|
168
|
+
isScrolling: isScrollingState,
|
|
169
|
+
onScrollCards,
|
|
170
|
+
};
|
|
171
|
+
};
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { THUMBNAIL } from '../constants';
|
|
2
|
+
import { ResponsiveImageConfig } from '../ImageSlider.types';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Generates a srcSet string for main images with responsive breakpoints
|
|
6
|
+
* @param baseUrl - The base URL of the image
|
|
7
|
+
* @param config - Responsive image configuration
|
|
8
|
+
* @param useHighQuality - Whether to use high quality mode (no width constraints)
|
|
9
|
+
* @returns The srcSet string for the image
|
|
10
|
+
*/
|
|
11
|
+
export const generateMainImageSrcSet = (
|
|
12
|
+
baseUrl: string,
|
|
13
|
+
config: ResponsiveImageConfig,
|
|
14
|
+
useHighQuality: boolean = false
|
|
15
|
+
): string => {
|
|
16
|
+
// If high quality mode is enabled (after hover), return empty string
|
|
17
|
+
// This forces the browser to use only the src attribute (full quality)
|
|
18
|
+
// avoiding intermediate 651px requests
|
|
19
|
+
if (useHighQuality) {
|
|
20
|
+
return '';
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const { desktopSize, mobileSize } = config;
|
|
24
|
+
const widths = [mobileSize, desktopSize];
|
|
25
|
+
|
|
26
|
+
return widths
|
|
27
|
+
.map((width) => {
|
|
28
|
+
return `${baseUrl}&width=${width} ${width}w`;
|
|
29
|
+
})
|
|
30
|
+
.join(', ');
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Generates a srcSet string for thumbnail images
|
|
35
|
+
* @param baseUrl - The base URL of the image
|
|
36
|
+
* @returns The srcSet string for the thumbnail
|
|
37
|
+
*/
|
|
38
|
+
export const generateThumbnailSrcSet = (baseUrl: string): string => {
|
|
39
|
+
return `${baseUrl}&width=${THUMBNAIL.WIDTH_PARAM} ${THUMBNAIL.WIDTH_PARAM}w`;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Generates the sizes attribute for responsive images
|
|
44
|
+
* @param config - Responsive image configuration
|
|
45
|
+
* @param useHighQuality - Whether to use high quality mode
|
|
46
|
+
* @returns The sizes attribute string
|
|
47
|
+
*/
|
|
48
|
+
export const generateSizesAttribute = (config: ResponsiveImageConfig, useHighQuality: boolean = false): string => {
|
|
49
|
+
// If high quality mode is enabled (after hover), sizes attribute is not needed
|
|
50
|
+
// since we're using empty srcSet and relying only on src attribute
|
|
51
|
+
if (useHighQuality) {
|
|
52
|
+
return '';
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const { breakpoint, desktopSize, mobileSize } = config;
|
|
56
|
+
// Use a much smaller size on mobile to force selection of 366w image even on high-DPR devices
|
|
57
|
+
const adjustedMobileSize = Math.floor(mobileSize / 3); // ~122px, ensuring 366w is selected even at DPR 3.0
|
|
58
|
+
return `(max-width: ${breakpoint}px) ${adjustedMobileSize}px, ${desktopSize}px`;
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
// Memoized thumbnail sizes attribute (static value)
|
|
62
|
+
const THUMBNAIL_SIZES_ATTRIBUTE = `${THUMBNAIL.WIDTH_PARAM}px`;
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Generates the sizes attribute for thumbnail images
|
|
66
|
+
* @returns The sizes attribute string for thumbnails
|
|
67
|
+
*/
|
|
68
|
+
export const generateThumbnailSizesAttribute = (): string => {
|
|
69
|
+
return THUMBNAIL_SIZES_ATTRIBUTE;
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Gets the appropriate image source URL based on quality mode
|
|
74
|
+
* @param baseUrl - The base URL of the image
|
|
75
|
+
* @param config - Responsive image configuration
|
|
76
|
+
* @param useHighQuality - Whether to use high quality mode
|
|
77
|
+
* @returns The appropriate source URL
|
|
78
|
+
*/
|
|
79
|
+
export const getImageSrc = (
|
|
80
|
+
baseUrl: string,
|
|
81
|
+
config: ResponsiveImageConfig,
|
|
82
|
+
useHighQuality: boolean = false
|
|
83
|
+
): string => {
|
|
84
|
+
if (useHighQuality) {
|
|
85
|
+
return baseUrl;
|
|
86
|
+
}
|
|
87
|
+
return `${baseUrl}&width=${config.mobileSize}`;
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Gets the thumbnail image source URL
|
|
92
|
+
* @param baseUrl - The base URL of the image
|
|
93
|
+
* @returns The thumbnail source URL
|
|
94
|
+
*/
|
|
95
|
+
export const getThumbnailSrc = (baseUrl: string): string => {
|
|
96
|
+
return `${baseUrl}&width=${THUMBNAIL.WIDTH_PARAM}`;
|
|
97
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './imageOptimization';
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { cn } from '@evolve.ui/theme-system';
|
|
2
|
+
import { ComponentProps, ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
import { CheckCircle, Info, Warning } from '../Icons';
|
|
5
|
+
import { BodyPrimary, BodySecondary } from '../Typography/Text/Text';
|
|
6
|
+
|
|
7
|
+
type Props = {
|
|
8
|
+
className?: string;
|
|
9
|
+
level: 'success' | 'info' | 'critical' | 'warning';
|
|
10
|
+
message: string | ReactNode;
|
|
11
|
+
small?: boolean;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export const InlineNotification = ({ className, level, message, small = false }: Props) => {
|
|
15
|
+
let icon: ReactNode;
|
|
16
|
+
let messageColor: ComponentProps<typeof BodySecondary>['color'];
|
|
17
|
+
switch (level) {
|
|
18
|
+
case 'success':
|
|
19
|
+
icon = small ? (
|
|
20
|
+
<CheckCircle
|
|
21
|
+
color="success"
|
|
22
|
+
size="sm"
|
|
23
|
+
style="fill"
|
|
24
|
+
/>
|
|
25
|
+
) : (
|
|
26
|
+
<CheckCircle
|
|
27
|
+
color="success"
|
|
28
|
+
size="md"
|
|
29
|
+
style="fill"
|
|
30
|
+
/>
|
|
31
|
+
);
|
|
32
|
+
messageColor = 'success';
|
|
33
|
+
break;
|
|
34
|
+
case 'critical':
|
|
35
|
+
icon = small ? (
|
|
36
|
+
<Warning
|
|
37
|
+
color="critical"
|
|
38
|
+
size="sm"
|
|
39
|
+
style="fill"
|
|
40
|
+
/>
|
|
41
|
+
) : (
|
|
42
|
+
<Warning
|
|
43
|
+
color="critical"
|
|
44
|
+
size="md"
|
|
45
|
+
style="fill"
|
|
46
|
+
/>
|
|
47
|
+
);
|
|
48
|
+
messageColor = 'critical';
|
|
49
|
+
break;
|
|
50
|
+
case 'warning':
|
|
51
|
+
icon = small ? (
|
|
52
|
+
<Warning
|
|
53
|
+
color="warning"
|
|
54
|
+
size="sm"
|
|
55
|
+
style="fill"
|
|
56
|
+
/>
|
|
57
|
+
) : (
|
|
58
|
+
<Warning
|
|
59
|
+
color="warning"
|
|
60
|
+
size="md"
|
|
61
|
+
style="fill"
|
|
62
|
+
/>
|
|
63
|
+
);
|
|
64
|
+
messageColor = 'primary';
|
|
65
|
+
break;
|
|
66
|
+
case 'info':
|
|
67
|
+
default:
|
|
68
|
+
icon = small ? (
|
|
69
|
+
<Info
|
|
70
|
+
color="info"
|
|
71
|
+
size="sm"
|
|
72
|
+
style="fill"
|
|
73
|
+
/>
|
|
74
|
+
) : (
|
|
75
|
+
<Info
|
|
76
|
+
color="info"
|
|
77
|
+
size="md"
|
|
78
|
+
style="fill"
|
|
79
|
+
/>
|
|
80
|
+
);
|
|
81
|
+
messageColor = 'primary';
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return (
|
|
86
|
+
<div className={cn('flex items-center', className)}>
|
|
87
|
+
<div className="mr-xs">{icon}</div>
|
|
88
|
+
{small ? (
|
|
89
|
+
<BodySecondary color={messageColor}>{message}</BodySecondary>
|
|
90
|
+
) : (
|
|
91
|
+
<BodyPrimary color={messageColor}>{message}</BodyPrimary>
|
|
92
|
+
)}
|
|
93
|
+
</div>
|
|
94
|
+
);
|
|
95
|
+
};
|