@opexa/portal-components 0.0.726 → 0.0.728

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 (245) hide show
  1. package/dist/client/hooks/useJackpotsNextQuery.d.ts +3 -0
  2. package/dist/client/hooks/useJackpotsNextQuery.js +22 -0
  3. package/dist/components/DigitainLauncher/Loading.js +1 -1
  4. package/dist/components/Disclaimer/ResponsibleGaming.d.ts +10 -0
  5. package/dist/components/Disclaimer/ResponsibleGaming.js +13 -0
  6. package/dist/components/Disclaimer/TermsOfUse.d.ts +11 -0
  7. package/dist/components/Disclaimer/TermsOfUse.js +13 -0
  8. package/dist/components/FeatureFlag/FeatureFlag.d.ts +1 -0
  9. package/dist/components/FeatureFlag/FeatureFlag.js +29 -0
  10. package/dist/components/FeatureFlag/index.d.ts +1 -0
  11. package/dist/components/FeatureFlag/index.js +1 -0
  12. package/dist/components/Jackpots/Jackpots.js +13 -0
  13. package/dist/components/Jackpots/Jackpots.module.css +219 -184
  14. package/dist/components/Jackpots/JackpotsCarousel/JackpotsCarouselItem.module.css +184 -184
  15. package/dist/components/Jackpots/JackpotsList/JackpotsList.d.ts +16 -0
  16. package/dist/components/Jackpots/JackpotsList/JackpotsList.js +7 -0
  17. package/dist/components/Jackpots/JackpotsList/JackpotsListItem.module.css +184 -184
  18. package/dist/components/Jackpots/JackpotsListNext/JackpotMultiStageDesktop.d.ts +33 -0
  19. package/dist/components/Jackpots/JackpotsListNext/JackpotMultiStageDesktop.js +107 -0
  20. package/dist/components/Jackpots/JackpotsListNext/JackpotMultiStageMobile.d.ts +55 -0
  21. package/dist/components/Jackpots/JackpotsListNext/JackpotMultiStageMobile.js +136 -0
  22. package/dist/components/Jackpots/JackpotsListNext/JackpotsList.d.ts +106 -0
  23. package/dist/components/Jackpots/JackpotsListNext/JackpotsList.js +51 -0
  24. package/dist/components/Jackpots/JackpotsListNext/JackpotsListContext.d.ts +12 -0
  25. package/dist/components/Jackpots/JackpotsListNext/JackpotsListContext.js +3 -0
  26. package/dist/components/Jackpots/JackpotsListNext/JackpotsListItemDesktop.d.ts +43 -0
  27. package/dist/components/Jackpots/JackpotsListNext/JackpotsListItemDesktop.js +117 -0
  28. package/dist/components/Jackpots/JackpotsListNext/JackpotsListItemGameProviders.d.ts +5 -0
  29. package/dist/components/Jackpots/JackpotsListNext/JackpotsListItemGameProviders.js +54 -0
  30. package/dist/components/Jackpots/JackpotsListNext/JackpotsListItemMobile.d.ts +43 -0
  31. package/dist/components/Jackpots/JackpotsListNext/JackpotsListItemMobile.js +147 -0
  32. package/dist/components/Jackpots/JackpotsListNext/JackpotsListItemRules.d.ts +8 -0
  33. package/dist/components/Jackpots/JackpotsListNext/JackpotsListItemRules.js +15 -0
  34. package/dist/components/Jackpots/JackpotsListNext/useJackpotsListItemData.d.ts +20 -0
  35. package/dist/components/Jackpots/JackpotsListNext/useJackpotsListItemData.js +88 -0
  36. package/dist/components/KYC/AutoOpen.d.ts +1 -0
  37. package/dist/components/KYC/AutoOpen.js +40 -0
  38. package/dist/components/KYC/BasicInformation.js +1 -1
  39. package/dist/components/KYC/CaptureIdDocument.d.ts +1 -0
  40. package/dist/components/KYC/CaptureIdDocument.js +219 -0
  41. package/dist/components/KYC/CaptureSelfie.d.ts +1 -0
  42. package/dist/components/KYC/CaptureSelfie.js +285 -0
  43. package/dist/components/KYC/DisplayImage.d.ts +5 -0
  44. package/dist/components/KYC/DisplayImage.js +8 -0
  45. package/dist/components/KYC/FileUpload.d.ts +10 -0
  46. package/dist/components/KYC/FileUpload.js +72 -0
  47. package/dist/components/KYC/IdentityVerification.js +1 -1
  48. package/dist/components/KYC/KYC.lazy.js +1 -1
  49. package/dist/components/KYC/KYCDefault/IdentityVerification.js +9 -7
  50. package/dist/components/KYC/KYCDefault/KYCDefault.js +1 -1
  51. package/dist/components/KYC/KYCDefault/KYCVerificationStatus.lazy.js +2 -2
  52. package/dist/components/KYC/KYCVerificationStatus.lazy.js +13 -7
  53. package/dist/components/KYC/KycOpenOnHomeMount.js +9 -30
  54. package/dist/components/KYC/NoCameraError.d.ts +7 -0
  55. package/dist/components/KYC/NoCameraError.js +6 -0
  56. package/dist/components/KYC/PersonOverlayDesktop.d.ts +7 -0
  57. package/dist/components/KYC/PersonOverlayDesktop.js +9 -0
  58. package/dist/components/KYC/PersonalInformation.js +1 -1
  59. package/dist/components/KYC/backup/Header.d.ts +1 -0
  60. package/dist/components/KYC/backup/Header.js +8 -0
  61. package/dist/components/KYC/backup/Indicator.d.ts +1 -0
  62. package/dist/components/KYC/backup/Indicator.js +9 -0
  63. package/dist/components/KYC/backup/KYC.d.ts +1 -0
  64. package/dist/components/KYC/backup/KYC.js +14 -0
  65. package/dist/components/KYC/backup/KYC.lazy.d.ts +1 -0
  66. package/dist/components/KYC/backup/KYC.lazy.js +26 -0
  67. package/dist/components/KYC/backup/KYCContext.d.ts +6 -0
  68. package/dist/components/KYC/backup/KYCContext.js +2 -0
  69. package/dist/components/KYC/backup/Step1.d.ts +1 -0
  70. package/dist/components/KYC/backup/Step1.js +13 -0
  71. package/dist/components/KYC/backup/Step2.d.ts +1 -0
  72. package/dist/components/KYC/backup/Step2.js +13 -0
  73. package/dist/components/KYC/backup/Step3.d.ts +1 -0
  74. package/dist/components/KYC/backup/Step3.js +13 -0
  75. package/dist/components/KYC/backup/Step4.d.ts +1 -0
  76. package/dist/components/KYC/backup/Step4.js +7 -0
  77. package/dist/components/KYC/backup/useKYC.d.ts +10 -0
  78. package/dist/components/KYC/backup/useKYC.js +8 -0
  79. package/dist/components/KYC/loadModels.d.ts +1 -0
  80. package/dist/components/KYC/loadModels.js +9 -0
  81. package/dist/components/KYC/utils.d.ts +9 -0
  82. package/dist/components/KYC/utils.js +79 -0
  83. package/dist/components/Messages/Message.d.ts +1 -0
  84. package/dist/components/Messages/Message.js +35 -0
  85. package/dist/components/Messages/MessageContext.d.ts +6 -0
  86. package/dist/components/Messages/MessageContext.js +2 -0
  87. package/dist/components/Messages/MessagePopup.d.ts +1 -0
  88. package/dist/components/Messages/MessagePopup.js +20 -0
  89. package/dist/components/Messages/MessageTrigger.d.ts +8 -0
  90. package/dist/components/Messages/MessageTrigger.js +19 -0
  91. package/dist/components/Quests/CountdownTimer.d.ts +15 -0
  92. package/dist/components/Quests/CountdownTimer.js +33 -0
  93. package/dist/components/Quests/DailyCheckInQuest/DailyCheckInQuest.d.ts +4 -0
  94. package/dist/components/Quests/DailyCheckInQuest/DailyCheckInQuest.js +78 -0
  95. package/dist/components/Quests/DailyCheckInQuest/DailyCheckInQuestModal.d.ts +8 -0
  96. package/dist/components/Quests/DailyCheckInQuest/DailyCheckInQuestModal.js +9 -0
  97. package/dist/components/Quests/OnboardingQuest/OnboardingQuest.d.ts +4 -0
  98. package/dist/components/Quests/OnboardingQuest/OnboardingQuest.js +4 -0
  99. package/dist/components/Quests/WageringQuest/WageringQuest.d.ts +4 -0
  100. package/dist/components/Quests/WageringQuest/WageringQuest.js +20 -0
  101. package/dist/components/Quests/WageringQuest/WageringQuestModal.d.ts +9 -0
  102. package/dist/components/Quests/WageringQuest/WageringQuestModal.js +9 -0
  103. package/dist/components/SignIn/utils.d.ts +8 -0
  104. package/dist/components/SignIn/utils.js +26 -0
  105. package/dist/components/SignUp/SignUp.lazy.d.ts +12 -0
  106. package/dist/components/SignUp/SignUp.lazy.js +18 -0
  107. package/dist/components/SignUp/SignUpContext.d.ts +6 -0
  108. package/dist/components/SignUp/SignUpContext.js +2 -0
  109. package/dist/components/SignUp/SignUpDefault/SignUp.lazy.d.ts +17 -0
  110. package/dist/components/SignUp/SignUpDefault/SignUp.lazy.js +18 -0
  111. package/dist/components/SignUp/SignUpDefault/SignUpContext.d.ts +6 -0
  112. package/dist/components/SignUp/SignUpDefault/SignUpContext.js +2 -0
  113. package/dist/components/SignUp/SignUpDefault/SignUpForm.d.ts +1 -0
  114. package/dist/components/SignUp/SignUpDefault/SignUpForm.js +310 -0
  115. package/dist/components/SignUp/SignUpForm.d.ts +1 -0
  116. package/dist/components/SignUp/SignUpForm.js +284 -0
  117. package/dist/components/SignUp/SignUpKYC/CaptureIdDocument.d.ts +1 -0
  118. package/dist/components/SignUp/SignUpKYC/CaptureIdDocument.js +198 -0
  119. package/dist/components/SignUp/SignUpKYC/CaptureSelfie.d.ts +1 -0
  120. package/dist/components/SignUp/SignUpKYC/CaptureSelfie.js +251 -0
  121. package/dist/components/SignUp/SignUpKYC/ImageUploader.d.ts +10 -0
  122. package/dist/components/SignUp/SignUpKYC/ImageUploader.js +42 -0
  123. package/dist/components/SignUp/SignUpKYC/PersonOverlayDesktop.d.ts +7 -0
  124. package/dist/components/SignUp/SignUpKYC/PersonOverlayDesktop.js +9 -0
  125. package/dist/components/SignUp/SignUpKYC/SignUpFormKYC.d.ts +1 -0
  126. package/dist/components/SignUp/SignUpKYC/SignUpFormKYC.js +464 -0
  127. package/dist/components/SignUp/SignUpKYC/useImageUploader.d.ts +11 -0
  128. package/dist/components/SignUp/SignUpKYC/useImageUploader.js +20 -0
  129. package/dist/components/SignUp/SignUpKYC/utils.d.ts +9 -0
  130. package/dist/components/SignUp/SignUpKYC/utils.js +79 -0
  131. package/dist/components/SignUp/SignUpPagcor/CaptureIdDocument.d.ts +1 -0
  132. package/dist/components/SignUp/SignUpPagcor/CaptureIdDocument.js +198 -0
  133. package/dist/components/SignUp/SignUpPagcor/CaptureSelfie.d.ts +1 -0
  134. package/dist/components/SignUp/SignUpPagcor/CaptureSelfie.js +251 -0
  135. package/dist/components/SignUp/SignUpPagcor/ImageUploader.d.ts +10 -0
  136. package/dist/components/SignUp/SignUpPagcor/ImageUploader.js +41 -0
  137. package/dist/components/SignUp/SignUpPagcor/SignUpFormPagcor.d.ts +1 -0
  138. package/dist/components/SignUp/SignUpPagcor/SignUpFormPagcor.js +429 -0
  139. package/dist/components/SignUp/SignUpPagcor/SignUpPagcor.lazy.d.ts +13 -0
  140. package/dist/components/SignUp/SignUpPagcor/SignUpPagcor.lazy.js +26 -0
  141. package/dist/components/SignUp/SignUpPagcor/SignUpPagcorContext.d.ts +7 -0
  142. package/dist/components/SignUp/SignUpPagcor/SignUpPagcorContext.js +2 -0
  143. package/dist/components/SignUp/SignUpPagcor/useImageUploader.d.ts +11 -0
  144. package/dist/components/SignUp/SignUpPagcor/useImageUploader.js +20 -0
  145. package/dist/components/Tournaments/TournamentsCarousel/TournamentsCarouselItem.module.css +184 -184
  146. package/dist/components/Tournaments/TournamentsList/TournamentItem.module.css +184 -184
  147. package/dist/components/shared/IdDocumentField.client.d.ts +25 -0
  148. package/dist/components/shared/IdDocumentField.client.js +204 -0
  149. package/dist/components/shared/IdDocumentField.d.ts +2 -0
  150. package/dist/components/shared/IdDocumentField.js +11 -0
  151. package/dist/components/shared/IdFrontImageField/IdFrontImageField.client.js +0 -1
  152. package/dist/components/shared/SelfieField.client.d.ts +20 -0
  153. package/dist/components/shared/SelfieField.client.js +327 -0
  154. package/dist/components/shared/SelfieField.d.ts +2 -0
  155. package/dist/components/shared/SelfieField.js +11 -0
  156. package/dist/constants/BranchCode.d.ts +4 -0
  157. package/dist/constants/BranchCode.js +42 -0
  158. package/dist/constants/Branches.d.ts +2 -0
  159. package/dist/constants/Branches.js +42 -0
  160. package/dist/constants/EnvVar.d.ts +1 -1
  161. package/dist/handlers/postTransformIdFrontImage.d.ts +3 -0
  162. package/dist/handlers/postTransformIdFrontImage.js +67 -0
  163. package/dist/handlers/postTransformSelfieImage.d.ts +3 -0
  164. package/dist/handlers/postTransformSelfieImage.js +71 -0
  165. package/dist/handlers.d.ts +43 -0
  166. package/dist/handlers.js +297 -0
  167. package/dist/icons/BellRingIcon.d.ts +2 -0
  168. package/dist/icons/BellRingIcon.js +4 -0
  169. package/dist/icons/Flag05Icon.d.ts +2 -0
  170. package/dist/icons/Flag05Icon.js +4 -0
  171. package/dist/server/utils/prefetchJackpotsNextQuery.d.ts +2 -0
  172. package/dist/server/utils/prefetchJackpotsNextQuery.js +16 -0
  173. package/dist/services/queries.d.ts +2 -1
  174. package/dist/services/queries.js +3069 -3009
  175. package/dist/services/report.d.ts +21 -1
  176. package/dist/services/report.js +13 -1
  177. package/dist/styles/theme.css +773 -773
  178. package/dist/third-parties/FacebookPixel/FacebookPixel.d.ts +4 -0
  179. package/dist/third-parties/FacebookPixel/FacebookPixel.js +4 -0
  180. package/dist/third-parties/FacebookPixel/api.d.ts +0 -0
  181. package/dist/third-parties/FacebookPixel/api.js +1 -0
  182. package/dist/third-parties/FacebookPixel/index.d.ts +1 -0
  183. package/dist/third-parties/FacebookPixel/index.js +1 -0
  184. package/dist/third-parties/GoogleRecaptcha/GoogleRecaptcha.d.ts +4 -0
  185. package/dist/third-parties/GoogleRecaptcha/GoogleRecaptcha.js +4 -0
  186. package/dist/third-parties/GoogleRecaptcha/api.d.ts +0 -0
  187. package/dist/third-parties/GoogleRecaptcha/api.js +1 -0
  188. package/dist/third-parties/GoogleRecaptcha/index.d.ts +1 -0
  189. package/dist/third-parties/GoogleRecaptcha/index.js +1 -0
  190. package/dist/third-parties/index.d.ts +2 -0
  191. package/dist/third-parties/index.js +2 -0
  192. package/dist/types/index.d.ts +33 -0
  193. package/dist/ui/Badge/Badge.d.ts +12 -12
  194. package/dist/ui/Badge/badge.anatomy.d.ts +1 -1
  195. package/dist/ui/Badge/badge.recipe.d.ts +3 -3
  196. package/dist/ui/Carousel/Carousel.d.ts +72 -72
  197. package/dist/ui/Carousel/carousel.recipe.d.ts +8 -8
  198. package/dist/ui/Checkbox/Checkbox.d.ts +23 -23
  199. package/dist/ui/Checkbox/checkbox.recipe.d.ts +3 -3
  200. package/dist/ui/Clipboard/Clipboard.d.ts +18 -18
  201. package/dist/ui/Clipboard/clipboard.recipe.d.ts +3 -3
  202. package/dist/ui/Collapsible/Collapsible.d.ts +20 -20
  203. package/dist/ui/Collapsible/collapsible.recipe.d.ts +5 -5
  204. package/dist/ui/Combobox/Combobox.d.ts +42 -42
  205. package/dist/ui/Combobox/combobox.recipe.d.ts +3 -3
  206. package/dist/ui/DatePicker/DatePicker.d.ts +72 -72
  207. package/dist/ui/DatePicker/datePicker.recipe.d.ts +3 -3
  208. package/dist/ui/Menu/Menu.d.ts +198 -198
  209. package/dist/ui/Menu/menu.recipe.d.ts +11 -11
  210. package/dist/ui/PasswordInput/PasswordInput.d.ts +18 -18
  211. package/dist/ui/PasswordInput/passwordInput.recipe.d.ts +3 -3
  212. package/dist/ui/Popover/Popover.d.ts +55 -55
  213. package/dist/ui/Popover/popover.recipe.d.ts +5 -5
  214. package/dist/ui/Progress/Progress.d.ts +27 -27
  215. package/dist/ui/Progress/progress.recipe.d.ts +3 -3
  216. package/dist/ui/QrCode/QrCode.d.ts +25 -25
  217. package/dist/ui/QrCode/qrCode.recipe.d.ts +5 -5
  218. package/dist/ui/SegmentGroup/SegmentGroup.d.ts +18 -18
  219. package/dist/ui/SegmentGroup/segmentGroup.recipe.d.ts +3 -3
  220. package/dist/ui/Select/Select.d.ts +45 -45
  221. package/dist/ui/Select/select.recipe.d.ts +3 -3
  222. package/dist/ui/Table/Table.d.ts +21 -21
  223. package/dist/ui/Table/table.anatomy.d.ts +1 -1
  224. package/dist/ui/Table/table.recipe.d.ts +3 -3
  225. package/dist/ui/Tabs/Tabs.d.ts +15 -15
  226. package/dist/ui/Tabs/tabs.recipe.d.ts +3 -3
  227. package/dist/utils/dataUrlToBlob.d.ts +1 -0
  228. package/dist/utils/dataUrlToBlob.js +11 -0
  229. package/dist/utils/gamesAvailable3pmTo3am.d.ts +1 -0
  230. package/dist/utils/gamesAvailable3pmTo3am.js +1 -0
  231. package/dist/utils/getGameName.d.ts +1 -0
  232. package/dist/utils/getGameName.js +6 -0
  233. package/dist/utils/isBetween3amAnd3pm.d.ts +1 -0
  234. package/dist/utils/isBetween3amAnd3pm.js +5 -0
  235. package/dist/utils/queryKeys.d.ts +1 -0
  236. package/dist/utils/queryKeys.js +1 -0
  237. package/dist/utils/resizeImageSize.d.ts +2 -0
  238. package/dist/utils/resizeImageSize.js +11 -0
  239. package/package.json +176 -176
  240. package/dist/components/AccountInfo/GoogleDisconnect.d.ts +0 -7
  241. package/dist/components/AccountInfo/GoogleDisconnect.js +0 -11
  242. package/dist/components/DepositWithdrawal/Deposit/GCashWebpayDeposit /GCashWebpayDeposit .d.ts +0 -1
  243. package/dist/components/DepositWithdrawal/Deposit/GCashWebpayDeposit /GCashWebpayDeposit .js +0 -191
  244. package/dist/icons/LinkBrokenIcon.d.ts +0 -2
  245. package/dist/icons/LinkBrokenIcon.js +0 -4
