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