@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.
Files changed (509) hide show
  1. package/evolve-ui.entries.json +556 -0
  2. package/fileUpload/testUtils/mockFilesAndImages.d.cts +3 -3
  3. package/fileUpload/testUtils/mockFilesAndImages.d.cts.map +1 -1
  4. package/fileUpload/testUtils/mockFilesAndImages.d.mts +3 -3
  5. package/fileUpload/testUtils/mockFilesAndImages.d.mts.map +1 -1
  6. package/fileUpload/testUtils/testUtils.d.cts +1 -1
  7. package/fileUpload/testUtils/testUtils.d.cts.map +1 -1
  8. package/fileUpload/testUtils/testUtils.d.mts +1 -1
  9. package/fileUpload/testUtils/testUtils.d.mts.map +1 -1
  10. package/package.json +2 -2
  11. package/src/Accordion/Accordion.tsx +233 -0
  12. package/src/AddressDisplay/AddressDisplay.tsx +43 -0
  13. package/src/AddressDisplay/components/addressComponents.tsx +111 -0
  14. package/src/AddressDisplay/components/addressField.tsx +25 -0
  15. package/src/AddressDisplay/components/addressSection.tsx +8 -0
  16. package/src/AddressDisplay/components/getCountryValue.tsx +31 -0
  17. package/src/AddressDisplay/types.ts +26 -0
  18. package/src/AutomatedCarousel/AutomatedCarousel.tsx +163 -0
  19. package/src/AutomatedCarousel/automatedCarousel.types.ts +7 -0
  20. package/src/AutomatedCarousel/components/CarouselProgressBar/CarouselProgressBar.tsx +139 -0
  21. package/src/AutomatedCarousel/components/CarouselProgressBar/components/CarouselProgressBarUnit/CarouselProgressBarUnit.tsx +165 -0
  22. package/src/Badge/Badge.tsx +104 -0
  23. package/src/Badge/Badge.types.ts +58 -0
  24. package/src/Badge/ItemBadge.tsx +97 -0
  25. package/src/Badge/LiveStatusBadge.tsx +93 -0
  26. package/src/BannerNotification/BannerNotification.tsx +157 -0
  27. package/src/BannerNotification/components/BannerNotificationSkeleton.tsx +39 -0
  28. package/src/BannerNotification/components/CalloutIcon/BannerIcon.tsx +48 -0
  29. package/src/BannerNotification/utils/getRandomTooltipId.ts +3 -0
  30. package/src/BottomSheet/BottomSheet.tsx +476 -0
  31. package/src/BottomSheet/components/BottomSheetBackdrop/BottomSheetBackdrop.tsx +47 -0
  32. package/src/BottomSheet/components/BottomSheetContentArea/BottomSheetContentArea.tsx +92 -0
  33. package/src/BottomSheet/components/BottomSheetOverlay/BottomSheetOverlayTranslate3d.tsx +196 -0
  34. package/src/BottomSheet/components/SheetDescription/SheetDescription.tsx +22 -0
  35. package/src/BottomSheet/components/SheetTitle/SheetTitle.tsx +21 -0
  36. package/src/BottomSheet/components/index.tsx +5 -0
  37. package/src/BottomSheet/hooks/index.tsx +13 -0
  38. package/src/BottomSheet/hooks/useAriaHider.tsx +91 -0
  39. package/src/BottomSheet/hooks/useBottomSheetServices.tsx +224 -0
  40. package/src/BottomSheet/hooks/useDragHandler.tsx +282 -0
  41. package/src/BottomSheet/hooks/useFocusTrap.tsx +113 -0
  42. package/src/BottomSheet/hooks/useLayoutEffect.tsx +4 -0
  43. package/src/BottomSheet/hooks/useOptimizedResizeObserver.tsx +94 -0
  44. package/src/BottomSheet/hooks/useOptimizedScrollState.tsx +87 -0
  45. package/src/BottomSheet/hooks/useReady.tsx +34 -0
  46. package/src/BottomSheet/hooks/useReducedMotion.tsx +22 -0
  47. package/src/BottomSheet/hooks/useScrollLock.tsx +143 -0
  48. package/src/BottomSheet/hooks/useSnapPoints.tsx +355 -0
  49. package/src/BottomSheet/hooks/useSpring.tsx +47 -0
  50. package/src/BottomSheet/hooks/useSpringInterpolationsTranslate3d.tsx +101 -0
  51. package/src/BottomSheet/index.tsx +237 -0
  52. package/src/BottomSheet/state/atoms.ts +147 -0
  53. package/src/BottomSheet/state/useBottomSheetStateMachine.ts +246 -0
  54. package/src/BottomSheet/types.ts +172 -0
  55. package/src/BottomSheet/utils.ts +65 -0
  56. package/src/Breadcrumbs/Breadcrumbs.tsx +126 -0
  57. package/src/Button/Button.tsx +164 -0
  58. package/src/Button/Button.types.ts +80 -0
  59. package/src/Button/buttonColorClasses.ts +53 -0
  60. package/src/Callout/Callout.tsx +136 -0
  61. package/src/Callout/Callout.types.ts +29 -0
  62. package/src/Callout/components/CalloutIcon/CalloutIcon.tsx +56 -0
  63. package/src/Card/CardGrid.tsx +263 -0
  64. package/src/Card/SingleCard.tsx +22 -0
  65. package/src/Card/cardFactory.tsx +176 -0
  66. package/src/Card/components/createBadge.tsx +34 -0
  67. package/src/Card/components/createFavoriteButton.tsx +40 -0
  68. package/src/Card/components/createImage.tsx +64 -0
  69. package/src/Card/components/createInfo.tsx +84 -0
  70. package/src/Card/components/createName.tsx +63 -0
  71. package/src/Card/components/createPriceStatus.tsx +100 -0
  72. package/src/Card/components/types.ts +4 -0
  73. package/src/Card/hooks/useCardVisibilityTracking.ts +82 -0
  74. package/src/Card/sharedProps.ts +12 -0
  75. package/src/Card/types.ts +62 -0
  76. package/src/Carousel/Carousel.tsx +513 -0
  77. package/src/Carousel/Carousel.types.ts +43 -0
  78. package/src/Carousel/Carousel.utils.ts +63 -0
  79. package/src/Carousel/components/DotButton/DotButton.tsx +42 -0
  80. package/src/Carousel/components/NavigationButtons/NavigationButtons.tsx +77 -0
  81. package/src/Carousel/components/TitleSection/TitleSection.tsx +61 -0
  82. package/src/Carousel/components/TitleSection/components/SubHeaderLeft/SubHeaderLeft.tsx +53 -0
  83. package/src/Carousel/components/TitleSection/components/Title/Title.tsx +46 -0
  84. package/src/Carousel/index.ts +2 -0
  85. package/src/Carousel/testUtils.ts +10 -0
  86. package/src/Chips/Chip.tsx +153 -0
  87. package/src/Chips/ChipGroup.tsx +173 -0
  88. package/src/Chips/SuggestionChip.tsx +15 -0
  89. package/src/Chips/chipTypes.ts +113 -0
  90. package/src/Chips/index.ts +4 -0
  91. package/src/ChoiceListItem/Checkbox.tsx +69 -0
  92. package/src/ChoiceListItem/Radio.tsx +61 -0
  93. package/src/ChoiceListItem/choiceListItem.tsx +99 -0
  94. package/src/ChoiceListItem/common.tsx +148 -0
  95. package/src/ChoiceListItem/index.ts +3 -0
  96. package/src/Collapsible/Collapsible.tsx +58 -0
  97. package/src/Confetti/Confetti.tsx +270 -0
  98. package/src/Confetti/index.ts +2 -0
  99. package/src/ContentPager/ContentPager.tsx +189 -0
  100. package/src/ContentPager/components/Page.tsx +24 -0
  101. package/src/CookieConsent/components/CookieCategoryRow/CookieCategoryRow.tsx +30 -0
  102. package/src/CookieConsent/components/CookieConsent/CookieConsent.tsx +74 -0
  103. package/src/CookieConsent/components/CookieConsentBanner/CookieConsentBanner.tsx +51 -0
  104. package/src/CookieConsent/components/CookieConsentModal/CookieConsentModal.tsx +64 -0
  105. package/src/CookieConsent/hooks/useCookieConsent.ts +170 -0
  106. package/src/CookieConsent/hooks/useCookieConsentState.ts +142 -0
  107. package/src/CookieConsent/index.ts +16 -0
  108. package/src/CookieConsent/types/cookieConsent.types.ts +79 -0
  109. package/src/CookieConsent/types/index.ts +7 -0
  110. package/src/Countdown/Countdown.tsx +161 -0
  111. package/src/Countdown/Countdown.types.ts +4 -0
  112. package/src/Countdown/hooks/useGetCountdown.ts +103 -0
  113. package/src/DateTimeInput/dateInput/DateInput.tsx +199 -0
  114. package/src/DateTimeInput/datePicker/DatePicker.tsx +138 -0
  115. package/src/DateTimeInput/datePicker/components/calendar/Calendar.tsx +72 -0
  116. package/src/DateTimeInput/datePicker/index.ts +2 -0
  117. package/src/DateTimeInput/timeInput/TimeInput.tsx +128 -0
  118. package/src/DateTimeInput/timePicker/TimePicker.tsx +118 -0
  119. package/src/DateTimeInput/timePicker/components/TimePopover/AmPmSwitch.tsx +103 -0
  120. package/src/DateTimeInput/timePicker/components/TimePopover/TimeFieldInput.tsx +26 -0
  121. package/src/DateTimeInput/timePicker/components/TimePopover/TimePopover.tsx +84 -0
  122. package/src/DateTimeInput/timePicker/components/TimePopover/TimePopover.utils.ts +67 -0
  123. package/src/DateTimeInput/timePicker/components/TimePopover/TimePopoverActions.tsx +26 -0
  124. package/src/DateTimeInput/timePicker/index.ts +2 -0
  125. package/src/DateTimeInput/utils/getDisplayDate.ts +15 -0
  126. package/src/DateTimeInput/utils/getDisplayTime.ts +15 -0
  127. package/src/DateTimeInput/utils/index.ts +2 -0
  128. package/src/DateTimeInput/utils/parseTimeValue.ts +54 -0
  129. package/src/Drawer/Drawer.tsx +446 -0
  130. package/src/Drawer/atoms.ts +4 -0
  131. package/src/Drawer/components/DialogActions/DialogActions.tsx +33 -0
  132. package/src/Drawer/components/DialogContent/DialogContent.tsx +80 -0
  133. package/src/Drawer/components/DialogHeader/DialogHeader.tsx +68 -0
  134. package/src/EducationalPopover/EducationalPopover.tsx +174 -0
  135. package/src/FavoriteButton/FavoriteButton.tsx +64 -0
  136. package/src/FavoriteButton/components/IconOnlyFavoriteButton/IconOnlyFavoriteButton.tsx +80 -0
  137. package/src/FavoriteButton/components/LabeledAnimatedFavoriteButton/LabeledAnimatedFavoriteButton.tsx +179 -0
  138. package/src/FavoriteButton/components/LabeledFavoriteButton/LabeledFavoriteButton.tsx +71 -0
  139. package/src/FavoriteButton/components/SmallHeartStraightIcon/SmallHeartStraightIcon.tsx +14 -0
  140. package/src/FavoriteButton/hooks/useFavoriteButtonState.ts +30 -0
  141. package/src/FavoriteButton/index.ts +2 -0
  142. package/src/FavoriteButton/types/favoriteButton.ts +87 -0
  143. package/src/FeatureFlags/devTools/FeatureFlagDevToolsUI.tsx +226 -0
  144. package/src/FeatureFlags/devTools/getFeatureFlagCookieOverrides.ts +30 -0
  145. package/src/FeatureFlags/devTools/utils/cookies.ts +169 -0
  146. package/src/FeatureFlags/hooks/index.ts +2 -0
  147. package/src/FeatureFlags/hooks/useFeatureFlag.tsx +19 -0
  148. package/src/FeatureFlags/hooks/useFeatureFlags.tsx +15 -0
  149. package/src/FileUpload/components/FileCard/FileCard.tsx +50 -0
  150. package/src/FileUpload/components/FileDropzone/FileDropzone.tsx +221 -0
  151. package/src/FileUpload/components/FileDropzone/components/DropzoneContent/DropzoneContent.tsx +28 -0
  152. package/src/FileUpload/components/FileDropzone/components/DropzoneContent/DropzoneText.tsx +81 -0
  153. package/src/FileUpload/components/FileDropzone/components/FileDropzoneDebugger/FileDropzoneDebugger.tsx +40 -0
  154. package/src/FileUpload/components/FileDropzone/components/FileDropzoneDebugger/FileRejectionsDisplay.tsx +110 -0
  155. package/src/FileUpload/components/FileDropzoneOverlay/FileDropzoneOverlay.tsx +183 -0
  156. package/src/FileUpload/components/FileDropzoneOverlay/components/OverlayDropzoneContent.tsx +146 -0
  157. package/src/FileUpload/components/FileDropzoneOverlay/components/OverlayDropzoneDragText.tsx +42 -0
  158. package/src/FileUpload/components/FileDropzoneOverlay/styles.ts +79 -0
  159. package/src/FileUpload/components/FilePreviewList/FilePreviewList.tsx +251 -0
  160. package/src/FileUpload/components/FilePreviewList/virtualizerComponents/FilePreviewVirtualizedList/FilePreviewVirtualizedList.tsx +88 -0
  161. package/src/FileUpload/components/FileUpload/FileUpload.tsx +63 -0
  162. package/src/FileUpload/components/FileUploadCanvas/FileUploadCanvas.tsx +125 -0
  163. package/src/FileUpload/components/GridFileCard/GridFileCard.tsx +364 -0
  164. package/src/FileUpload/components/GridFileCard/utils/sortable.ts +48 -0
  165. package/src/FileUpload/components/ListFileCard/ListFileCard.tsx +259 -0
  166. package/src/FileUpload/components/types.ts +78 -0
  167. package/src/FileUpload/hooks/filePreview/useImageFilePreviewUrl.ts +62 -0
  168. package/src/FileUpload/hooks/index.ts +11 -0
  169. package/src/FileUpload/hooks/upload/useHandleDragEnter/useHandleDragEnter.ts +154 -0
  170. package/src/FileUpload/hooks/upload/useHandleDrop/createFileRejectionHelpers.ts +273 -0
  171. package/src/FileUpload/hooks/upload/useHandleDrop/useHandleDrop.ts +153 -0
  172. package/src/FileUpload/hooks/upload/useUploadAvailability/useUploadAvailability.ts +44 -0
  173. package/src/FileUpload/hooks/validation/createDropzoneValidator.ts +41 -0
  174. package/src/FileUpload/hooks/validation/useFileValidation.ts +25 -0
  175. package/src/FileUpload/hooks/validation/useFileValidationLogic.ts +107 -0
  176. package/src/FileUpload/hooks/validation/useValidationMessages.ts +92 -0
  177. package/src/FileUpload/hooks/validation/useValidationState.ts +171 -0
  178. package/src/FileUpload/index.ts +57 -0
  179. package/src/FileUpload/providers/FileUploadProvider.tsx +219 -0
  180. package/src/FileUpload/providers/UploadValidationProvider.tsx +159 -0
  181. package/src/FileUpload/testUtils/mockFilesAndImages.ts +64 -0
  182. package/src/FileUpload/testUtils/testUtils.ts +111 -0
  183. package/src/FileUpload/types/commonTypes.ts +267 -0
  184. package/src/FileUpload/types/index.ts +31 -0
  185. package/src/FileUpload/types/sharedTypes.ts +159 -0
  186. package/src/FileUpload/utils/constants.ts +79 -0
  187. package/src/FileUpload/utils/createMessageContext.ts +180 -0
  188. package/src/FileUpload/utils/getFileExtensionsFromAcceptedTypes.ts +73 -0
  189. package/src/FileUpload/utils/getFilePluralizationText.ts +68 -0
  190. package/src/FileUpload/utils/getMimeTypes.ts +26 -0
  191. package/src/FileUpload/utils/messageUtils.ts +41 -0
  192. package/src/FileUpload/utils/styles.ts +68 -0
  193. package/src/FormLabel/FormLabel.tsx +212 -0
  194. package/src/IconButton/IconButton.tsx +154 -0
  195. package/src/Icons/CreditCardIcon/CreditCardIcon.tsx +73 -0
  196. package/src/Icons/CreditCardIcon/cardIcons.tsx +270 -0
  197. package/src/Icons/IconBase.tsx +133 -0
  198. package/src/Icons/anyIcon.ts +3 -0
  199. package/src/Icons/generatedIcons/Archive.tsx +48 -0
  200. package/src/Icons/generatedIcons/ArrowClockwise.tsx +48 -0
  201. package/src/Icons/generatedIcons/ArrowDown.tsx +48 -0
  202. package/src/Icons/generatedIcons/ArrowLeft.tsx +48 -0
  203. package/src/Icons/generatedIcons/ArrowRight.tsx +48 -0
  204. package/src/Icons/generatedIcons/ArrowSquareOut.tsx +51 -0
  205. package/src/Icons/generatedIcons/ArrowSquareRight.tsx +51 -0
  206. package/src/Icons/generatedIcons/ArrowUp.tsx +48 -0
  207. package/src/Icons/generatedIcons/ArrowsCounterClockwise.tsx +48 -0
  208. package/src/Icons/generatedIcons/ArrowsLeftRight.tsx +48 -0
  209. package/src/Icons/generatedIcons/ArrowsOutCardinal.tsx +48 -0
  210. package/src/Icons/generatedIcons/Bank.tsx +48 -0
  211. package/src/Icons/generatedIcons/Bell.tsx +51 -0
  212. package/src/Icons/generatedIcons/BookBookmark.tsx +51 -0
  213. package/src/Icons/generatedIcons/BookmarksSimple.tsx +51 -0
  214. package/src/Icons/generatedIcons/Broadcast.tsx +48 -0
  215. package/src/Icons/generatedIcons/CalendarBlank.tsx +48 -0
  216. package/src/Icons/generatedIcons/CalendarStar.tsx +51 -0
  217. package/src/Icons/generatedIcons/Camera.tsx +51 -0
  218. package/src/Icons/generatedIcons/CaretDown.tsx +48 -0
  219. package/src/Icons/generatedIcons/CaretLeft.tsx +48 -0
  220. package/src/Icons/generatedIcons/CaretRight.tsx +48 -0
  221. package/src/Icons/generatedIcons/CaretUp.tsx +48 -0
  222. package/src/Icons/generatedIcons/Certificate.tsx +51 -0
  223. package/src/Icons/generatedIcons/ChartBar.tsx +48 -0
  224. package/src/Icons/generatedIcons/Check.tsx +51 -0
  225. package/src/Icons/generatedIcons/CheckCircle.tsx +48 -0
  226. package/src/Icons/generatedIcons/CirclesFour.tsx +51 -0
  227. package/src/Icons/generatedIcons/Clock.tsx +48 -0
  228. package/src/Icons/generatedIcons/ClockCountdown.tsx +48 -0
  229. package/src/Icons/generatedIcons/Close.tsx +51 -0
  230. package/src/Icons/generatedIcons/CloudArrowUp.tsx +51 -0
  231. package/src/Icons/generatedIcons/CloudWarning.tsx +51 -0
  232. package/src/Icons/generatedIcons/Code.tsx +48 -0
  233. package/src/Icons/generatedIcons/Compass.tsx +51 -0
  234. package/src/Icons/generatedIcons/Confetti.tsx +51 -0
  235. package/src/Icons/generatedIcons/Copy.tsx +48 -0
  236. package/src/Icons/generatedIcons/CornersOut.tsx +48 -0
  237. package/src/Icons/generatedIcons/CreditCard.tsx +48 -0
  238. package/src/Icons/generatedIcons/Crown.tsx +51 -0
  239. package/src/Icons/generatedIcons/CrownSimple.tsx +51 -0
  240. package/src/Icons/generatedIcons/CurrencyCircleDollar.tsx +48 -0
  241. package/src/Icons/generatedIcons/CurrencyDollarSimple.tsx +51 -0
  242. package/src/Icons/generatedIcons/Desktop.tsx +51 -0
  243. package/src/Icons/generatedIcons/Detective.tsx +51 -0
  244. package/src/Icons/generatedIcons/DotOutline.tsx +46 -0
  245. package/src/Icons/generatedIcons/DotsSixVertical.tsx +51 -0
  246. package/src/Icons/generatedIcons/DotsThreeOutline.tsx +51 -0
  247. package/src/Icons/generatedIcons/DotsThreeOutlineVertical.tsx +51 -0
  248. package/src/Icons/generatedIcons/DownloadSimple.tsx +51 -0
  249. package/src/Icons/generatedIcons/EnvelopeSimple.tsx +48 -0
  250. package/src/Icons/generatedIcons/Eraser.tsx +51 -0
  251. package/src/Icons/generatedIcons/Eye.tsx +51 -0
  252. package/src/Icons/generatedIcons/EyeSlash.tsx +51 -0
  253. package/src/Icons/generatedIcons/FacebookLogo.tsx +48 -0
  254. package/src/Icons/generatedIcons/FileArchive.tsx +48 -0
  255. package/src/Icons/generatedIcons/FileArrowDown.tsx +48 -0
  256. package/src/Icons/generatedIcons/FileCsv.tsx +48 -0
  257. package/src/Icons/generatedIcons/FilePdf.tsx +48 -0
  258. package/src/Icons/generatedIcons/FileText.tsx +48 -0
  259. package/src/Icons/generatedIcons/Files.tsx +51 -0
  260. package/src/Icons/generatedIcons/Fire.tsx +51 -0
  261. package/src/Icons/generatedIcons/Flag.tsx +51 -0
  262. package/src/Icons/generatedIcons/FlagBannerFold.tsx +48 -0
  263. package/src/Icons/generatedIcons/FloppyDisk.tsx +51 -0
  264. package/src/Icons/generatedIcons/Gauge.tsx +51 -0
  265. package/src/Icons/generatedIcons/Gavel.tsx +51 -0
  266. package/src/Icons/generatedIcons/Gear.tsx +51 -0
  267. package/src/Icons/generatedIcons/GlobeHemisphereWest.tsx +51 -0
  268. package/src/Icons/generatedIcons/GoogleLogo.tsx +48 -0
  269. package/src/Icons/generatedIcons/GridNine.tsx +51 -0
  270. package/src/Icons/generatedIcons/HandCoins.tsx +51 -0
  271. package/src/Icons/generatedIcons/HandbagSimple.tsx +51 -0
  272. package/src/Icons/generatedIcons/Headset.tsx +51 -0
  273. package/src/Icons/generatedIcons/HeartStraight.tsx +51 -0
  274. package/src/Icons/generatedIcons/HourglassLow.tsx +48 -0
  275. package/src/Icons/generatedIcons/House.tsx +51 -0
  276. package/src/Icons/generatedIcons/Image.tsx +51 -0
  277. package/src/Icons/generatedIcons/ImageSquare.tsx +51 -0
  278. package/src/Icons/generatedIcons/ImagesSquare.tsx +51 -0
  279. package/src/Icons/generatedIcons/Info.tsx +48 -0
  280. package/src/Icons/generatedIcons/InstagramLogo.tsx +51 -0
  281. package/src/Icons/generatedIcons/Lightning.tsx +48 -0
  282. package/src/Icons/generatedIcons/Link.tsx +51 -0
  283. package/src/Icons/generatedIcons/LinkedinLogo.tsx +51 -0
  284. package/src/Icons/generatedIcons/List.tsx +48 -0
  285. package/src/Icons/generatedIcons/Lock.tsx +51 -0
  286. package/src/Icons/generatedIcons/LockOpen.tsx +51 -0
  287. package/src/Icons/generatedIcons/MagnifyingGlass.tsx +48 -0
  288. package/src/Icons/generatedIcons/MapPin.tsx +51 -0
  289. package/src/Icons/generatedIcons/MapPinSimpleArea.tsx +48 -0
  290. package/src/Icons/generatedIcons/Medal.tsx +48 -0
  291. package/src/Icons/generatedIcons/Megaphone.tsx +48 -0
  292. package/src/Icons/generatedIcons/Minus.tsx +45 -0
  293. package/src/Icons/generatedIcons/Money.tsx +51 -0
  294. package/src/Icons/generatedIcons/Notches.tsx +48 -0
  295. package/src/Icons/generatedIcons/NotePencil.tsx +48 -0
  296. package/src/Icons/generatedIcons/Package.tsx +51 -0
  297. package/src/Icons/generatedIcons/PaintBrush.tsx +51 -0
  298. package/src/Icons/generatedIcons/PaperPlaneTilt.tsx +51 -0
  299. package/src/Icons/generatedIcons/Paperclip.tsx +51 -0
  300. package/src/Icons/generatedIcons/Pause.tsx +51 -0
  301. package/src/Icons/generatedIcons/PencilLine.tsx +51 -0
  302. package/src/Icons/generatedIcons/PencilRuler.tsx +51 -0
  303. package/src/Icons/generatedIcons/PencilSimple.tsx +51 -0
  304. package/src/Icons/generatedIcons/Phone.tsx +51 -0
  305. package/src/Icons/generatedIcons/PinterestLogo.tsx +51 -0
  306. package/src/Icons/generatedIcons/Play.tsx +51 -0
  307. package/src/Icons/generatedIcons/Plus.tsx +51 -0
  308. package/src/Icons/generatedIcons/PlusCircle.tsx +48 -0
  309. package/src/Icons/generatedIcons/Printer.tsx +51 -0
  310. package/src/Icons/generatedIcons/Question.tsx +48 -0
  311. package/src/Icons/generatedIcons/Receipt.tsx +51 -0
  312. package/src/Icons/generatedIcons/Rows.tsx +51 -0
  313. package/src/Icons/generatedIcons/SealCheck.tsx +51 -0
  314. package/src/Icons/generatedIcons/SelectionSlash.tsx +48 -0
  315. package/src/Icons/generatedIcons/ShareNetwork.tsx +51 -0
  316. package/src/Icons/generatedIcons/ShieldCheck.tsx +51 -0
  317. package/src/Icons/generatedIcons/ShieldStar.tsx +51 -0
  318. package/src/Icons/generatedIcons/ShoppingCart.tsx +48 -0
  319. package/src/Icons/generatedIcons/ShuffleAngular.tsx +48 -0
  320. package/src/Icons/generatedIcons/SidebarSimple.tsx +48 -0
  321. package/src/Icons/generatedIcons/SlidersHorizontal.tsx +51 -0
  322. package/src/Icons/generatedIcons/Smiley.tsx +48 -0
  323. package/src/Icons/generatedIcons/Sparkle.tsx +51 -0
  324. package/src/Icons/generatedIcons/SpinnerGap.tsx +48 -0
  325. package/src/Icons/generatedIcons/StackPlus.tsx +48 -0
  326. package/src/Icons/generatedIcons/Star.tsx +51 -0
  327. package/src/Icons/generatedIcons/Storefront.tsx +51 -0
  328. package/src/Icons/generatedIcons/Swap.tsx +51 -0
  329. package/src/Icons/generatedIcons/Tag.tsx +51 -0
  330. package/src/Icons/generatedIcons/ThumbsDown.tsx +48 -0
  331. package/src/Icons/generatedIcons/ThumbsUp.tsx +48 -0
  332. package/src/Icons/generatedIcons/Toolbox.tsx +48 -0
  333. package/src/Icons/generatedIcons/Trash.tsx +48 -0
  334. package/src/Icons/generatedIcons/TrendUp.tsx +48 -0
  335. package/src/Icons/generatedIcons/Trophy.tsx +51 -0
  336. package/src/Icons/generatedIcons/Truck.tsx +51 -0
  337. package/src/Icons/generatedIcons/UploadSimple.tsx +51 -0
  338. package/src/Icons/generatedIcons/User.tsx +48 -0
  339. package/src/Icons/generatedIcons/Users.tsx +48 -0
  340. package/src/Icons/generatedIcons/UsersThree.tsx +51 -0
  341. package/src/Icons/generatedIcons/VideoCamera.tsx +51 -0
  342. package/src/Icons/generatedIcons/Warning.tsx +51 -0
  343. package/src/Icons/generatedIcons/WarningCircle.tsx +48 -0
  344. package/src/Icons/generatedIcons/WifiHigh.tsx +51 -0
  345. package/src/Icons/generatedIcons/XCircle.tsx +48 -0
  346. package/src/Icons/generatedIcons/XLogo.tsx +48 -0
  347. package/src/Icons/generatedIcons/YoutubeLogo.tsx +51 -0
  348. package/src/Icons/importedIcons.ts +152 -0
  349. package/src/Icons/index.ts +149 -0
  350. package/src/Icons/socialIcons/appleSocialIcon.tsx +50 -0
  351. package/src/Icons/socialIcons/facebookSocialIcon.tsx +41 -0
  352. package/src/Icons/socialIcons/googleSocialIcon.tsx +134 -0
  353. package/src/ImageCluster/ImageCluster.tsx +125 -0
  354. package/src/ImageSlider/ImageSlider.tsx +582 -0
  355. package/src/ImageSlider/ImageSlider.types.ts +90 -0
  356. package/src/ImageSlider/components/IndexIndicator/IndexIndicator.tsx +21 -0
  357. package/src/ImageSlider/components/NavigationButtons/NavigationButtons.tsx +113 -0
  358. package/src/ImageSlider/components/ResponsiveImage/ResponsiveImage.tsx +114 -0
  359. package/src/ImageSlider/components/ResponsiveImage/index.ts +1 -0
  360. package/src/ImageSlider/components/Thumbnails/Thumbnails.tsx +184 -0
  361. package/src/ImageSlider/constants.ts +59 -0
  362. package/src/ImageSlider/hooks/index.ts +3 -0
  363. package/src/ImageSlider/hooks/useImageSlider.ts +57 -0
  364. package/src/ImageSlider/hooks/useImageSliderNavigation.ts +133 -0
  365. package/src/ImageSlider/hooks/useImageSliderScrollHandler.ts +171 -0
  366. package/src/ImageSlider/index.ts +3 -0
  367. package/src/ImageSlider/utils/imageOptimization.ts +97 -0
  368. package/src/ImageSlider/utils/index.ts +1 -0
  369. package/src/InlineNotification/InlineNotification.tsx +95 -0
  370. package/src/JumpMenu/JumpMenu.tsx +395 -0
  371. package/src/JumpMenu/components/JumpMenuItem/JumpMenuItem.tsx +62 -0
  372. package/src/JumpMenu/hooks/useContainerTracking.ts +171 -0
  373. package/src/JumpMenu/hooks/useIntersectionObserver.ts +77 -0
  374. package/src/JumpMenu/hooks/useKeyboardNavigation.ts +102 -0
  375. package/src/JumpMenu/hooks/useResizeObserver.ts +53 -0
  376. package/src/JumpMenu/hooks/useSectionObserver.ts +102 -0
  377. package/src/JumpMenu/index.ts +2 -0
  378. package/src/JumpMenu/types/index.ts +19 -0
  379. package/src/Loading/Loading.tsx +39 -0
  380. package/src/Loading/components/LoadingDot/LoadingDot.tsx +16 -0
  381. package/src/LoadingSpinner/LoadingSpinner.tsx +20 -0
  382. package/src/Menu/Menu.tsx +372 -0
  383. package/src/Menu/components/MenuDivider/MenuDivider.tsx +5 -0
  384. package/src/Menu/components/MenuItem/MenuItem.tsx +298 -0
  385. package/src/Menu/context/menuContext.tsx +20 -0
  386. package/src/Menu/hooks/useMenu.tsx +18 -0
  387. package/src/Menu/index.ts +3 -0
  388. package/src/Modal/ComposableModal.tsx +313 -0
  389. package/src/Modal/Modal.tsx +231 -0
  390. package/src/Modal/components/BackButton/BackButton.tsx +43 -0
  391. package/src/Modal/components/Backdrop/Backdrop.tsx +62 -0
  392. package/src/Modal/components/CloseButton/CloseButton.tsx +55 -0
  393. package/src/Modal/components/ModalActions/ModalActions.tsx +135 -0
  394. package/src/Modal/components/ModalContent/ModalContent.tsx +163 -0
  395. package/src/Modal/components/ModalHeader/ModalHeader.tsx +84 -0
  396. package/src/Modal/components/ModalHeader/hooks/useHeaderAnimation.tsx +49 -0
  397. package/src/Modal/components/ModalProgressSteps/ModalProgressSteps.tsx +26 -0
  398. package/src/Modal/components/ModalSubTitle/ModalSubTitle.tsx +29 -0
  399. package/src/Modal/components/ModalTitle/ModalTitle.tsx +22 -0
  400. package/src/Modal/components/PreventModalScroll/PreventModalScroll.tsx +106 -0
  401. package/src/Modal/components/index.ts +12 -0
  402. package/src/Modal/context.ts +33 -0
  403. package/src/Modal/hooks/useCloseModal.ts +133 -0
  404. package/src/NotificationBadge/NotificationBadge.tsx +34 -0
  405. package/src/Pagination/AdvancedPagination.tsx +48 -0
  406. package/src/Pagination/Pagination.tsx +216 -0
  407. package/src/Pagination/components/AdvancedPaginator/AdvancedPaginator.tsx +52 -0
  408. package/src/Pagination/components/AdvancedPaginator/components/PageSelect/PageSelect.tsx +43 -0
  409. package/src/Pagination/components/ItemCountDisplay/ItemCountDisplay.tsx +32 -0
  410. package/src/Pagination/components/ItemCountSelect/ItemCountSelect.tsx +33 -0
  411. package/src/Pagination/index.tsx +3 -0
  412. package/src/Pagination/paginationProvider.tsx +234 -0
  413. package/src/Pagination/utils.tsx +36 -0
  414. package/src/PhoneInput/PhoneInput.tsx +509 -0
  415. package/src/PhoneInput/useDropdownLogic.tsx +163 -0
  416. package/src/ProgressCircle/ProgressCircle.tsx +246 -0
  417. package/src/ProgressCircle/hooks/useProgressStatusTransitions.ts +49 -0
  418. package/src/ProgressCircle/utils/progressCircle.constants.ts +27 -0
  419. package/src/ProgressSteps/ProgressSteps.tsx +160 -0
  420. package/src/SaveConfetti/SaveConfetti.tsx +277 -0
  421. package/src/SaveConfetti/index.ts +2 -0
  422. package/src/SearchInput/SearchInput.tsx +236 -0
  423. package/src/SegmentedControl/SegmentedControl.tsx +111 -0
  424. package/src/SegmentedControl/SegmentedControlGroup.tsx +94 -0
  425. package/src/SegmentedControl/index.ts +4 -0
  426. package/src/Select/Select.tsx +154 -0
  427. package/src/Select/SelectAsync.tsx +13 -0
  428. package/src/Select/SelectAsyncCreatable.tsx +14 -0
  429. package/src/Select/SelectCreatable.tsx +12 -0
  430. package/src/Select/reexportedComponents.tsx +5 -0
  431. package/src/Select/selectComponents.tsx +306 -0
  432. package/src/Skeleton/Skeleton.tsx +13 -0
  433. package/src/SplitButton/SplitButton.tsx +298 -0
  434. package/src/SplitButton/SplitButtonTrigger.tsx +55 -0
  435. package/src/StarRating/StarRating.tsx +165 -0
  436. package/src/StarRating/components/StarComponent/StarComponent.tsx +44 -0
  437. package/src/Table/Table.tsx +474 -0
  438. package/src/Table/components/TableHeader/TableHeader.tsx +166 -0
  439. package/src/Table/components/TablePagination/TablePagination.tsx +18 -0
  440. package/src/Table/components/TablePagination/components/ItemCountDisplay/ItemCountDisplay.tsx +17 -0
  441. package/src/Table/components/TablePagination/components/ItemCountSelect/ItemCountSelect.tsx +31 -0
  442. package/src/Table/components/TablePagination/components/TablePaginator/TablePaginator.tsx +37 -0
  443. package/src/Table/components/TablePagination/components/TablePaginator/components/PageSelect/PageSelect.tsx +32 -0
  444. package/src/Table/components/TableRow/TableRows.tsx +147 -0
  445. package/src/Table/components/TableRow/components/TableRowCell/TableRowCell.tsx +49 -0
  446. package/src/Table/components/TableShadow/TableShadow.tsx +46 -0
  447. package/src/Table/index.ts +2 -0
  448. package/src/Table/sharedState.ts +30 -0
  449. package/src/Table/sharedStyles.ts +1 -0
  450. package/src/Table/types.ts +55 -0
  451. package/src/Tabs/Tabs.tsx +358 -0
  452. package/src/TextArea/TextArea.tsx +157 -0
  453. package/src/TextInput/TextInput.tsx +173 -0
  454. package/src/Toast/Toast.tsx +64 -0
  455. package/src/Toast/components/ToastContainer/ToastContainer.tsx +48 -0
  456. package/src/Toast/index.ts +2 -0
  457. package/src/Toast/types/role.ts +1 -0
  458. package/src/Toast/utils/getIcon.tsx +41 -0
  459. package/src/ToggleSwitch/ToggleSwitch.tsx +188 -0
  460. package/src/Tooltip/InfoIconTooltip.tsx +47 -0
  461. package/src/Tooltip/Tooltip.tsx +41 -0
  462. package/src/Typography/InlineButton/InlineButton.tsx +166 -0
  463. package/src/Typography/Links/Links.tsx +113 -0
  464. package/src/Typography/Text/Text.tsx +239 -0
  465. package/src/ViewMore/ViewMore.tsx +226 -0
  466. package/src/WebRTCPlayer/WebRTCPlayer.tsx +325 -0
  467. package/src/WebRTCPlayer/adaptor/NativeWebRTCAdaptor.ts +588 -0
  468. package/src/WebRTCPlayer/hooks/useWebRTCStream.ts +571 -0
  469. package/src/WebRTCPlayer/index.ts +22 -0
  470. package/src/WebRTCPlayer/types.ts +95 -0
  471. package/src/breakpoints/index.tsx +1 -0
  472. package/src/breakpoints/utils.tsx +50 -0
  473. package/src/declarations.d.ts +7 -0
  474. package/src/grid/gridHighlighter.tsx +83 -0
  475. package/src/grid/index.ts +3 -0
  476. package/src/grid/pageGrid.tsx +37 -0
  477. package/src/grid/useSubGridCSS.tsx +214 -0
  478. package/src/hooks/useHorizontalScrollFade.ts +44 -0
  479. package/src/hooks/usePrevious.ts +14 -0
  480. package/src/index.ts +351 -0
  481. package/src/intl/index.ts +4 -0
  482. package/src/intl/utils.ts +67 -0
  483. package/src/mixins/horizontalScrollFadeMixin.ts +56 -0
  484. package/src/mixins/index.ts +18 -0
  485. package/src/mixins/propMixins.ts +389 -0
  486. package/src/providers/createContextProvider.ts +22 -0
  487. package/src/providers/designSystemProvider.tsx +218 -0
  488. package/src/providers/errorBoundaryProvider.tsx +179 -0
  489. package/src/providers/featureFlagProvider.tsx +18 -0
  490. package/src/providers/gridSizeProvider.tsx +23 -0
  491. package/src/providers/index.ts +12 -0
  492. package/src/providers/linkProvider.tsx +32 -0
  493. package/src/providers/normalize.tsx +93 -0
  494. package/src/providers/targets/DatePickerTarget.tsx +10 -0
  495. package/src/providers/targets/ModalTarget.tsx +14 -0
  496. package/src/providers/targets/TimePickerTarget.tsx +10 -0
  497. package/src/providers/themeContext.tsx +24 -0
  498. package/src/providers/windowSizeProvider.tsx +125 -0
  499. package/src/spacing/index.ts +1 -0
  500. package/src/spacing/spacing.ts +11 -0
  501. package/src/utils/countriesWithISOCodes.ts +1419 -0
  502. package/src/utils/dateTimeFormat.ts +257 -0
  503. package/src/utils/effectEventListener.ts +11 -0
  504. package/src/utils/formatFileSize.ts +18 -0
  505. package/src/utils/isClientSide.ts +1 -0
  506. package/src/utils/keepTransition.ts +15 -0
  507. package/src/utils/nodeEnv.ts +9 -0
  508. package/src/utils/smoothScrollTo.ts +47 -0
  509. package/src/utils/utilityTypes.ts +13 -0
@@ -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,2 @@
1
+ export { useFeatureFlag } from './useFeatureFlag';
2
+ export { useFeatureFlags } from './useFeatureFlags';
@@ -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';