@evolve.ui/core-components 1.0.0 → 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/Checkbox.d.cts +1 -1
- package/Checkbox.d.mts +1 -1
- package/{DateInput-B8XQZPTx.d.cts → DateInput-CFxTZu3m.d.mts} +2 -2
- package/{DateInput-B8XQZPTx.d.cts.map → DateInput-CFxTZu3m.d.mts.map} +1 -1
- package/{DateInput-CfNmywqQ.d.mts → DateInput-DstMICTl.d.cts} +2 -2
- package/{DateInput-CfNmywqQ.d.mts.map → DateInput-DstMICTl.d.cts.map} +1 -1
- package/{FavoriteButton-CowOPoqo.d.cts → FavoriteButton-BGF-3dze.d.cts} +2 -2
- package/{FavoriteButton-BRY8FVpV.d.mts.map → FavoriteButton-BGF-3dze.d.cts.map} +1 -1
- package/{FavoriteButton-BRY8FVpV.d.mts → FavoriteButton-BZEGWrRo.d.mts} +2 -2
- package/{FavoriteButton-CowOPoqo.d.cts.map → FavoriteButton-BZEGWrRo.d.mts.map} +1 -1
- package/Input.d.cts +1 -1
- package/Input.d.mts +1 -1
- package/Radio.d.cts +1 -1
- package/Radio.d.mts +1 -1
- package/{TextInput-BhkeQZh4.d.cts → TextInput-B7lqQ1gh.d.cts} +3 -3
- package/{TextInput-BhkeQZh4.d.cts.map → TextInput-B7lqQ1gh.d.cts.map} +1 -1
- package/{TextInput-CWCeR18b.d.mts → TextInput-CxoT3np_.d.mts} +3 -3
- package/{TextInput-CWCeR18b.d.mts.map → TextInput-CxoT3np_.d.mts.map} +1 -1
- package/dateInput.d.cts +1 -1
- package/dateInput.d.mts +1 -1
- package/datePicker.d.cts +1 -1
- package/datePicker.d.mts +1 -1
- package/evolve-ui.entries.json +556 -0
- package/favoriteButton.d.cts +1 -1
- package/favoriteButton.d.mts +1 -1
- package/featureFlags/hooks.d.cts +1 -1
- package/featureFlags/hooks.d.mts +1 -1
- 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/{index-BVb-FJDo.d.mts → index-BYPklw8m.d.mts} +2 -2
- package/{index-BVb-FJDo.d.mts.map → index-BYPklw8m.d.mts.map} +1 -1
- package/{index-3V0Y3AU3.d.mts → index-Bvn6svaT.d.cts} +2 -2
- package/{index-3V0Y3AU3.d.mts.map → index-Bvn6svaT.d.cts.map} +1 -1
- package/{index-Bu7c6X7O.d.mts → index-C2zPeUs9.d.mts} +5 -5
- package/{index-Bu7c6X7O.d.mts.map → index-C2zPeUs9.d.mts.map} +1 -1
- package/{index-BXz3rMMk.d.cts → index-Cmz2OD6x.d.cts} +2 -2
- package/{index-BXz3rMMk.d.cts.map → index-Cmz2OD6x.d.cts.map} +1 -1
- package/{index-kchg551L.d.cts → index-DsZAxqnF.d.mts} +2 -2
- package/{index-kchg551L.d.cts.map → index-DsZAxqnF.d.mts.map} +1 -1
- package/{index-BzN9RaXe.d.cts → index-QtMvgJcp.d.cts} +5 -5
- package/{index-BzN9RaXe.d.cts.map → index-QtMvgJcp.d.cts.map} +1 -1
- package/{index-dpfLYhgI.d.mts → index-hrztez-b.d.mts} +2 -2
- package/{index-DBYqF9Sr.d.cts.map → index-hrztez-b.d.mts.map} +1 -1
- package/{index-DBYqF9Sr.d.cts → index-o9dwzLLE.d.cts} +2 -2
- package/{index-dpfLYhgI.d.mts.map → index-o9dwzLLE.d.cts.map} +1 -1
- package/index.d.cts +7 -7
- package/index.d.mts +7 -7
- package/package.json +2 -2
- package/providers.d.cts +1 -1
- package/providers.d.mts +1 -1
- 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
- package/textInput.d.cts +1 -1
- package/textInput.d.mts +1 -1
- package/timePicker.d.cts +1 -1
- package/timePicker.d.mts +1 -1
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { ButtonHTMLAttributes, ComponentProps } from 'react';
|
|
2
|
+
|
|
3
|
+
import { Tooltip } from '../../Tooltip/Tooltip';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Available variants for the FavoriteButton component
|
|
7
|
+
* - `circle`: Shows only the heart icon in a circular button (default)
|
|
8
|
+
* - `square`: Shows only the heart icon in a square button
|
|
9
|
+
* - `labeled`: Shows a button with text and the heart icon
|
|
10
|
+
* - `labeled-animated`: Labeled variant with animation-ready DOM hooks
|
|
11
|
+
*/
|
|
12
|
+
export type FavoriteButtonVariant = 'circle' | 'square' | 'labeled' | 'labeled-animated';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Base props shared by all FavoriteButton variants
|
|
16
|
+
*/
|
|
17
|
+
export interface BaseFavoriteButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'type'> {
|
|
18
|
+
favorited?: boolean;
|
|
19
|
+
type?: 'button' | 'submit' | 'reset';
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Props specific to the labeled variant
|
|
24
|
+
*/
|
|
25
|
+
export type LabeledFavoriteButtonProps = BaseFavoriteButtonProps & {
|
|
26
|
+
/**
|
|
27
|
+
* Label text to display when favorited
|
|
28
|
+
* @default 'Saved'
|
|
29
|
+
*/
|
|
30
|
+
favoritedLabel?: string;
|
|
31
|
+
/**
|
|
32
|
+
* Label text to display when not favorited
|
|
33
|
+
* @default 'Save'
|
|
34
|
+
*/
|
|
35
|
+
label?: string;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Props specific to the icon-only variants (circle and square)
|
|
40
|
+
*/
|
|
41
|
+
export type IconOnlyFavoriteButtonProps = BaseFavoriteButtonProps & {
|
|
42
|
+
/**
|
|
43
|
+
* Shape of the button
|
|
44
|
+
*/
|
|
45
|
+
shape: 'circle' | 'square';
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Props for the main FavoriteButton component
|
|
50
|
+
*/
|
|
51
|
+
export type FavoriteButtonProps = BaseFavoriteButtonProps & {
|
|
52
|
+
/**
|
|
53
|
+
* Label text to display when favorited (only for labeled variant)
|
|
54
|
+
* @default 'Saved'
|
|
55
|
+
*/
|
|
56
|
+
favoritedLabel?: string;
|
|
57
|
+
/**
|
|
58
|
+
* When true, fires the save-click animation (pulse + heart pop).
|
|
59
|
+
* Only meaningful for the `labeled-animated` variant.
|
|
60
|
+
* Reset to false after ~500ms to re-arm.
|
|
61
|
+
*/
|
|
62
|
+
isActivating?: boolean;
|
|
63
|
+
/**
|
|
64
|
+
* When true, fires the nudge animation (wiggle + twirl + shimmer).
|
|
65
|
+
* Only meaningful for the `labeled-animated` variant.
|
|
66
|
+
* Reset to false after ~1300ms to re-arm.
|
|
67
|
+
*/
|
|
68
|
+
isWiggling?: boolean;
|
|
69
|
+
/**
|
|
70
|
+
* Label text to display when not favorited (only for labeled variant)
|
|
71
|
+
* @default 'Save'
|
|
72
|
+
*/
|
|
73
|
+
label?: string;
|
|
74
|
+
tooltipProps?: ComponentProps<typeof Tooltip> & {
|
|
75
|
+
enabled?: boolean;
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* Button variant.
|
|
79
|
+
* - `circle`: Shows only the heart icon in a circular button (default)
|
|
80
|
+
* - `square`: Shows only the heart icon in a square button
|
|
81
|
+
* - `labeled`: Shows a button with text and the heart icon
|
|
82
|
+
* - `labeled-animated`: Shows a labeled button with animation-ready wrappers
|
|
83
|
+
*
|
|
84
|
+
* @default 'circle'
|
|
85
|
+
*/
|
|
86
|
+
variant?: FavoriteButtonVariant;
|
|
87
|
+
};
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { cn } from '@evolve.ui/theme-system';
|
|
2
|
+
import { useCallback, useState } from 'react';
|
|
3
|
+
|
|
4
|
+
import { Button } from '../../Button/Button';
|
|
5
|
+
import { Callout } from '../../Callout/Callout';
|
|
6
|
+
import { ToggleSwitch } from '../../ToggleSwitch/ToggleSwitch';
|
|
7
|
+
import { BodyPrimary, H2 } from '../../Typography/Text/Text';
|
|
8
|
+
import { useFeatureFlags } from '../hooks/useFeatureFlags';
|
|
9
|
+
import {
|
|
10
|
+
getFeatureFlagOverrides,
|
|
11
|
+
getFeatureFlagValueSource,
|
|
12
|
+
removeFeatureFlagOverride,
|
|
13
|
+
setFeatureFlagOverride,
|
|
14
|
+
} from './utils/cookies';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Props for FeatureFlagDevToolsUI component
|
|
18
|
+
*/
|
|
19
|
+
type Props = {
|
|
20
|
+
/** Additional CSS classes to apply to the component */
|
|
21
|
+
className?: string;
|
|
22
|
+
/** URL of your feature-flag service's management console. When provided, a "Manage Feature Flags" button is rendered. */
|
|
23
|
+
manageFlagsUrl?: string;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* DevTool component for managing feature flag overrides via cookies
|
|
28
|
+
*
|
|
29
|
+
* This component displays all feature flags from the HammerUI provider and allows
|
|
30
|
+
* developers to locally override flag values using browser cookies for testing purposes.
|
|
31
|
+
*
|
|
32
|
+
* Features:
|
|
33
|
+
* - Displays all feature flags from your feature-flag service with their current values
|
|
34
|
+
* - Toggle switches to enable/disable flags locally via cookie overrides
|
|
35
|
+
* - Shows the source of each flag value (Remote, Cookie Override, or Default)
|
|
36
|
+
* - Remove button to clear cookie overrides and revert to remote values
|
|
37
|
+
* - Warning callout when changes require a page reload
|
|
38
|
+
* - Optional link to manage flags in your feature-flag service
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```tsx
|
|
42
|
+
* <FeatureFlagDevToolsUI />
|
|
43
|
+
* ```
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```tsx
|
|
47
|
+
* <FeatureFlagDevToolsUI className="max-w-full" manageFlagsUrl="https://flags.example.com" />
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
export const FeatureFlagDevToolsUI = ({ className, manageFlagsUrl }: Props = {}) => {
|
|
51
|
+
// Get all feature flags from the HammerUI provider context
|
|
52
|
+
const featureFlagsObject = useFeatureFlags();
|
|
53
|
+
const featureFlags = Object.entries(featureFlagsObject) as Array<[string, boolean | undefined]>;
|
|
54
|
+
|
|
55
|
+
// State for forcing component re-render when overrides change
|
|
56
|
+
const [, setOverrideVersion] = useState(0);
|
|
57
|
+
const flagKeys = featureFlags.map(([key]) => key);
|
|
58
|
+
|
|
59
|
+
// Get current cookie overrides for all flags
|
|
60
|
+
const overrides = getFeatureFlagOverrides(flagKeys);
|
|
61
|
+
|
|
62
|
+
// Track if there are unsaved changes that require a page reload
|
|
63
|
+
const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false);
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Forces component to re-render by incrementing version state
|
|
67
|
+
* Used after setting/removing cookie overrides to reflect changes in UI
|
|
68
|
+
*/
|
|
69
|
+
const forceRefresh = useCallback(() => {
|
|
70
|
+
setOverrideVersion((v) => v + 1);
|
|
71
|
+
}, []);
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Handles toggle switch changes - sets a cookie override for the flag
|
|
75
|
+
* Note: Page reload is required for the override to take effect in the app
|
|
76
|
+
*/
|
|
77
|
+
const handleToggleChange = useCallback(
|
|
78
|
+
(key: string, toggled: boolean) => {
|
|
79
|
+
setFeatureFlagOverride(key, toggled);
|
|
80
|
+
setHasUnsavedChanges(true);
|
|
81
|
+
forceRefresh();
|
|
82
|
+
},
|
|
83
|
+
[forceRefresh]
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Removes a cookie override, reverting the flag to its remote value
|
|
88
|
+
* Note: Page reload is required for the change to take effect in the app
|
|
89
|
+
*/
|
|
90
|
+
const handleRemoveOverride = useCallback(
|
|
91
|
+
(key: string) => {
|
|
92
|
+
removeFeatureFlagOverride(key);
|
|
93
|
+
setHasUnsavedChanges(true);
|
|
94
|
+
forceRefresh();
|
|
95
|
+
},
|
|
96
|
+
[forceRefresh]
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Gets the effective toggle value - prioritizes cookie override over the remote value
|
|
101
|
+
* Falls back to false if no value is set
|
|
102
|
+
*/
|
|
103
|
+
const getToggleValue = useCallback(
|
|
104
|
+
(key: string, currentValue: boolean | undefined): boolean => {
|
|
105
|
+
if (key in overrides) {
|
|
106
|
+
return overrides[key];
|
|
107
|
+
}
|
|
108
|
+
return currentValue ?? false;
|
|
109
|
+
},
|
|
110
|
+
[overrides]
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Checks if a flag has a local cookie override
|
|
115
|
+
*/
|
|
116
|
+
const hasOverride = useCallback(
|
|
117
|
+
(key: string): boolean => {
|
|
118
|
+
return key in overrides;
|
|
119
|
+
},
|
|
120
|
+
[overrides]
|
|
121
|
+
);
|
|
122
|
+
|
|
123
|
+
return (
|
|
124
|
+
<div className={cn('mb-2xl flex w-3/4 flex-col gap-sm mdMax:w-full', className)}>
|
|
125
|
+
<H2>Feature Flags</H2>
|
|
126
|
+
|
|
127
|
+
{/* Info callout explaining the feature flag override system */}
|
|
128
|
+
<Callout
|
|
129
|
+
message="Feature flags are pulled from your feature-flag service. You can override them locally using cookie overrides for testing. Note: You'll need to refresh the page after toggling an override for the change to take effect."
|
|
130
|
+
primaryButton={
|
|
131
|
+
manageFlagsUrl
|
|
132
|
+
? {
|
|
133
|
+
onClick: () => window.open(manageFlagsUrl, '_blank'),
|
|
134
|
+
text: 'Manage Feature Flags',
|
|
135
|
+
}
|
|
136
|
+
: undefined
|
|
137
|
+
}
|
|
138
|
+
status="info"
|
|
139
|
+
title="Feature Flag Overrides"
|
|
140
|
+
/>
|
|
141
|
+
|
|
142
|
+
{/* Warning callout shown when changes have been made but page hasn't been reloaded */}
|
|
143
|
+
{hasUnsavedChanges && (
|
|
144
|
+
<Callout
|
|
145
|
+
message="Feature flag overrides have been updated. Reload the page to apply the changes."
|
|
146
|
+
primaryButton={{
|
|
147
|
+
onClick: () => window.location.reload(),
|
|
148
|
+
text: 'Reload Page',
|
|
149
|
+
}}
|
|
150
|
+
status="warning"
|
|
151
|
+
title="Reload Required"
|
|
152
|
+
/>
|
|
153
|
+
)}
|
|
154
|
+
|
|
155
|
+
{/* Empty state - no feature flags available */}
|
|
156
|
+
{featureFlags.length === 0 ? (
|
|
157
|
+
<BodyPrimary>No feature flags available</BodyPrimary>
|
|
158
|
+
) : (
|
|
159
|
+
// Table showing all feature flags with their values and controls
|
|
160
|
+
<table className="w-full border-collapse border border-border-secondary">
|
|
161
|
+
<colgroup>
|
|
162
|
+
<col />
|
|
163
|
+
<col className="w-64" />
|
|
164
|
+
<col className="w-56" />
|
|
165
|
+
</colgroup>
|
|
166
|
+
<thead>
|
|
167
|
+
<tr>
|
|
168
|
+
<th className="border border-border-secondary p-2 text-left">Feature Flag</th>
|
|
169
|
+
<th className="border border-border-secondary p-2 text-left">Current Value</th>
|
|
170
|
+
<th className="border border-border-secondary p-2 text-left">Source</th>
|
|
171
|
+
</tr>
|
|
172
|
+
</thead>
|
|
173
|
+
<tbody>
|
|
174
|
+
{featureFlags.map(([key, currentValue]) => {
|
|
175
|
+
const isOverridden = hasOverride(key);
|
|
176
|
+
const cellClassName = 'border border-border-secondary p-2';
|
|
177
|
+
|
|
178
|
+
return (
|
|
179
|
+
<tr
|
|
180
|
+
className="odd:bg-background-secondary"
|
|
181
|
+
key={key}
|
|
182
|
+
>
|
|
183
|
+
{/* Flag name column */}
|
|
184
|
+
<td className={cellClassName}>
|
|
185
|
+
<BodyPrimary>{key}</BodyPrimary>
|
|
186
|
+
</td>
|
|
187
|
+
|
|
188
|
+
{/* Toggle switch and remove button column */}
|
|
189
|
+
<td className={cellClassName}>
|
|
190
|
+
<div className="flex items-center gap-xs">
|
|
191
|
+
{/* Toggle to set cookie override */}
|
|
192
|
+
<ToggleSwitch
|
|
193
|
+
aria-label={`Toggle ${key}`}
|
|
194
|
+
id={`toggle-${key}`}
|
|
195
|
+
isToggled={getToggleValue(key, currentValue)}
|
|
196
|
+
onToggleChange={(toggled) => handleToggleChange(key, toggled ?? false)}
|
|
197
|
+
/>
|
|
198
|
+
{/* Remove button only shows when a cookie override exists */}
|
|
199
|
+
{isOverridden && (
|
|
200
|
+
<Button
|
|
201
|
+
onClick={() => handleRemoveOverride(key)}
|
|
202
|
+
size="sm"
|
|
203
|
+
style="critical"
|
|
204
|
+
variant="outlined"
|
|
205
|
+
>
|
|
206
|
+
Remove
|
|
207
|
+
</Button>
|
|
208
|
+
)}
|
|
209
|
+
</div>
|
|
210
|
+
</td>
|
|
211
|
+
|
|
212
|
+
{/* Source column - shows where the value comes from */}
|
|
213
|
+
<td className={cellClassName}>
|
|
214
|
+
<BodyPrimary>
|
|
215
|
+
{getFeatureFlagValueSource(isOverridden, currentValue)}
|
|
216
|
+
</BodyPrimary>
|
|
217
|
+
</td>
|
|
218
|
+
</tr>
|
|
219
|
+
);
|
|
220
|
+
})}
|
|
221
|
+
</tbody>
|
|
222
|
+
</table>
|
|
223
|
+
)}
|
|
224
|
+
</div>
|
|
225
|
+
);
|
|
226
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extracts feature flag cookie overrides from the request cookies
|
|
3
|
+
*
|
|
4
|
+
* Only processes cookies for flags that exist in the API payload. This allows
|
|
5
|
+
* cookie-based overrides to take precedence over values from your feature-flag service.
|
|
6
|
+
*
|
|
7
|
+
* @param featureFlagsApiPayload - Feature flags from the API response
|
|
8
|
+
* @param cookies - Cookie name-value pairs from the server request
|
|
9
|
+
* @returns Feature flag overrides found in cookies (subset of API payload flags)
|
|
10
|
+
*/
|
|
11
|
+
export const getFeatureFlagCookieOverrides = (
|
|
12
|
+
featureFlagsApiPayload: Record<string, boolean>,
|
|
13
|
+
cookies: Record<string, string | undefined>
|
|
14
|
+
): Record<string, boolean> => {
|
|
15
|
+
const overrides: Record<string, boolean> = {};
|
|
16
|
+
|
|
17
|
+
// Iterate through all defined feature flag keys
|
|
18
|
+
Object.keys(featureFlagsApiPayload).forEach((flagKey) => {
|
|
19
|
+
const cookieValue = cookies[flagKey];
|
|
20
|
+
|
|
21
|
+
// Only include if cookie exists
|
|
22
|
+
if (cookieValue !== undefined) {
|
|
23
|
+
// Convert cookie string value to boolean
|
|
24
|
+
// Handles: 'true', '1' -> true, everything else -> false
|
|
25
|
+
overrides[flagKey] = cookieValue === 'true' || cookieValue === '1';
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
return overrides;
|
|
30
|
+
};
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parses document.cookie string into a key-value object
|
|
3
|
+
* Returns empty object during SSR when document is not available
|
|
4
|
+
*
|
|
5
|
+
* @returns Object mapping cookie names to their decoded values
|
|
6
|
+
*/
|
|
7
|
+
const parseCookies = (): Record<string, string> => {
|
|
8
|
+
// Check if we're in the browser environment
|
|
9
|
+
if (typeof document === 'undefined' || !document.cookie) {
|
|
10
|
+
return {};
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
return document.cookie.split('; ').reduce(
|
|
14
|
+
(acc, cookie) => {
|
|
15
|
+
const equalIndex = cookie.indexOf('=');
|
|
16
|
+
if (equalIndex === -1) {
|
|
17
|
+
return acc;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const name = cookie.substring(0, equalIndex);
|
|
21
|
+
const value = cookie.substring(equalIndex + 1);
|
|
22
|
+
|
|
23
|
+
try {
|
|
24
|
+
acc[decodeURIComponent(name.trim())] = decodeURIComponent(value.trim());
|
|
25
|
+
} catch {
|
|
26
|
+
// Skip malformed cookies that can't be decoded
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return acc;
|
|
30
|
+
},
|
|
31
|
+
{} as Record<string, string>
|
|
32
|
+
);
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Gets a specific cookie value by name
|
|
37
|
+
*/
|
|
38
|
+
const getCookie = (name: string): string | undefined => {
|
|
39
|
+
const cookies = parseCookies();
|
|
40
|
+
return cookies[name];
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Sets a cookie with the specified options
|
|
45
|
+
* Does nothing during SSR when document is not available
|
|
46
|
+
*/
|
|
47
|
+
const setCookie = (
|
|
48
|
+
name: string,
|
|
49
|
+
value: string | boolean,
|
|
50
|
+
options: {
|
|
51
|
+
expires?: Date;
|
|
52
|
+
path?: string;
|
|
53
|
+
sameSite?: 'strict' | 'lax' | 'none';
|
|
54
|
+
secure?: boolean;
|
|
55
|
+
}
|
|
56
|
+
) => {
|
|
57
|
+
// Check if we're in the browser environment
|
|
58
|
+
if (typeof document === 'undefined') {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
let cookie = `${encodeURIComponent(name)}=${encodeURIComponent(String(value))}`;
|
|
63
|
+
|
|
64
|
+
if (options.expires) {
|
|
65
|
+
cookie += `; expires=${options.expires.toUTCString()}`;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (options.path) {
|
|
69
|
+
cookie += `; path=${options.path}`;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (options.sameSite) {
|
|
73
|
+
cookie += `; samesite=${options.sameSite}`;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (options.secure) {
|
|
77
|
+
cookie += '; secure';
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
document.cookie = cookie;
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Removes a cookie by setting its expiry to the past
|
|
85
|
+
*/
|
|
86
|
+
const removeCookie = (name: string, options: { path?: string }) => {
|
|
87
|
+
setCookie(name, '', {
|
|
88
|
+
...options,
|
|
89
|
+
expires: new Date(0),
|
|
90
|
+
});
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Reads cookies to find feature flag overrides
|
|
95
|
+
*
|
|
96
|
+
* Looks for cookies that match feature flag key names and returns
|
|
97
|
+
* a FeatureFlags object with the overridden values
|
|
98
|
+
*
|
|
99
|
+
* @param flagKeys - Array of flag keys to check for cookie overrides
|
|
100
|
+
* @example
|
|
101
|
+
* // If a cookie named "ff_team-1234_home-page-is-green" exists with value "true"
|
|
102
|
+
* const overrides = getFeatureFlagOverrides(['ff_team-1234_home-page-is-green']);
|
|
103
|
+
* // Returns: { 'ff_team-1234_home-page-is-green': true }
|
|
104
|
+
*/
|
|
105
|
+
export const getFeatureFlagOverrides = (flagKeys: string[]) => {
|
|
106
|
+
const overrides: Record<string, boolean> = {};
|
|
107
|
+
|
|
108
|
+
flagKeys.forEach((flagKey) => {
|
|
109
|
+
const cookieValue = getCookie(flagKey);
|
|
110
|
+
|
|
111
|
+
// Only include if cookie exists and has a non-empty value
|
|
112
|
+
if (cookieValue !== undefined && cookieValue !== '') {
|
|
113
|
+
// Convert cookie value to boolean
|
|
114
|
+
// Handles: 'true', 'false', true, false, 1, 0, '1', '0'
|
|
115
|
+
overrides[flagKey] = cookieValue === 'true' || cookieValue === '1';
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
return overrides;
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Sets a feature flag override cookie
|
|
124
|
+
*
|
|
125
|
+
* @param featureFlagKey - The feature flag key to override
|
|
126
|
+
* @param value - The boolean value to set
|
|
127
|
+
*
|
|
128
|
+
* Note: Cookies are set without a domain attribute to make them specific
|
|
129
|
+
* to the current hostname
|
|
130
|
+
*/
|
|
131
|
+
export const setFeatureFlagOverride = (featureFlagKey: string, value: boolean) => {
|
|
132
|
+
const expires = new Date();
|
|
133
|
+
expires.setDate(expires.getDate() + 30); // 30 days expiration
|
|
134
|
+
|
|
135
|
+
setCookie(featureFlagKey, value, {
|
|
136
|
+
expires,
|
|
137
|
+
path: '/',
|
|
138
|
+
sameSite: 'lax',
|
|
139
|
+
secure: true,
|
|
140
|
+
});
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Removes a feature flag override cookie
|
|
145
|
+
*
|
|
146
|
+
* @param featureFlagKey - The feature flag key to remove
|
|
147
|
+
*
|
|
148
|
+
* Note: Cookies are removed without a domain attribute since they're
|
|
149
|
+
* specific to the current hostname
|
|
150
|
+
*/
|
|
151
|
+
export const removeFeatureFlagOverride = (featureFlagKey: string) => {
|
|
152
|
+
removeCookie(featureFlagKey, {
|
|
153
|
+
path: '/',
|
|
154
|
+
});
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Determines the source of a feature flag's value
|
|
159
|
+
*
|
|
160
|
+
* @param hasOverride - Whether the flag has a local cookie override
|
|
161
|
+
* @param currentValue - The current value from the remote feature-flag service (undefined means not set)
|
|
162
|
+
* @returns A human-readable string indicating the value source
|
|
163
|
+
*/
|
|
164
|
+
export const getFeatureFlagValueSource = (hasOverride: boolean, currentValue: boolean | undefined): string => {
|
|
165
|
+
if (hasOverride) {
|
|
166
|
+
return 'Cookie Override';
|
|
167
|
+
}
|
|
168
|
+
return currentValue !== undefined ? 'Remote' : 'Default (false)';
|
|
169
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { useFeatureFlagsContext } from '../../providers/featureFlagProvider';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Hook to check if a specific feature flag is enabled
|
|
5
|
+
* @param key - The feature flag key to check
|
|
6
|
+
* @returns `true` if the feature flag exists and is enabled, `false` otherwise
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```tsx
|
|
10
|
+
* const isGreenHomePage = useFeatureFlag('ff_team-1234_home-page-is-green');
|
|
11
|
+
* if (isGreenHomePage) {
|
|
12
|
+
* return <GreenHomePage />;
|
|
13
|
+
* }
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export const useFeatureFlag = (key: string): boolean => {
|
|
17
|
+
const featureFlags = useFeatureFlagsContext();
|
|
18
|
+
return featureFlags[key] === true;
|
|
19
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { useFeatureFlagsContext } from '../../providers/featureFlagProvider';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Hook to get all feature flags
|
|
5
|
+
* @returns The complete feature flags object passed to DesignSystemProvider
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```tsx
|
|
9
|
+
* const featureFlags = useFeatureFlags();
|
|
10
|
+
* console.log(featureFlags); // { 'ff_team-1234_home-page-is-green': true }
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
export const useFeatureFlags = () => {
|
|
14
|
+
return useFeatureFlagsContext();
|
|
15
|
+
};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { GridFileCard } from '../GridFileCard/GridFileCard';
|
|
2
|
+
import { ListFileCard } from '../ListFileCard/ListFileCard';
|
|
3
|
+
import { BaseFileCardProps, BaseFileCardStyle } from '../types';
|
|
4
|
+
|
|
5
|
+
export type FileCardProps = BaseFileCardProps & {
|
|
6
|
+
badge?: string;
|
|
7
|
+
cardStyle?: BaseFileCardStyle;
|
|
8
|
+
'data-testid'?: string;
|
|
9
|
+
showActionsOnHover?: boolean;
|
|
10
|
+
statusText?: string;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export const FileCard = ({
|
|
14
|
+
badge,
|
|
15
|
+
cardStyle = 'contained',
|
|
16
|
+
'data-testid': dataTestId,
|
|
17
|
+
errorMessage,
|
|
18
|
+
progress,
|
|
19
|
+
showActionsOnHover = false,
|
|
20
|
+
status,
|
|
21
|
+
statusIcon,
|
|
22
|
+
statusText,
|
|
23
|
+
...props
|
|
24
|
+
}: FileCardProps) =>
|
|
25
|
+
cardStyle === 'card' ? (
|
|
26
|
+
<GridFileCard
|
|
27
|
+
{...props}
|
|
28
|
+
badge={badge}
|
|
29
|
+
data-testid={dataTestId}
|
|
30
|
+
errorMessage={errorMessage}
|
|
31
|
+
progress={progress}
|
|
32
|
+
status={status}
|
|
33
|
+
statusIcon={statusIcon}
|
|
34
|
+
statusText={statusText}
|
|
35
|
+
/>
|
|
36
|
+
) : (
|
|
37
|
+
<ListFileCard
|
|
38
|
+
{...props}
|
|
39
|
+
cardStyle={cardStyle}
|
|
40
|
+
data-testid={dataTestId}
|
|
41
|
+
errorMessage={errorMessage}
|
|
42
|
+
progress={progress}
|
|
43
|
+
showActionsOnHover={showActionsOnHover}
|
|
44
|
+
status={status}
|
|
45
|
+
statusIcon={statusIcon}
|
|
46
|
+
statusText={statusText}
|
|
47
|
+
/>
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
FileCard.displayName = 'FileCard';
|