@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,79 @@
1
+ import { capitalize } from 'es-toolkit';
2
+
3
+ import { CommonFileTypes, DynamicMessageContext, FileErrorCode } from '../types/commonTypes';
4
+
5
+ export const builtInErrorCodes: FileErrorCode[] = ['file-invalid-type', 'file-too-large', 'too-many-files'];
6
+
7
+ export const ACCEPTED_MIME_TYPES: Record<CommonFileTypes, string[]> = {
8
+ documents: [
9
+ 'application/pdf',
10
+ 'application/msword',
11
+ 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', // .docx
12
+ 'application/vnd.ms-excel',
13
+ 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', // .xlsx
14
+ ],
15
+ images: ['image/jpeg', 'image/png', 'image/gif', 'image/webp'],
16
+ pdfs: ['application/pdf'],
17
+ };
18
+
19
+ // Messages shown during drag (preventative)
20
+ //DRAG MESSAGE RULES: Be short and concise. Don't use periods.
21
+ export const DRAG_MESSAGES = {
22
+ default: 'Invalid file',
23
+ partialUpload: {
24
+ 'file-invalid-type': ({ fileCount = 1, filePluralizationText }: DynamicMessageContext) =>
25
+ `${fileCount} ${filePluralizationText} ${fileCount > 1 ? 'have' : 'has'} an invalid file type`,
26
+ 'file-too-large': ({ formattedMaxSize }: DynamicMessageContext) =>
27
+ `One or more files are too large. (${formattedMaxSize} limit)`,
28
+ 'too-many-files': ({ fileCount, filePluralizationText }: DynamicMessageContext) =>
29
+ `${fileCount} ${filePluralizationText} will exceed the file limit`,
30
+ },
31
+ singleFileUpload: {
32
+ 'file-invalid-type': 'File type not supported',
33
+ 'file-too-large': ({ formattedMaxSize }: DynamicMessageContext) =>
34
+ `File must be smaller than ${formattedMaxSize}`,
35
+ 'too-many-files': ({ filePluralizationText, maxFiles }: DynamicMessageContext) =>
36
+ `You can only upload ${maxFiles} ${filePluralizationText}`,
37
+ },
38
+ strictUpload: {
39
+ 'file-invalid-type': 'One or more files have an invalid file type',
40
+ 'file-too-large': ({ formattedMaxSize }: DynamicMessageContext) =>
41
+ `One or more files are too large. (${formattedMaxSize} limit)`,
42
+ 'too-many-files': ({ maxFiles, maxFilesPluralizationText }: DynamicMessageContext) =>
43
+ `You can only upload ${maxFiles} ${maxFilesPluralizationText}`,
44
+ },
45
+ };
46
+
47
+ // Messages shown after drop (error state)
48
+ //DROP MESSAGE RULES: Guide the user on what went wrong and what they can do to move forward.
49
+ export const DROP_MESSAGES = {
50
+ default: 'Invalid file',
51
+ partialUpload: {
52
+ 'file-invalid-type': ({
53
+ acceptedFileExtensions,
54
+ fileCount = 1,
55
+ filePluralizationText,
56
+ }: DynamicMessageContext) =>
57
+ `Failed to add ${fileCount} ${filePluralizationText} due to invalid file type. Please upload only ${acceptedFileExtensions} files.`,
58
+ 'file-too-large': ({ fileCount = 1, filePluralizationText, formattedMaxSize }: DynamicMessageContext) =>
59
+ `${fileCount} ${filePluralizationText} ${fileCount > 1 ? 'are' : 'is'} too large. Please upload files smaller than ${formattedMaxSize}.`,
60
+ 'too-many-files': ({ fileCount, filePluralizationText, maxFiles }: DynamicMessageContext) =>
61
+ `You've reached the ${maxFiles} file limit. ${fileCount} ${filePluralizationText} could not be added.`,
62
+ },
63
+ singleFileUpload: {
64
+ 'file-invalid-type': ({ acceptedFileExtensions }: DynamicMessageContext) =>
65
+ `File type not supported. Please upload only ${acceptedFileExtensions} files.`,
66
+ 'file-too-large': ({ formattedMaxSize }: DynamicMessageContext) =>
67
+ `File is too large. Please upload files smaller than ${formattedMaxSize}.`,
68
+ 'too-many-files': ({ filePluralizationText, maxFiles }: DynamicMessageContext) =>
69
+ `${capitalize(filePluralizationText ?? 'files')} not added. You can only upload ${maxFiles} in total`,
70
+ },
71
+ strictUpload: {
72
+ 'file-invalid-type': ({ acceptedFileExtensions }: DynamicMessageContext) =>
73
+ `One or more files have an invalid file type. Please upload only ${acceptedFileExtensions} files.`,
74
+ 'file-too-large': ({ formattedMaxSize }: DynamicMessageContext) =>
75
+ `One or more files are too large. Please upload files smaller than ${formattedMaxSize}.`,
76
+ 'too-many-files': ({ filePluralizationText, maxFiles, maxFilesPluralizationText }: DynamicMessageContext) =>
77
+ `${capitalize(filePluralizationText ?? 'files')} not added - maximum of ${maxFiles} ${maxFilesPluralizationText} allowed.`,
78
+ },
79
+ };
@@ -0,0 +1,180 @@
1
+ import {
2
+ BaseDynamicMessageContext,
3
+ CommonFileTypes,
4
+ DragMessageContext,
5
+ DropMessageContext,
6
+ DynamicMessageContext,
7
+ } from '../types/commonTypes';
8
+ import { getFileExtensionsFromAcceptedTypes } from './getFileExtensionsFromAcceptedTypes';
9
+ import { getFilePluralizationText } from './getFilePluralizationText';
10
+
11
+ /**
12
+ * Creates a base message context with properties common to both drag and drop events
13
+ */
14
+ export const createBaseMessageContext = ({
15
+ accept,
16
+ code,
17
+ count,
18
+ formattedMaxSize,
19
+ maxFiles,
20
+ maxSize,
21
+ }: {
22
+ accept?: CommonFileTypes | string[];
23
+ code: string;
24
+ count?: number;
25
+ formattedMaxSize?: string;
26
+ maxFiles?: number;
27
+ maxSize?: number;
28
+ }): BaseDynamicMessageContext => {
29
+ const acceptedFileExtensions = getFileExtensionsFromAcceptedTypes(accept);
30
+
31
+ const filePluralizationText = getFilePluralizationText({
32
+ accept,
33
+ count,
34
+ hideCount: true,
35
+ });
36
+
37
+ const maxFilesPluralizationText = getFilePluralizationText({
38
+ accept,
39
+ count: maxFiles,
40
+ hideCount: true,
41
+ });
42
+
43
+ return {
44
+ acceptedFileExtensions,
45
+ errorCode: code,
46
+ ...(count !== undefined && { fileCount: count }),
47
+ filePluralizationText,
48
+ formattedMaxSize,
49
+ maxFiles,
50
+ maxFilesPluralizationText,
51
+ maxSizeBytes: maxSize,
52
+ };
53
+ };
54
+
55
+ /**
56
+ * Creates a message context for drag events
57
+ */
58
+ export const createDragMessageContext = ({
59
+ accept,
60
+ code,
61
+ count,
62
+ formattedMaxSize,
63
+ items,
64
+ maxFiles,
65
+ maxSize,
66
+ }: {
67
+ accept?: CommonFileTypes | string[];
68
+ code: string;
69
+ count?: number;
70
+ formattedMaxSize?: string;
71
+ items?: DataTransferItemList;
72
+ maxFiles?: number;
73
+ maxSize?: number;
74
+ }): DragMessageContext => {
75
+ const baseContext = createBaseMessageContext({
76
+ accept,
77
+ code,
78
+ count,
79
+ formattedMaxSize,
80
+ maxFiles,
81
+ maxSize,
82
+ });
83
+
84
+ return {
85
+ ...baseContext,
86
+ ...(items && { draggedItems: items }),
87
+ eventType: 'drag',
88
+ };
89
+ };
90
+
91
+ /**
92
+ * Creates a message context for drop events
93
+ */
94
+ export const createDropMessageContext = ({
95
+ accept,
96
+ code,
97
+ count,
98
+ files,
99
+ formattedMaxSize,
100
+ maxFiles,
101
+ maxSize,
102
+ }: {
103
+ accept?: CommonFileTypes | string[];
104
+ code: string;
105
+ count?: number;
106
+ files?: File[];
107
+ formattedMaxSize?: string;
108
+ maxFiles?: number;
109
+ maxSize?: number;
110
+ }): DropMessageContext => {
111
+ const baseContext = createBaseMessageContext({
112
+ accept,
113
+ code,
114
+ count,
115
+ formattedMaxSize,
116
+ maxFiles,
117
+ maxSize,
118
+ });
119
+
120
+ const rejectedFileList = files?.map((f) => f.name).join(', ') ?? '';
121
+
122
+ return {
123
+ ...baseContext,
124
+ eventType: 'drop',
125
+ rejectedFileList,
126
+ ...(files && { rejectedFiles: files }),
127
+ };
128
+ };
129
+
130
+ /**
131
+ * Unified function to create the appropriate message context based on the message type
132
+ *
133
+ * @param params Common parameters for both context types
134
+ * @param params.messageType The type of message context to create ('drag' or 'drop')
135
+ * @param params.dragItems Optional DataTransferItemList for drag events
136
+ * @param params.dropFiles Optional File[] for drop events (only newly dropped files can be rejected)
137
+ * @returns The appropriate message context based on the message type
138
+ */
139
+ export const createMessageContext = ({
140
+ accept,
141
+ code,
142
+ count,
143
+ dragItems,
144
+ dropFiles,
145
+ formattedMaxSize,
146
+ maxFiles,
147
+ maxSize,
148
+ messageType = 'drop',
149
+ }: {
150
+ accept?: CommonFileTypes | string[];
151
+ code: string;
152
+ count?: number;
153
+ dragItems?: DataTransferItemList;
154
+ dropFiles?: File[];
155
+ formattedMaxSize?: string;
156
+ maxFiles?: number;
157
+ maxSize?: number;
158
+ messageType?: 'drag' | 'drop';
159
+ }): DynamicMessageContext => {
160
+ const baseParams = {
161
+ accept,
162
+ code,
163
+ count,
164
+ formattedMaxSize,
165
+ maxFiles,
166
+ maxSize,
167
+ };
168
+
169
+ if (messageType === 'drag') {
170
+ return createDragMessageContext({
171
+ ...baseParams,
172
+ items: dragItems,
173
+ });
174
+ }
175
+
176
+ return createDropMessageContext({
177
+ ...baseParams,
178
+ files: dropFiles,
179
+ });
180
+ };
@@ -0,0 +1,73 @@
1
+ import { CommonFileTypes } from '../types/commonTypes';
2
+ import { ACCEPTED_MIME_TYPES } from './constants';
3
+
4
+ // Map of MIME types to their corresponding file extensions
5
+ const MIME_TYPE_TO_EXTENSION: Record<string, string> = {
6
+ 'application/msword': '.doc',
7
+ 'application/pdf': '.pdf',
8
+ 'application/vnd.ms-excel': '.xls',
9
+ 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': '.xlsx',
10
+ 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': '.docx',
11
+ 'image/gif': '.gif',
12
+ 'image/jpeg': '.jpeg',
13
+ 'image/jpg': '.jpg',
14
+ 'image/png': '.png',
15
+ 'image/webp': '.webp',
16
+ };
17
+
18
+ /**
19
+ * Converts a MIME type to its corresponding file extension
20
+ * @param mimeType The MIME type to convert (e.g., 'image/jpeg', 'application/pdf')
21
+ * @returns The corresponding file extension with leading dot (e.g., '.jpeg', '.pdf')
22
+ * or an empty string if the MIME type is invalid or incomplete
23
+ */
24
+ export const getMimeTypeExtension = (mimeType: string): string => {
25
+ // If we have a direct mapping, use it
26
+ if (MIME_TYPE_TO_EXTENSION[mimeType]) {
27
+ return MIME_TYPE_TO_EXTENSION[mimeType];
28
+ }
29
+
30
+ // For simple MIME types, extract the subtype
31
+ const parts = mimeType.split('/');
32
+ if (parts.length === 2 && parts[1] && !parts[1].includes('.')) {
33
+ return `.${parts[1]}`;
34
+ }
35
+
36
+ // Return empty string for incomplete MIME types
37
+ return '';
38
+ };
39
+
40
+ /**
41
+ * Converts file type restrictions into a comma-separated list of file extensions
42
+ * @param accept - Optional file type restrictions, can be either:
43
+ * - A preset category from CommonFileTypes (e.g., 'images', 'pdfs', 'documents')
44
+ * - An array of specific file extensions (e.g., ['.jpg', '.png', '.pdf'])
45
+ * - An array of MIME types (e.g., ['image/jpeg', 'image/png', 'application/pdf'])
46
+ * - A mixed array of both extensions and MIME types
47
+ * @returns A comma-separated string of file extensions with leading dots (e.g., '.jpg, .png, .pdf')
48
+ * or an empty string if no valid extensions are found or accept is undefined
49
+ * @example
50
+ * // Returns '.jpeg, .png, .gif, .webp, .jpg'
51
+ * getFileExtensionsFromAcceptedTypes('images')
52
+ *
53
+ * // Returns '.jpg, .png, .pdf'
54
+ * getFileExtensionsFromAcceptedTypes(['.jpg', 'image/png', 'application/pdf'])
55
+ */
56
+ export const getFileExtensionsFromAcceptedTypes = (accept?: CommonFileTypes | string[]) => {
57
+ if (!accept) {
58
+ return '';
59
+ }
60
+
61
+ // If it's a CommonFileTypes string (e.g., 'images')
62
+ if (typeof accept === 'string') {
63
+ const mimeTypes = ACCEPTED_MIME_TYPES[accept as CommonFileTypes];
64
+ return mimeTypes.map(getMimeTypeExtension).join(', ');
65
+ }
66
+
67
+ // If it's an array of extensions/mime types
68
+ return accept
69
+ .filter(Boolean) // Remove empty strings and falsy values
70
+ .map((type) => (type.startsWith('.') ? type : getMimeTypeExtension(type))) // Convert MIME types to extensions
71
+ .filter((ext) => ext.length > 1) // Remove single-character extensions
72
+ .join(', ');
73
+ };
@@ -0,0 +1,68 @@
1
+ import { capitalize } from 'es-toolkit';
2
+
3
+ import { CommonFileTypes } from '../types/commonTypes';
4
+
5
+ type GetFilePluralizationTextProps = {
6
+ accept?: CommonFileTypes | string[];
7
+ capitalize?: boolean;
8
+ count?: number;
9
+ hideCount?: boolean;
10
+ };
11
+
12
+ const getBaseText = (accept?: CommonFileTypes | string[]): 'image' | 'file' => {
13
+ if (accept === 'images') {
14
+ return 'image';
15
+ }
16
+
17
+ if (Array.isArray(accept)) {
18
+ const isImageOnly = accept.every((type) => type.startsWith('image/'));
19
+ return isImageOnly ? 'image' : 'file';
20
+ }
21
+
22
+ return 'file';
23
+ };
24
+
25
+ const pluralize = (count: number, word: string, hideCount?: boolean, capitalizeWord?: boolean) => {
26
+ const text = `${word}${count === 1 ? '' : 's'}`;
27
+ const finalText = capitalizeWord ? capitalize(text) : text;
28
+ return hideCount ? finalText : `${count} ${finalText}`;
29
+ };
30
+
31
+ /**
32
+ * Generates a formatted text string for file type descriptions with proper pluralization and capitalization
33
+ * @param props Configuration object for text formatting
34
+ * @param props.accept - Optional file type(s) to determine if text should say "file" or "image"
35
+ * @param props.capitalize - Optional flag to capitalize the first letter of the output
36
+ * @param props.count - Optional number to determine pluralization (e.g., "1 file" vs "2 files")
37
+ * @param props.hideCount - Optional flag to exclude the count from the output (e.g., "files" instead of "2 files")
38
+ * @returns Formatted string describing file(s) or image(s)
39
+ * @example
40
+ * // Returns "2 files"
41
+ * getFilePluralizationText({ count: 2 })
42
+ *
43
+ * // Returns "1 image"
44
+ * getFilePluralizationText({ accept: 'images', count: 1 })
45
+ *
46
+ * // Returns "Files"
47
+ * getFilePluralizationText({ capitalize: true, hideCount: true })
48
+ *
49
+ * // Returns "Image"
50
+ * getFilePluralizationText({ accept: 'images', capitalize: true })
51
+ */
52
+ export const getFilePluralizationText = ({
53
+ accept,
54
+ capitalize: capitalizeWord,
55
+ count,
56
+ hideCount,
57
+ }: GetFilePluralizationTextProps = {}) => {
58
+ const baseText = getBaseText(accept);
59
+
60
+ if (count === undefined) {
61
+ if (capitalizeWord) {
62
+ return capitalize(baseText);
63
+ }
64
+ return baseText;
65
+ }
66
+
67
+ return pluralize(count, baseText, hideCount, capitalizeWord);
68
+ };
@@ -0,0 +1,26 @@
1
+ import { CommonFileTypes } from '../types/commonTypes';
2
+ import { ACCEPTED_MIME_TYPES } from './constants';
3
+
4
+ /**
5
+ * Utility function that converts file type restrictions into MIME type format for react-dropzone
6
+ * @param accept - Optional file type restrictions, can be either:
7
+ * - A preset category from CommonFileTypes (e.g., 'images', 'pdfs', 'documents')
8
+ * - An array of specific MIME types (e.g., ['image/jpeg', 'image/png'])
9
+ * @returns Object mapping MIME types to empty arrays for react-dropzone's accept prop
10
+ * @remarks
11
+ * - Returns undefined when no restrictions are provided (accepts all file types)
12
+ * - Handles both preset categories and custom MIME type arrays
13
+ * - Formats MIME types to match react-dropzone's expected structure
14
+ */
15
+
16
+ export const getMimeTypes = (accept?: CommonFileTypes | string[]) => {
17
+ if (!accept) {
18
+ return undefined; // No restrictions
19
+ }
20
+
21
+ if (Array.isArray(accept)) {
22
+ return accept.reduce((acc, curr) => ({ ...acc, [curr]: [] }), {}); // Custom MIME types
23
+ }
24
+
25
+ return ACCEPTED_MIME_TYPES[accept].reduce((acc, curr) => ({ ...acc, [curr]: [] }), {}); // Preset category
26
+ };
@@ -0,0 +1,41 @@
1
+ import { ContextAwareMessage } from '../types/commonTypes';
2
+
3
+ /**
4
+ * Processes any type of message into a string
5
+ * @param message - A string, function that returns a string, or undefined
6
+ * @param context - The context object to pass to the message function (optional)
7
+ * @param defaultMessage - Optional fallback message used when the primary message is undefined
8
+ * or when the primary message is a function but context is undefined
9
+ * @returns A string message. If a function message is provided, its result is converted to a string.
10
+ * Returns an empty string if no valid message can be resolved.
11
+ */
12
+ export const resolveContextAwareMessage = <T>(
13
+ message: ContextAwareMessage<T> | undefined,
14
+ context?: T,
15
+ defaultMessage?: ContextAwareMessage<T>
16
+ ): string => {
17
+ // Handle undefined message
18
+ if (!message) {
19
+ // Use default message if provided
20
+ if (defaultMessage) {
21
+ return resolveContextAwareMessage(defaultMessage, context);
22
+ }
23
+ return '';
24
+ }
25
+
26
+ // Handle function message
27
+ if (typeof message === 'function') {
28
+ // Ensure we have a context to pass to the function
29
+ if (context) {
30
+ return String(message(context));
31
+ }
32
+ // If no context but we have a default, use it
33
+ if (defaultMessage) {
34
+ return resolveContextAwareMessage(defaultMessage, context);
35
+ }
36
+ return '';
37
+ }
38
+
39
+ // Handle string message
40
+ return message;
41
+ };
@@ -0,0 +1,68 @@
1
+ import { cn } from '@evolve.ui/theme-system';
2
+
3
+ import { FileError } from '../types';
4
+
5
+ type DropzoneState = {
6
+ disableDragValidation: boolean;
7
+ disabled: boolean;
8
+ isDragActive: boolean;
9
+ validationError?: FileError | null;
10
+ };
11
+
12
+ export const getUploadZoneStyles = ({
13
+ disabled,
14
+ disableDragValidation,
15
+ isDragActive,
16
+ validationError,
17
+ }: DropzoneState) => {
18
+ const isInvalid = Boolean(validationError);
19
+ const isErrorState = disableDragValidation ? false : isInvalid;
20
+ const isDefaultState = !isDragActive && !isErrorState;
21
+ const isDraggedOver = isDragActive && (disableDragValidation || !isInvalid);
22
+ const isDefaultAppearance = isDefaultState && !disabled;
23
+
24
+ return cn(
25
+ // Layout & Container
26
+ [
27
+ 'relative',
28
+ 'flex flex-col',
29
+ 'h-full w-full',
30
+ 'items-center justify-center',
31
+ 'rounded-container',
32
+ 'outline-dashed outline-1 -outline-offset-1',
33
+ 'p-sm',
34
+ 'transition-colors',
35
+ 'hover:bg-background-hover hover:outline-border-hover', // Hover (when not dragging)
36
+ ],
37
+
38
+ // Focus & Interactive Base
39
+ ['hui-focus-visible-outline'],
40
+
41
+ // Interactive States
42
+ {
43
+ // Disabled
44
+ 'cursor-not-allowed bg-background-disabled outline-border-disabled hover:bg-background-disabled hover:outline-border-disabled':
45
+ disabled,
46
+
47
+ // Enabled
48
+ 'cursor-pointer active:bg-background-pressed active:outline active:outline-4 active:outline-focus-primary':
49
+ !disabled,
50
+
51
+ // Drag Active (only when not disabled)
52
+ 'outline outline-4 outline-offset-0 outline-focus-primary': isDragActive && !disabled,
53
+ },
54
+
55
+ // Visual States
56
+ {
57
+ // Error (only when not disabled)
58
+ 'bg-background-critical-light outline-dashed outline-1 -outline-offset-1 outline-border-critical':
59
+ isErrorState && !disabled,
60
+
61
+ // Drag Over
62
+ 'bg-background-hover': isDraggedOver && !isErrorState && !disabled,
63
+
64
+ // Default
65
+ 'bg-background-primary outline-border-secondary': isDefaultAppearance,
66
+ }
67
+ );
68
+ };