@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,79 @@
|
|
|
1
|
+
import { capitalize } from 'es-toolkit';
|
|
2
|
+
|
|
3
|
+
import { CommonFileTypes, DynamicMessageContext, FileErrorCode } from '../types/commonTypes';
|
|
4
|
+
|
|
5
|
+
export const builtInErrorCodes: FileErrorCode[] = ['file-invalid-type', 'file-too-large', 'too-many-files'];
|
|
6
|
+
|
|
7
|
+
export const ACCEPTED_MIME_TYPES: Record<CommonFileTypes, string[]> = {
|
|
8
|
+
documents: [
|
|
9
|
+
'application/pdf',
|
|
10
|
+
'application/msword',
|
|
11
|
+
'application/vnd.openxmlformats-officedocument.wordprocessingml.document', // .docx
|
|
12
|
+
'application/vnd.ms-excel',
|
|
13
|
+
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', // .xlsx
|
|
14
|
+
],
|
|
15
|
+
images: ['image/jpeg', 'image/png', 'image/gif', 'image/webp'],
|
|
16
|
+
pdfs: ['application/pdf'],
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
// Messages shown during drag (preventative)
|
|
20
|
+
//DRAG MESSAGE RULES: Be short and concise. Don't use periods.
|
|
21
|
+
export const DRAG_MESSAGES = {
|
|
22
|
+
default: 'Invalid file',
|
|
23
|
+
partialUpload: {
|
|
24
|
+
'file-invalid-type': ({ fileCount = 1, filePluralizationText }: DynamicMessageContext) =>
|
|
25
|
+
`${fileCount} ${filePluralizationText} ${fileCount > 1 ? 'have' : 'has'} an invalid file type`,
|
|
26
|
+
'file-too-large': ({ formattedMaxSize }: DynamicMessageContext) =>
|
|
27
|
+
`One or more files are too large. (${formattedMaxSize} limit)`,
|
|
28
|
+
'too-many-files': ({ fileCount, filePluralizationText }: DynamicMessageContext) =>
|
|
29
|
+
`${fileCount} ${filePluralizationText} will exceed the file limit`,
|
|
30
|
+
},
|
|
31
|
+
singleFileUpload: {
|
|
32
|
+
'file-invalid-type': 'File type not supported',
|
|
33
|
+
'file-too-large': ({ formattedMaxSize }: DynamicMessageContext) =>
|
|
34
|
+
`File must be smaller than ${formattedMaxSize}`,
|
|
35
|
+
'too-many-files': ({ filePluralizationText, maxFiles }: DynamicMessageContext) =>
|
|
36
|
+
`You can only upload ${maxFiles} ${filePluralizationText}`,
|
|
37
|
+
},
|
|
38
|
+
strictUpload: {
|
|
39
|
+
'file-invalid-type': 'One or more files have an invalid file type',
|
|
40
|
+
'file-too-large': ({ formattedMaxSize }: DynamicMessageContext) =>
|
|
41
|
+
`One or more files are too large. (${formattedMaxSize} limit)`,
|
|
42
|
+
'too-many-files': ({ maxFiles, maxFilesPluralizationText }: DynamicMessageContext) =>
|
|
43
|
+
`You can only upload ${maxFiles} ${maxFilesPluralizationText}`,
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
// Messages shown after drop (error state)
|
|
48
|
+
//DROP MESSAGE RULES: Guide the user on what went wrong and what they can do to move forward.
|
|
49
|
+
export const DROP_MESSAGES = {
|
|
50
|
+
default: 'Invalid file',
|
|
51
|
+
partialUpload: {
|
|
52
|
+
'file-invalid-type': ({
|
|
53
|
+
acceptedFileExtensions,
|
|
54
|
+
fileCount = 1,
|
|
55
|
+
filePluralizationText,
|
|
56
|
+
}: DynamicMessageContext) =>
|
|
57
|
+
`Failed to add ${fileCount} ${filePluralizationText} due to invalid file type. Please upload only ${acceptedFileExtensions} files.`,
|
|
58
|
+
'file-too-large': ({ fileCount = 1, filePluralizationText, formattedMaxSize }: DynamicMessageContext) =>
|
|
59
|
+
`${fileCount} ${filePluralizationText} ${fileCount > 1 ? 'are' : 'is'} too large. Please upload files smaller than ${formattedMaxSize}.`,
|
|
60
|
+
'too-many-files': ({ fileCount, filePluralizationText, maxFiles }: DynamicMessageContext) =>
|
|
61
|
+
`You've reached the ${maxFiles} file limit. ${fileCount} ${filePluralizationText} could not be added.`,
|
|
62
|
+
},
|
|
63
|
+
singleFileUpload: {
|
|
64
|
+
'file-invalid-type': ({ acceptedFileExtensions }: DynamicMessageContext) =>
|
|
65
|
+
`File type not supported. Please upload only ${acceptedFileExtensions} files.`,
|
|
66
|
+
'file-too-large': ({ formattedMaxSize }: DynamicMessageContext) =>
|
|
67
|
+
`File is too large. Please upload files smaller than ${formattedMaxSize}.`,
|
|
68
|
+
'too-many-files': ({ filePluralizationText, maxFiles }: DynamicMessageContext) =>
|
|
69
|
+
`${capitalize(filePluralizationText ?? 'files')} not added. You can only upload ${maxFiles} in total`,
|
|
70
|
+
},
|
|
71
|
+
strictUpload: {
|
|
72
|
+
'file-invalid-type': ({ acceptedFileExtensions }: DynamicMessageContext) =>
|
|
73
|
+
`One or more files have an invalid file type. Please upload only ${acceptedFileExtensions} files.`,
|
|
74
|
+
'file-too-large': ({ formattedMaxSize }: DynamicMessageContext) =>
|
|
75
|
+
`One or more files are too large. Please upload files smaller than ${formattedMaxSize}.`,
|
|
76
|
+
'too-many-files': ({ filePluralizationText, maxFiles, maxFilesPluralizationText }: DynamicMessageContext) =>
|
|
77
|
+
`${capitalize(filePluralizationText ?? 'files')} not added - maximum of ${maxFiles} ${maxFilesPluralizationText} allowed.`,
|
|
78
|
+
},
|
|
79
|
+
};
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import {
|
|
2
|
+
BaseDynamicMessageContext,
|
|
3
|
+
CommonFileTypes,
|
|
4
|
+
DragMessageContext,
|
|
5
|
+
DropMessageContext,
|
|
6
|
+
DynamicMessageContext,
|
|
7
|
+
} from '../types/commonTypes';
|
|
8
|
+
import { getFileExtensionsFromAcceptedTypes } from './getFileExtensionsFromAcceptedTypes';
|
|
9
|
+
import { getFilePluralizationText } from './getFilePluralizationText';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Creates a base message context with properties common to both drag and drop events
|
|
13
|
+
*/
|
|
14
|
+
export const createBaseMessageContext = ({
|
|
15
|
+
accept,
|
|
16
|
+
code,
|
|
17
|
+
count,
|
|
18
|
+
formattedMaxSize,
|
|
19
|
+
maxFiles,
|
|
20
|
+
maxSize,
|
|
21
|
+
}: {
|
|
22
|
+
accept?: CommonFileTypes | string[];
|
|
23
|
+
code: string;
|
|
24
|
+
count?: number;
|
|
25
|
+
formattedMaxSize?: string;
|
|
26
|
+
maxFiles?: number;
|
|
27
|
+
maxSize?: number;
|
|
28
|
+
}): BaseDynamicMessageContext => {
|
|
29
|
+
const acceptedFileExtensions = getFileExtensionsFromAcceptedTypes(accept);
|
|
30
|
+
|
|
31
|
+
const filePluralizationText = getFilePluralizationText({
|
|
32
|
+
accept,
|
|
33
|
+
count,
|
|
34
|
+
hideCount: true,
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
const maxFilesPluralizationText = getFilePluralizationText({
|
|
38
|
+
accept,
|
|
39
|
+
count: maxFiles,
|
|
40
|
+
hideCount: true,
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
return {
|
|
44
|
+
acceptedFileExtensions,
|
|
45
|
+
errorCode: code,
|
|
46
|
+
...(count !== undefined && { fileCount: count }),
|
|
47
|
+
filePluralizationText,
|
|
48
|
+
formattedMaxSize,
|
|
49
|
+
maxFiles,
|
|
50
|
+
maxFilesPluralizationText,
|
|
51
|
+
maxSizeBytes: maxSize,
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Creates a message context for drag events
|
|
57
|
+
*/
|
|
58
|
+
export const createDragMessageContext = ({
|
|
59
|
+
accept,
|
|
60
|
+
code,
|
|
61
|
+
count,
|
|
62
|
+
formattedMaxSize,
|
|
63
|
+
items,
|
|
64
|
+
maxFiles,
|
|
65
|
+
maxSize,
|
|
66
|
+
}: {
|
|
67
|
+
accept?: CommonFileTypes | string[];
|
|
68
|
+
code: string;
|
|
69
|
+
count?: number;
|
|
70
|
+
formattedMaxSize?: string;
|
|
71
|
+
items?: DataTransferItemList;
|
|
72
|
+
maxFiles?: number;
|
|
73
|
+
maxSize?: number;
|
|
74
|
+
}): DragMessageContext => {
|
|
75
|
+
const baseContext = createBaseMessageContext({
|
|
76
|
+
accept,
|
|
77
|
+
code,
|
|
78
|
+
count,
|
|
79
|
+
formattedMaxSize,
|
|
80
|
+
maxFiles,
|
|
81
|
+
maxSize,
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
return {
|
|
85
|
+
...baseContext,
|
|
86
|
+
...(items && { draggedItems: items }),
|
|
87
|
+
eventType: 'drag',
|
|
88
|
+
};
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Creates a message context for drop events
|
|
93
|
+
*/
|
|
94
|
+
export const createDropMessageContext = ({
|
|
95
|
+
accept,
|
|
96
|
+
code,
|
|
97
|
+
count,
|
|
98
|
+
files,
|
|
99
|
+
formattedMaxSize,
|
|
100
|
+
maxFiles,
|
|
101
|
+
maxSize,
|
|
102
|
+
}: {
|
|
103
|
+
accept?: CommonFileTypes | string[];
|
|
104
|
+
code: string;
|
|
105
|
+
count?: number;
|
|
106
|
+
files?: File[];
|
|
107
|
+
formattedMaxSize?: string;
|
|
108
|
+
maxFiles?: number;
|
|
109
|
+
maxSize?: number;
|
|
110
|
+
}): DropMessageContext => {
|
|
111
|
+
const baseContext = createBaseMessageContext({
|
|
112
|
+
accept,
|
|
113
|
+
code,
|
|
114
|
+
count,
|
|
115
|
+
formattedMaxSize,
|
|
116
|
+
maxFiles,
|
|
117
|
+
maxSize,
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
const rejectedFileList = files?.map((f) => f.name).join(', ') ?? '';
|
|
121
|
+
|
|
122
|
+
return {
|
|
123
|
+
...baseContext,
|
|
124
|
+
eventType: 'drop',
|
|
125
|
+
rejectedFileList,
|
|
126
|
+
...(files && { rejectedFiles: files }),
|
|
127
|
+
};
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Unified function to create the appropriate message context based on the message type
|
|
132
|
+
*
|
|
133
|
+
* @param params Common parameters for both context types
|
|
134
|
+
* @param params.messageType The type of message context to create ('drag' or 'drop')
|
|
135
|
+
* @param params.dragItems Optional DataTransferItemList for drag events
|
|
136
|
+
* @param params.dropFiles Optional File[] for drop events (only newly dropped files can be rejected)
|
|
137
|
+
* @returns The appropriate message context based on the message type
|
|
138
|
+
*/
|
|
139
|
+
export const createMessageContext = ({
|
|
140
|
+
accept,
|
|
141
|
+
code,
|
|
142
|
+
count,
|
|
143
|
+
dragItems,
|
|
144
|
+
dropFiles,
|
|
145
|
+
formattedMaxSize,
|
|
146
|
+
maxFiles,
|
|
147
|
+
maxSize,
|
|
148
|
+
messageType = 'drop',
|
|
149
|
+
}: {
|
|
150
|
+
accept?: CommonFileTypes | string[];
|
|
151
|
+
code: string;
|
|
152
|
+
count?: number;
|
|
153
|
+
dragItems?: DataTransferItemList;
|
|
154
|
+
dropFiles?: File[];
|
|
155
|
+
formattedMaxSize?: string;
|
|
156
|
+
maxFiles?: number;
|
|
157
|
+
maxSize?: number;
|
|
158
|
+
messageType?: 'drag' | 'drop';
|
|
159
|
+
}): DynamicMessageContext => {
|
|
160
|
+
const baseParams = {
|
|
161
|
+
accept,
|
|
162
|
+
code,
|
|
163
|
+
count,
|
|
164
|
+
formattedMaxSize,
|
|
165
|
+
maxFiles,
|
|
166
|
+
maxSize,
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
if (messageType === 'drag') {
|
|
170
|
+
return createDragMessageContext({
|
|
171
|
+
...baseParams,
|
|
172
|
+
items: dragItems,
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
return createDropMessageContext({
|
|
177
|
+
...baseParams,
|
|
178
|
+
files: dropFiles,
|
|
179
|
+
});
|
|
180
|
+
};
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { CommonFileTypes } from '../types/commonTypes';
|
|
2
|
+
import { ACCEPTED_MIME_TYPES } from './constants';
|
|
3
|
+
|
|
4
|
+
// Map of MIME types to their corresponding file extensions
|
|
5
|
+
const MIME_TYPE_TO_EXTENSION: Record<string, string> = {
|
|
6
|
+
'application/msword': '.doc',
|
|
7
|
+
'application/pdf': '.pdf',
|
|
8
|
+
'application/vnd.ms-excel': '.xls',
|
|
9
|
+
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': '.xlsx',
|
|
10
|
+
'application/vnd.openxmlformats-officedocument.wordprocessingml.document': '.docx',
|
|
11
|
+
'image/gif': '.gif',
|
|
12
|
+
'image/jpeg': '.jpeg',
|
|
13
|
+
'image/jpg': '.jpg',
|
|
14
|
+
'image/png': '.png',
|
|
15
|
+
'image/webp': '.webp',
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Converts a MIME type to its corresponding file extension
|
|
20
|
+
* @param mimeType The MIME type to convert (e.g., 'image/jpeg', 'application/pdf')
|
|
21
|
+
* @returns The corresponding file extension with leading dot (e.g., '.jpeg', '.pdf')
|
|
22
|
+
* or an empty string if the MIME type is invalid or incomplete
|
|
23
|
+
*/
|
|
24
|
+
export const getMimeTypeExtension = (mimeType: string): string => {
|
|
25
|
+
// If we have a direct mapping, use it
|
|
26
|
+
if (MIME_TYPE_TO_EXTENSION[mimeType]) {
|
|
27
|
+
return MIME_TYPE_TO_EXTENSION[mimeType];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// For simple MIME types, extract the subtype
|
|
31
|
+
const parts = mimeType.split('/');
|
|
32
|
+
if (parts.length === 2 && parts[1] && !parts[1].includes('.')) {
|
|
33
|
+
return `.${parts[1]}`;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Return empty string for incomplete MIME types
|
|
37
|
+
return '';
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Converts file type restrictions into a comma-separated list of file extensions
|
|
42
|
+
* @param accept - Optional file type restrictions, can be either:
|
|
43
|
+
* - A preset category from CommonFileTypes (e.g., 'images', 'pdfs', 'documents')
|
|
44
|
+
* - An array of specific file extensions (e.g., ['.jpg', '.png', '.pdf'])
|
|
45
|
+
* - An array of MIME types (e.g., ['image/jpeg', 'image/png', 'application/pdf'])
|
|
46
|
+
* - A mixed array of both extensions and MIME types
|
|
47
|
+
* @returns A comma-separated string of file extensions with leading dots (e.g., '.jpg, .png, .pdf')
|
|
48
|
+
* or an empty string if no valid extensions are found or accept is undefined
|
|
49
|
+
* @example
|
|
50
|
+
* // Returns '.jpeg, .png, .gif, .webp, .jpg'
|
|
51
|
+
* getFileExtensionsFromAcceptedTypes('images')
|
|
52
|
+
*
|
|
53
|
+
* // Returns '.jpg, .png, .pdf'
|
|
54
|
+
* getFileExtensionsFromAcceptedTypes(['.jpg', 'image/png', 'application/pdf'])
|
|
55
|
+
*/
|
|
56
|
+
export const getFileExtensionsFromAcceptedTypes = (accept?: CommonFileTypes | string[]) => {
|
|
57
|
+
if (!accept) {
|
|
58
|
+
return '';
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// If it's a CommonFileTypes string (e.g., 'images')
|
|
62
|
+
if (typeof accept === 'string') {
|
|
63
|
+
const mimeTypes = ACCEPTED_MIME_TYPES[accept as CommonFileTypes];
|
|
64
|
+
return mimeTypes.map(getMimeTypeExtension).join(', ');
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// If it's an array of extensions/mime types
|
|
68
|
+
return accept
|
|
69
|
+
.filter(Boolean) // Remove empty strings and falsy values
|
|
70
|
+
.map((type) => (type.startsWith('.') ? type : getMimeTypeExtension(type))) // Convert MIME types to extensions
|
|
71
|
+
.filter((ext) => ext.length > 1) // Remove single-character extensions
|
|
72
|
+
.join(', ');
|
|
73
|
+
};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { capitalize } from 'es-toolkit';
|
|
2
|
+
|
|
3
|
+
import { CommonFileTypes } from '../types/commonTypes';
|
|
4
|
+
|
|
5
|
+
type GetFilePluralizationTextProps = {
|
|
6
|
+
accept?: CommonFileTypes | string[];
|
|
7
|
+
capitalize?: boolean;
|
|
8
|
+
count?: number;
|
|
9
|
+
hideCount?: boolean;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
const getBaseText = (accept?: CommonFileTypes | string[]): 'image' | 'file' => {
|
|
13
|
+
if (accept === 'images') {
|
|
14
|
+
return 'image';
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
if (Array.isArray(accept)) {
|
|
18
|
+
const isImageOnly = accept.every((type) => type.startsWith('image/'));
|
|
19
|
+
return isImageOnly ? 'image' : 'file';
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return 'file';
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
const pluralize = (count: number, word: string, hideCount?: boolean, capitalizeWord?: boolean) => {
|
|
26
|
+
const text = `${word}${count === 1 ? '' : 's'}`;
|
|
27
|
+
const finalText = capitalizeWord ? capitalize(text) : text;
|
|
28
|
+
return hideCount ? finalText : `${count} ${finalText}`;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Generates a formatted text string for file type descriptions with proper pluralization and capitalization
|
|
33
|
+
* @param props Configuration object for text formatting
|
|
34
|
+
* @param props.accept - Optional file type(s) to determine if text should say "file" or "image"
|
|
35
|
+
* @param props.capitalize - Optional flag to capitalize the first letter of the output
|
|
36
|
+
* @param props.count - Optional number to determine pluralization (e.g., "1 file" vs "2 files")
|
|
37
|
+
* @param props.hideCount - Optional flag to exclude the count from the output (e.g., "files" instead of "2 files")
|
|
38
|
+
* @returns Formatted string describing file(s) or image(s)
|
|
39
|
+
* @example
|
|
40
|
+
* // Returns "2 files"
|
|
41
|
+
* getFilePluralizationText({ count: 2 })
|
|
42
|
+
*
|
|
43
|
+
* // Returns "1 image"
|
|
44
|
+
* getFilePluralizationText({ accept: 'images', count: 1 })
|
|
45
|
+
*
|
|
46
|
+
* // Returns "Files"
|
|
47
|
+
* getFilePluralizationText({ capitalize: true, hideCount: true })
|
|
48
|
+
*
|
|
49
|
+
* // Returns "Image"
|
|
50
|
+
* getFilePluralizationText({ accept: 'images', capitalize: true })
|
|
51
|
+
*/
|
|
52
|
+
export const getFilePluralizationText = ({
|
|
53
|
+
accept,
|
|
54
|
+
capitalize: capitalizeWord,
|
|
55
|
+
count,
|
|
56
|
+
hideCount,
|
|
57
|
+
}: GetFilePluralizationTextProps = {}) => {
|
|
58
|
+
const baseText = getBaseText(accept);
|
|
59
|
+
|
|
60
|
+
if (count === undefined) {
|
|
61
|
+
if (capitalizeWord) {
|
|
62
|
+
return capitalize(baseText);
|
|
63
|
+
}
|
|
64
|
+
return baseText;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return pluralize(count, baseText, hideCount, capitalizeWord);
|
|
68
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { CommonFileTypes } from '../types/commonTypes';
|
|
2
|
+
import { ACCEPTED_MIME_TYPES } from './constants';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Utility function that converts file type restrictions into MIME type format for react-dropzone
|
|
6
|
+
* @param accept - Optional file type restrictions, can be either:
|
|
7
|
+
* - A preset category from CommonFileTypes (e.g., 'images', 'pdfs', 'documents')
|
|
8
|
+
* - An array of specific MIME types (e.g., ['image/jpeg', 'image/png'])
|
|
9
|
+
* @returns Object mapping MIME types to empty arrays for react-dropzone's accept prop
|
|
10
|
+
* @remarks
|
|
11
|
+
* - Returns undefined when no restrictions are provided (accepts all file types)
|
|
12
|
+
* - Handles both preset categories and custom MIME type arrays
|
|
13
|
+
* - Formats MIME types to match react-dropzone's expected structure
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
export const getMimeTypes = (accept?: CommonFileTypes | string[]) => {
|
|
17
|
+
if (!accept) {
|
|
18
|
+
return undefined; // No restrictions
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if (Array.isArray(accept)) {
|
|
22
|
+
return accept.reduce((acc, curr) => ({ ...acc, [curr]: [] }), {}); // Custom MIME types
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
return ACCEPTED_MIME_TYPES[accept].reduce((acc, curr) => ({ ...acc, [curr]: [] }), {}); // Preset category
|
|
26
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { ContextAwareMessage } from '../types/commonTypes';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Processes any type of message into a string
|
|
5
|
+
* @param message - A string, function that returns a string, or undefined
|
|
6
|
+
* @param context - The context object to pass to the message function (optional)
|
|
7
|
+
* @param defaultMessage - Optional fallback message used when the primary message is undefined
|
|
8
|
+
* or when the primary message is a function but context is undefined
|
|
9
|
+
* @returns A string message. If a function message is provided, its result is converted to a string.
|
|
10
|
+
* Returns an empty string if no valid message can be resolved.
|
|
11
|
+
*/
|
|
12
|
+
export const resolveContextAwareMessage = <T>(
|
|
13
|
+
message: ContextAwareMessage<T> | undefined,
|
|
14
|
+
context?: T,
|
|
15
|
+
defaultMessage?: ContextAwareMessage<T>
|
|
16
|
+
): string => {
|
|
17
|
+
// Handle undefined message
|
|
18
|
+
if (!message) {
|
|
19
|
+
// Use default message if provided
|
|
20
|
+
if (defaultMessage) {
|
|
21
|
+
return resolveContextAwareMessage(defaultMessage, context);
|
|
22
|
+
}
|
|
23
|
+
return '';
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Handle function message
|
|
27
|
+
if (typeof message === 'function') {
|
|
28
|
+
// Ensure we have a context to pass to the function
|
|
29
|
+
if (context) {
|
|
30
|
+
return String(message(context));
|
|
31
|
+
}
|
|
32
|
+
// If no context but we have a default, use it
|
|
33
|
+
if (defaultMessage) {
|
|
34
|
+
return resolveContextAwareMessage(defaultMessage, context);
|
|
35
|
+
}
|
|
36
|
+
return '';
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Handle string message
|
|
40
|
+
return message;
|
|
41
|
+
};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { cn } from '@evolve.ui/theme-system';
|
|
2
|
+
|
|
3
|
+
import { FileError } from '../types';
|
|
4
|
+
|
|
5
|
+
type DropzoneState = {
|
|
6
|
+
disableDragValidation: boolean;
|
|
7
|
+
disabled: boolean;
|
|
8
|
+
isDragActive: boolean;
|
|
9
|
+
validationError?: FileError | null;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export const getUploadZoneStyles = ({
|
|
13
|
+
disabled,
|
|
14
|
+
disableDragValidation,
|
|
15
|
+
isDragActive,
|
|
16
|
+
validationError,
|
|
17
|
+
}: DropzoneState) => {
|
|
18
|
+
const isInvalid = Boolean(validationError);
|
|
19
|
+
const isErrorState = disableDragValidation ? false : isInvalid;
|
|
20
|
+
const isDefaultState = !isDragActive && !isErrorState;
|
|
21
|
+
const isDraggedOver = isDragActive && (disableDragValidation || !isInvalid);
|
|
22
|
+
const isDefaultAppearance = isDefaultState && !disabled;
|
|
23
|
+
|
|
24
|
+
return cn(
|
|
25
|
+
// Layout & Container
|
|
26
|
+
[
|
|
27
|
+
'relative',
|
|
28
|
+
'flex flex-col',
|
|
29
|
+
'h-full w-full',
|
|
30
|
+
'items-center justify-center',
|
|
31
|
+
'rounded-container',
|
|
32
|
+
'outline-dashed outline-1 -outline-offset-1',
|
|
33
|
+
'p-sm',
|
|
34
|
+
'transition-colors',
|
|
35
|
+
'hover:bg-background-hover hover:outline-border-hover', // Hover (when not dragging)
|
|
36
|
+
],
|
|
37
|
+
|
|
38
|
+
// Focus & Interactive Base
|
|
39
|
+
['hui-focus-visible-outline'],
|
|
40
|
+
|
|
41
|
+
// Interactive States
|
|
42
|
+
{
|
|
43
|
+
// Disabled
|
|
44
|
+
'cursor-not-allowed bg-background-disabled outline-border-disabled hover:bg-background-disabled hover:outline-border-disabled':
|
|
45
|
+
disabled,
|
|
46
|
+
|
|
47
|
+
// Enabled
|
|
48
|
+
'cursor-pointer active:bg-background-pressed active:outline active:outline-4 active:outline-focus-primary':
|
|
49
|
+
!disabled,
|
|
50
|
+
|
|
51
|
+
// Drag Active (only when not disabled)
|
|
52
|
+
'outline outline-4 outline-offset-0 outline-focus-primary': isDragActive && !disabled,
|
|
53
|
+
},
|
|
54
|
+
|
|
55
|
+
// Visual States
|
|
56
|
+
{
|
|
57
|
+
// Error (only when not disabled)
|
|
58
|
+
'bg-background-critical-light outline-dashed outline-1 -outline-offset-1 outline-border-critical':
|
|
59
|
+
isErrorState && !disabled,
|
|
60
|
+
|
|
61
|
+
// Drag Over
|
|
62
|
+
'bg-background-hover': isDraggedOver && !isErrorState && !disabled,
|
|
63
|
+
|
|
64
|
+
// Default
|
|
65
|
+
'bg-background-primary outline-border-secondary': isDefaultAppearance,
|
|
66
|
+
}
|
|
67
|
+
);
|
|
68
|
+
};
|