@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,172 @@
1
+ import { ComponentPropsWithoutRef, DOMAttributes, ReactNode, RefObject } from 'react';
2
+
3
+ /** Props returned by use-gesture's `bind()`, spread onto a drag target. */
4
+ export type DragBindProps = Partial<DOMAttributes<EventTarget>>;
5
+
6
+ /** The `bind` function produced by use-gesture's `useDrag`. */
7
+ export type DragBind = (args?: { closeOnTap?: boolean }) => DragBindProps;
8
+
9
+ export type SnapPointProps = {
10
+ /**
11
+ * The height of the sticky footer, if there's one
12
+ */
13
+ footerHeight: number;
14
+ /**
15
+ * The height of the sticky header, if there's one
16
+ */
17
+ headerHeight: number;
18
+ /**
19
+ * If the bottom sheet is animating to a snap point the height will match the destination height, not the height the bottom sheet might have in the middle of the animation. It includes the header and footer heights.
20
+ */
21
+ height: number;
22
+ /**
23
+ * Max height the sheet can be, your snap points are capped to this value. It's window.innerHeight by default but can be overriden using the maxHeight prop.
24
+ */
25
+ maxHeight: number;
26
+ /**
27
+ * Minimum height needed to avoid scroll overflow in the content area, if possible.
28
+ */
29
+ minHeight: number;
30
+ };
31
+
32
+ export type snapPoints = (props: SnapPointProps) => number[] | number;
33
+
34
+ /**
35
+ * `window` comes from window.onresize, maxheightprop is if the `maxHeight` prop is used, and `element` comes from the resize observers that listens to header, footer and the content area
36
+ */
37
+ export type ResizeSource = 'window' | 'maxheightprop' | 'element';
38
+
39
+ export type defaultSnapProps = {
40
+ /** The last snap point the user dragged to, if any. 0 if the user haven't interacted */
41
+ lastSnap: number | null;
42
+ /** The snap points currently in use, this can be controlled by providing a `snapPoints` function on the bottom sheet. */
43
+ snapPoints: number[];
44
+ } & SnapPointProps;
45
+
46
+ /* Might make sense to expose a preventDefault method here */
47
+ export type SpringEvent =
48
+ | { type: 'OPEN' }
49
+ | { type: 'CLOSE' }
50
+ | { source: ResizeSource; type: 'RESIZE' }
51
+ | { source: 'dragging' | 'custom' | string; type: 'SNAP' };
52
+
53
+ export type Props = {
54
+ /**
55
+ * Ensure that whatever you put in here have at least 1px height, or else the bottom sheet won't open
56
+ */
57
+ children: ReactNode;
58
+
59
+ /**
60
+ * Additional CSS class for the container.
61
+ */
62
+ className?: string;
63
+
64
+ /**
65
+ * Handler that is called to get the initial height of the bottom sheet when it's opened (or when the viewport is resized).
66
+ * @default ({ snapPoints, lastSnap }) => lastSnap ?? Math.min(...snapPoints)
67
+ */
68
+ defaultSnap?: number | ((props: defaultSnapProps) => number);
69
+ /**
70
+ * Whether to disable the BottomSheet's own scrolling (useful when children handle their own scrolling)
71
+ * @default false
72
+ */
73
+ disableScroll?: boolean;
74
+
75
+ /**
76
+ * Renders a sticky footer at the bottom of the sheet.
77
+ */
78
+ footer?: ReactNode;
79
+
80
+ /**
81
+ * Renders a title/description header below the drag handle. Omit to render no header.
82
+ */
83
+ header?: {
84
+ description: ReactNode;
85
+ title: ReactNode;
86
+ };
87
+
88
+ /**
89
+ * A reference to the element that should be focused. By default it'll be the first interactive element.
90
+ * Set to false to disable keyboard focus when opening.
91
+ */
92
+ initialFocusRef?: RefObject<HTMLElement> | false;
93
+
94
+ /**
95
+ * By default the maxHeight is set to window.innerHeight to match 100vh, and responds to window resize events.
96
+ * You can override it by giving maxHeight a number, just make sure you handle things like resize events when needed.
97
+ */
98
+ maxHeight?: number;
99
+
100
+ /**
101
+ * Minimum height for the bottom sheet in pixels. Ensures usable height on small screens.
102
+ * @default 300
103
+ */
104
+ minHeight?: number;
105
+
106
+ /**
107
+ * Handler that is called when the close animation completes.
108
+ * This is useful for cleanup actions or state updates that should happen after the sheet is fully closed.
109
+ */
110
+ onCloseEnd?: () => void;
111
+
112
+ /**
113
+ * Handler that is called when the user presses *esc*, clicks outside the dialog or drags the sheet to the bottom of the display.
114
+ */
115
+ onDismiss?: () => void;
116
+
117
+ /**
118
+ * A running transition didn't finish or got stopped, this event isn't awaited on and might happen
119
+ * after the sheet is unmounted (if it were in the middle of something).
120
+ */
121
+ onSpringCancel?: (event: SpringEvent) => void;
122
+
123
+ /**
124
+ * The transition ended successfully. Handy to know when it's safe to unmount
125
+ * the sheet without interrupting the closing animation.
126
+ * Return a promise or async to delay the start of the transition, just remember it can be cancelled.
127
+ */
128
+ onSpringEnd?: (event: SpringEvent) => void;
129
+
130
+ /**
131
+ * Start a transition from closed to open, open to closed, or snap to snap.
132
+ * Return a promise or async to delay the start of the transition, just remember it can be cancelled.
133
+ */
134
+ onSpringStart?: (event: SpringEvent) => void;
135
+
136
+ /** Whether the bottom sheet is open or not. */
137
+ open: boolean;
138
+
139
+ /**
140
+ * Ensures that drag interactions works properly on iOS and Android.
141
+ * If setting this to `false`make sure you test on real iOS and Android devices to ensure the dragging interactions don't break.
142
+ * @default true
143
+ */
144
+ scrollLocking?: boolean;
145
+
146
+ /**
147
+ * Handler that is called to get the height values that the bottom sheet can *snap* to when the user stops dragging.
148
+ * @default ({ minHeight }) => minHeight
149
+ */
150
+ snapPoints?: snapPoints;
151
+ } & Omit<ComponentPropsWithoutRef<'div'>, 'children'>;
152
+
153
+ export interface RefHandles {
154
+ /**
155
+ * Returns the current snap point, in other words the height.
156
+ * It's update lifecycle with events are onSpringStart and onSpringCancel will give you the old value, while onSpringEnd will give you the current one.
157
+ */
158
+ height: number;
159
+
160
+ /**
161
+ * When given a number it'll find the closest snap point, so you don't need to know the exact value,
162
+ * Use the callback method to access what snap points you can choose from.
163
+ *
164
+ * Use the second argument for advanced settings like:
165
+ * `source: string` which is passed to onSpring events, and is 'custom' by default
166
+ * `velocity: number` which is 1 by default, adjust it to control the speed of the spring transition to the new snap point
167
+ */
168
+ snapTo: (
169
+ numberOrCallback: number | ((state: defaultSnapProps) => number),
170
+ options?: { source?: string; velocity?: number }
171
+ ) => void;
172
+ }
@@ -0,0 +1,65 @@
1
+ /* eslint-disable no-param-reassign */
2
+ /* eslint-disable no-self-compare */
3
+
4
+ // stolen from lodash
5
+ export const clamp = (number: number, lower: number, upper: number) => {
6
+ number = Number(number);
7
+ lower = Number(lower);
8
+ upper = Number(upper);
9
+ lower = lower === lower ? lower : 0;
10
+ upper = upper === upper ? upper : 0;
11
+ if (number === number) {
12
+ number = number <= upper ? number : upper;
13
+ number = number >= lower ? number : lower;
14
+ }
15
+ return number;
16
+ };
17
+
18
+ // Mwahaha easiest way to filter out NaN I ever saw! >:3
19
+ export const deleteNaN = (arr: number[]) => {
20
+ const set = new Set(arr);
21
+ set.delete(NaN);
22
+ return [...set];
23
+ };
24
+
25
+ export const roundAndCheckForNaN = (unrounded: number) => {
26
+ const rounded = Math.round(unrounded);
27
+ if (Number.isNaN(unrounded)) {
28
+ throw new TypeError('Found a NaN! Check your snapPoints / defaultSnap / snapTo ');
29
+ }
30
+
31
+ return rounded;
32
+ };
33
+
34
+ // Validate, sanitize, round and dedupe snap points, as well as extracting the minSnap and maxSnap points
35
+ export const processSnapPoints = (unsafeSnaps: number | number[], maxHeight: number) => {
36
+ // @ts-expect-error - we're not sure what the type of unsafeSnaps is, but we know it's a number or an array of numbers
37
+ const safeSnaps = [].concat(unsafeSnaps).map(roundAndCheckForNaN);
38
+
39
+ // Get actual viewport height for hard capping
40
+ const viewportHeight = typeof window !== 'undefined' ? window.innerHeight : maxHeight;
41
+ // Use the smaller of maxHeight or actual viewport height as the absolute limit
42
+ const absoluteMaxHeight = Math.min(maxHeight, viewportHeight);
43
+
44
+ const snapPointsDedupedSet = safeSnaps.reduce((acc, snapPoint) => {
45
+ acc.add(clamp(snapPoint, 0, absoluteMaxHeight));
46
+ return acc;
47
+ }, new Set<number>());
48
+
49
+ const snapPoints = Array.from(snapPointsDedupedSet);
50
+
51
+ const minSnap = Math.min(...snapPoints);
52
+ if (Number.isNaN(minSnap)) {
53
+ throw new TypeError('minSnap is NaN');
54
+ }
55
+ const maxSnap = Math.max(...snapPoints);
56
+ if (Number.isNaN(maxSnap)) {
57
+ throw new TypeError('maxSnap is NaN');
58
+ }
59
+
60
+ return {
61
+ maxSnap,
62
+ minSnap,
63
+ snapPoints,
64
+ };
65
+ };
@@ -0,0 +1,126 @@
1
+ import { cn } from '@evolve.ui/theme-system';
2
+ import { ReactElement, useMemo } from 'react';
3
+
4
+ import { useHorizontalScrollFade } from '../hooks/useHorizontalScrollFade';
5
+ import { ArrowLeft, CaretRight } from '../Icons';
6
+ import { SubtleWeakLink } from '../Typography/Links/Links';
7
+
8
+ type Props = {
9
+ 'aria-label'?: string;
10
+ breadcrumbs?: {
11
+ href: string;
12
+ label: string;
13
+ }[];
14
+ className?: string;
15
+ onClick: (href: string, label: string) => void;
16
+ } & (
17
+ | {
18
+ backHref?: string;
19
+ backText?: string;
20
+ showBackLink?: false;
21
+ }
22
+ | {
23
+ backHref: string;
24
+ backText: string;
25
+ showBackLink: true;
26
+ }
27
+ );
28
+
29
+ export const Breadcrumbs = ({
30
+ 'aria-label': ariaLabel = 'breadcrumbs',
31
+ backHref,
32
+ backText = 'Back',
33
+ breadcrumbs: propBreadcrumbs,
34
+ className,
35
+ onClick,
36
+ showBackLink = false,
37
+ }: Props) => {
38
+ const { leftFadeClass, ref, rightFadeClass } = useHorizontalScrollFade();
39
+
40
+ const backNode = useMemo(
41
+ () =>
42
+ showBackLink ? (
43
+ <>
44
+ <SubtleWeakLink
45
+ aria-label={`Navigate to ${backText}`}
46
+ className="flex items-center"
47
+ href={backHref}
48
+ onClick={(e) => {
49
+ e.preventDefault();
50
+ onClick(backHref!, backText!);
51
+ }}
52
+ size="xs"
53
+ >
54
+ <ArrowLeft
55
+ className="mr-1 max-h-[14px] min-h-[14px] min-w-[14px] max-w-[14px]"
56
+ color="primary"
57
+ role="none"
58
+ size="xs"
59
+ />
60
+ {backText}
61
+ </SubtleWeakLink>
62
+ <div className="mx-2 h-3 border-l border-border-secondary"></div>
63
+ </>
64
+ ) : null,
65
+ [showBackLink, backHref, backText, onClick]
66
+ );
67
+
68
+ const breadcrumbs = useMemo(() => {
69
+ if (!propBreadcrumbs) {
70
+ return null;
71
+ }
72
+
73
+ const breadcrumbs: ReactElement[] = [];
74
+
75
+ propBreadcrumbs.forEach(({ href, label }, i) => {
76
+ breadcrumbs.push(
77
+ <SubtleWeakLink
78
+ aria-label={`Navigate to ${label}`}
79
+ href={href}
80
+ key={href}
81
+ onClick={(e) => {
82
+ e.preventDefault();
83
+ onClick(href, label);
84
+ }}
85
+ size="xs"
86
+ >
87
+ {label}
88
+ </SubtleWeakLink>
89
+ );
90
+
91
+ if (i !== propBreadcrumbs.length - 1) {
92
+ breadcrumbs.push(
93
+ <CaretRight
94
+ className="mx-1 max-h-[14px] min-h-[14px] min-w-[14px] max-w-[14px]"
95
+ color="primary"
96
+ key={`separator-${i}`}
97
+ role="none"
98
+ size="xs"
99
+ />
100
+ );
101
+ }
102
+ });
103
+
104
+ return breadcrumbs;
105
+ }, [propBreadcrumbs, onClick]);
106
+
107
+ return (
108
+ <div
109
+ className={cn('relative -ml-2', className)}
110
+ data-hui-id="Breadcrumbs"
111
+ >
112
+ <nav
113
+ aria-label={ariaLabel}
114
+ className={cn(
115
+ 'scrollbar-hide flex flex-row items-center overflow-x-auto whitespace-nowrap p-2',
116
+ leftFadeClass,
117
+ rightFadeClass
118
+ )}
119
+ ref={ref}
120
+ >
121
+ {backNode}
122
+ {breadcrumbs}
123
+ </nav>
124
+ </div>
125
+ );
126
+ };
@@ -0,0 +1,164 @@
1
+ 'use client';
2
+
3
+ import { cn } from '@evolve.ui/theme-system';
4
+ import { forwardRef, MouseEventHandler, useCallback, useMemo } from 'react';
5
+
6
+ import { iconSizesToPixels } from '../Icons/IconBase';
7
+ import { LoadingSpinner } from '../LoadingSpinner/LoadingSpinner';
8
+ import { Props } from './Button.types';
9
+ import {
10
+ filledCriticalClasses,
11
+ filledInverseClasses,
12
+ filledNeutralClasses,
13
+ filledPrimaryClasses,
14
+ outlinedCriticalClasses,
15
+ outlinedInverseClasses,
16
+ outlinedNeutralClasses,
17
+ outlinedPrimaryClasses,
18
+ transparentCriticalClasses,
19
+ transparentInverseClasses,
20
+ transparentNeutralClasses,
21
+ transparentPrimaryClasses,
22
+ } from './buttonColorClasses';
23
+
24
+ /**
25
+ * A wonderful HUI button. Inherits all props from a normal HTML button.
26
+ *
27
+ * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button
28
+ */
29
+ export const Button = forwardRef<HTMLButtonElement, Props>(
30
+ (
31
+ {
32
+ as: Component = 'button',
33
+ children,
34
+ className,
35
+ dataTestId = 'Button',
36
+ disabled = false,
37
+ iconLeft: IconLeft,
38
+ iconRight: IconRight,
39
+ iconStyle = 'bold',
40
+ inlineStyles,
41
+ loading = false,
42
+ onClick: onClickProp,
43
+ size = 'md',
44
+ style = 'primary',
45
+ variant = 'filled',
46
+ ...rest
47
+ },
48
+ ref
49
+ ) => {
50
+ const onClick: MouseEventHandler<HTMLButtonElement> = useCallback(
51
+ (e) => {
52
+ if (!disabled && !loading && onClickProp) {
53
+ onClickProp(e);
54
+ }
55
+
56
+ // Handle the case where the button is in a Form and shouldnt trigger the form's onSubmit callback
57
+ if (disabled || loading) {
58
+ e.preventDefault();
59
+ e.stopPropagation();
60
+ }
61
+ },
62
+ [disabled, loading, onClickProp]
63
+ );
64
+
65
+ const colorClasses = useMemo(
66
+ () => ({
67
+ [filledCriticalClasses]: variant === 'filled' && style === 'critical',
68
+ [filledInverseClasses]: variant === 'filled' && style === 'inverse',
69
+ [filledNeutralClasses]: variant === 'filled' && style === 'neutral',
70
+ [filledPrimaryClasses]: variant === 'filled' && style === 'primary',
71
+ [outlinedCriticalClasses]: variant === 'outlined' && style === 'critical',
72
+ [outlinedInverseClasses]: variant === 'outlined' && style === 'inverse',
73
+ [outlinedNeutralClasses]: variant === 'outlined' && style === 'neutral',
74
+ [outlinedPrimaryClasses]: variant === 'outlined' && style === 'primary',
75
+ [transparentCriticalClasses]: variant === 'transparent' && style === 'critical',
76
+ [transparentInverseClasses]: variant === 'transparent' && style === 'inverse',
77
+ [transparentNeutralClasses]: variant === 'transparent' && style === 'neutral',
78
+ [transparentPrimaryClasses]: variant === 'transparent' && style === 'primary',
79
+ }),
80
+ [style, variant]
81
+ );
82
+
83
+ const sizeClasses = useMemo(
84
+ () =>
85
+ cn({
86
+ 'gap-[4px] px-sm py-[13px] leading-[8px]': size === 'sm',
87
+ 'gap-[6px] px-md py-sm align-text-bottom leading-[10px]': size === 'md',
88
+ }),
89
+ [size]
90
+ );
91
+
92
+ const iconClasses = cn('absolute group-aria-busy:text-transparent');
93
+
94
+ return (
95
+ <Component
96
+ aria-busy={loading}
97
+ aria-live="polite"
98
+ className={cn(
99
+ 'hui-focus-visible-outline relative flex max-w-full items-center justify-center whitespace-nowrap rounded-button text-center font-primary tracking-[var(--letter-spacing-button)] outline outline-1 -outline-offset-1 transition-colors disabled:text-text-disabled',
100
+ colorClasses,
101
+ sizeClasses,
102
+ className
103
+ )}
104
+ data-testid={dataTestId}
105
+ disabled={disabled && !loading}
106
+ onClick={onClick}
107
+ ref={ref}
108
+ style={{
109
+ fontSize: size === 'sm' ? 'var(--font-size-button-200)' : 'var(--font-size-button-100)',
110
+ fontWeight: 'var(--font-weight-button)',
111
+ textTransform: 'var(--text-transform-button)',
112
+ ...inlineStyles,
113
+ }}
114
+ {...rest}
115
+ >
116
+ {IconLeft && (
117
+ <div
118
+ className="relative flex items-center justify-center"
119
+ style={{ width: `${size === 'md' ? iconSizesToPixels['sm'] : iconSizesToPixels['xs']}px` }}
120
+ >
121
+ <IconLeft
122
+ className={iconClasses}
123
+ size={size === 'md' ? 'sm' : 'xs'}
124
+ style={iconStyle}
125
+ />
126
+ </div>
127
+ )}
128
+
129
+ {children}
130
+ {IconRight && (
131
+ <div
132
+ className="relative flex items-center justify-center"
133
+ style={{ width: `${size === 'md' ? iconSizesToPixels['sm'] : iconSizesToPixels['xs']}px` }}
134
+ >
135
+ <IconRight
136
+ className={iconClasses}
137
+ size={size === 'md' ? 'sm' : 'xs'}
138
+ style={iconStyle}
139
+ />
140
+ </div>
141
+ )}
142
+
143
+ {loading && (
144
+ <LoadingSpinner
145
+ className={cn('absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 transform', {
146
+ 'text-critical-500': variant !== 'filled' && style === 'critical',
147
+ 'text-icon-inverse':
148
+ (variant === 'filled' && style !== 'inverse') ||
149
+ ((variant === 'outlined' || variant === 'transparent') && style === 'inverse'),
150
+ 'text-primary-500':
151
+ (variant !== 'filled' && style === 'primary') ||
152
+ (variant === 'filled' && style === 'inverse'),
153
+ 'text-surface-500': variant !== 'filled' && style === 'neutral',
154
+ })}
155
+ color="inherit"
156
+ size={size === 'md' ? 'sm' : 'xs'}
157
+ />
158
+ )}
159
+ </Component>
160
+ );
161
+ }
162
+ );
163
+
164
+ Button.displayName = 'Button';
@@ -0,0 +1,80 @@
1
+ import type { ComponentProps, ElementType, HTMLProps } from 'react';
2
+
3
+ import type { AnyIcon } from '../Icons/anyIcon';
4
+ import type { IconComponent } from '../Icons/IconBase';
5
+
6
+ export type ButtonStyle = 'primary' | 'critical' | 'neutral' | 'inverse';
7
+ export type ButtonVariant = 'filled' | 'outlined' | 'transparent';
8
+
9
+ export type InlineStyles = {
10
+ inlineStyles?: HTMLProps<HTMLDivElement>['style'];
11
+ };
12
+
13
+ export type Props = {
14
+ as?: ElementType;
15
+ /**
16
+ * Optional test ID for targeting in tests.
17
+ *
18
+ * @default 'Button'
19
+ *
20
+ * Usage:
21
+ * ```tsx
22
+ * <Button dataTestId="submit-form">Submit</Button>
23
+ * ```
24
+ */
25
+ dataTestId?: string;
26
+ /**
27
+ * Optional icon to show alongside the left of the component.
28
+ *
29
+ * Usage:
30
+ * ```tsx
31
+ * <Button iconLeft={HeartStraight} />
32
+ * ```
33
+ */
34
+ iconLeft?: AnyIcon;
35
+ /**
36
+ * Optional icon to show alongside the right of the component.
37
+ *
38
+ * Usage:
39
+ * ```tsx
40
+ * <Button iconRight={HeartStraight} />
41
+ * ```
42
+ */
43
+ iconRight?: AnyIcon;
44
+ /**
45
+ * Optional icon style to show alongside the component.
46
+ *
47
+ * Usage:
48
+ * ```tsx
49
+ * <Button iconStyle="fill" />
50
+ * ```
51
+ */
52
+ iconStyle?: ComponentProps<IconComponent>['style'];
53
+
54
+ /**
55
+ * Optional loading state trigger. Disables button and adds a loading state.
56
+ *
57
+ * @default false
58
+ */
59
+ loading?: boolean;
60
+ /**
61
+ * Button size.
62
+ *
63
+ * @default 'md'
64
+ */
65
+ size?: 'md' | 'sm';
66
+ /**
67
+ * Button style. This matches a color palette in the theme.
68
+ *
69
+ * @default 'primary'
70
+ */
71
+ style?: ButtonStyle;
72
+ type?: 'button' | 'submit' | 'reset';
73
+ /**
74
+ * What kind of button to render. `filled`, `outlined`, or `transparent`.
75
+ *
76
+ * @default 'filled'
77
+ */
78
+ variant?: ButtonVariant;
79
+ } & Omit<HTMLProps<HTMLButtonElement>, 'style' | 'size' | 'as'> &
80
+ InlineStyles;
@@ -0,0 +1,53 @@
1
+ import { cn } from '@evolve.ui/theme-system';
2
+
3
+ /**
4
+ * Color class constants shared between Button and IconButton components.
5
+ * Each constant represents a combination of variant (filled/outlined/transparent) and style (primary/critical/neutral/inverse).
6
+ */
7
+
8
+ export const filledPrimaryClasses = cn(
9
+ 'bg-primary-500 text-text-inverse outline-transparent hover:bg-primary-700 active:bg-primary-900 disabled:cursor-not-allowed disabled:bg-background-disabled aria-busy:cursor-not-allowed aria-busy:bg-primary-500 aria-busy:text-transparent'
10
+ );
11
+
12
+ export const filledCriticalClasses = cn(
13
+ 'bg-critical-500 text-text-inverse outline-transparent hover:bg-critical-700 active:bg-critical-900 disabled:cursor-not-allowed disabled:bg-background-disabled aria-busy:cursor-not-allowed aria-busy:bg-critical-500 aria-busy:text-transparent'
14
+ );
15
+
16
+ export const filledNeutralClasses = cn(
17
+ 'bg-surface-500 text-text-inverse outline-transparent hover:bg-surface-700 active:bg-surface-900 disabled:cursor-not-allowed disabled:bg-background-disabled aria-busy:cursor-not-allowed aria-busy:bg-surface-500 aria-busy:text-transparent'
18
+ );
19
+
20
+ export const filledInverseClasses = cn(
21
+ 'bg-surface-50 text-primary-500 outline-transparent focus:hui-focus-visible-outline-inverse hover:bg-surface-100 active:bg-surface-200 disabled:cursor-not-allowed disabled:bg-background-disabled aria-busy:cursor-not-allowed aria-busy:text-transparent'
22
+ );
23
+
24
+ export const outlinedNeutralClasses = cn(
25
+ 'bg-background-primary text-surface-500 outline outline-1 outline-current hover:bg-surface-100 hover:text-surface-700 active:bg-surface-200 active:text-surface-900 disabled:cursor-not-allowed disabled:bg-background-disabled disabled:outline-border-disabled aria-busy:cursor-not-allowed aria-busy:bg-background-primary aria-busy:text-transparent aria-busy:outline-surface-500'
26
+ );
27
+ export const outlinedPrimaryClasses = cn(
28
+ 'bg-background-primary text-primary-500 outline outline-1 outline-current hover:bg-primary-100 hover:text-primary-700 active:bg-primary-200 active:text-primary-900 disabled:cursor-not-allowed disabled:bg-background-disabled disabled:outline-border-disabled aria-busy:cursor-not-allowed aria-busy:bg-background-primary aria-busy:text-transparent aria-busy:outline-primary-500'
29
+ );
30
+
31
+ export const outlinedCriticalClasses = cn(
32
+ 'bg-background-primary text-critical-500 outline outline-1 outline-current hover:bg-critical-100 hover:text-critical-700 active:bg-critical-200 active:text-critical-900 disabled:cursor-not-allowed disabled:bg-background-disabled disabled:outline-border-disabled aria-busy:cursor-not-allowed aria-busy:bg-background-primary aria-busy:text-transparent aria-busy:outline-critical-500'
33
+ );
34
+
35
+ export const outlinedInverseClasses = cn(
36
+ 'outline-solid bg-transparent text-icon-inverse outline outline-1 outline-surface-50 focus:hui-focus-visible-outline-inverse hover:bg-background-hover-inverse focus:outline-focus-inverse active:bg-background-pressed-inverse disabled:cursor-not-allowed disabled:text-text-disabled disabled:outline-border-disabled aria-busy:cursor-not-allowed aria-busy:text-transparent'
37
+ );
38
+
39
+ export const transparentPrimaryClasses = cn(
40
+ 'bg-transparent text-primary-500 outline-transparent hover:bg-background-hover hover:text-primary-700 active:bg-background-pressed active:text-primary-900 disabled:cursor-not-allowed disabled:bg-transparent aria-busy:cursor-not-allowed aria-busy:bg-background-pressed aria-busy:text-transparent'
41
+ );
42
+
43
+ export const transparentCriticalClasses = cn(
44
+ 'bg-transparent text-critical-500 outline-transparent hover:bg-background-hover hover:text-critical-700 active:bg-background-pressed active:text-critical-900 disabled:cursor-not-allowed disabled:bg-transparent aria-busy:cursor-not-allowed aria-busy:bg-background-pressed aria-busy:text-transparent'
45
+ );
46
+
47
+ export const transparentNeutralClasses = cn(
48
+ 'bg-transparent text-surface-500 outline-transparent hover:bg-background-hover hover:text-surface-700 active:bg-background-pressed active:text-surface-900 disabled:cursor-not-allowed disabled:bg-transparent aria-busy:cursor-not-allowed aria-busy:bg-background-pressed aria-busy:text-transparent'
49
+ );
50
+
51
+ export const transparentInverseClasses = cn(
52
+ 'bg-transparent text-icon-inverse outline-transparent focus:hui-focus-visible-outline-inverse hover:bg-background-hover-inverse active:bg-background-pressed-inverse disabled:cursor-not-allowed disabled:bg-transparent aria-busy:cursor-not-allowed aria-busy:text-transparent'
53
+ );