@evolve.ui/core-components 1.0.0 → 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 (559) hide show
  1. package/Checkbox.d.cts +1 -1
  2. package/Checkbox.d.mts +1 -1
  3. package/{DateInput-B8XQZPTx.d.cts → DateInput-CFxTZu3m.d.mts} +2 -2
  4. package/{DateInput-B8XQZPTx.d.cts.map → DateInput-CFxTZu3m.d.mts.map} +1 -1
  5. package/{DateInput-CfNmywqQ.d.mts → DateInput-DstMICTl.d.cts} +2 -2
  6. package/{DateInput-CfNmywqQ.d.mts.map → DateInput-DstMICTl.d.cts.map} +1 -1
  7. package/{FavoriteButton-CowOPoqo.d.cts → FavoriteButton-BGF-3dze.d.cts} +2 -2
  8. package/{FavoriteButton-BRY8FVpV.d.mts.map → FavoriteButton-BGF-3dze.d.cts.map} +1 -1
  9. package/{FavoriteButton-BRY8FVpV.d.mts → FavoriteButton-BZEGWrRo.d.mts} +2 -2
  10. package/{FavoriteButton-CowOPoqo.d.cts.map → FavoriteButton-BZEGWrRo.d.mts.map} +1 -1
  11. package/Input.d.cts +1 -1
  12. package/Input.d.mts +1 -1
  13. package/Radio.d.cts +1 -1
  14. package/Radio.d.mts +1 -1
  15. package/{TextInput-BhkeQZh4.d.cts → TextInput-B7lqQ1gh.d.cts} +3 -3
  16. package/{TextInput-BhkeQZh4.d.cts.map → TextInput-B7lqQ1gh.d.cts.map} +1 -1
  17. package/{TextInput-CWCeR18b.d.mts → TextInput-CxoT3np_.d.mts} +3 -3
  18. package/{TextInput-CWCeR18b.d.mts.map → TextInput-CxoT3np_.d.mts.map} +1 -1
  19. package/dateInput.d.cts +1 -1
  20. package/dateInput.d.mts +1 -1
  21. package/datePicker.d.cts +1 -1
  22. package/datePicker.d.mts +1 -1
  23. package/evolve-ui.entries.json +556 -0
  24. package/favoriteButton.d.cts +1 -1
  25. package/favoriteButton.d.mts +1 -1
  26. package/featureFlags/hooks.d.cts +1 -1
  27. package/featureFlags/hooks.d.mts +1 -1
  28. package/fileUpload/testUtils/mockFilesAndImages.d.cts +3 -3
  29. package/fileUpload/testUtils/mockFilesAndImages.d.cts.map +1 -1
  30. package/fileUpload/testUtils/mockFilesAndImages.d.mts +3 -3
  31. package/fileUpload/testUtils/mockFilesAndImages.d.mts.map +1 -1
  32. package/fileUpload/testUtils/testUtils.d.cts +1 -1
  33. package/fileUpload/testUtils/testUtils.d.cts.map +1 -1
  34. package/fileUpload/testUtils/testUtils.d.mts +1 -1
  35. package/fileUpload/testUtils/testUtils.d.mts.map +1 -1
  36. package/{index-BVb-FJDo.d.mts → index-BYPklw8m.d.mts} +2 -2
  37. package/{index-BVb-FJDo.d.mts.map → index-BYPklw8m.d.mts.map} +1 -1
  38. package/{index-3V0Y3AU3.d.mts → index-Bvn6svaT.d.cts} +2 -2
  39. package/{index-3V0Y3AU3.d.mts.map → index-Bvn6svaT.d.cts.map} +1 -1
  40. package/{index-Bu7c6X7O.d.mts → index-C2zPeUs9.d.mts} +5 -5
  41. package/{index-Bu7c6X7O.d.mts.map → index-C2zPeUs9.d.mts.map} +1 -1
  42. package/{index-BXz3rMMk.d.cts → index-Cmz2OD6x.d.cts} +2 -2
  43. package/{index-BXz3rMMk.d.cts.map → index-Cmz2OD6x.d.cts.map} +1 -1
  44. package/{index-kchg551L.d.cts → index-DsZAxqnF.d.mts} +2 -2
  45. package/{index-kchg551L.d.cts.map → index-DsZAxqnF.d.mts.map} +1 -1
  46. package/{index-BzN9RaXe.d.cts → index-QtMvgJcp.d.cts} +5 -5
  47. package/{index-BzN9RaXe.d.cts.map → index-QtMvgJcp.d.cts.map} +1 -1
  48. package/{index-dpfLYhgI.d.mts → index-hrztez-b.d.mts} +2 -2
  49. package/{index-DBYqF9Sr.d.cts.map → index-hrztez-b.d.mts.map} +1 -1
  50. package/{index-DBYqF9Sr.d.cts → index-o9dwzLLE.d.cts} +2 -2
  51. package/{index-dpfLYhgI.d.mts.map → index-o9dwzLLE.d.cts.map} +1 -1
  52. package/index.d.cts +7 -7
  53. package/index.d.mts +7 -7
  54. package/package.json +2 -2
  55. package/providers.d.cts +1 -1
  56. package/providers.d.mts +1 -1
  57. package/src/Accordion/Accordion.tsx +233 -0
  58. package/src/AddressDisplay/AddressDisplay.tsx +43 -0
  59. package/src/AddressDisplay/components/addressComponents.tsx +111 -0
  60. package/src/AddressDisplay/components/addressField.tsx +25 -0
  61. package/src/AddressDisplay/components/addressSection.tsx +8 -0
  62. package/src/AddressDisplay/components/getCountryValue.tsx +31 -0
  63. package/src/AddressDisplay/types.ts +26 -0
  64. package/src/AutomatedCarousel/AutomatedCarousel.tsx +163 -0
  65. package/src/AutomatedCarousel/automatedCarousel.types.ts +7 -0
  66. package/src/AutomatedCarousel/components/CarouselProgressBar/CarouselProgressBar.tsx +139 -0
  67. package/src/AutomatedCarousel/components/CarouselProgressBar/components/CarouselProgressBarUnit/CarouselProgressBarUnit.tsx +165 -0
  68. package/src/Badge/Badge.tsx +104 -0
  69. package/src/Badge/Badge.types.ts +58 -0
  70. package/src/Badge/ItemBadge.tsx +97 -0
  71. package/src/Badge/LiveStatusBadge.tsx +93 -0
  72. package/src/BannerNotification/BannerNotification.tsx +157 -0
  73. package/src/BannerNotification/components/BannerNotificationSkeleton.tsx +39 -0
  74. package/src/BannerNotification/components/CalloutIcon/BannerIcon.tsx +48 -0
  75. package/src/BannerNotification/utils/getRandomTooltipId.ts +3 -0
  76. package/src/BottomSheet/BottomSheet.tsx +476 -0
  77. package/src/BottomSheet/components/BottomSheetBackdrop/BottomSheetBackdrop.tsx +47 -0
  78. package/src/BottomSheet/components/BottomSheetContentArea/BottomSheetContentArea.tsx +92 -0
  79. package/src/BottomSheet/components/BottomSheetOverlay/BottomSheetOverlayTranslate3d.tsx +196 -0
  80. package/src/BottomSheet/components/SheetDescription/SheetDescription.tsx +22 -0
  81. package/src/BottomSheet/components/SheetTitle/SheetTitle.tsx +21 -0
  82. package/src/BottomSheet/components/index.tsx +5 -0
  83. package/src/BottomSheet/hooks/index.tsx +13 -0
  84. package/src/BottomSheet/hooks/useAriaHider.tsx +91 -0
  85. package/src/BottomSheet/hooks/useBottomSheetServices.tsx +224 -0
  86. package/src/BottomSheet/hooks/useDragHandler.tsx +282 -0
  87. package/src/BottomSheet/hooks/useFocusTrap.tsx +113 -0
  88. package/src/BottomSheet/hooks/useLayoutEffect.tsx +4 -0
  89. package/src/BottomSheet/hooks/useOptimizedResizeObserver.tsx +94 -0
  90. package/src/BottomSheet/hooks/useOptimizedScrollState.tsx +87 -0
  91. package/src/BottomSheet/hooks/useReady.tsx +34 -0
  92. package/src/BottomSheet/hooks/useReducedMotion.tsx +22 -0
  93. package/src/BottomSheet/hooks/useScrollLock.tsx +143 -0
  94. package/src/BottomSheet/hooks/useSnapPoints.tsx +355 -0
  95. package/src/BottomSheet/hooks/useSpring.tsx +47 -0
  96. package/src/BottomSheet/hooks/useSpringInterpolationsTranslate3d.tsx +101 -0
  97. package/src/BottomSheet/index.tsx +237 -0
  98. package/src/BottomSheet/state/atoms.ts +147 -0
  99. package/src/BottomSheet/state/useBottomSheetStateMachine.ts +246 -0
  100. package/src/BottomSheet/types.ts +172 -0
  101. package/src/BottomSheet/utils.ts +65 -0
  102. package/src/Breadcrumbs/Breadcrumbs.tsx +126 -0
  103. package/src/Button/Button.tsx +164 -0
  104. package/src/Button/Button.types.ts +80 -0
  105. package/src/Button/buttonColorClasses.ts +53 -0
  106. package/src/Callout/Callout.tsx +136 -0
  107. package/src/Callout/Callout.types.ts +29 -0
  108. package/src/Callout/components/CalloutIcon/CalloutIcon.tsx +56 -0
  109. package/src/Card/CardGrid.tsx +263 -0
  110. package/src/Card/SingleCard.tsx +22 -0
  111. package/src/Card/cardFactory.tsx +176 -0
  112. package/src/Card/components/createBadge.tsx +34 -0
  113. package/src/Card/components/createFavoriteButton.tsx +40 -0
  114. package/src/Card/components/createImage.tsx +64 -0
  115. package/src/Card/components/createInfo.tsx +84 -0
  116. package/src/Card/components/createName.tsx +63 -0
  117. package/src/Card/components/createPriceStatus.tsx +100 -0
  118. package/src/Card/components/types.ts +4 -0
  119. package/src/Card/hooks/useCardVisibilityTracking.ts +82 -0
  120. package/src/Card/sharedProps.ts +12 -0
  121. package/src/Card/types.ts +62 -0
  122. package/src/Carousel/Carousel.tsx +513 -0
  123. package/src/Carousel/Carousel.types.ts +43 -0
  124. package/src/Carousel/Carousel.utils.ts +63 -0
  125. package/src/Carousel/components/DotButton/DotButton.tsx +42 -0
  126. package/src/Carousel/components/NavigationButtons/NavigationButtons.tsx +77 -0
  127. package/src/Carousel/components/TitleSection/TitleSection.tsx +61 -0
  128. package/src/Carousel/components/TitleSection/components/SubHeaderLeft/SubHeaderLeft.tsx +53 -0
  129. package/src/Carousel/components/TitleSection/components/Title/Title.tsx +46 -0
  130. package/src/Carousel/index.ts +2 -0
  131. package/src/Carousel/testUtils.ts +10 -0
  132. package/src/Chips/Chip.tsx +153 -0
  133. package/src/Chips/ChipGroup.tsx +173 -0
  134. package/src/Chips/SuggestionChip.tsx +15 -0
  135. package/src/Chips/chipTypes.ts +113 -0
  136. package/src/Chips/index.ts +4 -0
  137. package/src/ChoiceListItem/Checkbox.tsx +69 -0
  138. package/src/ChoiceListItem/Radio.tsx +61 -0
  139. package/src/ChoiceListItem/choiceListItem.tsx +99 -0
  140. package/src/ChoiceListItem/common.tsx +148 -0
  141. package/src/ChoiceListItem/index.ts +3 -0
  142. package/src/Collapsible/Collapsible.tsx +58 -0
  143. package/src/Confetti/Confetti.tsx +270 -0
  144. package/src/Confetti/index.ts +2 -0
  145. package/src/ContentPager/ContentPager.tsx +189 -0
  146. package/src/ContentPager/components/Page.tsx +24 -0
  147. package/src/CookieConsent/components/CookieCategoryRow/CookieCategoryRow.tsx +30 -0
  148. package/src/CookieConsent/components/CookieConsent/CookieConsent.tsx +74 -0
  149. package/src/CookieConsent/components/CookieConsentBanner/CookieConsentBanner.tsx +51 -0
  150. package/src/CookieConsent/components/CookieConsentModal/CookieConsentModal.tsx +64 -0
  151. package/src/CookieConsent/hooks/useCookieConsent.ts +170 -0
  152. package/src/CookieConsent/hooks/useCookieConsentState.ts +142 -0
  153. package/src/CookieConsent/index.ts +16 -0
  154. package/src/CookieConsent/types/cookieConsent.types.ts +79 -0
  155. package/src/CookieConsent/types/index.ts +7 -0
  156. package/src/Countdown/Countdown.tsx +161 -0
  157. package/src/Countdown/Countdown.types.ts +4 -0
  158. package/src/Countdown/hooks/useGetCountdown.ts +103 -0
  159. package/src/DateTimeInput/dateInput/DateInput.tsx +199 -0
  160. package/src/DateTimeInput/datePicker/DatePicker.tsx +138 -0
  161. package/src/DateTimeInput/datePicker/components/calendar/Calendar.tsx +72 -0
  162. package/src/DateTimeInput/datePicker/index.ts +2 -0
  163. package/src/DateTimeInput/timeInput/TimeInput.tsx +128 -0
  164. package/src/DateTimeInput/timePicker/TimePicker.tsx +118 -0
  165. package/src/DateTimeInput/timePicker/components/TimePopover/AmPmSwitch.tsx +103 -0
  166. package/src/DateTimeInput/timePicker/components/TimePopover/TimeFieldInput.tsx +26 -0
  167. package/src/DateTimeInput/timePicker/components/TimePopover/TimePopover.tsx +84 -0
  168. package/src/DateTimeInput/timePicker/components/TimePopover/TimePopover.utils.ts +67 -0
  169. package/src/DateTimeInput/timePicker/components/TimePopover/TimePopoverActions.tsx +26 -0
  170. package/src/DateTimeInput/timePicker/index.ts +2 -0
  171. package/src/DateTimeInput/utils/getDisplayDate.ts +15 -0
  172. package/src/DateTimeInput/utils/getDisplayTime.ts +15 -0
  173. package/src/DateTimeInput/utils/index.ts +2 -0
  174. package/src/DateTimeInput/utils/parseTimeValue.ts +54 -0
  175. package/src/Drawer/Drawer.tsx +446 -0
  176. package/src/Drawer/atoms.ts +4 -0
  177. package/src/Drawer/components/DialogActions/DialogActions.tsx +33 -0
  178. package/src/Drawer/components/DialogContent/DialogContent.tsx +80 -0
  179. package/src/Drawer/components/DialogHeader/DialogHeader.tsx +68 -0
  180. package/src/EducationalPopover/EducationalPopover.tsx +174 -0
  181. package/src/FavoriteButton/FavoriteButton.tsx +64 -0
  182. package/src/FavoriteButton/components/IconOnlyFavoriteButton/IconOnlyFavoriteButton.tsx +80 -0
  183. package/src/FavoriteButton/components/LabeledAnimatedFavoriteButton/LabeledAnimatedFavoriteButton.tsx +179 -0
  184. package/src/FavoriteButton/components/LabeledFavoriteButton/LabeledFavoriteButton.tsx +71 -0
  185. package/src/FavoriteButton/components/SmallHeartStraightIcon/SmallHeartStraightIcon.tsx +14 -0
  186. package/src/FavoriteButton/hooks/useFavoriteButtonState.ts +30 -0
  187. package/src/FavoriteButton/index.ts +2 -0
  188. package/src/FavoriteButton/types/favoriteButton.ts +87 -0
  189. package/src/FeatureFlags/devTools/FeatureFlagDevToolsUI.tsx +226 -0
  190. package/src/FeatureFlags/devTools/getFeatureFlagCookieOverrides.ts +30 -0
  191. package/src/FeatureFlags/devTools/utils/cookies.ts +169 -0
  192. package/src/FeatureFlags/hooks/index.ts +2 -0
  193. package/src/FeatureFlags/hooks/useFeatureFlag.tsx +19 -0
  194. package/src/FeatureFlags/hooks/useFeatureFlags.tsx +15 -0
  195. package/src/FileUpload/components/FileCard/FileCard.tsx +50 -0
  196. package/src/FileUpload/components/FileDropzone/FileDropzone.tsx +221 -0
  197. package/src/FileUpload/components/FileDropzone/components/DropzoneContent/DropzoneContent.tsx +28 -0
  198. package/src/FileUpload/components/FileDropzone/components/DropzoneContent/DropzoneText.tsx +81 -0
  199. package/src/FileUpload/components/FileDropzone/components/FileDropzoneDebugger/FileDropzoneDebugger.tsx +40 -0
  200. package/src/FileUpload/components/FileDropzone/components/FileDropzoneDebugger/FileRejectionsDisplay.tsx +110 -0
  201. package/src/FileUpload/components/FileDropzoneOverlay/FileDropzoneOverlay.tsx +183 -0
  202. package/src/FileUpload/components/FileDropzoneOverlay/components/OverlayDropzoneContent.tsx +146 -0
  203. package/src/FileUpload/components/FileDropzoneOverlay/components/OverlayDropzoneDragText.tsx +42 -0
  204. package/src/FileUpload/components/FileDropzoneOverlay/styles.ts +79 -0
  205. package/src/FileUpload/components/FilePreviewList/FilePreviewList.tsx +251 -0
  206. package/src/FileUpload/components/FilePreviewList/virtualizerComponents/FilePreviewVirtualizedList/FilePreviewVirtualizedList.tsx +88 -0
  207. package/src/FileUpload/components/FileUpload/FileUpload.tsx +63 -0
  208. package/src/FileUpload/components/FileUploadCanvas/FileUploadCanvas.tsx +125 -0
  209. package/src/FileUpload/components/GridFileCard/GridFileCard.tsx +364 -0
  210. package/src/FileUpload/components/GridFileCard/utils/sortable.ts +48 -0
  211. package/src/FileUpload/components/ListFileCard/ListFileCard.tsx +259 -0
  212. package/src/FileUpload/components/types.ts +78 -0
  213. package/src/FileUpload/hooks/filePreview/useImageFilePreviewUrl.ts +62 -0
  214. package/src/FileUpload/hooks/index.ts +11 -0
  215. package/src/FileUpload/hooks/upload/useHandleDragEnter/useHandleDragEnter.ts +154 -0
  216. package/src/FileUpload/hooks/upload/useHandleDrop/createFileRejectionHelpers.ts +273 -0
  217. package/src/FileUpload/hooks/upload/useHandleDrop/useHandleDrop.ts +153 -0
  218. package/src/FileUpload/hooks/upload/useUploadAvailability/useUploadAvailability.ts +44 -0
  219. package/src/FileUpload/hooks/validation/createDropzoneValidator.ts +41 -0
  220. package/src/FileUpload/hooks/validation/useFileValidation.ts +25 -0
  221. package/src/FileUpload/hooks/validation/useFileValidationLogic.ts +107 -0
  222. package/src/FileUpload/hooks/validation/useValidationMessages.ts +92 -0
  223. package/src/FileUpload/hooks/validation/useValidationState.ts +171 -0
  224. package/src/FileUpload/index.ts +57 -0
  225. package/src/FileUpload/providers/FileUploadProvider.tsx +219 -0
  226. package/src/FileUpload/providers/UploadValidationProvider.tsx +159 -0
  227. package/src/FileUpload/testUtils/mockFilesAndImages.ts +64 -0
  228. package/src/FileUpload/testUtils/testUtils.ts +111 -0
  229. package/src/FileUpload/types/commonTypes.ts +267 -0
  230. package/src/FileUpload/types/index.ts +31 -0
  231. package/src/FileUpload/types/sharedTypes.ts +159 -0
  232. package/src/FileUpload/utils/constants.ts +79 -0
  233. package/src/FileUpload/utils/createMessageContext.ts +180 -0
  234. package/src/FileUpload/utils/getFileExtensionsFromAcceptedTypes.ts +73 -0
  235. package/src/FileUpload/utils/getFilePluralizationText.ts +68 -0
  236. package/src/FileUpload/utils/getMimeTypes.ts +26 -0
  237. package/src/FileUpload/utils/messageUtils.ts +41 -0
  238. package/src/FileUpload/utils/styles.ts +68 -0
  239. package/src/FormLabel/FormLabel.tsx +212 -0
  240. package/src/IconButton/IconButton.tsx +154 -0
  241. package/src/Icons/CreditCardIcon/CreditCardIcon.tsx +73 -0
  242. package/src/Icons/CreditCardIcon/cardIcons.tsx +270 -0
  243. package/src/Icons/IconBase.tsx +133 -0
  244. package/src/Icons/anyIcon.ts +3 -0
  245. package/src/Icons/generatedIcons/Archive.tsx +48 -0
  246. package/src/Icons/generatedIcons/ArrowClockwise.tsx +48 -0
  247. package/src/Icons/generatedIcons/ArrowDown.tsx +48 -0
  248. package/src/Icons/generatedIcons/ArrowLeft.tsx +48 -0
  249. package/src/Icons/generatedIcons/ArrowRight.tsx +48 -0
  250. package/src/Icons/generatedIcons/ArrowSquareOut.tsx +51 -0
  251. package/src/Icons/generatedIcons/ArrowSquareRight.tsx +51 -0
  252. package/src/Icons/generatedIcons/ArrowUp.tsx +48 -0
  253. package/src/Icons/generatedIcons/ArrowsCounterClockwise.tsx +48 -0
  254. package/src/Icons/generatedIcons/ArrowsLeftRight.tsx +48 -0
  255. package/src/Icons/generatedIcons/ArrowsOutCardinal.tsx +48 -0
  256. package/src/Icons/generatedIcons/Bank.tsx +48 -0
  257. package/src/Icons/generatedIcons/Bell.tsx +51 -0
  258. package/src/Icons/generatedIcons/BookBookmark.tsx +51 -0
  259. package/src/Icons/generatedIcons/BookmarksSimple.tsx +51 -0
  260. package/src/Icons/generatedIcons/Broadcast.tsx +48 -0
  261. package/src/Icons/generatedIcons/CalendarBlank.tsx +48 -0
  262. package/src/Icons/generatedIcons/CalendarStar.tsx +51 -0
  263. package/src/Icons/generatedIcons/Camera.tsx +51 -0
  264. package/src/Icons/generatedIcons/CaretDown.tsx +48 -0
  265. package/src/Icons/generatedIcons/CaretLeft.tsx +48 -0
  266. package/src/Icons/generatedIcons/CaretRight.tsx +48 -0
  267. package/src/Icons/generatedIcons/CaretUp.tsx +48 -0
  268. package/src/Icons/generatedIcons/Certificate.tsx +51 -0
  269. package/src/Icons/generatedIcons/ChartBar.tsx +48 -0
  270. package/src/Icons/generatedIcons/Check.tsx +51 -0
  271. package/src/Icons/generatedIcons/CheckCircle.tsx +48 -0
  272. package/src/Icons/generatedIcons/CirclesFour.tsx +51 -0
  273. package/src/Icons/generatedIcons/Clock.tsx +48 -0
  274. package/src/Icons/generatedIcons/ClockCountdown.tsx +48 -0
  275. package/src/Icons/generatedIcons/Close.tsx +51 -0
  276. package/src/Icons/generatedIcons/CloudArrowUp.tsx +51 -0
  277. package/src/Icons/generatedIcons/CloudWarning.tsx +51 -0
  278. package/src/Icons/generatedIcons/Code.tsx +48 -0
  279. package/src/Icons/generatedIcons/Compass.tsx +51 -0
  280. package/src/Icons/generatedIcons/Confetti.tsx +51 -0
  281. package/src/Icons/generatedIcons/Copy.tsx +48 -0
  282. package/src/Icons/generatedIcons/CornersOut.tsx +48 -0
  283. package/src/Icons/generatedIcons/CreditCard.tsx +48 -0
  284. package/src/Icons/generatedIcons/Crown.tsx +51 -0
  285. package/src/Icons/generatedIcons/CrownSimple.tsx +51 -0
  286. package/src/Icons/generatedIcons/CurrencyCircleDollar.tsx +48 -0
  287. package/src/Icons/generatedIcons/CurrencyDollarSimple.tsx +51 -0
  288. package/src/Icons/generatedIcons/Desktop.tsx +51 -0
  289. package/src/Icons/generatedIcons/Detective.tsx +51 -0
  290. package/src/Icons/generatedIcons/DotOutline.tsx +46 -0
  291. package/src/Icons/generatedIcons/DotsSixVertical.tsx +51 -0
  292. package/src/Icons/generatedIcons/DotsThreeOutline.tsx +51 -0
  293. package/src/Icons/generatedIcons/DotsThreeOutlineVertical.tsx +51 -0
  294. package/src/Icons/generatedIcons/DownloadSimple.tsx +51 -0
  295. package/src/Icons/generatedIcons/EnvelopeSimple.tsx +48 -0
  296. package/src/Icons/generatedIcons/Eraser.tsx +51 -0
  297. package/src/Icons/generatedIcons/Eye.tsx +51 -0
  298. package/src/Icons/generatedIcons/EyeSlash.tsx +51 -0
  299. package/src/Icons/generatedIcons/FacebookLogo.tsx +48 -0
  300. package/src/Icons/generatedIcons/FileArchive.tsx +48 -0
  301. package/src/Icons/generatedIcons/FileArrowDown.tsx +48 -0
  302. package/src/Icons/generatedIcons/FileCsv.tsx +48 -0
  303. package/src/Icons/generatedIcons/FilePdf.tsx +48 -0
  304. package/src/Icons/generatedIcons/FileText.tsx +48 -0
  305. package/src/Icons/generatedIcons/Files.tsx +51 -0
  306. package/src/Icons/generatedIcons/Fire.tsx +51 -0
  307. package/src/Icons/generatedIcons/Flag.tsx +51 -0
  308. package/src/Icons/generatedIcons/FlagBannerFold.tsx +48 -0
  309. package/src/Icons/generatedIcons/FloppyDisk.tsx +51 -0
  310. package/src/Icons/generatedIcons/Gauge.tsx +51 -0
  311. package/src/Icons/generatedIcons/Gavel.tsx +51 -0
  312. package/src/Icons/generatedIcons/Gear.tsx +51 -0
  313. package/src/Icons/generatedIcons/GlobeHemisphereWest.tsx +51 -0
  314. package/src/Icons/generatedIcons/GoogleLogo.tsx +48 -0
  315. package/src/Icons/generatedIcons/GridNine.tsx +51 -0
  316. package/src/Icons/generatedIcons/HandCoins.tsx +51 -0
  317. package/src/Icons/generatedIcons/HandbagSimple.tsx +51 -0
  318. package/src/Icons/generatedIcons/Headset.tsx +51 -0
  319. package/src/Icons/generatedIcons/HeartStraight.tsx +51 -0
  320. package/src/Icons/generatedIcons/HourglassLow.tsx +48 -0
  321. package/src/Icons/generatedIcons/House.tsx +51 -0
  322. package/src/Icons/generatedIcons/Image.tsx +51 -0
  323. package/src/Icons/generatedIcons/ImageSquare.tsx +51 -0
  324. package/src/Icons/generatedIcons/ImagesSquare.tsx +51 -0
  325. package/src/Icons/generatedIcons/Info.tsx +48 -0
  326. package/src/Icons/generatedIcons/InstagramLogo.tsx +51 -0
  327. package/src/Icons/generatedIcons/Lightning.tsx +48 -0
  328. package/src/Icons/generatedIcons/Link.tsx +51 -0
  329. package/src/Icons/generatedIcons/LinkedinLogo.tsx +51 -0
  330. package/src/Icons/generatedIcons/List.tsx +48 -0
  331. package/src/Icons/generatedIcons/Lock.tsx +51 -0
  332. package/src/Icons/generatedIcons/LockOpen.tsx +51 -0
  333. package/src/Icons/generatedIcons/MagnifyingGlass.tsx +48 -0
  334. package/src/Icons/generatedIcons/MapPin.tsx +51 -0
  335. package/src/Icons/generatedIcons/MapPinSimpleArea.tsx +48 -0
  336. package/src/Icons/generatedIcons/Medal.tsx +48 -0
  337. package/src/Icons/generatedIcons/Megaphone.tsx +48 -0
  338. package/src/Icons/generatedIcons/Minus.tsx +45 -0
  339. package/src/Icons/generatedIcons/Money.tsx +51 -0
  340. package/src/Icons/generatedIcons/Notches.tsx +48 -0
  341. package/src/Icons/generatedIcons/NotePencil.tsx +48 -0
  342. package/src/Icons/generatedIcons/Package.tsx +51 -0
  343. package/src/Icons/generatedIcons/PaintBrush.tsx +51 -0
  344. package/src/Icons/generatedIcons/PaperPlaneTilt.tsx +51 -0
  345. package/src/Icons/generatedIcons/Paperclip.tsx +51 -0
  346. package/src/Icons/generatedIcons/Pause.tsx +51 -0
  347. package/src/Icons/generatedIcons/PencilLine.tsx +51 -0
  348. package/src/Icons/generatedIcons/PencilRuler.tsx +51 -0
  349. package/src/Icons/generatedIcons/PencilSimple.tsx +51 -0
  350. package/src/Icons/generatedIcons/Phone.tsx +51 -0
  351. package/src/Icons/generatedIcons/PinterestLogo.tsx +51 -0
  352. package/src/Icons/generatedIcons/Play.tsx +51 -0
  353. package/src/Icons/generatedIcons/Plus.tsx +51 -0
  354. package/src/Icons/generatedIcons/PlusCircle.tsx +48 -0
  355. package/src/Icons/generatedIcons/Printer.tsx +51 -0
  356. package/src/Icons/generatedIcons/Question.tsx +48 -0
  357. package/src/Icons/generatedIcons/Receipt.tsx +51 -0
  358. package/src/Icons/generatedIcons/Rows.tsx +51 -0
  359. package/src/Icons/generatedIcons/SealCheck.tsx +51 -0
  360. package/src/Icons/generatedIcons/SelectionSlash.tsx +48 -0
  361. package/src/Icons/generatedIcons/ShareNetwork.tsx +51 -0
  362. package/src/Icons/generatedIcons/ShieldCheck.tsx +51 -0
  363. package/src/Icons/generatedIcons/ShieldStar.tsx +51 -0
  364. package/src/Icons/generatedIcons/ShoppingCart.tsx +48 -0
  365. package/src/Icons/generatedIcons/ShuffleAngular.tsx +48 -0
  366. package/src/Icons/generatedIcons/SidebarSimple.tsx +48 -0
  367. package/src/Icons/generatedIcons/SlidersHorizontal.tsx +51 -0
  368. package/src/Icons/generatedIcons/Smiley.tsx +48 -0
  369. package/src/Icons/generatedIcons/Sparkle.tsx +51 -0
  370. package/src/Icons/generatedIcons/SpinnerGap.tsx +48 -0
  371. package/src/Icons/generatedIcons/StackPlus.tsx +48 -0
  372. package/src/Icons/generatedIcons/Star.tsx +51 -0
  373. package/src/Icons/generatedIcons/Storefront.tsx +51 -0
  374. package/src/Icons/generatedIcons/Swap.tsx +51 -0
  375. package/src/Icons/generatedIcons/Tag.tsx +51 -0
  376. package/src/Icons/generatedIcons/ThumbsDown.tsx +48 -0
  377. package/src/Icons/generatedIcons/ThumbsUp.tsx +48 -0
  378. package/src/Icons/generatedIcons/Toolbox.tsx +48 -0
  379. package/src/Icons/generatedIcons/Trash.tsx +48 -0
  380. package/src/Icons/generatedIcons/TrendUp.tsx +48 -0
  381. package/src/Icons/generatedIcons/Trophy.tsx +51 -0
  382. package/src/Icons/generatedIcons/Truck.tsx +51 -0
  383. package/src/Icons/generatedIcons/UploadSimple.tsx +51 -0
  384. package/src/Icons/generatedIcons/User.tsx +48 -0
  385. package/src/Icons/generatedIcons/Users.tsx +48 -0
  386. package/src/Icons/generatedIcons/UsersThree.tsx +51 -0
  387. package/src/Icons/generatedIcons/VideoCamera.tsx +51 -0
  388. package/src/Icons/generatedIcons/Warning.tsx +51 -0
  389. package/src/Icons/generatedIcons/WarningCircle.tsx +48 -0
  390. package/src/Icons/generatedIcons/WifiHigh.tsx +51 -0
  391. package/src/Icons/generatedIcons/XCircle.tsx +48 -0
  392. package/src/Icons/generatedIcons/XLogo.tsx +48 -0
  393. package/src/Icons/generatedIcons/YoutubeLogo.tsx +51 -0
  394. package/src/Icons/importedIcons.ts +152 -0
  395. package/src/Icons/index.ts +149 -0
  396. package/src/Icons/socialIcons/appleSocialIcon.tsx +50 -0
  397. package/src/Icons/socialIcons/facebookSocialIcon.tsx +41 -0
  398. package/src/Icons/socialIcons/googleSocialIcon.tsx +134 -0
  399. package/src/ImageCluster/ImageCluster.tsx +125 -0
  400. package/src/ImageSlider/ImageSlider.tsx +582 -0
  401. package/src/ImageSlider/ImageSlider.types.ts +90 -0
  402. package/src/ImageSlider/components/IndexIndicator/IndexIndicator.tsx +21 -0
  403. package/src/ImageSlider/components/NavigationButtons/NavigationButtons.tsx +113 -0
  404. package/src/ImageSlider/components/ResponsiveImage/ResponsiveImage.tsx +114 -0
  405. package/src/ImageSlider/components/ResponsiveImage/index.ts +1 -0
  406. package/src/ImageSlider/components/Thumbnails/Thumbnails.tsx +184 -0
  407. package/src/ImageSlider/constants.ts +59 -0
  408. package/src/ImageSlider/hooks/index.ts +3 -0
  409. package/src/ImageSlider/hooks/useImageSlider.ts +57 -0
  410. package/src/ImageSlider/hooks/useImageSliderNavigation.ts +133 -0
  411. package/src/ImageSlider/hooks/useImageSliderScrollHandler.ts +171 -0
  412. package/src/ImageSlider/index.ts +3 -0
  413. package/src/ImageSlider/utils/imageOptimization.ts +97 -0
  414. package/src/ImageSlider/utils/index.ts +1 -0
  415. package/src/InlineNotification/InlineNotification.tsx +95 -0
  416. package/src/JumpMenu/JumpMenu.tsx +395 -0
  417. package/src/JumpMenu/components/JumpMenuItem/JumpMenuItem.tsx +62 -0
  418. package/src/JumpMenu/hooks/useContainerTracking.ts +171 -0
  419. package/src/JumpMenu/hooks/useIntersectionObserver.ts +77 -0
  420. package/src/JumpMenu/hooks/useKeyboardNavigation.ts +102 -0
  421. package/src/JumpMenu/hooks/useResizeObserver.ts +53 -0
  422. package/src/JumpMenu/hooks/useSectionObserver.ts +102 -0
  423. package/src/JumpMenu/index.ts +2 -0
  424. package/src/JumpMenu/types/index.ts +19 -0
  425. package/src/Loading/Loading.tsx +39 -0
  426. package/src/Loading/components/LoadingDot/LoadingDot.tsx +16 -0
  427. package/src/LoadingSpinner/LoadingSpinner.tsx +20 -0
  428. package/src/Menu/Menu.tsx +372 -0
  429. package/src/Menu/components/MenuDivider/MenuDivider.tsx +5 -0
  430. package/src/Menu/components/MenuItem/MenuItem.tsx +298 -0
  431. package/src/Menu/context/menuContext.tsx +20 -0
  432. package/src/Menu/hooks/useMenu.tsx +18 -0
  433. package/src/Menu/index.ts +3 -0
  434. package/src/Modal/ComposableModal.tsx +313 -0
  435. package/src/Modal/Modal.tsx +231 -0
  436. package/src/Modal/components/BackButton/BackButton.tsx +43 -0
  437. package/src/Modal/components/Backdrop/Backdrop.tsx +62 -0
  438. package/src/Modal/components/CloseButton/CloseButton.tsx +55 -0
  439. package/src/Modal/components/ModalActions/ModalActions.tsx +135 -0
  440. package/src/Modal/components/ModalContent/ModalContent.tsx +163 -0
  441. package/src/Modal/components/ModalHeader/ModalHeader.tsx +84 -0
  442. package/src/Modal/components/ModalHeader/hooks/useHeaderAnimation.tsx +49 -0
  443. package/src/Modal/components/ModalProgressSteps/ModalProgressSteps.tsx +26 -0
  444. package/src/Modal/components/ModalSubTitle/ModalSubTitle.tsx +29 -0
  445. package/src/Modal/components/ModalTitle/ModalTitle.tsx +22 -0
  446. package/src/Modal/components/PreventModalScroll/PreventModalScroll.tsx +106 -0
  447. package/src/Modal/components/index.ts +12 -0
  448. package/src/Modal/context.ts +33 -0
  449. package/src/Modal/hooks/useCloseModal.ts +133 -0
  450. package/src/NotificationBadge/NotificationBadge.tsx +34 -0
  451. package/src/Pagination/AdvancedPagination.tsx +48 -0
  452. package/src/Pagination/Pagination.tsx +216 -0
  453. package/src/Pagination/components/AdvancedPaginator/AdvancedPaginator.tsx +52 -0
  454. package/src/Pagination/components/AdvancedPaginator/components/PageSelect/PageSelect.tsx +43 -0
  455. package/src/Pagination/components/ItemCountDisplay/ItemCountDisplay.tsx +32 -0
  456. package/src/Pagination/components/ItemCountSelect/ItemCountSelect.tsx +33 -0
  457. package/src/Pagination/index.tsx +3 -0
  458. package/src/Pagination/paginationProvider.tsx +234 -0
  459. package/src/Pagination/utils.tsx +36 -0
  460. package/src/PhoneInput/PhoneInput.tsx +509 -0
  461. package/src/PhoneInput/useDropdownLogic.tsx +163 -0
  462. package/src/ProgressCircle/ProgressCircle.tsx +246 -0
  463. package/src/ProgressCircle/hooks/useProgressStatusTransitions.ts +49 -0
  464. package/src/ProgressCircle/utils/progressCircle.constants.ts +27 -0
  465. package/src/ProgressSteps/ProgressSteps.tsx +160 -0
  466. package/src/SaveConfetti/SaveConfetti.tsx +277 -0
  467. package/src/SaveConfetti/index.ts +2 -0
  468. package/src/SearchInput/SearchInput.tsx +236 -0
  469. package/src/SegmentedControl/SegmentedControl.tsx +111 -0
  470. package/src/SegmentedControl/SegmentedControlGroup.tsx +94 -0
  471. package/src/SegmentedControl/index.ts +4 -0
  472. package/src/Select/Select.tsx +154 -0
  473. package/src/Select/SelectAsync.tsx +13 -0
  474. package/src/Select/SelectAsyncCreatable.tsx +14 -0
  475. package/src/Select/SelectCreatable.tsx +12 -0
  476. package/src/Select/reexportedComponents.tsx +5 -0
  477. package/src/Select/selectComponents.tsx +306 -0
  478. package/src/Skeleton/Skeleton.tsx +13 -0
  479. package/src/SplitButton/SplitButton.tsx +298 -0
  480. package/src/SplitButton/SplitButtonTrigger.tsx +55 -0
  481. package/src/StarRating/StarRating.tsx +165 -0
  482. package/src/StarRating/components/StarComponent/StarComponent.tsx +44 -0
  483. package/src/Table/Table.tsx +474 -0
  484. package/src/Table/components/TableHeader/TableHeader.tsx +166 -0
  485. package/src/Table/components/TablePagination/TablePagination.tsx +18 -0
  486. package/src/Table/components/TablePagination/components/ItemCountDisplay/ItemCountDisplay.tsx +17 -0
  487. package/src/Table/components/TablePagination/components/ItemCountSelect/ItemCountSelect.tsx +31 -0
  488. package/src/Table/components/TablePagination/components/TablePaginator/TablePaginator.tsx +37 -0
  489. package/src/Table/components/TablePagination/components/TablePaginator/components/PageSelect/PageSelect.tsx +32 -0
  490. package/src/Table/components/TableRow/TableRows.tsx +147 -0
  491. package/src/Table/components/TableRow/components/TableRowCell/TableRowCell.tsx +49 -0
  492. package/src/Table/components/TableShadow/TableShadow.tsx +46 -0
  493. package/src/Table/index.ts +2 -0
  494. package/src/Table/sharedState.ts +30 -0
  495. package/src/Table/sharedStyles.ts +1 -0
  496. package/src/Table/types.ts +55 -0
  497. package/src/Tabs/Tabs.tsx +358 -0
  498. package/src/TextArea/TextArea.tsx +157 -0
  499. package/src/TextInput/TextInput.tsx +173 -0
  500. package/src/Toast/Toast.tsx +64 -0
  501. package/src/Toast/components/ToastContainer/ToastContainer.tsx +48 -0
  502. package/src/Toast/index.ts +2 -0
  503. package/src/Toast/types/role.ts +1 -0
  504. package/src/Toast/utils/getIcon.tsx +41 -0
  505. package/src/ToggleSwitch/ToggleSwitch.tsx +188 -0
  506. package/src/Tooltip/InfoIconTooltip.tsx +47 -0
  507. package/src/Tooltip/Tooltip.tsx +41 -0
  508. package/src/Typography/InlineButton/InlineButton.tsx +166 -0
  509. package/src/Typography/Links/Links.tsx +113 -0
  510. package/src/Typography/Text/Text.tsx +239 -0
  511. package/src/ViewMore/ViewMore.tsx +226 -0
  512. package/src/WebRTCPlayer/WebRTCPlayer.tsx +325 -0
  513. package/src/WebRTCPlayer/adaptor/NativeWebRTCAdaptor.ts +588 -0
  514. package/src/WebRTCPlayer/hooks/useWebRTCStream.ts +571 -0
  515. package/src/WebRTCPlayer/index.ts +22 -0
  516. package/src/WebRTCPlayer/types.ts +95 -0
  517. package/src/breakpoints/index.tsx +1 -0
  518. package/src/breakpoints/utils.tsx +50 -0
  519. package/src/declarations.d.ts +7 -0
  520. package/src/grid/gridHighlighter.tsx +83 -0
  521. package/src/grid/index.ts +3 -0
  522. package/src/grid/pageGrid.tsx +37 -0
  523. package/src/grid/useSubGridCSS.tsx +214 -0
  524. package/src/hooks/useHorizontalScrollFade.ts +44 -0
  525. package/src/hooks/usePrevious.ts +14 -0
  526. package/src/index.ts +351 -0
  527. package/src/intl/index.ts +4 -0
  528. package/src/intl/utils.ts +67 -0
  529. package/src/mixins/horizontalScrollFadeMixin.ts +56 -0
  530. package/src/mixins/index.ts +18 -0
  531. package/src/mixins/propMixins.ts +389 -0
  532. package/src/providers/createContextProvider.ts +22 -0
  533. package/src/providers/designSystemProvider.tsx +218 -0
  534. package/src/providers/errorBoundaryProvider.tsx +179 -0
  535. package/src/providers/featureFlagProvider.tsx +18 -0
  536. package/src/providers/gridSizeProvider.tsx +23 -0
  537. package/src/providers/index.ts +12 -0
  538. package/src/providers/linkProvider.tsx +32 -0
  539. package/src/providers/normalize.tsx +93 -0
  540. package/src/providers/targets/DatePickerTarget.tsx +10 -0
  541. package/src/providers/targets/ModalTarget.tsx +14 -0
  542. package/src/providers/targets/TimePickerTarget.tsx +10 -0
  543. package/src/providers/themeContext.tsx +24 -0
  544. package/src/providers/windowSizeProvider.tsx +125 -0
  545. package/src/spacing/index.ts +1 -0
  546. package/src/spacing/spacing.ts +11 -0
  547. package/src/utils/countriesWithISOCodes.ts +1419 -0
  548. package/src/utils/dateTimeFormat.ts +257 -0
  549. package/src/utils/effectEventListener.ts +11 -0
  550. package/src/utils/formatFileSize.ts +18 -0
  551. package/src/utils/isClientSide.ts +1 -0
  552. package/src/utils/keepTransition.ts +15 -0
  553. package/src/utils/nodeEnv.ts +9 -0
  554. package/src/utils/smoothScrollTo.ts +47 -0
  555. package/src/utils/utilityTypes.ts +13 -0
  556. package/textInput.d.cts +1 -1
  557. package/textInput.d.mts +1 -1
  558. package/timePicker.d.cts +1 -1
  559. package/timePicker.d.mts +1 -1
