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