@@ -0,0 +1,136 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { Progress } from '@ark-ui/react/progress';
3
+ import { format } from 'date-fns';
4
+ import Image, {} from 'next/image';
5
+ import { useCallback, useEffect, useId, useState, } from 'react';
6
+ import { twMerge } from 'tailwind-merge';
7
+ import { ArrowNarrowDownIcon } from '../../../icons/ArrowNarrowDownIcon.js';
8
+ import { ArrowNarrowUpIcon } from '../../../icons/ArrowNarrowUpIcon.js';
9
+ import { ArrowNarrowUpRightIcon } from '../../../icons/ArrowNarrowUpRightIcon.js';
10
+ import { CheckCircleBrokenIcon } from '../../../icons/CheckCircleBrokenIcon.js';
11
+ import { Flag05Icon } from '../../../icons/Flag05Icon.js';
12
+ import { StarIcon } from '../../../icons/StarIcon.js';
13
+ import { Target04Icon } from '../../../icons/Target04Icon.js';
14
+ import { Trophy01Icon } from '../../../icons/Trophy01Icon.js';
15
+ import { User01Icon } from '../../../icons/User01Icon.js';
16
+ import firstPlace from '../../../images/first-place.png';
17
+ import leaderboard from '../../../images/leaderboard.png';
18
+ import { Button } from '../../../ui/Button/index.js';
19
+ import { formatNumber } from '../../../utils/formatNumber.js';
20
+ import { mask } from '../../../utils/mask.js';
21
+ import { parseDecimal } from '../../../utils/parseDecimal.js';
22
+ import styles from '../Jackpots.module.css';
23
+ import { useJackpotsListItemContext } from './JackpotsListContext.js';
24
+ import { JackpotsListItemGameProviders } from './JackpotsListItemGameProviders.js';
25
+ import { JackpotsListItemRules } from './JackpotsListItemRules.js';
26
+ import { useJackpotsListItemData } from './useJackpotsListItemData.js';
27
+ function getPercentage(value, total) {
28
+ const v = parseDecimal(value, 0);
29
+ const t = parseDecimal(total, 0);
30
+ return t === 0 ? 0 : (v / t) * 100;
31
+ }
32
+ export function JackpotMultiStageMobile({ animate = true, customJackpotChestImage, jackpotProfileShape = 'oval', customJackpotStageChest, chestImagesByTier, className, ...props }) {
33
+ const jackpot = useJackpotsListItemContext();
34
+ const { rootRef, jackpotPayouts, topJackpotPayout, filteredGameProviders, localeInfo, isPayingOut, jackpotAmount, arrowImages, } = useJackpotsListItemData();
35
+ const getChestImages = (stage) => {
36
+ if (stage === 1) {
37
+ return {
38
+ image: customJackpotStageChest?.stage.one,
39
+ style: customJackpotStageChest?.style,
40
+ };
41
+ }
42
+ if (stage === 2) {
43
+ return {
44
+ image: customJackpotStageChest?.stage.two,
45
+ style: customJackpotStageChest?.style,
46
+ };
47
+ }
48
+ if (stage === 3) {
49
+ return {
50
+ image: customJackpotStageChest?.stage.three,
51
+ style: customJackpotStageChest?.style,
52
+ };
53
+ }
54
+ return {
55
+ image: customJackpotStageChest?.stage.four,
56
+ style: customJackpotStageChest?.style,
57
+ };
58
+ };
59
+ const chestImages = getChestImages(jackpot.stage ?? 1);
60
+ const [isDetailsVisible, setIsDetailsVisible] = useState(false);
61
+ const [mainTooltipOpen, setMainTooltipOpen] = useState(false);
62
+ const [minLimitTooltipOpen, setMinLimitTooltipOpen] = useState(false);
63
+ const mainTooltipId = useId();
64
+ const minLimitTooltipId = useId();
65
+ const handleMainTooltipClick = useCallback((e) => {
66
+ e.stopPropagation();
67
+ setMainTooltipOpen((prev) => !prev);
68
+ }, []);
69
+ const handleMinLimitTooltipClick = useCallback((e) => {
70
+ e.stopPropagation();
71
+ setMinLimitTooltipOpen((prev) => !prev);
72
+ }, []);
73
+ useEffect(() => {
74
+ if (mainTooltipOpen) {
75
+ const timeout = setTimeout(() => setMainTooltipOpen(false), 3000);
76
+ return () => clearTimeout(timeout);
77
+ }
78
+ }, [mainTooltipOpen]);
79
+ useEffect(() => {
80
+ if (minLimitTooltipOpen) {
81
+ const timeout = setTimeout(() => setMinLimitTooltipOpen(false), 3000);
82
+ return () => clearTimeout(timeout);
83
+ }
84
+ }, [minLimitTooltipOpen]);
85
+ const target = parseFloat(jackpot.stages?.[jackpot.stage]?.targetTurnover ?? '0');
86
+ const total = parseFloat(jackpot.totalTurnover ?? '0');
87
+ const currStageProgressPercentage = getPercentage(total, target);
88
+ const totalTurnover = jackpot.totalTurnover;
89
+ const overallTurnover = parseDecimal(jackpot.totalTurnover, 0) /
90
+ (jackpot.stages?.reduce((acc, stage) => acc + parseFloat(stage.targetTurnover ?? '0'), 0) ?? 0);
91
+ const overallPercentage = getPercentage(totalTurnover, overallTurnover);
92
+ const ProfileIcon = () => jackpotProfileShape === 'oval' ? (_jsxs("div", { className: "relative flex h-18 w-18 items-center justify-center rounded-full bg-bg-tertiary", children: [_jsx(User01Icon, { className: "size-9 text-text-quarterary-500" }), _jsx("div", { className: twMerge('absolute right-0 bottom-safe-area-inset-bottom flex h-6 w-6 items-center justify-center rounded-full border-[1.5px] border-bg-primary bg-yellow-400 font-bold text-brand-950 text-xs', className?.latestPayoutRankRoot), children: "1st" })] })) : (_jsxs("div", { className: "relative grid h-18 w-18", children: [_jsx(StarIcon, { className: "col-start-1 row-start-1 h-full w-full" }), _jsx(User01Icon, { className: "z-10 col-start-1 row-start-1 size-9 place-self-center text-text-quarterary-500" }), _jsx("div", { className: twMerge('-right-0 absolute bottom-safe-area-inset-bottom z-20 flex h-7 w-7 items-center justify-center rounded-full border-[1.5px] border-bg-primary bg-yellow-400 text-center font-bold text-brand-950 text-xs', className?.latestPayoutRankRoot), children: "1st" })] }));
93
+ const PayoutBadge = () => (_jsxs("div", { className: twMerge('flex h-fit w-fit items-center gap-1 rounded-sm border border-utility-brand-200 bg-utility-brand-50 px-2 py-0.5 font-medium text-utility-brand-700 text-xs', className?.latestPayoutBadgeRoot), children: [_jsx(Trophy01Icon, { className: twMerge('size-3.5 text-utility-brand-600', className?.latestPayoutBadgeIcon) }), "Winner"] }));
94
+ const ProgressBar = () => (_jsxs("div", { className: "flex w-full flex-col items-center justify-between", children: [_jsxs("div", { className: "mb-[5px] flex w-full items-center justify-between", children: [_jsxs("div", { className: "font-semibold text-text-primary-900 text-xs", children: ["Stage ", jackpot.stage, " Progress"] }), currStageProgressPercentage, "%"] }), _jsx(Progress.Root, { className: "h-2 w-full rounded-full bg-bg-primary", max: 100, value: currStageProgressPercentage, "aria-valuemax": 100, "aria-label": "Stage progress", children: _jsx(Progress.Track, { className: twMerge('h-full overflow-hidden rounded-full bg-bg-primary', className?.progressBarTrack), children: _jsx(Progress.Range, { className: "relative h-full overflow-hidden rounded-full bg-brand-500 pl-1.5", children: _jsx("div", { className: "pointer-events-none absolute inset-0 flex items-center justify-start pl-1.5", "aria-hidden": "true", children: arrowImages }) }) }) })] }));
95
+ const OverallProgressBar = () => {
96
+ return (_jsxs("div", { className: "mt-3 mb-[1rem] px-[0.75rem] lg:mt-4", children: [_jsxs("div", { className: "mb-[5px] flex items-center justify-between font-semibold text-text-primary-900 text-xs", children: [_jsx("p", { children: "Overall Progress" }), overallPercentage, "%"] }), _jsx(Progress.Root, { className: "h-2 w-full rounded-full bg-bg-primary lg:h-4", max: 100, value: overallPercentage, children: _jsx(Progress.Track, { className: twMerge('h-full overflow-hidden rounded-full bg-bg-primary', className?.progressBarTrack), children: _jsx(Progress.Range, { className: "relative h-full overflow-hidden rounded-full bg-brand-500 pl-1.5", children: _jsx("div", { className: "pointer-events-none absolute inset-0 flex items-center justify-start pl-1.5", "aria-hidden": "true", children: arrowImages }) }) }) })] }));
97
+ };
98
+ const RecentPayoutsTable = () => (_jsx("div", { className: "overflow-x-auto border-gray-200", children: _jsxs("table", { className: "w-full min-w-[37.5rem]", children: [_jsx("thead", { children: _jsx("tr", { className: twMerge('h-8 whitespace-nowrap bg-bg-secondary text-left font-medium text-text-tertiary-600 text-xs', className?.recentPayoutsTableHeadRow), children: ['Stage', 'Player', 'Target Turnover', 'Prize', 'Timestamp'].map((header) => (_jsx("th", { className: "px-4", children: header }, header))) }) }), _jsx("tbody", { children: jackpot.stages
99
+ ? jackpot.stages.map((j, i) => (_jsxs("tr", { className: twMerge('whitespace-nowrap bg-bg-primary text-left text-sm text-text-secondary-700', className?.recentPayoutsTableBodyRow), children: [_jsx("td", { className: twMerge('h-12 border-border-secondary border-t-2 px-4', className?.recentPayoutsTableBodyData), children: i + 1 }), _jsx("td", { className: twMerge('h-12 border-border-secondary border-t-2 px-4', className?.recentPayoutsTableBodyData), children: j.member?.name
100
+ ? mask(j.member.name, {
101
+ totalCharsCount: 6,
102
+ })
103
+ : '-' }), _jsx("td", { className: twMerge('h-12 border-border-secondary border-t-2 px-4', className?.recentPayoutsTableBodyData), children: formatNumber(j.targetTurnover, {
104
+ currency: localeInfo.currency.code,
105
+ minDecimalPlaces: 2,
106
+ maxDecimalPlaces: 2,
107
+ }) }), _jsx("td", { className: twMerge('h-12 border-border-secondary border-t-2 px-4 text-brand-400', className?.recentPayoutsTableBodyData), children: formatNumber(j.jackpotPayout, {
108
+ currency: localeInfo.currency.code,
109
+ minDecimalPlaces: 2,
110
+ maxDecimalPlaces: 2,
111
+ }) }), _jsx("td", { className: twMerge('h-12 border-border-secondary border-t-2 px-4', className?.recentPayoutsTableBodyData), children: j.dateTimeCompleted
112
+ ? format(new Date(j.dateTimeCompleted), 'dd MMM yyyy h:mm a')
113
+ : '-' })] }, i)))
114
+ : Array.from({ length: 10 }).map((_, i) => (_jsx("tr", { className: twMerge('bg-bg-primary text-left text-sm text-text-secondary-700', className?.recentPayoutsTableBodyRow), children: Array.from({ length: 5 }).map((_, j) => (_jsx("td", { className: twMerge('h-12 border-border-secondary border-t-2 px-4', className?.recentPayoutsTableBodyData), children: "-" }, j))) }, i))) })] }) }));
115
+ if (jackpot.status === 'DISABLED' && jackpot.drawing !== true) {
116
+ return null;
117
+ }
118
+ return (_jsxs("div", { ref: rootRef, className: twMerge('rounded-2xl border border-border-primary bg-bg-primary', className?.itemRoot), children: [_jsxs("div", { style: props.style, className: twMerge('relative flex shrink-0 rounded-2xl bg-bg-tertiary p-3 text-center lg:gap-4 lg:p-5', window.location.href.includes('blucky') &&
119
+ styles['animate-multi-stage-gradient-blucky']), children: [_jsxs("div", { className: "relative z-1 flex flex-1 flex-col", children: [_jsx("div", { className: "flex h-full flex-col justify-between", children: _jsx("div", { className: "flex w-full justify-between", children: _jsx("div", { className: "flex w-full flex-col", children: _jsxs("div", { className: "relative flex w-full items-center justify-between", children: [_jsxs("div", { className: "w-full", children: [_jsxs("div", { className: "flex gap-2.5", children: [_jsxs("div", { className: twMerge('flex w-fit items-center gap-1 rounded-full border border-[#3F100B] bg-[#CDA95B] px-2 py-0.5 font-medium text-[#1D0201] text-xs', className?.jackpotBadgeRoot), children: [_jsx(Flag05Icon, { className: "size-3.5 text-[inherit]" }), "Stage ", jackpot.stage] }), overallPercentage < 100 ? (_jsxs("div", { className: "flex w-fit items-center gap-1 rounded-full border border-utility-blue-200 bg-utility-blue-50 px-2 py-0.5 font-medium text-utility-blue-700 text-xs", children: [_jsx(ArrowNarrowUpRightIcon, { className: "size-3.5 text-utility-blue-500" }), "In Progress"] })) : (_jsxs("div", { className: "flex w-fit items-center gap-1 rounded-full border border-utility-success-200 bg-utility-success-50 px-2 py-0.5 font-medium text-utility-success-700 text-xs", children: [_jsx(CheckCircleBrokenIcon, { className: "size-3.5 text-utility-success-500" }), "Completed"] }))] }), _jsx("div", { className: "mt-1 text-left font-medium text-lg text-text-primary-900 lg:mt-5 lg:text-2xl", children: jackpot.name }), _jsx("div", { className: twMerge('mt-1.5 w-fit rounded-md bg-bg-primary px-2 py-1 font-bold text-2xl text-brand-400 lg:mt-2 lg:text-4xl', className?.jackpotAmountRoot), children: formatNumber(jackpotAmount, {
120
+ currency: localeInfo.currency.code,
121
+ minDecimalPlaces: 2,
122
+ maxDecimalPlaces: 2,
123
+ }) }), _jsxs("div", { className: twMerge('mt-[15px] mb-[10px] flex w-fit items-center gap-1 rounded-full border border-[#932F19] bg-[#511C10] py-[0.125rem] pr-[0.5rem] pl-[0.375rem] text-[#F7B27A] text-xs', className?.jackpotTurnoverRoot), children: [_jsx(Target04Icon, { className: twMerge('size-3.5 text-[#EF6820]', className?.jackpotTurnoverIcon) }), _jsxs("p", { children: ["Turnover Target:", ' ', formatNumber(jackpot.stages?.[jackpot.stage]?.targetTurnover, {
124
+ currency: localeInfo.currency.code,
125
+ minDecimalPlaces: 2,
126
+ maxDecimalPlaces: 2,
127
+ })] })] }), _jsx(ProgressBar, {})] }), chestImages?.image && (_jsx("div", { className: twMerge('right-0 bottom-[-60] z-1 block min-w-34.5 lg:absolute', chestImages?.style?.wrapper), children: _jsx(Image, { width: 100, height: 100, src: chestImages?.image, alt: "chest", className: twMerge('size-full h-34.5 w-34.5 p-2 lg:h-37.5 lg:w-37.5', chestImages?.style?.image) }) }))] }) }) }) }), _jsx("div", { className: twMerge('relative mt-4 flex w-full gap-4 rounded-lg bg-bg-primary p-4', className?.latestPayoutRoot), children: topJackpotPayout?.amount ? (_jsxs(_Fragment, { children: [_jsx(ProfileIcon, {}), _jsxs("div", { className: "flex flex-col gap-1 text-left", children: [_jsx(PayoutBadge, {}), _jsx("div", { className: "font-semibold", children: mask(topJackpotPayout.member.name, {
128
+ totalCharsCount: 6,
129
+ }) }), _jsx("div", { className: twMerge('text-2xl text-brand-400', className?.latestPayoutAmount), children: formatNumber(topJackpotPayout.amount, {
130
+ currency: localeInfo.currency.code,
131
+ minDecimalPlaces: 2,
132
+ maxDecimalPlaces: 2,
133
+ }) })] })] })) : (_jsxs(_Fragment, { children: [_jsx(Image, { width: 66, height: 87, src: firstPlace, alt: "closeChest", className: "size-full h-auto w-[4.125rem] mix-blend-luminosity" }), _jsxs("div", { className: "flex flex-col gap-1 text-left", children: [_jsx(PayoutBadge, {}), _jsx("div", { className: "font-semibold", children: "No winners yet" }), _jsx("div", { className: "text-text-secondary-700 text-xs", children: "You could be the first to win the jackpot!" })] })] })) }), _jsx(Button, { variant: "outline", className: twMerge('mt-5.5 px-3.5 py-2.5 text-sm', isDetailsVisible ? 'hidden' : 'flex'), onClick: () => setIsDetailsVisible(!isDetailsVisible), children: _jsxs("div", { className: "flex gap-1.5", children: ["See Details", _jsx(ArrowNarrowDownIcon, { className: "size-5" })] }) })] }), isPayingOut && animate && (_jsx("div", { className: twMerge(styles['light-rays'], 'absolute top-safe-area-inset-top right-0 rounded-2xl [--light-rays-top:15%] lg:[--light-rays-top:9.375rem]') }))] }), isDetailsVisible && (_jsxs("div", { children: [_jsxs("div", { className: "z-1 flex-1", children: [_jsxs("div", { className: "flex items-center justify-between p-3", children: [_jsxs("div", { className: "flex gap-2", children: [_jsx(Image, { width: 24, height: 24, src: leaderboard, alt: "leaderboardIcon", className: "size-full h-auto w-6" }), _jsx("div", { className: twMerge('font-semibold text-lg text-text-primary-900', className?.recentPayoutsHeading), children: "Stages" })] }), _jsx(JackpotsListItemRules, { className: {
134
+ button: className?.recentPayoutsJackpotRulesButton,
135
+ } })] }), _jsx(OverallProgressBar, {}), _jsx(RecentPayoutsTable, {})] }), Boolean(filteredGameProviders.length) && (_jsx(JackpotsListItemGameProviders, { gameProviders: filteredGameProviders })), _jsx("div", { className: "m-3", children: _jsx(Button, { variant: "outline", className: twMerge('px-3.5 py-2.5 text-sm', !isDetailsVisible ? 'hidden' : 'flex'), onClick: () => setIsDetailsVisible(!isDetailsVisible), children: _jsxs("div", { className: "flex gap-1.5", children: ["Hide", _jsx(ArrowNarrowUpIcon, { className: "size-5" })] }) }) })] }))] }));
136
+ }
@@ -0,0 +1,106 @@
1
+ import { type ImageProps } from 'next/image';
2
+ import type { CSSProperties, ReactNode } from 'react';
3
+ import type { GameProvider, GameProviderData } from '../../../types';
4
+ export interface ClassNameEntries {
5
+ root?: string;
6
+ itemRoot?: string;
7
+ providerRoot?: string;
8
+ providerHeading?: string;
9
+ providerNavigationButton?: string;
10
+ providerThumbnailRoot?: string;
11
+ providerThumbnailImage?: string;
12
+ jackpotAmountRoot?: string;
13
+ jackpotTurnoverRoot?: string;
14
+ jackpotTurnoverIcon?: string;
15
+ jackpotBadgeRoot?: string;
16
+ latestPayoutRoot?: string;
17
+ latestPayoutBadgeRoot?: string;
18
+ latestPayoutBadgeIcon?: string;
19
+ latestPayoutAmount?: string;
20
+ latestPayoutRankRoot?: string;
21
+ progressBarRoot?: string;
22
+ progressBarTrack?: string;
23
+ recentPayoutsRoot?: string;
24
+ recentPayoutsTableRoot?: string;
25
+ recentPayoutsTableHeadRow?: string;
26
+ recentPayoutsTableBodyRow?: string;
27
+ recentPayoutsTableBodyData?: string;
28
+ recentPayoutsHeading?: string;
29
+ recentPayoutsJackpotRulesButton?: string;
30
+ }
31
+ interface StyleEntries {
32
+ root?: CSSProperties;
33
+ itemRoot?: CSSProperties;
34
+ multiStageItemRoot?: CSSProperties;
35
+ }
36
+ export interface JackpotsListProps {
37
+ layout: 'list';
38
+ /** @default "Jackpots" */
39
+ heading?: string | ReactNode;
40
+ className?: string | ClassNameEntries;
41
+ style?: CSSProperties | StyleEntries;
42
+ gameProviders?: Partial<Record<GameProvider, {
43
+ redirectUrl: string;
44
+ image?: ImageProps['src'];
45
+ }>>;
46
+ gameProviderImages?: Partial<Record<GameProvider, ImageProps['src']>>;
47
+ /**
48
+ * @default '/providers/<slug>'
49
+ * @example
50
+ * ```ts
51
+ * '/bingo/:slug' // '/bingo/jili'
52
+ * '/bingo/:id' // '/bingo/JILI'
53
+ * // or using a function
54
+ * ({slug}) => `/bingo/${slug}`
55
+ * ```
56
+ */
57
+ viewGamesUrl?: string | ((gameProvider: GameProviderData) => string);
58
+ animate?: boolean;
59
+ customJackpotChestImage?: {
60
+ image: {
61
+ open: string;
62
+ closed: string;
63
+ };
64
+ style?: {
65
+ wrapper?: string;
66
+ image?: string;
67
+ };
68
+ };
69
+ customJackpotStageChest?: {
70
+ style?: {
71
+ wrapper?: string;
72
+ image?: string;
73
+ };
74
+ stage: {
75
+ one: ImageProps['src'];
76
+ two: ImageProps['src'];
77
+ three: ImageProps['src'];
78
+ four: ImageProps['src'];
79
+ };
80
+ };
81
+ jackpotProfileShape?: 'oval' | 'star';
82
+ chestImagesByTier?: {
83
+ grand?: {
84
+ open: ImageProps['src'];
85
+ closed: ImageProps['src'];
86
+ };
87
+ major?: {
88
+ open: ImageProps['src'];
89
+ closed: ImageProps['src'];
90
+ };
91
+ minor?: {
92
+ open: ImageProps['src'];
93
+ closed: ImageProps['src'];
94
+ };
95
+ default?: {
96
+ open: ImageProps['src'];
97
+ closed: ImageProps['src'];
98
+ };
99
+ style?: {
100
+ wrapper?: string;
101
+ image?: string;
102
+ };
103
+ };
104
+ }
105
+ export declare function JackpotsListNext(props: JackpotsListProps): import("react/jsx-runtime").JSX.Element;
106
+ export {};
@@ -0,0 +1,51 @@
1
+ 'use client';
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { isString } from 'lodash-es';
4
+ import Image, {} from 'next/image';
5
+ import { useIntersectionObserver } from 'usehooks-ts';
6
+ import { useJackpotsNextQuery } from '../../../client/hooks/useJackpotsNextQuery.js';
7
+ import closeChest from '../../../images/close-chest.png';
8
+ import { isStyleEntries } from '../../../utils/isStyleEntries.js';
9
+ import { JackpotMultiStageDesktop } from './JackpotMultiStageDesktop.js';
10
+ import { JackpotMultiStageMobile } from './JackpotMultiStageMobile.js';
11
+ import { JackpotsListItemContext, JackpotsListPropsContext, } from './JackpotsListContext.js';
12
+ import { JackpotsListItemDesktop } from './JackpotsListItemDesktop.js';
13
+ import { JackpotsListItemMobile } from './JackpotsListItemMobile.js';
14
+ export function JackpotsListNext(props) {
15
+ const [ref, inView] = useIntersectionObserver({
16
+ threshold: 0.25,
17
+ });
18
+ const jackpotsNextQuery = useJackpotsNextQuery({
19
+ first: 100,
20
+ filter: {
21
+ deleted: {
22
+ equal: false,
23
+ },
24
+ },
25
+ sort: {
26
+ cursor: 'POOL',
27
+ order: 'DESC',
28
+ },
29
+ }, {
30
+ refetchInterval: inView ? 10_000 : false,
31
+ });
32
+ const jackpots = jackpotsNextQuery.data?.pages[0].edges.map((edge) => edge.node) ?? [];
33
+ console.log;
34
+ const styles = isStyleEntries(props.style, ['root', 'itemRoot'])
35
+ ? props.style
36
+ : { root: props.style };
37
+ const classNames = isString(props.className)
38
+ ? { root: props.className }
39
+ : (props.className ?? {});
40
+ return (_jsx(JackpotsListPropsContext, { value: props, children: _jsxs("div", { ref: ref, style: styles.root, className: classNames.root, children: [_jsx("div", { className: "mb-3 font-semibold text-lg lg:mb-4.5", children: props.heading ?? 'Jackpots' }), jackpots.length > 0 ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "hidden flex-col gap-6 lg:flex", children: jackpots.map((jackpot, index) => {
41
+ if (jackpot?.stages?.length) {
42
+ return (_jsx(JackpotsListItemContext, { value: jackpot, children: _jsx(JackpotMultiStageDesktop, { style: styles.itemRoot, className: classNames, animate: true, customJackpotChestImage: props.customJackpotChestImage, jackpotProfileShape: props.jackpotProfileShape, customJackpotStageChest: props.customJackpotStageChest }) }, index));
43
+ }
44
+ return (_jsx(JackpotsListItemContext, { value: jackpot, children: _jsx(JackpotsListItemDesktop, { style: styles.itemRoot, className: classNames, animate: true, customJackpotChestImage: props.customJackpotChestImage, jackpotProfileShape: props.jackpotProfileShape, chestImagesByTier: props.chestImagesByTier }) }, index));
45
+ }) }), _jsx("div", { className: "flex flex-col gap-6 lg:hidden", children: jackpots.map((jackpot, index) => {
46
+ if (jackpot?.stages?.length) {
47
+ return (_jsx(JackpotsListItemContext, { value: jackpot, children: _jsx(JackpotMultiStageMobile, { style: styles.itemRoot, className: classNames, animate: props.animate, customJackpotChestImage: props.customJackpotChestImage, jackpotProfileShape: props.jackpotProfileShape, chestImagesByTier: props.chestImagesByTier, customJackpotStageChest: props.customJackpotStageChest }) }, index));
48
+ }
49
+ return (_jsx(JackpotsListItemContext, { value: jackpot, children: _jsx(JackpotsListItemMobile, { style: styles.itemRoot, className: classNames, animate: props.animate, customJackpotChestImage: props.customJackpotChestImage, jackpotProfileShape: props.jackpotProfileShape, chestImagesByTier: props.chestImagesByTier }) }, index));
50
+ }) })] })) : (_jsxs("div", { className: "mt-5 flex h-fit flex-col items-center justify-center lg:mt-0 lg:h-62", children: [_jsx(Image, { width: 100, height: 100, src: closeChest, alt: "closeChest", className: "size-full h-29.5 w-29.5 mix-blend-luminosity lg:h-25 lg:w-25" }), _jsx("div", { className: "mt-4 font-semibold text-base text-text-primary-900", children: "No Jackpots" }), _jsxs("div", { className: "mt-1 text-center text-sm text-text-tertiary-600", children: ["No jackpots are running at the moment. ", _jsx("br", {}), "Please check back later!"] })] }))] }) }));
51
+ }
@@ -0,0 +1,12 @@
1
+ import type { _Jackpot } from '../../../types';
2
+ import type { JackpotsListProps } from './JackpotsList';
3
+ export declare const JackpotsListPropsContext: (props: {
4
+ value: JackpotsListProps;
5
+ } & {
6
+ children?: import("react").ReactNode | undefined;
7
+ }) => React.ReactNode, useJackpotsListPropsContext: () => JackpotsListProps;
8
+ export declare const JackpotsListItemContext: (props: {
9
+ value: _Jackpot;
10
+ } & {
11
+ children?: import("react").ReactNode | undefined;
12
+ }) => React.ReactNode, useJackpotsListItemContext: () => _Jackpot;
@@ -0,0 +1,3 @@
1
+ import { createContext } from '../../../client/utils/createContext.js';
2
+ export const [JackpotsListPropsContext, useJackpotsListPropsContext] = createContext();
3
+ export const [JackpotsListItemContext, useJackpotsListItemContext] = createContext();
@@ -0,0 +1,43 @@
1
+ import { type ImageProps } from 'next/image';
2
+ import type { CSSProperties } from 'react';
3
+ import type { ClassNameEntries } from './JackpotsList';
4
+ interface JackpotsListItemDesktopProps {
5
+ className?: ClassNameEntries;
6
+ style?: CSSProperties;
7
+ animate?: boolean;
8
+ customJackpotChestImage?: {
9
+ image: {
10
+ open: string;
11
+ closed: string;
12
+ };
13
+ style?: {
14
+ wrapper?: string;
15
+ image?: string;
16
+ };
17
+ };
18
+ chestImagesByTier?: {
19
+ grand?: {
20
+ open: ImageProps['src'];
21
+ closed: ImageProps['src'];
22
+ };
23
+ major?: {
24
+ open: ImageProps['src'];
25
+ closed: ImageProps['src'];
26
+ };
27
+ minor?: {
28
+ open: ImageProps['src'];
29
+ closed: ImageProps['src'];
30
+ };
31
+ default?: {
32
+ open: ImageProps['src'];
33
+ closed: ImageProps['src'];
34
+ };
35
+ style?: {
36
+ wrapper?: string;
37
+ image?: string;
38
+ };
39
+ };
40
+ jackpotProfileShape?: 'oval' | 'star';
41
+ }
42
+ export declare function JackpotsListItemDesktop({ animate, customJackpotChestImage, chestImagesByTier, jackpotProfileShape, className, ...props }: JackpotsListItemDesktopProps): import("react/jsx-runtime").JSX.Element | null;
43
+ export {};
@@ -0,0 +1,117 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { Progress } from '@ark-ui/react/progress';
3
+ import { format } from 'date-fns';
4
+ import Image, {} from 'next/image';
5
+ import { twMerge } from 'tailwind-merge';
6
+ import { ArrowNarrowUpRightIcon } from '../../../icons/ArrowNarrowUpRightIcon.js';
7
+ import { ChevronLeftIcon } from '../../../icons/ChevronLeftIcon.js';
8
+ import { ChevronRightIcon } from '../../../icons/ChevronRightIcon.js';
9
+ import { StarIcon } from '../../../icons/StarIcon.js';
10
+ import { Trophy01Icon } from '../../../icons/Trophy01Icon.js';
11
+ import { User01Icon } from '../../../icons/User01Icon.js';
12
+ import closeChest from '../../../images/close-chest.png';
13
+ import firstPlace from '../../../images/first-place.png';
14
+ import leaderboard from '../../../images/leaderboard.png';
15
+ import openChest from '../../../images/open-chest.png';
16
+ import { Tooltip } from '../../../ui/Tooltip/index.js';
17
+ import { capitalize } from '../../../utils/capitalize.js';
18
+ import { formatNumber } from '../../../utils/formatNumber.js';
19
+ import { mask } from '../../../utils/mask.js';
20
+ import { parseDecimal } from '../../../utils/parseDecimal.js';
21
+ import styles from '../Jackpots.module.css';
22
+ import { useJackpotsListItemContext } from './JackpotsListContext.js';
23
+ import { JackpotsListItemGameProviders } from './JackpotsListItemGameProviders.js';
24
+ import { JackpotsListItemRules } from './JackpotsListItemRules.js';
25
+ import { useJackpotsListItemData } from './useJackpotsListItemData.js';
26
+ export function JackpotsListItemDesktop({ animate = true, customJackpotChestImage, chestImagesByTier, jackpotProfileShape = 'oval', className, ...props }) {
27
+ const jackpot = useJackpotsListItemContext();
28
+ const { rootRef, jackpotPayouts, topJackpotPayout, filteredGameProviders, localeInfo, isPayingOut, jackpotAmount, arrowImages, getAccumulatingJackpotDescription, getTierFromName, } = useJackpotsListItemData();
29
+ const getChestImages = () => {
30
+ // Priority: chestImagesByTier > customJackpotChestImage > default
31
+ if (chestImagesByTier) {
32
+ const tier = getTierFromName(jackpot.name);
33
+ const tierImages = chestImagesByTier[tier] || chestImagesByTier.default;
34
+ if (tierImages) {
35
+ return {
36
+ open: tierImages.open,
37
+ closed: tierImages.closed,
38
+ style: chestImagesByTier.style,
39
+ };
40
+ }
41
+ }
42
+ if (customJackpotChestImage?.image) {
43
+ return {
44
+ open: customJackpotChestImage.image.open,
45
+ closed: customJackpotChestImage.image.closed,
46
+ style: customJackpotChestImage.style,
47
+ };
48
+ }
49
+ // Default fallback
50
+ return {
51
+ open: openChest,
52
+ closed: closeChest,
53
+ style: undefined,
54
+ };
55
+ };
56
+ const chestImages = getChestImages();
57
+ const ProfileIcon = () => jackpotProfileShape === 'oval' ? (_jsxs("div", { className: "relative flex h-18 w-18 items-center justify-center rounded-full bg-bg-tertiary", children: [_jsx(User01Icon, { className: "size-9 text-text-quarterary-500" }), _jsx("div", { className: twMerge('absolute right-0 bottom-safe-area-inset-bottom flex h-6 w-6 items-center justify-center rounded-full border-[1.5px] border-bg-primary bg-yellow-400 font-bold text-brand-950 text-xs', className?.latestPayoutRankRoot), children: "1st" })] })) : (_jsxs("div", { className: "relative grid h-18 w-18", children: [_jsx(StarIcon, { className: "col-start-1 row-start-1 h-full w-full" }), _jsx(User01Icon, { className: "z-10 col-start-1 row-start-1 size-9 place-self-center text-text-quarterary-500" }), _jsx("div", { className: twMerge('-right-0 absolute bottom-safe-area-inset-bottom z-20 flex h-7 w-7 items-center justify-center rounded-full border-[1.5px] border-bg-primary bg-yellow-400 text-center font-bold text-brand-950 text-xs', className?.latestPayoutRankRoot), children: "1st" })] }));
58
+ const PayoutBadge = () => (_jsxs("div", { className: twMerge('flex h-fit w-fit items-center gap-1 rounded-sm border border-utility-brand-200 bg-utility-brand-50 px-2 py-0.5 font-medium text-utility-brand-700 text-xs', className?.latestPayoutBadgeRoot), children: [_jsx(Trophy01Icon, { className: twMerge('size-3.5 text-utility-brand-600', className?.latestPayoutBadgeIcon) }), "Latest Payout"] }));
59
+ const ProgressBar = () => (_jsxs("div", { className: "mt-3 lg:mt-4", children: [_jsxs("div", { className: "mb-1 flex justify-between", children: [_jsx("div", { className: "font-semibold text-text-primary-900 text-xs", children: formatNumber(0, {
60
+ currency: localeInfo.currency.code,
61
+ compact: true,
62
+ }) }), _jsxs("div", { className: "relative flex items-center justify-end gap-1.5", children: [isPayingOut ? (_jsxs("div", { className: "flex w-6 items-center", children: [_jsx("div", { className: twMerge('absolute left-0', styles['animate-arrow-red-flash-1']), children: _jsx(ChevronLeftIcon, { className: "size-4.5" }) }), _jsx("div", { className: twMerge('absolute left-1.5', styles['animate-arrow-red-flash-2']), children: _jsx(ChevronLeftIcon, { className: "size-4.5" }) }), _jsx("div", { className: twMerge('absolute left-3', styles['animate-arrow-red-flash-3']), children: _jsx(ChevronLeftIcon, { className: "size-4.5" }) })] })) : (_jsxs("div", { className: "flex w-6 items-center", children: [_jsx("div", { className: twMerge('absolute left-0', styles['animate-arrow-green-flash-1']), children: _jsx(ChevronRightIcon, { className: "size-4.5" }) }), _jsx("div", { className: twMerge('absolute left-1.5', styles['animate-arrow-green-flash-2']), children: _jsx(ChevronRightIcon, { className: "size-4.5" }) }), _jsx("div", { className: twMerge('absolute left-3', styles['animate-arrow-green-flash-3']), children: _jsx(ChevronRightIcon, { className: "size-4.5" }) })] })), _jsx("div", { className: "font-semibold text-text-primary-900 text-xs", children: formatNumber(jackpot?.maximumJackpotPoolLimit, {
63
+ currency: localeInfo.currency.code,
64
+ compact: true,
65
+ }) })] })] }), _jsx(Progress.Root, { className: "h-2 w-full rounded-full bg-bg-primary lg:h-4", max: 100, value: getPercentage(jackpot.pool, jackpot.maximumJackpotPoolLimit), children: _jsx(Progress.Track, { className: twMerge('h-full overflow-hidden rounded-full bg-bg-primary', className?.progressBarTrack), children: _jsxs(Progress.Range, { className: "relative h-full overflow-hidden rounded-full bg-brand-500 pl-1.5", children: [_jsxs(Tooltip.Root, { openDelay: 0, closeDelay: 100, lazyMount: true, unmountOnExit: true, positioning: { strategy: 'fixed', placement: 'top' }, children: [_jsx(Tooltip.Trigger, { asChild: true, children: _jsx("div", { className: "absolute inset-0 h-full w-full" }) }), _jsx(Tooltip.Positioner, { children: _jsxs(Tooltip.Content, { children: [_jsxs("div", { className: "text-xs", children: ["Current\uD83D\uDCB0:", ' ', formatNumber(jackpot.pool, {
66
+ currency: localeInfo.currency.code,
67
+ minDecimalPlaces: 2,
68
+ maxDecimalPlaces: 2,
69
+ })] }), _jsx(Tooltip.Arrow, { children: _jsx(Tooltip.ArrowTip, {}) })] }) })] }), _jsx("div", { className: "pointer-events-none absolute inset-0 flex items-center justify-start pl-1.5", "aria-hidden": "true", children: arrowImages }), _jsxs(Tooltip.Root, { openDelay: 0, closeDelay: 100, lazyMount: true, unmountOnExit: true, positioning: { strategy: 'fixed', placement: 'top' }, children: [_jsx(Tooltip.Trigger, { asChild: true, children: _jsx("div", { className: "absolute inset-0 h-full bg-black opacity-30", style: {
70
+ width: `${getPercentage(jackpot.minimumJackpotPoolDrawingLimit, jackpot.pool)}%`,
71
+ } }) }), _jsx(Tooltip.Positioner, { children: _jsxs(Tooltip.Content, { children: [_jsxs("div", { className: "text-xs", children: ["Minimum Payout Limit:", ' ', formatNumber(jackpot.minimumJackpotPoolDrawingLimit, {
72
+ currency: localeInfo.currency.code,
73
+ minDecimalPlaces: 2,
74
+ maxDecimalPlaces: 2,
75
+ })] }), _jsx(Tooltip.Arrow, { children: _jsx(Tooltip.ArrowTip, {}) })] }) })] })] }) }) }), _jsx("div", { className: "mt-1 block text-start text-2xs lg:hidden", children: isPayingOut
76
+ ? `The pot has hit ${formatNumber(jackpot?.maximumJackpotPoolLimit, {
77
+ currency: localeInfo.currency.code,
78
+ compact: true,
79
+ })} Play now for your chance to win big! 🔥`
80
+ : getAccumulatingJackpotDescription(Number(jackpot?.pool) ?? 0, Number(jackpot?.maximumJackpotPoolLimit) ?? 0) })] }));
81
+ const RecentPayoutsTable = () => (_jsx("div", { className: twMerge('max-h-[17rem] overflow-y-scroll', styles.scrollArea), children: _jsx("div", { className: "overflow-hidden rounded-xl border-gray-200", children: _jsxs("table", { className: "w-full", children: [_jsx("thead", { children: _jsx("tr", { className: twMerge('h-8 whitespace-nowrap bg-bg-secondary text-left font-medium text-text-tertiary-600 text-xs', className?.recentPayoutsTableHeadRow), children: [
82
+ 'Player',
83
+ 'Game Provider',
84
+ 'Multiplier',
85
+ 'Prize',
86
+ 'Timestamp',
87
+ ].map((header) => (_jsx("th", { className: "px-4", children: header }, header))) }) }), _jsx("tbody", { children: jackpotPayouts.length
88
+ ? jackpotPayouts.map((jackpotPayout, i) => (_jsxs("tr", { className: twMerge('whitespace-nowrap bg-bg-primary text-left text-sm text-text-secondary-700', className?.recentPayoutsTableBodyRow), children: [_jsx("td", { className: twMerge('h-12 border-border-secondary border-t-2 px-4', className?.recentPayoutsTableBodyData), children: mask(jackpotPayout.member.name, {
89
+ totalCharsCount: 6,
90
+ }) }), _jsx("td", { className: twMerge('h-12 border-border-secondary border-t-2 px-4', className?.recentPayoutsTableBodyData), children: capitalize(jackpotPayout.game?.provider ?? '-') }), _jsxs("td", { className: twMerge('h-12 border-border-secondary border-t-2 px-4', className?.recentPayoutsTableBodyData), children: [jackpotPayout.multiplier, "x"] }), _jsx("td", { className: twMerge('h-12 border-border-secondary border-t-2 px-4 text-brand-400', className?.recentPayoutsTableBodyData), children: formatNumber(jackpotPayout.amount, {
91
+ currency: localeInfo.currency.code,
92
+ minDecimalPlaces: 2,
93
+ maxDecimalPlaces: 2,
94
+ }) }), _jsx("td", { className: twMerge('h-12 border-border-secondary border-t-2 px-4', className?.recentPayoutsTableBodyData), children: format(new Date(jackpotPayout.dateTimeCreated), 'dd MMM yyyy h:mm a') })] }, i)))
95
+ : Array.from({ length: 10 }).map((_, i) => (_jsx("tr", { className: twMerge('bg-bg-primary text-sm text-text-secondary-700', className?.recentPayoutsTableBodyRow), children: Array.from({ length: 5 }).map((_, j) => (_jsx("td", { className: twMerge('h-12 border-border-secondary border-t-2', className?.recentPayoutsTableBodyData), children: "-" }, j))) }, i))) })] }) }) }));
96
+ if (jackpot.status === 'DISABLED' && jackpot.drawing !== true) {
97
+ return null;
98
+ }
99
+ return (_jsxs("div", { ref: rootRef, className: twMerge('rounded-2xl border border-border-primary bg-bg-tertiary', className?.itemRoot), children: [_jsxs("div", { style: props.style, className: twMerge('relative flex shrink-0 rounded-2xl p-3 text-center lg:gap-4 lg:p-5'), children: [_jsxs("div", { className: "relative z-1 flex flex-1 flex-col", children: [_jsx("div", { className: "flex h-full flex-col justify-between", children: _jsx("div", { className: "flex w-full justify-between", children: _jsxs("div", { className: "flex w-full flex-col", children: [_jsxs("div", { className: "relative flex w-full justify-between", children: [_jsxs("div", { children: [isPayingOut ? (_jsxs("div", { className: "flex w-fit items-center gap-1 rounded-full border border-utility-success-200 bg-utility-success-50 px-2 py-0.5 font-medium text-utility-success-700 text-xs", children: [_jsx("span", { className: "full size-1.5 animate-pulse rounded bg-utility-success-500" }), "Paying Out"] })) : (_jsxs("div", { className: "flex w-fit items-center gap-1 rounded-full border border-utility-blue-200 bg-utility-blue-50 px-2 py-0.5 font-medium text-utility-blue-700 text-xs", children: [_jsx(ArrowNarrowUpRightIcon, { className: "size-3.5 text-utility-blue-500" }), "Accumulating"] })), _jsx("div", { className: "mt-1 text-left font-medium text-lg text-text-primary-900 lg:mt-5 lg:text-2xl", children: jackpot.name }), _jsx("div", { className: twMerge('mt-1.5 w-fit rounded-md bg-bg-primary px-2 py-1 font-bold text-2xl text-brand-400 lg:mt-2 lg:text-4xl', className?.jackpotAmountRoot), children: formatNumber(jackpotAmount, {
100
+ currency: localeInfo.currency.code,
101
+ minDecimalPlaces: 2,
102
+ maxDecimalPlaces: 2,
103
+ }) })] }), _jsx("div", { className: "min-w-30" }), _jsx("div", { className: twMerge('right-0 bottom-[-60] z-1 min-w-30 lg:absolute', chestImages?.style?.wrapper), children: _jsx(Image, { width: 150, height: 150, src: isPayingOut ? chestImages.open : chestImages.closed, alt: "chest", className: twMerge('size-full h-25 w-25 p-2 lg:h-37.5 lg:w-37.5', chestImages?.style?.image) }) })] }), _jsx("div", { className: twMerge('relative mt-4 hidden w-full gap-4 rounded-lg bg-bg-primary p-4 lg:flex', className?.latestPayoutRoot), children: topJackpotPayout?.amount ? (_jsxs(_Fragment, { children: [_jsx(ProfileIcon, {}), _jsxs("div", { className: "flex flex-col gap-1 text-left", children: [_jsx(PayoutBadge, {}), _jsx("div", { className: "font-semibold", children: mask(topJackpotPayout.member.name, {
104
+ totalCharsCount: 6,
105
+ }) }), _jsx("div", { className: twMerge('text-2xl text-brand-400', className?.latestPayoutAmount), children: formatNumber(topJackpotPayout.amount, {
106
+ currency: localeInfo.currency.code,
107
+ minDecimalPlaces: 2,
108
+ maxDecimalPlaces: 2,
109
+ }) })] })] })) : (_jsxs(_Fragment, { children: [_jsx(Image, { width: 66, height: 87, src: firstPlace, alt: "firstPlace", className: "size-full h-auto w-[4.125rem] mix-blend-luminosity" }), _jsxs("div", { className: "flex flex-col gap-1 text-left", children: [_jsx(PayoutBadge, {}), _jsx("div", { className: "font-semibold", children: "No winners yet" }), _jsx("div", { className: "text-text-secondary-700 text-xs", children: "You could be the first to win the jackpot!" })] })] })) })] }) }) }), _jsx(ProgressBar, {})] }), _jsxs("div", { className: "z-1 hidden flex-1 space-y-4 lg:block", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { className: "flex gap-2", children: [_jsx(Image, { width: 24, height: 24, src: leaderboard, alt: "leaderboardIcon", className: "size-full h-auto w-6" }), _jsx("div", { className: twMerge('font-semibold text-lg text-text-primary-900', className?.recentPayoutsHeading), children: jackpotPayouts.length ? 'Recent Payouts' : 'Starting soon!' })] }), _jsx(JackpotsListItemRules, { className: {
110
+ button: className?.recentPayoutsJackpotRulesButton,
111
+ } })] }), _jsx(RecentPayoutsTable, {})] }), isPayingOut && animate && (_jsx("div", { className: twMerge(styles['light-rays'], 'absolute top-safe-area-inset-top right-0 rounded-2xl') }))] }), Boolean(filteredGameProviders.length) && (_jsx(JackpotsListItemGameProviders, { gameProviders: filteredGameProviders }))] }));
112
+ }
113
+ function getPercentage(value, total) {
114
+ const v = parseDecimal(value, 0);
115
+ const t = parseDecimal(total, 0);
116
+ return t === 0 ? 0 : (v / t) * 100;
117
+ }
@@ -0,0 +1,5 @@
1
+ import type { GameProviderData } from '../../../types';
2
+ export interface JackpotsListItemGameProvidersProps {
3
+ gameProviders: GameProviderData[];
4
+ }
5
+ export declare function JackpotsListItemGameProviders({ gameProviders, }: JackpotsListItemGameProvidersProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,54 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import useEmblaCarousel from 'embla-carousel-react';
3
+ import { isString } from 'lodash-es';
4
+ import Image from 'next/image';
5
+ import Link from 'next/link';
6
+ import { useCallback, useEffect, useState } from 'react';
7
+ import { twMerge } from 'tailwind-merge';
8
+ import { ArrowLeftIcon } from '../../../icons/ArrowLeftIcon.js';
9
+ import { ArrowRightIcon } from '../../../icons/ArrowRightIcon.js';
10
+ import { Button } from '../../../ui/Button/index.js';
11
+ import { callIfFn } from '../../../utils/callIfFn.js';
12
+ import { useJackpotsListPropsContext } from './JackpotsListContext.js';
13
+ export function JackpotsListItemGameProviders({ gameProviders, }) {
14
+ const jackpotsProps = useJackpotsListPropsContext();
15
+ const viewGamesUrl = (data) => {
16
+ return jackpotsProps.viewGamesUrl
17
+ ? callIfFn(jackpotsProps.viewGamesUrl, data)
18
+ .replace(':id', data.id)
19
+ .replace(':slug', data.slug)
20
+ : `/providers/${data.slug}`;
21
+ };
22
+ const classNames = isString(jackpotsProps.className)
23
+ ? { root: jackpotsProps.className }
24
+ : (jackpotsProps.className ?? {});
25
+ const [emblaRef, emblaApi] = useEmblaCarousel({
26
+ align: 'start',
27
+ slidesToScroll: 1,
28
+ });
29
+ const scrollPrev = useCallback(() => {
30
+ if (emblaApi)
31
+ emblaApi.scrollPrev();
32
+ }, [emblaApi]);
33
+ const scrollNext = useCallback(() => {
34
+ if (emblaApi)
35
+ emblaApi.scrollNext();
36
+ }, [emblaApi]);
37
+ const [canScrollPrev, setCanScrollPrev] = useState(false);
38
+ const [canScrollNext, setCanScrollNext] = useState(false);
39
+ const onSelect = useCallback(() => {
40
+ if (!emblaApi)
41
+ return;
42
+ setCanScrollPrev(emblaApi.canScrollPrev());
43
+ setCanScrollNext(emblaApi.canScrollNext());
44
+ }, [emblaApi]);
45
+ useEffect(() => {
46
+ if (!emblaApi)
47
+ return;
48
+ onSelect();
49
+ emblaApi.on('select', onSelect);
50
+ emblaApi.on('reInit', onSelect);
51
+ }, [emblaApi, onSelect]);
52
+ return (_jsxs("div", { className: twMerge('p-4 pb-8', classNames.providerRoot), children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("div", { className: twMerge('font-semibold text-lg text-text-primary-900', classNames.providerHeading), children: "Jackpot Game Providers" }), _jsxs("div", { className: "hidden lg:flex", children: [_jsx(Button, { disabled: !canScrollPrev, onClick: scrollPrev, variant: "outline", colorScheme: "gray", className: twMerge('rounded-r-none border-r-0', classNames.providerNavigationButton), "aria-label": "Previous", children: _jsx(ArrowLeftIcon, { className: "size-5" }) }), _jsxs(Button, { disabled: !canScrollNext, onClick: scrollNext, variant: "outline", colorScheme: "gray", className: twMerge('rounded-l-none', classNames.providerNavigationButton), "aria-label": "Next", children: [_jsx("span", { className: "sr-only", children: "Next" }), _jsx(ArrowRightIcon, { className: "size-5" })] })] })] }), _jsx("div", { className: "relative mt-3 overflow-hidden", ref: emblaRef, children: _jsx("div", { className: "flex gap-3.5", children: gameProviders.map((provider) => (_jsx(Link, { href: viewGamesUrl(provider), className: twMerge('min-w-27.5 rounded-md bg-brand-800 lg:bg-bg-primary-900', classNames.providerThumbnailRoot), children: _jsx(Image, { src: jackpotsProps.gameProviderImages?.[provider.id] ??
53
+ provider.logo, alt: "provider", className: twMerge('size-full', classNames.providerThumbnailImage), width: 300, height: 150 }) }, provider.slug))) }) })] }));
54
+ }
@@ -0,0 +1,43 @@
1
+ import { type ImageProps } from 'next/image';
2
+ import { type CSSProperties } from 'react';
3
+ import type { ClassNameEntries } from './JackpotsList';
4
+ interface JackpotsListItemMobileProps {
5
+ className?: ClassNameEntries;
6
+ style?: CSSProperties;
7
+ animate?: boolean;
8
+ customJackpotChestImage?: {
9
+ image: {
10
+ open: string;
11
+ closed: string;
12
+ };
13
+ style?: {
14
+ wrapper?: string;
15
+ image?: string;
16
+ };
17
+ };
18
+ chestImagesByTier?: {
19
+ grand?: {
20
+ open: ImageProps['src'];
21
+ closed: ImageProps['src'];
22
+ };
23
+ major?: {
24
+ open: ImageProps['src'];
25
+ closed: ImageProps['src'];
26
+ };
27
+ minor?: {
28
+ open: ImageProps['src'];
29
+ closed: ImageProps['src'];
30
+ };
31
+ default?: {
32
+ open: ImageProps['src'];
33
+ closed: ImageProps['src'];
34
+ };
35
+ style?: {
36
+ wrapper?: string;
37
+ image?: string;
38
+ };
39
+ };
40
+ jackpotProfileShape?: 'oval' | 'star';
41
+ }
42
+ export declare function JackpotsListItemMobile({ animate, customJackpotChestImage, jackpotProfileShape, chestImagesByTier, className, ...props }: JackpotsListItemMobileProps): import("react/jsx-runtime").JSX.Element | null;
43
+ export {};