@@ -0,0 +1,94 @@
1
+ import { cn } from '@evolve.ui/theme-system';
2
+
3
+ import { IconComponent } from '../Icons/IconBase';
4
+ import { SegmentedControl } from './SegmentedControl';
5
+
6
+ /**
7
+ * Represents an individual control item within the SegmentedControlGroup.
8
+ */
9
+ export type ControlItem<ControlItemOptionId extends string> = {
10
+ /** Whether the control is disabled */
11
+ disabled?: boolean;
12
+ /** Icon component to be displayed on the left side of the control */
13
+ iconLeft?: IconComponent;
14
+ /** Icon component to be displayed on the right side of the control */
15
+ iconRight?: IconComponent;
16
+ /** Unique identifier for the control */
17
+ id: ControlItemOptionId;
18
+ /** Text label for the control */
19
+ label?: string;
20
+ };
21
+
22
+ /**
23
+ * Props for the SegmentedControlGroup component.
24
+ */
25
+ export type SegmentedControlGroupProps<ControlItemOptionId extends string> = {
26
+ /** Additional CSS class name for the group */
27
+ className?: string;
28
+ /** Array of ControlItem objects representing the individual controls */
29
+ controls: ControlItem<ControlItemOptionId>[];
30
+ /** Name of the group, defaults to 'SegmentedControl'
31
+ * use when multiple groups are present on the page that may share control ids
32
+ */
33
+ name?: string;
34
+ /** Callback function triggered when a control is selected */
35
+ onChange: (id: ControlItemOptionId) => void;
36
+ /** ID of the currently selected control */
37
+ selectedId: ControlItemOptionId;
38
+ };
39
+
40
+ export const SegmentedControlGroup = <ControlItemOptionId extends string>({
41
+ className,
42
+ controls,
43
+ name = 'SegmentedControl',
44
+ onChange,
45
+ selectedId,
46
+ }: SegmentedControlGroupProps<ControlItemOptionId>) => {
47
+ const groupClasses = cn(
48
+ 'inline-flex h-[34px] gap-1 overflow-hidden rounded-md border border-border-secondary bg-background-subdued p-1',
49
+ className
50
+ );
51
+ const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>, currentIndex: number) => {
52
+ if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {
53
+ event.preventDefault();
54
+ const direction = event.key === 'ArrowLeft' ? -1 : 1;
55
+ let newIndex = currentIndex;
56
+ do {
57
+ newIndex = (newIndex + direction + controls.length) % controls.length;
58
+ } while (controls[newIndex].disabled && newIndex !== currentIndex);
59
+ // Find the DOM element of the new selected control
60
+ const newSelectedControl = document.getElementById(`${name}-${controls[newIndex].id}`);
61
+ if (newSelectedControl) {
62
+ // Set focus to the new selected control
63
+ newSelectedControl.focus();
64
+ }
65
+ }
66
+ };
67
+
68
+ return (
69
+ <div
70
+ aria-label="Segmented Control Group"
71
+ className={groupClasses}
72
+ data-hui-id="SegmentedControlGroup"
73
+ role="group"
74
+ >
75
+ {controls.map((control, index) => (
76
+ <SegmentedControl
77
+ aria-checked={control.id === selectedId}
78
+ disabled={control.disabled}
79
+ iconLeft={control.iconLeft}
80
+ iconRight={control.iconRight}
81
+ id={`${name}-${control.id}`}
82
+ key={control.id}
83
+ onClick={() => onChange(control.id)}
84
+ onKeyDown={(event: React.KeyboardEvent<HTMLDivElement>) => handleKeyDown(event, index)}
85
+ selected={control.id === selectedId}
86
+ >
87
+ {control.label}
88
+ </SegmentedControl>
89
+ ))}
90
+ </div>
91
+ );
92
+ };
93
+
94
+ SegmentedControlGroup.displayName = 'SegmentedControlGroup';
@@ -0,0 +1,4 @@
1
+ export { SegmentedControl } from './SegmentedControl';
2
+ export { SegmentedControlGroup } from './SegmentedControlGroup';
3
+ export type { ControlItem, SegmentedControlGroupProps } from './SegmentedControlGroup';
4
+ export type { SegmentedControlProps } from './SegmentedControl';
@@ -0,0 +1,154 @@
1
+ import type ReactSelectAsync from 'react-select/async';
2
+ import type ReactSelectAsyncCreatable from 'react-select/async-creatable';
3
+ import type ReactSelectCreatable from 'react-select/creatable';
4
+
5
+ import {
6
+ type ForwardRefExoticComponent,
7
+ type RefAttributes,
8
+ ComponentProps,
9
+ forwardRef,
10
+ useCallback,
11
+ useId,
12
+ } from 'react';
13
+ import ReactSelect, { ActionMeta, components as selectBuiltins } from 'react-select';
14
+
15
+ import { extractFormLabelProps, FormLabel, FormLabelProps } from '../FormLabel/FormLabel';
16
+ import {
17
+ ClearIndicator,
18
+ DropdownIndicator,
19
+ Input,
20
+ InsideLabelControl,
21
+ Menu,
22
+ MenuList,
23
+ MenuPortal,
24
+ NoOptionsMessage,
25
+ Option,
26
+ Placeholder,
27
+ SelectContainer,
28
+ SingleValue,
29
+ ValueContainer,
30
+ } from './selectComponents';
31
+
32
+ // Props are unwieldy, so, put them at the bottom.
33
+
34
+ /**
35
+ * A customized + styled react-select
36
+ *
37
+ * @see https://react-select.com
38
+ */
39
+ export const Select = forwardRef(
40
+ <SelectType extends AllSelects>(unfilteredProps: Props<SelectType>, ref: ComponentProps<SelectType>['ref']) => {
41
+ const defaultInstanceId = useId();
42
+ const [
43
+ formLabelProps,
44
+ {
45
+ components,
46
+ disabled,
47
+ isInsideLabel,
48
+ menuPlacement = 'auto',
49
+ menuPosition,
50
+ name,
51
+ onChange: propOnChange,
52
+ selectType: SelectComponent = ReactSelect,
53
+ small = false,
54
+ usePortalMenu,
55
+ ...selectProps
56
+ },
57
+ ] = extractFormLabelProps(unfilteredProps);
58
+
59
+ const onChange = useCallback<SelectOnChange>(
60
+ (event, action) => {
61
+ if (event) {
62
+ event.name = name;
63
+ propOnChange?.(event, action);
64
+ }
65
+ },
66
+ [name, propOnChange]
67
+ );
68
+
69
+ return (
70
+ <FormLabel
71
+ {...formLabelProps}
72
+ labelText={isInsideLabel ? undefined : formLabelProps.labelText}
73
+ >
74
+ <SelectComponent
75
+ data-hui-id="Select"
76
+ instanceId={defaultInstanceId}
77
+ placeholder="Select"
78
+ {...selectProps}
79
+ components={{
80
+ ClearIndicator,
81
+ Control: InsideLabelControl,
82
+ DropdownIndicator,
83
+ IndicatorSeparator: null,
84
+ Input,
85
+ Menu,
86
+ MenuList,
87
+ MenuPortal,
88
+ NoOptionsMessage,
89
+ Option,
90
+ Placeholder,
91
+ SelectContainer,
92
+ SingleValue,
93
+ ValueContainer,
94
+ ...components,
95
+ }}
96
+ hasError={formLabelProps.hasError}
97
+ isDisabled={disabled}
98
+ isInsideLabel={isInsideLabel}
99
+ labelText={formLabelProps.labelText}
100
+ menuPlacement={menuPlacement}
101
+ menuPosition={menuPosition ?? (usePortalMenu ? 'fixed' : 'absolute')}
102
+ menuPortalTarget={
103
+ usePortalMenu && typeof document !== 'undefined'
104
+ ? document.getElementById('hui-modal-target')
105
+ : undefined
106
+ }
107
+ name={name}
108
+ // This typing should be correct, but react-select is a bit of a mess
109
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
110
+ onChange={onChange as any}
111
+ ref={ref}
112
+ small={small}
113
+ />
114
+ </FormLabel>
115
+ );
116
+ }
117
+ ) as ForwardRefExoticComponent<Props<typeof ReactSelect> & RefAttributes<unknown>>;
118
+
119
+ Select.displayName = 'Select';
120
+
121
+ /**
122
+ * Re-export react-select built-ins
123
+ * @see https://react-select.com/components
124
+ */
125
+ export { selectBuiltins as reactSelectBuiltins };
126
+
127
+ type ExtendedProps = {
128
+ /** Adds autocomplete attribute to the dom element, used for accessibility and password managers. */
129
+ autoComplete?: string;
130
+ /** If true, the label will be inside the select. */
131
+ isInsideLabel?: boolean;
132
+ /** Set the size of the select to small (`34px` height, small=false is `42px`) */
133
+ small?: boolean;
134
+ /** Position the select dropdown menu absolutely, relative to <body />. Useful in places like modals where the menu may get cut off */
135
+ usePortalMenu?: boolean;
136
+ } & FormLabelProps;
137
+
138
+ type AllSelects =
139
+ | typeof ReactSelect
140
+ | typeof ReactSelectAsync
141
+ | typeof ReactSelectAsyncCreatable
142
+ | typeof ReactSelectCreatable;
143
+
144
+ type OverridenOnChangeProps<SelectType extends AllSelects> = Omit<ComponentProps<SelectType>, 'onChange'> & {
145
+ onChange?: SelectOnChange;
146
+ };
147
+
148
+ type Props<SelectType extends AllSelects> = { selectType?: SelectType } & ExtendedProps &
149
+ OverridenOnChangeProps<SelectType>;
150
+
151
+ // Hammer-parity public type — `value: any` is the published contract consumers rely on.
152
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
153
+ export type OptionType = { label: string; name?: string; value: any };
154
+ export type SelectOnChange = (event?: OptionType, action?: ActionMeta<OptionType>) => void;
@@ -0,0 +1,13 @@
1
+ import { ComponentProps } from 'react';
2
+ import ReactSelectAsync, { AsyncProps } from 'react-select/async';
3
+
4
+ import { OptionType, Select, SelectOnChange } from './Select';
5
+
6
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- hammer-parity react-select generics
7
+ export const SelectAsync = ({ ...props }: ComponentProps<typeof Select> & AsyncProps<OptionType, any, any>) => (
8
+ <Select
9
+ {...props}
10
+ onChange={props.onChange as SelectOnChange}
11
+ selectType={ReactSelectAsync}
12
+ />
13
+ );
@@ -0,0 +1,14 @@
1
+ import { ComponentProps } from 'react';
2
+ import ReactSelectAsyncCreatable, { AsyncCreatableProps } from 'react-select/async-creatable';
3
+
4
+ import { OptionType, Select } from './Select';
5
+
6
+ export const SelectAsyncCreatable = ({
7
+ ...props
8
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- hammer-parity react-select generics
9
+ }: ComponentProps<typeof Select> & AsyncCreatableProps<OptionType, any, any>) => (
10
+ <Select
11
+ {...props}
12
+ selectType={ReactSelectAsyncCreatable}
13
+ />
14
+ );
@@ -0,0 +1,12 @@
1
+ import { ComponentProps } from 'react';
2
+ import ReactSelectCreatable, { CreatableProps } from 'react-select/creatable';
3
+
4
+ import { OptionType, Select } from './Select';
5
+
6
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- hammer-parity react-select generics
7
+ export const SelectCreatable = ({ ...props }: ComponentProps<typeof Select> & CreatableProps<OptionType, any, any>) => (
8
+ <Select
9
+ {...props}
10
+ selectType={ReactSelectCreatable}
11
+ />
12
+ );
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Re-export react-select built-ins
3
+ * @see https://react-select.com/components
4
+ */
5
+ export { components } from 'react-select';
@@ -0,0 +1,306 @@
1
+ import { cn } from '@evolve.ui/theme-system';
2
+ import { ComponentProps, ReactNode } from 'react';
3
+ import { components as selectBuiltins } from 'react-select';
4
+
5
+ import { CaretDown, Check } from '../Icons';
6
+ import { BodyPrimary } from '../Typography/Text/Text';
7
+
8
+ export const InsideLabelControl = ({
9
+ children,
10
+ ...props
11
+ }: ComponentProps<typeof selectBuiltins.Control> & {
12
+ selectProps: {
13
+ hasError?: boolean;
14
+ isInsideLabel?: boolean;
15
+ labelText?: ReactNode;
16
+ small?: boolean;
17
+ };
18
+ }) => {
19
+ const { hasError, isInsideLabel, labelText, small } = props.selectProps;
20
+ return (
21
+ <selectBuiltins.Control
22
+ {...props}
23
+ className={cn(
24
+ // GENERAL
25
+ '!m-0 !min-h-[42px] !flex-nowrap !rounded-input !border !border-solid !border-border-secondary !bg-background-primary !p-0 ![box-shadow:none]',
26
+ // HOVER
27
+ {
28
+ 'hover:!border-border-hover': !props.menuIsOpen,
29
+ 'hover:!border-border-selected': props.menuIsOpen,
30
+ },
31
+ {
32
+ '!border-border-critical': props.selectProps['aria-invalid'] === 'true',
33
+ '!border-border-selected': props.menuIsOpen || props.isFocused,
34
+ '!min-h-[34px]': small,
35
+ },
36
+ // ERROR
37
+ {
38
+ '!border-border-critical': hasError && !props.menuIsOpen && !props.isDisabled,
39
+ }
40
+ )}
41
+ >
42
+ {isInsideLabel && Boolean(labelText) && (
43
+ <BodyPrimary
44
+ className="ml-xs mr--2xs"
45
+ color="secondary"
46
+ >
47
+ {labelText}
48
+ </BodyPrimary>
49
+ )}
50
+ {children}
51
+ </selectBuiltins.Control>
52
+ );
53
+ };
54
+
55
+ /**
56
+ * Add custom icon for dropdown indicator
57
+ * @see https://react-select.com/components#components
58
+ */
59
+ export const DropdownIndicator = (props: ComponentProps<typeof selectBuiltins.DropdownIndicator>) => {
60
+ return (
61
+ <selectBuiltins.DropdownIndicator
62
+ {...props}
63
+ className="flex h-full w-full items-center justify-center !py-0 px-xs"
64
+ >
65
+ <CaretDown
66
+ aria-label={props.selectProps.menuIsOpen ? 'Caret Up' : 'Caret Down'}
67
+ className={cn({
68
+ 'rotate-180': props.selectProps.menuIsOpen,
69
+ })}
70
+ color={props.selectProps.isDisabled ? 'disabled' : 'primary'}
71
+ size="sm"
72
+ />
73
+ </selectBuiltins.DropdownIndicator>
74
+ );
75
+ };
76
+
77
+ /**
78
+ * Add data-testid prop to the select component container
79
+ * @see https://react-select.com/components#components
80
+ */
81
+ export const SelectContainer = ({ className, ...props }: ComponentProps<typeof selectBuiltins.SelectContainer>) => (
82
+ <selectBuiltins.SelectContainer
83
+ {...props}
84
+ className={cn(className, 'hui-text-body-primary !rounded-input text-text-primary ![box-shadow:none]')}
85
+ innerProps={{
86
+ ...props.innerProps,
87
+ // @ts-expect-error all attributes are passed and we have the custom "data-testid", so this is ok.
88
+ ...(Boolean(props.selectProps['data-testid']) && {
89
+ // @ts-expect-error all attributes are passed and we have the custom "data-testid", so this is ok.
90
+ 'data-testid': props.selectProps['data-testid'],
91
+ }),
92
+ }}
93
+ />
94
+ );
95
+
96
+ export const NoOptionsMessage = (props: ComponentProps<typeof selectBuiltins.NoOptionsMessage>) => (
97
+ <selectBuiltins.NoOptionsMessage
98
+ {...props}
99
+ className="p-0"
100
+ >
101
+ <BodyPrimary
102
+ className="normal-case"
103
+ color="secondary"
104
+ >
105
+ No results
106
+ </BodyPrimary>
107
+ </selectBuiltins.NoOptionsMessage>
108
+ );
109
+
110
+ export const Input = (props: ComponentProps<typeof selectBuiltins.Input>) => (
111
+ <selectBuiltins.Input
112
+ {...props}
113
+ aria-activedescendant={props['aria-activedescendant'] || undefined}
114
+ // @ts-expect-error prop type does exist on parent, just not here.
115
+ autoComplete={props.selectProps.autoComplete}
116
+ className="!m-0 !p-0"
117
+ />
118
+ );
119
+
120
+ export const Option = ({
121
+ children,
122
+ isDisabled,
123
+ isFocused,
124
+ isSelected,
125
+ ...rest
126
+ }: ComponentProps<typeof selectBuiltins.Option>) => {
127
+ const isSelectedAndDisabled = isSelected && isDisabled;
128
+
129
+ return (
130
+ <selectBuiltins.Option
131
+ {...rest}
132
+ className={cn(
133
+ // BASE
134
+ 'hui-text-body-primary !px-[8px] !py-[4px] text-[16px] text-text-primary',
135
+ // HOVER
136
+ 'hover:cursor-pointer hover:bg-background-hover',
137
+ // SELECTED
138
+ {
139
+ '!bg-background-hover': !isDisabled && isFocused,
140
+ '!bg-background-inverse !text-text-inverse hover:!bg-background-inverse': !isDisabled && isSelected,
141
+ '!bg-background-primary': isDisabled && isFocused && !isSelected,
142
+ // Selected AND disabled - show as selected but with disabled text color
143
+ '!cursor-not-allowed !bg-background-inverse !text-text-disabled hover:!bg-background-inverse':
144
+ isSelectedAndDisabled,
145
+ '!cursor-not-allowed !text-text-disabled hover:!bg-background-primary focus:!bg-background-primary':
146
+ isDisabled && !isSelected,
147
+ }
148
+ )}
149
+ innerProps={{
150
+ ...rest.innerProps,
151
+ // @ts-expect-error all attributes are passed and we have the custom "data-testid", so this is ok.
152
+ ...(Boolean(rest.selectProps['data-testid']) && {
153
+ // @ts-expect-error all attributes are passed and we have the custom "data-testid", so this is ok.
154
+ 'data-testid': rest.selectProps['data-testid'],
155
+ }),
156
+ }}
157
+ isDisabled={Boolean(isDisabled)}
158
+ isFocused={isFocused}
159
+ isSelected={isSelected}
160
+ >
161
+ <div
162
+ // adds data-testid attribute to dropdown option
163
+ {...(rest.data && typeof rest.data === 'object' && 'data-testid' in rest.data
164
+ ? { 'data-testid': rest.data['data-testid'] }
165
+ : {})}
166
+ className={cn('flex h-full w-full items-center', {
167
+ 'bg-background-inverse text-text-disabled': isSelectedAndDisabled,
168
+ 'bg-background-inverse text-text-inverse': isSelected && !isDisabled,
169
+ 'pl-sm': !isSelected,
170
+ })}
171
+ >
172
+ {isSelected && (
173
+ <Check
174
+ className="mr-[2px]"
175
+ color={isDisabled ? 'disabled' : 'inverse'}
176
+ size="xs"
177
+ />
178
+ )}
179
+ {children}
180
+ </div>
181
+ </selectBuiltins.Option>
182
+ );
183
+ };
184
+
185
+ export const ClearIndicator = (props: ComponentProps<typeof selectBuiltins.ClearIndicator>) => (
186
+ <selectBuiltins.ClearIndicator
187
+ {...props}
188
+ className="!py-0"
189
+ >
190
+ {props.children}
191
+ </selectBuiltins.ClearIndicator>
192
+ );
193
+
194
+ /**
195
+ * Reads the scroll offset that `PreventModalScroll` parks on `document.body.style.top`.
196
+ *
197
+ * When a modal is open, `PreventModalScroll` sets `body.style.top = "-${scrollPosition}px"`
198
+ * and `body.style.position = "fixed"`. React-select uses `window.pageYOffset` for the
199
+ * portal offset, but that returns 0 when the body is fixed, so we read the stored scroll
200
+ * position directly from `body.style.top` to compensate. Zoom-agnostic because it's a
201
+ * stored value, not a layout measurement.
202
+ */
203
+ const getBodyScrollOffset = () => {
204
+ const bodyTop = typeof document !== 'undefined' ? document.body.style.top : '';
205
+ return bodyTop ? Math.abs(parseFloat(bodyTop)) : 0;
206
+ };
207
+
208
+ /**
209
+ * Adds the stored body-scroll offset to react-select's computed `top` style.
210
+ *
211
+ * react-select only sets `top` when placement === 'bottom'. When it flips to 'top'
212
+ * it sets `bottom` instead and leaves `top` undefined, so we must guard before adding
213
+ * the scroll offset — otherwise `Number(undefined)` NaN-stomps the style and breaks
214
+ * the flipped portal menu.
215
+ *
216
+ * @internal exported for unit testing only.
217
+ */
218
+ export const applyBodyScrollOffsetToTop = <T extends Record<string, unknown>>(
219
+ baseStyles: T,
220
+ scrollOffset: number
221
+ ): T => ({
222
+ ...baseStyles,
223
+ ...(typeof baseStyles.top === 'number' ? { top: baseStyles.top + scrollOffset } : {}),
224
+ });
225
+
226
+ export const Menu = ({ getStyles, ...props }: ComponentProps<typeof selectBuiltins.Menu>) => {
227
+ if (props.selectProps.menuPortalTarget) {
228
+ const customGetStyles: typeof getStyles = (name, styleProps) =>
229
+ applyBodyScrollOffsetToTop(getStyles(name, styleProps), getBodyScrollOffset());
230
+
231
+ return (
232
+ <selectBuiltins.Menu
233
+ {...props}
234
+ getStyles={customGetStyles}
235
+ className={cn(
236
+ props.className,
237
+ '!z-[11111] !mt-2xs !rounded-input !border !border-border-secondary !bg-background-primary'
238
+ )}
239
+ >
240
+ {props.children}
241
+ </selectBuiltins.Menu>
242
+ );
243
+ }
244
+
245
+ return (
246
+ <selectBuiltins.Menu
247
+ {...props}
248
+ getStyles={getStyles}
249
+ className={cn(
250
+ props.className,
251
+ '!z-[11111] !mt-2xs !rounded-input !border !border-border-secondary !bg-background-primary'
252
+ )}
253
+ >
254
+ {props.children}
255
+ </selectBuiltins.Menu>
256
+ );
257
+ };
258
+
259
+ export const MenuList = (props: ComponentProps<typeof selectBuiltins.MenuList>) => (
260
+ <selectBuiltins.MenuList
261
+ {...props}
262
+ className="!px-0 !py-xs"
263
+ >
264
+ {props.children}
265
+ </selectBuiltins.MenuList>
266
+ );
267
+
268
+ export const MenuPortal = (props: ComponentProps<typeof selectBuiltins.MenuPortal>) => (
269
+ <selectBuiltins.MenuPortal
270
+ {...props}
271
+ className="!z-[11111]"
272
+ >
273
+ {props.children}
274
+ </selectBuiltins.MenuPortal>
275
+ );
276
+
277
+ export const Placeholder = (props: ComponentProps<typeof selectBuiltins.Placeholder>) => (
278
+ <selectBuiltins.Placeholder
279
+ {...props}
280
+ className="!hui-text-body-primary overflow-hidden text-nowrap"
281
+ >
282
+ {props.children}
283
+ </selectBuiltins.Placeholder>
284
+ );
285
+
286
+ export const SingleValue = ({ isDisabled, ...rest }: ComponentProps<typeof selectBuiltins.SingleValue>) => (
287
+ <selectBuiltins.SingleValue
288
+ {...rest}
289
+ className={cn('!hui-text-body-primary m-0', {
290
+ '!cursor-not-allowed !text-text-disabled': isDisabled,
291
+ '!text-text-primary': !isDisabled,
292
+ })}
293
+ isDisabled={isDisabled}
294
+ >
295
+ {rest.children}
296
+ </selectBuiltins.SingleValue>
297
+ );
298
+
299
+ export const ValueContainer = (props: ComponentProps<typeof selectBuiltins.ValueContainer>) => (
300
+ <selectBuiltins.ValueContainer
301
+ {...props}
302
+ className="!m-0 flex h-full items-center !py-0"
303
+ >
304
+ {props.children}
305
+ </selectBuiltins.ValueContainer>
306
+ );
@@ -0,0 +1,13 @@
1
+ import { ComponentProps } from 'react';
2
+ import ContentLoader from 'react-content-loader';
3
+
4
+ /**
5
+ * A reexported version of `react-content-loader`.
6
+ *
7
+ * This component is mostly reserved here for any future styling updates that might want to apply to _every_ skeleton.
8
+ *
9
+ * @see https://skeletonreact.com/
10
+ */
11
+ export const Skeleton = (props: ComponentProps<typeof ContentLoader>) => {
12
+ return <ContentLoader {...props} />;
13
+ };