@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,146 @@
1
+ import { useMemo } from 'react';
2
+
3
+ import { FileArchive, FileCsv, FilePdf, Files, FileText, ImageSquare, ImagesSquare } from '../../../../Icons';
4
+ import { UploadValidationContextType } from '../../../providers/UploadValidationProvider';
5
+ import { CommonFileTypes } from '../../../types/commonTypes';
6
+ import { OverlayDropzoneDragText } from './OverlayDropzoneDragText';
7
+
8
+ type OverlayContentProps = {
9
+ accept?: CommonFileTypes | string[];
10
+ customIcon?: React.ReactNode;
11
+ dragText: string;
12
+ isDragActive: boolean;
13
+ maxFiles?: number;
14
+ validation: UploadValidationContextType;
15
+ };
16
+
17
+ export const OverlayDropzoneContent = ({
18
+ accept,
19
+ customIcon,
20
+ dragText,
21
+ isDragActive,
22
+ maxFiles,
23
+ validation,
24
+ }: OverlayContentProps) => {
25
+ // Determine icon color based on validation state
26
+ const iconColor = validation.dragValidationError ? 'critical' : 'secondary';
27
+
28
+ // Determine which icon to show based on accept and maxFiles
29
+ const icon = useMemo(() => {
30
+ // 1. Custom icon takes precedence
31
+ if (customIcon) {
32
+ return customIcon;
33
+ }
34
+
35
+ const isSingleFile = maxFiles === 1;
36
+
37
+ // 2. Images
38
+ if (accept === 'images' || (Array.isArray(accept) && accept.some((type) => type.startsWith('image/')))) {
39
+ if (isSingleFile) {
40
+ return (
41
+ <ImageSquare
42
+ color={iconColor}
43
+ size="lg"
44
+ style="duotone"
45
+ />
46
+ );
47
+ }
48
+ return (
49
+ <ImagesSquare
50
+ color={iconColor}
51
+ size="lg"
52
+ style="duotone"
53
+ />
54
+ );
55
+ }
56
+
57
+ // 3. Documents
58
+ if (accept === 'documents') {
59
+ if (isSingleFile) {
60
+ return (
61
+ <FileText
62
+ color={iconColor}
63
+ size="lg"
64
+ style="duotone"
65
+ />
66
+ );
67
+ }
68
+ return (
69
+ <Files
70
+ color={iconColor}
71
+ size="lg"
72
+ style="duotone"
73
+ />
74
+ );
75
+ }
76
+
77
+ // 4. PDFs
78
+ if (accept === 'pdfs' || (Array.isArray(accept) && accept.some((type) => type === 'application/pdf'))) {
79
+ return (
80
+ <FilePdf
81
+ color={iconColor}
82
+ size="lg"
83
+ style="duotone"
84
+ />
85
+ );
86
+ }
87
+
88
+ // 5. CSV files
89
+ if (
90
+ Array.isArray(accept) &&
91
+ accept.some((type) => type === 'text/csv' || type === '.csv' || type.includes('csv'))
92
+ ) {
93
+ return (
94
+ <FileCsv
95
+ color={iconColor}
96
+ size="lg"
97
+ style="duotone"
98
+ />
99
+ );
100
+ }
101
+
102
+ // 6. Archive files (zip, rar, 7z, tar, gz, etc.)
103
+ if (
104
+ Array.isArray(accept) &&
105
+ accept.some(
106
+ (type) =>
107
+ type.includes('zip') ||
108
+ type.includes('rar') ||
109
+ type.includes('7z') ||
110
+ type.includes('tar') ||
111
+ type.includes('gzip') ||
112
+ type === 'application/x-zip-compressed' ||
113
+ type === 'application/x-rar-compressed' ||
114
+ type === 'application/x-7z-compressed'
115
+ )
116
+ ) {
117
+ return (
118
+ <FileArchive
119
+ color={iconColor}
120
+ size="lg"
121
+ style="duotone"
122
+ />
123
+ );
124
+ }
125
+
126
+ // 7. Default: general files icon
127
+ return (
128
+ <Files
129
+ color={iconColor}
130
+ size="lg"
131
+ style="duotone"
132
+ />
133
+ );
134
+ }, [customIcon, accept, maxFiles, iconColor]);
135
+
136
+ return (
137
+ <div className="text-center">
138
+ <div className="mb-xs flex justify-center">{icon}</div>
139
+ <OverlayDropzoneDragText
140
+ dragText={dragText}
141
+ isDragActive={isDragActive}
142
+ validation={validation}
143
+ />
144
+ </div>
145
+ );
146
+ };
@@ -0,0 +1,42 @@
1
+ import { cn } from '@evolve.ui/theme-system';
2
+ import { useMemo } from 'react';
3
+
4
+ import { UploadValidationContextType } from '../../../providers/UploadValidationProvider';
5
+
6
+ type OverlayDropzoneDragTextProps = {
7
+ dragText: string;
8
+ isDragActive: boolean;
9
+ validation: UploadValidationContextType;
10
+ };
11
+
12
+ export const OverlayDropzoneDragText = ({ dragText, isDragActive, validation }: OverlayDropzoneDragTextProps) => {
13
+ // Determine overlay text based on drag state and validation
14
+ const overlayText = useMemo(() => {
15
+ if (!isDragActive) {
16
+ return null;
17
+ }
18
+
19
+ // Show validation error if present
20
+ if (validation.dragValidationError?.message) {
21
+ return validation.dragValidationError.message;
22
+ }
23
+
24
+ // Show success message for valid drag
25
+ return dragText;
26
+ }, [isDragActive, validation.dragValidationError, dragText]);
27
+
28
+ if (!overlayText) {
29
+ return null;
30
+ }
31
+
32
+ return (
33
+ <div
34
+ className={cn(
35
+ 'text-xl font-medium',
36
+ validation.dragValidationError ? 'text-text-critical' : 'text-blue-600'
37
+ )}
38
+ >
39
+ {overlayText}
40
+ </div>
41
+ );
42
+ };
@@ -0,0 +1,79 @@
1
+ import { cn } from '@evolve.ui/theme-system';
2
+
3
+ import { FileError } from '../../types';
4
+ import { OverlayStyleOptions } from '../../types/sharedTypes';
5
+
6
+ type DropzoneState = {
7
+ disableClickThrough: boolean;
8
+ disableDragValidation: boolean;
9
+ disabled: boolean;
10
+ isDragActive: boolean;
11
+ styleOptions?: OverlayStyleOptions;
12
+ validationError?: FileError | null;
13
+ };
14
+
15
+ export const getUploadOverlayStyles = ({
16
+ disableClickThrough,
17
+ disabled,
18
+ disableDragValidation,
19
+ isDragActive,
20
+ styleOptions = {},
21
+ validationError,
22
+ }: DropzoneState) => {
23
+ const { blurOnDrag = false, showDashedBorder = true } = styleOptions;
24
+
25
+ const isInvalid = Boolean(validationError);
26
+ const isErrorState = disableDragValidation ? false : isInvalid;
27
+ const isDraggedOver = isDragActive && (disableDragValidation || !isInvalid);
28
+
29
+ return cn(
30
+ // Layout & Container
31
+ [
32
+ 'absolute inset-0',
33
+ 'flex flex-col',
34
+ 'h-full w-full',
35
+ 'items-center justify-center',
36
+ 'rounded-[var(--container-border-radius)]',
37
+ showDashedBorder && 'outline-dashed outline-1 -outline-offset-1',
38
+ 'transition-colors',
39
+ disableClickThrough &&
40
+ 'cursor-pointer group-hover/dropzone:bg-background-hover group-hover/dropzone:outline-border-hover',
41
+ ],
42
+
43
+ // Pointer Events Strategy:
44
+ // - Only apply pointer-events-none when click-through is not disabled
45
+ // - When disableClickThrough is true, the overlay captures all events
46
+ // - The parent container (with getRootProps) captures drag events
47
+ !disableClickThrough && 'pointer-events-none',
48
+
49
+ // Z-Index: Always on top to be visible when drag is active
50
+ 'z-10',
51
+
52
+ // Focus & Interactive Base
53
+ ['hui-focus-visible-outline'],
54
+
55
+ // Interactive States
56
+ {
57
+ // Drag Active - thick blue outline when dragging
58
+ 'outline outline-4 outline-offset-0 outline-focus-primary': isDragActive,
59
+ },
60
+
61
+ // Visual States
62
+ {
63
+ // Apply blur when enabled and dragging (success state)
64
+ 'backdrop-blur-[2px]': blurOnDrag && isDraggedOver && !isErrorState && !disabled,
65
+
66
+ // Apply blur when enabled and dragging (error state)
67
+ 'backdrop-blur-sm': blurOnDrag && isDragActive && isErrorState,
68
+
69
+ // Error (only when not disabled and dragging)
70
+ 'bg-background-critical-light/50 outline-border-critical': isErrorState && !disabled && isDragActive,
71
+
72
+ // Drag Over - show background when dragging
73
+ 'bg-background-hover bg-background-secondary/90': isDraggedOver && !isErrorState && !disabled,
74
+
75
+ // Default - transparent when not dragging
76
+ 'bg-transparent outline-border-secondary': !isDragActive,
77
+ }
78
+ );
79
+ };
@@ -0,0 +1,251 @@
1
+ import { cn } from '@evolve.ui/theme-system';
2
+ import { breakpoints } from '@evolve.ui/theme-system/themes/common';
3
+ import { useCallback, useContext, useMemo, useState } from 'react';
4
+
5
+ import { useWindowWidth } from '../../../providers';
6
+ import { FileUploadContext, FileUploadContextType } from '../../providers/FileUploadProvider';
7
+ import { FileResource } from '../../types/commonTypes';
8
+ import { FileCard, FileCardProps } from '../FileCard/FileCard';
9
+ /* eslint-disable curly */
10
+ import { BaseFileCardStyle, FileStatusConfig, PreviewStyle } from '../types';
11
+ import { FilePreviewVirtualizedList } from './virtualizerComponents/FilePreviewVirtualizedList/FilePreviewVirtualizedList';
12
+
13
+ type ColsByBreakpoint = {
14
+ xs: number;
15
+ } & { [key in 'sm' | 'md' | 'lg' | 'xl']?: number };
16
+
17
+ export type FilePreviewListProps = {
18
+ /** Whether files in the list can be selected (or checked) */
19
+ bulkSelectionEnabled?: boolean;
20
+ /** Additional CSS classes */
21
+ className?: string;
22
+ /** Number of columns to display at each breakpoint, allowing you to create a custom grid layout. (grid view only) */
23
+ colsByBreakpoint?: ColsByBreakpoint;
24
+ /** Test ID for the component */
25
+ 'data-testid'?: string;
26
+ /** Whether files can be dragged and sorted */
27
+ draggable?: boolean;
28
+ /** Array of Files or RemoteFile Objects (typically with URLs) to display in the preview list */
29
+ files?: FileResource[];
30
+ /** Callback to configure status display (status, progress, error, icon, text) for each file */
31
+ getFileStatusConfig?: (file: FileResource, index: number) => FileStatusConfig | undefined;
32
+ /** Whether to hide the delete action on the file cards */
33
+ hideDeleteAction?: boolean;
34
+ /** Whether to hide the file names on the file cards */
35
+ hideFileNames?: boolean;
36
+ /** Whether to hide the file sizes on the file cards */
37
+ hideFileSizes?: boolean;
38
+ /** Whether to hide status messages on the file cards (error messages, "Pending", "Uploading", and custom statusText) */
39
+ hideFileStatuses?: boolean;
40
+ /** Called when user clicks delete button on a file preview */
41
+ onDelete?: (fileResource: FileResource) => void;
42
+ /** Called when user selects or deselects a file */
43
+ onSelect?: (fileResource: FileResource, isSelected: boolean) => void;
44
+ /** Determines the view style for the file preview list */
45
+ previewStyle?: PreviewStyle;
46
+ /** Whether to show delete button or other actions on hover (list view only) */
47
+ showActionsOnHover?: boolean;
48
+ /** Whether to use a virtualized list (Only used if previewStyle is list or compactList) */
49
+ virtualized?: boolean;
50
+ };
51
+
52
+ const VIEW_TO_CARD_STYLE: Record<PreviewStyle, BaseFileCardStyle> = {
53
+ compactList: 'compact',
54
+ grid: 'card',
55
+ list: 'contained',
56
+ };
57
+
58
+ export const FilePreviewList = ({
59
+ bulkSelectionEnabled = false,
60
+ className,
61
+ colsByBreakpoint = { lg: 5, md: 4, sm: 3, xl: 5, xs: 3 },
62
+ 'data-testid': dataTestId = 'file-preview-list',
63
+ draggable = false,
64
+ files: filesProp,
65
+ getFileStatusConfig,
66
+ hideDeleteAction = false,
67
+ hideFileNames = false,
68
+ hideFileSizes = false,
69
+ hideFileStatuses = false,
70
+ onDelete,
71
+ onSelect,
72
+ previewStyle = 'list',
73
+ showActionsOnHover = false,
74
+ virtualized = false,
75
+ }: FilePreviewListProps) => {
76
+ const uploadContext = useContext<FileUploadContextType | undefined>(FileUploadContext);
77
+ // Check if we're in a provider by checking if files exist in context
78
+
79
+ // Props should take precedence over context values (consistent with FileDropzone)
80
+ // If files are provided as props, use those. Otherwise, fallback to context if available.
81
+ const files = filesProp ?? uploadContext?.files ?? [];
82
+
83
+ const handleDeleteFile = useCallback(
84
+ (fileToDelete: FileResource) => {
85
+ if (uploadContext && !onDelete) {
86
+ // No onDelete handler, use automatic deletion from context state
87
+ const fileToDeleteId = getItemIdentifier(fileToDelete);
88
+ uploadContext.setFiles((prevFiles) =>
89
+ prevFiles.filter((file) => getItemIdentifier(file) !== fileToDeleteId)
90
+ );
91
+ }
92
+ onDelete?.(fileToDelete);
93
+ },
94
+ [uploadContext, onDelete]
95
+ );
96
+
97
+ const width = useWindowWidth();
98
+ const [selectedFiles, setSelectedFiles] = useState<string[]>([]);
99
+
100
+ const { lgMinValue, mdMinValue, smMinValue, xlMinValue } = breakpoints;
101
+
102
+ const gridColumns = useMemo(() => {
103
+ let columns = colsByBreakpoint.xs;
104
+ // Start with mobile (xs) as default
105
+ // Override with larger breakpoints if they exist and width matches
106
+ if (width >= smMinValue && colsByBreakpoint.sm) columns = colsByBreakpoint.sm;
107
+ if (width >= mdMinValue && colsByBreakpoint.md) columns = colsByBreakpoint.md;
108
+ if (width >= lgMinValue && colsByBreakpoint.lg) columns = colsByBreakpoint.lg;
109
+ if (width >= xlMinValue && colsByBreakpoint.xl) columns = colsByBreakpoint.xl;
110
+ return columns;
111
+ }, [width, colsByBreakpoint, lgMinValue, mdMinValue, smMinValue, xlMinValue]);
112
+
113
+ const handleSelect = useCallback(
114
+ (file: FileResource, isSelected: boolean) => {
115
+ setSelectedFiles((prev) => {
116
+ const name = file.name; // Both File and RemoteFile have name property
117
+
118
+ if (isSelected) {
119
+ return [...prev, name];
120
+ }
121
+ return prev.filter((n) => n !== name);
122
+ });
123
+ onSelect?.(file, isSelected);
124
+ },
125
+ [onSelect]
126
+ );
127
+
128
+ const containerClasses = cn(
129
+ // Grid layout
130
+ previewStyle === 'grid' && ['grid', gridColumns && `grid-cols-${gridColumns}`],
131
+ // List/Table layout - only include gap-xs if viewStyle is list
132
+ previewStyle !== 'grid' && ['flex flex-col', previewStyle === 'list' && 'gap-xs']
133
+ );
134
+
135
+ const cardStyle = VIEW_TO_CARD_STYLE[previewStyle];
136
+
137
+ // Determine if we should use the virtualized list based on previewStyle and virtualized prop
138
+ const shouldUseVirtualizedList = virtualized && (previewStyle === 'list' || previewStyle === 'compactList');
139
+
140
+ // Common props used by both rendering paths
141
+ const commonProps = {
142
+ bulkSelectionEnabled,
143
+ draggable,
144
+ hideDeleteAction,
145
+ hideFileNames,
146
+ hideFileSizes,
147
+ hideFileStatuses,
148
+ showActionsOnHover,
149
+ };
150
+
151
+ // Helper to get a unique identifier for a file or URL
152
+ const getItemIdentifier = (item: FileResource): string => {
153
+ if ('url' in item) {
154
+ // RemoteFile: id should be unique if provided, otherwise use url as fallback
155
+ return item.id ?? item.url;
156
+ }
157
+ // File: use traditional properties for uniqueness
158
+ return `${item.name}-${item.size}-${item.lastModified}`;
159
+ };
160
+
161
+ // Create shared FileCard props with common conditional logic
162
+ const createFileCardProps = useCallback(
163
+ (fileResource: FileResource, index: number): FileCardProps => {
164
+ const name = fileResource.name;
165
+
166
+ const isSelected = selectedFiles.includes(name);
167
+
168
+ // FileCards hide the delete button when onDelete is not provided,
169
+ // so we pass undefined when hideDeleteAction is true,
170
+ // otherwise we pass the handleDeleteFile function
171
+ const deleteHandler = hideDeleteAction ? undefined : handleDeleteFile;
172
+
173
+ // Get status configuration from callback if provided
174
+ const statusConfig = getFileStatusConfig?.(fileResource, index);
175
+
176
+ return {
177
+ cardStyle,
178
+ draggable,
179
+ errorMessage: statusConfig?.errorMessage,
180
+ hideFileName: hideFileNames,
181
+ hideFileSize: hideFileSizes,
182
+ hideFileStatus: hideFileStatuses,
183
+ imageSource: fileResource,
184
+ onDelete: deleteHandler,
185
+ onSelect: bulkSelectionEnabled ? handleSelect : undefined,
186
+ ...(bulkSelectionEnabled ? { isSelected, selectable: true } : { selectable: false }),
187
+ progress: statusConfig?.progress,
188
+ showActionsOnHover,
189
+ status: statusConfig?.status,
190
+ statusIcon: statusConfig?.statusIcon,
191
+ statusText: statusConfig?.statusText,
192
+ };
193
+ },
194
+ [
195
+ bulkSelectionEnabled,
196
+ cardStyle,
197
+ draggable,
198
+ getFileStatusConfig,
199
+ handleDeleteFile,
200
+ handleSelect,
201
+ hideDeleteAction,
202
+ hideFileNames,
203
+ hideFileSizes,
204
+ hideFileStatuses,
205
+ selectedFiles,
206
+ showActionsOnHover,
207
+ ]
208
+ );
209
+
210
+ return (
211
+ <section
212
+ aria-label="File preview list"
213
+ className={cn(
214
+ 'flex w-full flex-col',
215
+ {
216
+ 'h-full': previewStyle !== 'grid',
217
+ },
218
+ className
219
+ )}
220
+ >
221
+ {shouldUseVirtualizedList ? (
222
+ <FilePreviewVirtualizedList
223
+ {...commonProps}
224
+ createFileCardProps={createFileCardProps}
225
+ files={files}
226
+ previewStyle={previewStyle}
227
+ selectedFiles={selectedFiles}
228
+ />
229
+ ) : (
230
+ <ul
231
+ className={containerClasses}
232
+ data-testid={dataTestId}
233
+ >
234
+ {files.map((fileResource, index) => (
235
+ <li
236
+ data-testid={`${dataTestId}-item-${index}`}
237
+ key={`${getItemIdentifier(fileResource)}-${index}`}
238
+ >
239
+ <FileCard
240
+ data-testid={`${dataTestId}-card-${index}`}
241
+ {...createFileCardProps(fileResource, index)}
242
+ />
243
+ </li>
244
+ ))}
245
+ </ul>
246
+ )}
247
+ </section>
248
+ );
249
+ };
250
+
251
+ FilePreviewList.displayName = 'FilePreviewList';
@@ -0,0 +1,88 @@
1
+ import { cn } from '@evolve.ui/theme-system';
2
+ import { useVirtualizer, VirtualItem } from '@tanstack/react-virtual';
3
+ import { useRef } from 'react';
4
+
5
+ import { FileCard, FileCardProps } from '../../../../components/FileCard/FileCard';
6
+ import { PreviewStyle } from '../../../../components/types';
7
+ import { FileResource } from '../../../../types';
8
+
9
+ /**
10
+ * Props for the virtualized list component
11
+ */
12
+ type VirtualizedListProps = {
13
+ // Common props passed from parent
14
+ bulkSelectionEnabled?: boolean;
15
+ createFileCardProps: (fileResource: FileResource, index: number) => FileCardProps;
16
+ draggable?: boolean;
17
+ files: FileResource[];
18
+ hideDeleteAction?: boolean;
19
+ hideFileNames?: boolean;
20
+ hideFileSizes?: boolean;
21
+ previewStyle: PreviewStyle;
22
+ selectedFiles: string[];
23
+ showActionsOnHover?: boolean;
24
+ };
25
+
26
+ /**
27
+ * A virtualized list component for efficiently rendering large lists of file previews
28
+ * Only renders items that are currently visible in the viewport
29
+ */
30
+ export const FilePreviewVirtualizedList = ({ createFileCardProps, files, previewStyle }: VirtualizedListProps) => {
31
+ const scrollRef = useRef<HTMLDivElement>(null);
32
+
33
+ const listItemHeight = previewStyle === 'list' ? 66 : 65;
34
+ const listItemGap = previewStyle === 'list' ? 8 : 0;
35
+
36
+ const virtualizer = useVirtualizer({
37
+ count: files.length,
38
+ estimateSize: () => listItemHeight,
39
+ gap: listItemGap,
40
+ getScrollElement: () => scrollRef.current,
41
+ overscan: 5,
42
+ });
43
+
44
+ const virtualItems = virtualizer.getVirtualItems();
45
+ return (
46
+ <div
47
+ className="relative h-full overflow-y-auto"
48
+ ref={scrollRef}
49
+ >
50
+ <ul
51
+ className={cn('flex flex-col', previewStyle === 'list' && 'gap-xs')}
52
+ data-testid="file-preview-virtualized-list-element"
53
+ style={{
54
+ height: `${virtualizer.getTotalSize()}px`,
55
+ position: 'relative',
56
+ width: '100%',
57
+ }}
58
+ >
59
+ {virtualItems.map((virtualItem: VirtualItem) => {
60
+ const file = files[virtualItem.index];
61
+
62
+ return (
63
+ <li
64
+ data-index={virtualItem.index}
65
+ data-testid={`file-preview-virtualized-list-item-${virtualItem.index}`}
66
+ key={virtualItem.key}
67
+ style={{
68
+ height: `${virtualItem.size}px`,
69
+ left: 0,
70
+ position: 'absolute',
71
+ top: 0,
72
+ transform: `translateY(${virtualItem.start}px)`,
73
+ width: '100%',
74
+ }}
75
+ >
76
+ <FileCard
77
+ data-testid={`file-preview-virtualized-list-card-${virtualItem.index}`}
78
+ {...createFileCardProps(file, virtualItem.index)}
79
+ />
80
+ </li>
81
+ );
82
+ })}
83
+ </ul>
84
+ </div>
85
+ );
86
+ };
87
+
88
+ FilePreviewVirtualizedList.displayName = 'FilePreviewVirtualizedList';
@@ -0,0 +1,63 @@
1
+ import { FileUploadProvider, FileUploadProviderConfigProps } from '../../providers/FileUploadProvider';
2
+ import { FileUploadProps } from '../../types/sharedTypes';
3
+ /* eslint-disable curly */
4
+ import { FileDropzone } from '../FileDropzone/FileDropzone';
5
+ import { FilePreviewList } from '../FilePreviewList/FilePreviewList';
6
+
7
+ /**
8
+ * FileUpload component for handling single or multiple file uploads
9
+ * with built-in validation and preview capabilities.
10
+ *
11
+ * This is the main container component that combines the drag-and-drop area (FileDropzone)
12
+ * and the file preview list (FilePreviewList) into a single, cohesive interface.
13
+ * It handles the file validation, upload state management, and preview display through
14
+ * the FileUploadProvider context.
15
+ *
16
+ */
17
+ export const FileUpload = ({
18
+ disabled,
19
+ error,
20
+ hideFilePreview = false,
21
+ initialFiles,
22
+ maxFiles,
23
+ maxSize,
24
+ onDrop,
25
+ onDropAccepted,
26
+ onDropRejected,
27
+ onFileDelete,
28
+ previewConfig,
29
+ previewStyle = 'list',
30
+ ...dropzoneProps
31
+ }: FileUploadProps) => {
32
+ const providerProps: FileUploadProviderConfigProps = {
33
+ accept: dropzoneProps.accept,
34
+ disabled,
35
+ error,
36
+ initialFiles,
37
+ maxFiles,
38
+ maxSize,
39
+ onDrop,
40
+ onDropAccepted,
41
+ onDropRejected,
42
+ onFileDelete,
43
+ strictValidation: dropzoneProps.strictValidation,
44
+ validator: dropzoneProps.validator,
45
+ };
46
+
47
+ return (
48
+ <FileUploadProvider {...providerProps}>
49
+ <div className="flex flex-col gap-md">
50
+ <FileDropzone {...dropzoneProps} />
51
+ {!hideFilePreview && (
52
+ <FilePreviewList
53
+ {...previewConfig}
54
+ onDelete={onFileDelete}
55
+ previewStyle={previewStyle}
56
+ />
57
+ )}
58
+ </div>
59
+ </FileUploadProvider>
60
+ );
61
+ };
62
+
63
+ FileUpload.displayName = 'FileUpload';