@anker-in/headless-ui 1.1.87 → 1.1.89

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 (412) hide show
  1. package/dist/cjs/biz-components/AccordionCards/index.d.ts +1 -1
  2. package/dist/cjs/biz-components/ActiveShelf/index.d.ts +1 -1
  3. package/dist/cjs/biz-components/ActivitySchedule/index.d.ts +1 -1
  4. package/dist/cjs/biz-components/AiuiProvider/index.d.ts +6 -0
  5. package/dist/cjs/biz-components/AiuiProvider/index.js +1 -1
  6. package/dist/cjs/biz-components/AiuiProvider/index.js.map +3 -3
  7. package/dist/cjs/biz-components/AnchorNavigation/index.d.ts +1 -1
  8. package/dist/cjs/biz-components/AplusDesc/index.d.ts +1 -1
  9. package/dist/cjs/biz-components/BrandCardLink/BrandCardLink.d.ts +1 -1
  10. package/dist/cjs/biz-components/BrandEquity/BrandEquity.d.ts +1 -1
  11. package/dist/cjs/biz-components/BrandEquity/BrandEquity.js +1 -1
  12. package/dist/cjs/biz-components/BrandEquity/BrandEquity.js.map +3 -3
  13. package/dist/cjs/biz-components/BrandEquity/types.d.ts +8 -0
  14. package/dist/cjs/biz-components/BrandEquity/types.js +1 -1
  15. package/dist/cjs/biz-components/BrandEquity/types.js.map +1 -1
  16. package/dist/cjs/biz-components/Category/index.d.ts +1 -1
  17. package/dist/cjs/biz-components/CreativeModule/index.d.ts +1 -1
  18. package/dist/cjs/biz-components/DownLoad/index.d.ts +1 -1
  19. package/dist/cjs/biz-components/Evaluate/index.d.ts +1 -1
  20. package/dist/cjs/biz-components/EventSchedule/index.d.ts +1 -1
  21. package/dist/cjs/biz-components/Faq/Faq.d.ts +1 -1
  22. package/dist/cjs/biz-components/Faq/Faq.js +1 -1
  23. package/dist/cjs/biz-components/Faq/Faq.js.map +2 -2
  24. package/dist/cjs/biz-components/Faq/types.d.ts +1 -0
  25. package/dist/cjs/biz-components/Faq/types.js +1 -1
  26. package/dist/cjs/biz-components/Faq/types.js.map +1 -1
  27. package/dist/cjs/biz-components/FeatureCards/FeatureCards.d.ts +1 -1
  28. package/dist/cjs/biz-components/FeatureShowcase/FeatureShowcase.d.ts +1 -1
  29. package/dist/cjs/biz-components/FeaturedBlogPosts/index.d.ts +1 -1
  30. package/dist/cjs/biz-components/Features/index.d.ts +1 -1
  31. package/dist/cjs/biz-components/FootCharger/index.d.ts +1 -1
  32. package/dist/cjs/biz-components/FooterNavigation/index.d.ts +1 -1
  33. package/dist/cjs/biz-components/GiftBox/index.d.ts +1 -1
  34. package/dist/cjs/biz-components/GiftShelf/index.d.ts +1 -1
  35. package/dist/cjs/biz-components/GiftTierShelf/index.d.ts +1 -1
  36. package/dist/cjs/biz-components/Graphic/index.d.ts +1 -1
  37. package/dist/cjs/biz-components/GraphicAttractionBlock/index.d.ts +1 -1
  38. package/dist/cjs/biz-components/GraphicMore/index.d.ts +1 -1
  39. package/dist/cjs/biz-components/GraphicOverlay/GraphicOverlay.d.ts +1 -1
  40. package/dist/cjs/biz-components/HeaderNavigation/index.d.ts +1 -1
  41. package/dist/cjs/biz-components/HeroBanner/HeroBanner.d.ts +21 -1
  42. package/dist/cjs/biz-components/HeroBanner/HeroBanner.js +1 -1
  43. package/dist/cjs/biz-components/HeroBanner/HeroBanner.js.map +3 -3
  44. package/dist/cjs/biz-components/HeroBanner/HeroBannerCarousel.d.ts +23 -0
  45. package/dist/cjs/biz-components/HeroBanner/HeroBannerCarousel.js +2 -0
  46. package/dist/cjs/biz-components/HeroBanner/HeroBannerCarousel.js.map +7 -0
  47. package/dist/cjs/biz-components/HeroBanner/index.d.ts +1 -0
  48. package/dist/cjs/biz-components/HeroBanner/index.js +1 -1
  49. package/dist/cjs/biz-components/HeroBanner/index.js.map +1 -1
  50. package/dist/cjs/biz-components/HeroBanner/types.d.ts +73 -0
  51. package/dist/cjs/biz-components/HeroBanner/types.js +1 -1
  52. package/dist/cjs/biz-components/HeroBanner/types.js.map +1 -1
  53. package/dist/cjs/biz-components/ImageOverlayShelf/index.d.ts +2 -2
  54. package/dist/cjs/biz-components/ImageOverlayShelf/index.js +1 -1
  55. package/dist/cjs/biz-components/ImageOverlayShelf/index.js.map +3 -3
  56. package/dist/cjs/biz-components/ImageTextFeature/ImageTextFeature.d.ts +1 -1
  57. package/dist/cjs/biz-components/ImageTextOverlay/index.d.ts +9 -0
  58. package/dist/cjs/biz-components/ImageTextOverlay/index.js +18 -0
  59. package/dist/cjs/biz-components/ImageTextOverlay/index.js.map +7 -0
  60. package/dist/cjs/biz-components/ImageTextOverlay/types.d.ts +58 -0
  61. package/dist/cjs/biz-components/ImageTextOverlay/types.js +2 -0
  62. package/dist/cjs/biz-components/ImageTextOverlay/types.js.map +7 -0
  63. package/dist/cjs/biz-components/ImageWithText/ImageWithText.d.ts +1 -1
  64. package/dist/cjs/biz-components/ImageWithText/ImageWithText.js +1 -1
  65. package/dist/cjs/biz-components/ImageWithText/ImageWithText.js.map +2 -2
  66. package/dist/cjs/biz-components/Ksp/index.d.ts +1 -1
  67. package/dist/cjs/biz-components/Listing/components/PaidShipping/index.d.ts +1 -1
  68. package/dist/cjs/biz-components/Listing/components/ProductCard/ProductDetail/BenefitsTab.d.ts +1 -1
  69. package/dist/cjs/biz-components/Listing/components/ProductCard/ProductDetail/ProductBundle/index.d.ts +1 -1
  70. package/dist/cjs/biz-components/Listing/components/ProductCard/ProductDetail/ProductExchangePurchase/index.d.ts +1 -1
  71. package/dist/cjs/biz-components/Listing/components/ProductCard/ProductDetail/ProductFreeGift/index.d.ts +1 -1
  72. package/dist/cjs/biz-components/Listing/components/ProductCard/ProductDetail/ProductHighlight/index.d.ts +1 -1
  73. package/dist/cjs/biz-components/Listing/components/ProductCard/ProductDetail/ProductOptions/index.d.ts +1 -1
  74. package/dist/cjs/biz-components/Listing/components/ProductCard/ProductGallery/index.d.ts +1 -1
  75. package/dist/cjs/biz-components/Listing/components/ProductCard/ProductPaidShipping/index.d.ts +1 -1
  76. package/dist/cjs/biz-components/Listing/components/ProductCard/ProductSummary/index.d.ts +1 -1
  77. package/dist/cjs/biz-components/Listing/components/PurchaseBar/index.d.ts +1 -1
  78. package/dist/cjs/biz-components/LotteryShared/BaseModal.js +1 -1
  79. package/dist/cjs/biz-components/LotteryShared/BaseModal.js.map +2 -2
  80. package/dist/cjs/biz-components/LotteryShared/ChanceMethods.js +1 -1
  81. package/dist/cjs/biz-components/LotteryShared/ChanceMethods.js.map +3 -3
  82. package/dist/cjs/biz-components/LotteryShared/ErrorModal.js +1 -1
  83. package/dist/cjs/biz-components/LotteryShared/ErrorModal.js.map +2 -2
  84. package/dist/cjs/biz-components/LotteryShared/MyRewardsModal.d.ts +33 -0
  85. package/dist/cjs/biz-components/LotteryShared/MyRewardsModal.js +1 -1
  86. package/dist/cjs/biz-components/LotteryShared/MyRewardsModal.js.map +3 -3
  87. package/dist/cjs/biz-components/LotteryShared/PrizePool.js +1 -1
  88. package/dist/cjs/biz-components/LotteryShared/PrizePool.js.map +3 -3
  89. package/dist/cjs/biz-components/LotteryShared/WinnerModal.d.ts +1 -1
  90. package/dist/cjs/biz-components/LotteryShared/WinnerModal.js +1 -1
  91. package/dist/cjs/biz-components/LotteryShared/WinnerModal.js.map +3 -3
  92. package/dist/cjs/biz-components/LotteryShared/types.d.ts +101 -0
  93. package/dist/cjs/biz-components/LotteryShared/types.js +1 -1
  94. package/dist/cjs/biz-components/LotteryShared/types.js.map +2 -2
  95. package/dist/cjs/biz-components/Marquee/Marquee.d.ts +2 -1
  96. package/dist/cjs/biz-components/Marquee/Marquee.js +1 -1
  97. package/dist/cjs/biz-components/Marquee/Marquee.js.map +3 -3
  98. package/dist/cjs/biz-components/MarqueeReview/index.d.ts +1 -1
  99. package/dist/cjs/biz-components/Media/index.d.ts +15 -3
  100. package/dist/cjs/biz-components/Media/index.js +1 -1
  101. package/dist/cjs/biz-components/Media/index.js.map +3 -3
  102. package/dist/cjs/biz-components/MediaEndorsement/index.d.ts +1 -1
  103. package/dist/cjs/biz-components/MediaEndorsement/index.js +2 -2
  104. package/dist/cjs/biz-components/MediaEndorsement/index.js.map +3 -3
  105. package/dist/cjs/biz-components/MediaPlayerBase/index.d.ts +1 -1
  106. package/dist/cjs/biz-components/MediaPlayerBase/index.js +1 -1
  107. package/dist/cjs/biz-components/MediaPlayerBase/index.js.map +3 -3
  108. package/dist/cjs/biz-components/MediaPlayerBase/types.d.ts +26 -0
  109. package/dist/cjs/biz-components/MediaPlayerBase/types.js +1 -1
  110. package/dist/cjs/biz-components/MediaPlayerBase/types.js.map +1 -1
  111. package/dist/cjs/biz-components/MediaPlayerMulti/index.d.ts +1 -1
  112. package/dist/cjs/biz-components/MediaPlayerSticky/index.d.ts +1 -1
  113. package/dist/cjs/biz-components/MediaSceneSwitcher/MediaSceneSwitcher.d.ts +1 -1
  114. package/dist/cjs/biz-components/MediaSceneSwitcherV2/index.d.ts +1 -1
  115. package/dist/cjs/biz-components/MediaShelf/index.d.ts +1 -1
  116. package/dist/cjs/biz-components/MemberEquity/index.d.ts +1 -1
  117. package/dist/cjs/biz-components/MiniCart/index.js +1 -1
  118. package/dist/cjs/biz-components/MiniCart/index.js.map +2 -2
  119. package/dist/cjs/biz-components/MultiLayoutGraphicBlock/MultiLayoutGraphicBlock.d.ts +1 -1
  120. package/dist/cjs/biz-components/MultiLayoutGraphicBlock/MultiLayoutGraphicBlock.js +1 -1
  121. package/dist/cjs/biz-components/MultiLayoutGraphicBlock/MultiLayoutGraphicBlock.js.map +2 -2
  122. package/dist/cjs/biz-components/NavigationSearch/index.d.ts +1 -1
  123. package/dist/cjs/biz-components/ProductCompare/index.d.ts +1 -1
  124. package/dist/cjs/biz-components/ProductHero/ProductHero.d.ts +1 -1
  125. package/dist/cjs/biz-components/ProductLottery/MediaDrawArea.js +1 -1
  126. package/dist/cjs/biz-components/ProductLottery/MediaDrawArea.js.map +3 -3
  127. package/dist/cjs/biz-components/ProductLottery/index.d.ts +3 -2
  128. package/dist/cjs/biz-components/ProductLottery/index.js +1 -1
  129. package/dist/cjs/biz-components/ProductLottery/index.js.map +3 -3
  130. package/dist/cjs/biz-components/ProductLottery/types.d.ts +75 -89
  131. package/dist/cjs/biz-components/ProductLottery/types.js +1 -1
  132. package/dist/cjs/biz-components/ProductLottery/types.js.map +2 -2
  133. package/dist/cjs/biz-components/ProductNav/ProductNav.d.ts +1 -1
  134. package/dist/cjs/biz-components/PromotionalBar/index.d.ts +3 -2
  135. package/dist/cjs/biz-components/PromotionalBar/index.js +1 -1
  136. package/dist/cjs/biz-components/PromotionalBar/index.js.map +3 -3
  137. package/dist/cjs/biz-components/SceneShelfV2/index.d.ts +113 -0
  138. package/dist/cjs/biz-components/SceneShelfV2/index.js +2 -0
  139. package/dist/cjs/biz-components/SceneShelfV2/index.js.map +7 -0
  140. package/dist/cjs/biz-components/SceneShelfV3/ProductCard.d.ts +89 -0
  141. package/dist/cjs/biz-components/SceneShelfV3/ProductCard.js +2 -0
  142. package/dist/cjs/biz-components/SceneShelfV3/ProductCard.js.map +7 -0
  143. package/dist/cjs/biz-components/SceneShelfV3/index.d.ts +79 -0
  144. package/dist/cjs/biz-components/SceneShelfV3/index.js +2 -0
  145. package/dist/cjs/biz-components/SceneShelfV3/index.js.map +7 -0
  146. package/dist/cjs/biz-components/SceneShelfV3/types.d.ts +19 -0
  147. package/dist/cjs/biz-components/SceneShelfV3/types.js +2 -0
  148. package/dist/cjs/biz-components/SceneShelfV3/types.js.map +7 -0
  149. package/dist/cjs/biz-components/SecondaryBanner/SecondaryBannerCarousel.d.ts +21 -0
  150. package/dist/cjs/biz-components/SecondaryBanner/SecondaryBannerCarousel.js +2 -0
  151. package/dist/cjs/biz-components/SecondaryBanner/SecondaryBannerCarousel.js.map +7 -0
  152. package/dist/cjs/biz-components/SecondaryBanner/index.d.ts +65 -1
  153. package/dist/cjs/biz-components/SecondaryBanner/index.js +1 -1
  154. package/dist/cjs/biz-components/SecondaryBanner/index.js.map +3 -3
  155. package/dist/cjs/biz-components/SelectStore/index.d.ts +1 -1
  156. package/dist/cjs/biz-components/ShelfDisplay/index.d.ts +1 -1
  157. package/dist/cjs/biz-components/Slogan/index.d.ts +1 -1
  158. package/dist/cjs/biz-components/Spacer/index.d.ts +1 -1
  159. package/dist/cjs/biz-components/Specs/index.d.ts +1 -1
  160. package/dist/cjs/biz-components/SpecsComparison/SpecsComparison.d.ts +1 -1
  161. package/dist/cjs/biz-components/TabWithImage/TabWithImage.d.ts +1 -1
  162. package/dist/cjs/biz-components/Tabs/Tabs.d.ts +1 -1
  163. package/dist/cjs/biz-components/TabsGroup/index.d.ts +1 -1
  164. package/dist/cjs/biz-components/TabsWithMedia/TabsWithMedia.d.ts +1 -1
  165. package/dist/cjs/biz-components/ThreeDCarousel/ThreeDCarousel.d.ts +1 -1
  166. package/dist/cjs/biz-components/Title/index.d.ts +1 -1
  167. package/dist/cjs/biz-components/Title/index.js +1 -1
  168. package/dist/cjs/biz-components/Title/index.js.map +3 -3
  169. package/dist/cjs/biz-components/Title/types.d.ts +53 -1
  170. package/dist/cjs/biz-components/Title/types.js +1 -1
  171. package/dist/cjs/biz-components/Title/types.js.map +1 -1
  172. package/dist/cjs/biz-components/VideoFeature/VideoFeature.d.ts +1 -1
  173. package/dist/cjs/biz-components/WheelLottery/BaseModal.js +1 -1
  174. package/dist/cjs/biz-components/WheelLottery/BaseModal.js.map +2 -2
  175. package/dist/cjs/biz-components/WheelLottery/ErrorModal.js +1 -1
  176. package/dist/cjs/biz-components/WheelLottery/ErrorModal.js.map +2 -2
  177. package/dist/cjs/biz-components/WheelLottery/MyRewardsModal.js +1 -1
  178. package/dist/cjs/biz-components/WheelLottery/MyRewardsModal.js.map +2 -2
  179. package/dist/cjs/biz-components/WheelLottery/WinnerModal.js +1 -1
  180. package/dist/cjs/biz-components/WheelLottery/WinnerModal.js.map +2 -2
  181. package/dist/cjs/biz-components/WheelLottery/index.d.ts +2 -1
  182. package/dist/cjs/biz-components/WheelLottery/index.js +1 -1
  183. package/dist/cjs/biz-components/WheelLottery/index.js.map +3 -3
  184. package/dist/cjs/biz-components/WheelLottery/types.d.ts +6 -0
  185. package/dist/cjs/biz-components/WheelLottery/types.js.map +2 -2
  186. package/dist/cjs/biz-components/WhyChoose/WhyChoose.d.ts +1 -1
  187. package/dist/cjs/biz-components/index.d.ts +7 -0
  188. package/dist/cjs/biz-components/index.js +1 -1
  189. package/dist/cjs/biz-components/index.js.map +3 -3
  190. package/dist/cjs/hooks/useExposure.d.ts +4 -3
  191. package/dist/cjs/hooks/useExposure.js +1 -1
  192. package/dist/cjs/hooks/useExposure.js.map +3 -3
  193. package/dist/cjs/hooks/useGridRowCount.d.ts +16 -0
  194. package/dist/cjs/hooks/useGridRowCount.js +2 -0
  195. package/dist/cjs/hooks/useGridRowCount.js.map +7 -0
  196. package/dist/cjs/hooks/useViewItemList.d.ts +21 -0
  197. package/dist/cjs/hooks/useViewItemList.js +2 -0
  198. package/dist/cjs/hooks/useViewItemList.js.map +7 -0
  199. package/dist/cjs/index.d.ts +1 -0
  200. package/dist/cjs/index.js +1 -1
  201. package/dist/cjs/index.js.map +3 -3
  202. package/dist/cjs/shared/Styles.js +1 -1
  203. package/dist/cjs/shared/Styles.js.map +3 -3
  204. package/dist/cjs/shared/trackUrlRef.d.ts +9 -0
  205. package/dist/cjs/shared/trackUrlRef.js +1 -1
  206. package/dist/cjs/shared/trackUrlRef.js.map +3 -3
  207. package/dist/cjs/types/props.d.ts +18 -1
  208. package/dist/cjs/types/props.js +1 -1
  209. package/dist/cjs/types/props.js.map +1 -1
  210. package/dist/esm/biz-components/AccordionCards/index.d.ts +1 -1
  211. package/dist/esm/biz-components/ActiveShelf/index.d.ts +1 -1
  212. package/dist/esm/biz-components/ActivitySchedule/index.d.ts +1 -1
  213. package/dist/esm/biz-components/AiuiProvider/index.d.ts +6 -0
  214. package/dist/esm/biz-components/AiuiProvider/index.js +1 -1
  215. package/dist/esm/biz-components/AiuiProvider/index.js.map +3 -3
  216. package/dist/esm/biz-components/AnchorNavigation/index.d.ts +1 -1
  217. package/dist/esm/biz-components/AplusDesc/index.d.ts +1 -1
  218. package/dist/esm/biz-components/BrandCardLink/BrandCardLink.d.ts +1 -1
  219. package/dist/esm/biz-components/BrandEquity/BrandEquity.d.ts +1 -1
  220. package/dist/esm/biz-components/BrandEquity/BrandEquity.js +1 -1
  221. package/dist/esm/biz-components/BrandEquity/BrandEquity.js.map +3 -3
  222. package/dist/esm/biz-components/BrandEquity/types.d.ts +8 -0
  223. package/dist/esm/biz-components/Category/index.d.ts +1 -1
  224. package/dist/esm/biz-components/CreativeModule/index.d.ts +1 -1
  225. package/dist/esm/biz-components/DownLoad/index.d.ts +1 -1
  226. package/dist/esm/biz-components/Evaluate/index.d.ts +1 -1
  227. package/dist/esm/biz-components/EventSchedule/index.d.ts +1 -1
  228. package/dist/esm/biz-components/Faq/Faq.d.ts +1 -1
  229. package/dist/esm/biz-components/Faq/Faq.js +1 -1
  230. package/dist/esm/biz-components/Faq/Faq.js.map +2 -2
  231. package/dist/esm/biz-components/Faq/types.d.ts +1 -0
  232. package/dist/esm/biz-components/FeatureCards/FeatureCards.d.ts +1 -1
  233. package/dist/esm/biz-components/FeatureShowcase/FeatureShowcase.d.ts +1 -1
  234. package/dist/esm/biz-components/FeaturedBlogPosts/index.d.ts +1 -1
  235. package/dist/esm/biz-components/Features/index.d.ts +1 -1
  236. package/dist/esm/biz-components/FootCharger/index.d.ts +1 -1
  237. package/dist/esm/biz-components/FooterNavigation/index.d.ts +1 -1
  238. package/dist/esm/biz-components/GiftBox/index.d.ts +1 -1
  239. package/dist/esm/biz-components/GiftShelf/index.d.ts +1 -1
  240. package/dist/esm/biz-components/GiftTierShelf/index.d.ts +1 -1
  241. package/dist/esm/biz-components/Graphic/index.d.ts +1 -1
  242. package/dist/esm/biz-components/GraphicAttractionBlock/index.d.ts +1 -1
  243. package/dist/esm/biz-components/GraphicMore/index.d.ts +1 -1
  244. package/dist/esm/biz-components/GraphicOverlay/GraphicOverlay.d.ts +1 -1
  245. package/dist/esm/biz-components/HeaderNavigation/index.d.ts +1 -1
  246. package/dist/esm/biz-components/HeroBanner/HeroBanner.d.ts +21 -1
  247. package/dist/esm/biz-components/HeroBanner/HeroBanner.js +1 -1
  248. package/dist/esm/biz-components/HeroBanner/HeroBanner.js.map +3 -3
  249. package/dist/esm/biz-components/HeroBanner/HeroBannerCarousel.d.ts +23 -0
  250. package/dist/esm/biz-components/HeroBanner/HeroBannerCarousel.js +2 -0
  251. package/dist/esm/biz-components/HeroBanner/HeroBannerCarousel.js.map +7 -0
  252. package/dist/esm/biz-components/HeroBanner/index.d.ts +1 -0
  253. package/dist/esm/biz-components/HeroBanner/index.js +1 -1
  254. package/dist/esm/biz-components/HeroBanner/index.js.map +1 -1
  255. package/dist/esm/biz-components/HeroBanner/types.d.ts +73 -0
  256. package/dist/esm/biz-components/ImageOverlayShelf/index.d.ts +2 -2
  257. package/dist/esm/biz-components/ImageOverlayShelf/index.js +1 -1
  258. package/dist/esm/biz-components/ImageOverlayShelf/index.js.map +3 -3
  259. package/dist/esm/biz-components/ImageTextFeature/ImageTextFeature.d.ts +1 -1
  260. package/dist/esm/biz-components/ImageTextOverlay/index.d.ts +9 -0
  261. package/dist/esm/biz-components/ImageTextOverlay/index.js +18 -0
  262. package/dist/esm/biz-components/ImageTextOverlay/index.js.map +7 -0
  263. package/dist/esm/biz-components/ImageTextOverlay/types.d.ts +58 -0
  264. package/dist/esm/biz-components/ImageTextOverlay/types.js +1 -0
  265. package/dist/esm/biz-components/ImageTextOverlay/types.js.map +7 -0
  266. package/dist/esm/biz-components/ImageWithText/ImageWithText.d.ts +1 -1
  267. package/dist/esm/biz-components/ImageWithText/ImageWithText.js +1 -1
  268. package/dist/esm/biz-components/ImageWithText/ImageWithText.js.map +2 -2
  269. package/dist/esm/biz-components/Ksp/index.d.ts +1 -1
  270. package/dist/esm/biz-components/Listing/components/PaidShipping/index.d.ts +1 -1
  271. package/dist/esm/biz-components/Listing/components/ProductCard/ProductDetail/BenefitsTab.d.ts +1 -1
  272. package/dist/esm/biz-components/Listing/components/ProductCard/ProductDetail/ProductBundle/index.d.ts +1 -1
  273. package/dist/esm/biz-components/Listing/components/ProductCard/ProductDetail/ProductExchangePurchase/index.d.ts +1 -1
  274. package/dist/esm/biz-components/Listing/components/ProductCard/ProductDetail/ProductFreeGift/index.d.ts +1 -1
  275. package/dist/esm/biz-components/Listing/components/ProductCard/ProductDetail/ProductHighlight/index.d.ts +1 -1
  276. package/dist/esm/biz-components/Listing/components/ProductCard/ProductDetail/ProductOptions/index.d.ts +1 -1
  277. package/dist/esm/biz-components/Listing/components/ProductCard/ProductGallery/index.d.ts +1 -1
  278. package/dist/esm/biz-components/Listing/components/ProductCard/ProductPaidShipping/index.d.ts +1 -1
  279. package/dist/esm/biz-components/Listing/components/ProductCard/ProductSummary/index.d.ts +1 -1
  280. package/dist/esm/biz-components/Listing/components/PurchaseBar/index.d.ts +1 -1
  281. package/dist/esm/biz-components/LotteryShared/BaseModal.js +1 -1
  282. package/dist/esm/biz-components/LotteryShared/BaseModal.js.map +2 -2
  283. package/dist/esm/biz-components/LotteryShared/ChanceMethods.js +1 -1
  284. package/dist/esm/biz-components/LotteryShared/ChanceMethods.js.map +3 -3
  285. package/dist/esm/biz-components/LotteryShared/ErrorModal.js +1 -1
  286. package/dist/esm/biz-components/LotteryShared/ErrorModal.js.map +2 -2
  287. package/dist/esm/biz-components/LotteryShared/MyRewardsModal.d.ts +33 -0
  288. package/dist/esm/biz-components/LotteryShared/MyRewardsModal.js +1 -1
  289. package/dist/esm/biz-components/LotteryShared/MyRewardsModal.js.map +3 -3
  290. package/dist/esm/biz-components/LotteryShared/PrizePool.js +1 -1
  291. package/dist/esm/biz-components/LotteryShared/PrizePool.js.map +3 -3
  292. package/dist/esm/biz-components/LotteryShared/WinnerModal.d.ts +1 -1
  293. package/dist/esm/biz-components/LotteryShared/WinnerModal.js +1 -1
  294. package/dist/esm/biz-components/LotteryShared/WinnerModal.js.map +3 -3
  295. package/dist/esm/biz-components/LotteryShared/types.d.ts +101 -0
  296. package/dist/esm/biz-components/LotteryShared/types.js +1 -1
  297. package/dist/esm/biz-components/LotteryShared/types.js.map +2 -2
  298. package/dist/esm/biz-components/Marquee/Marquee.d.ts +2 -1
  299. package/dist/esm/biz-components/Marquee/Marquee.js +1 -1
  300. package/dist/esm/biz-components/Marquee/Marquee.js.map +2 -2
  301. package/dist/esm/biz-components/MarqueeReview/index.d.ts +1 -1
  302. package/dist/esm/biz-components/Media/index.d.ts +15 -3
  303. package/dist/esm/biz-components/Media/index.js +1 -1
  304. package/dist/esm/biz-components/Media/index.js.map +3 -3
  305. package/dist/esm/biz-components/MediaEndorsement/index.d.ts +1 -1
  306. package/dist/esm/biz-components/MediaEndorsement/index.js +2 -2
  307. package/dist/esm/biz-components/MediaEndorsement/index.js.map +3 -3
  308. package/dist/esm/biz-components/MediaPlayerBase/index.d.ts +1 -1
  309. package/dist/esm/biz-components/MediaPlayerBase/index.js +1 -1
  310. package/dist/esm/biz-components/MediaPlayerBase/index.js.map +3 -3
  311. package/dist/esm/biz-components/MediaPlayerBase/types.d.ts +26 -0
  312. package/dist/esm/biz-components/MediaPlayerMulti/index.d.ts +1 -1
  313. package/dist/esm/biz-components/MediaPlayerSticky/index.d.ts +1 -1
  314. package/dist/esm/biz-components/MediaSceneSwitcher/MediaSceneSwitcher.d.ts +1 -1
  315. package/dist/esm/biz-components/MediaSceneSwitcherV2/index.d.ts +1 -1
  316. package/dist/esm/biz-components/MediaShelf/index.d.ts +1 -1
  317. package/dist/esm/biz-components/MemberEquity/index.d.ts +1 -1
  318. package/dist/esm/biz-components/MiniCart/index.js +1 -1
  319. package/dist/esm/biz-components/MiniCart/index.js.map +2 -2
  320. package/dist/esm/biz-components/MultiLayoutGraphicBlock/MultiLayoutGraphicBlock.d.ts +1 -1
  321. package/dist/esm/biz-components/MultiLayoutGraphicBlock/MultiLayoutGraphicBlock.js +1 -1
  322. package/dist/esm/biz-components/MultiLayoutGraphicBlock/MultiLayoutGraphicBlock.js.map +2 -2
  323. package/dist/esm/biz-components/NavigationSearch/index.d.ts +1 -1
  324. package/dist/esm/biz-components/ProductCompare/index.d.ts +1 -1
  325. package/dist/esm/biz-components/ProductHero/ProductHero.d.ts +1 -1
  326. package/dist/esm/biz-components/ProductLottery/MediaDrawArea.js +1 -1
  327. package/dist/esm/biz-components/ProductLottery/MediaDrawArea.js.map +3 -3
  328. package/dist/esm/biz-components/ProductLottery/index.d.ts +3 -2
  329. package/dist/esm/biz-components/ProductLottery/index.js +1 -1
  330. package/dist/esm/biz-components/ProductLottery/index.js.map +3 -3
  331. package/dist/esm/biz-components/ProductLottery/types.d.ts +75 -89
  332. package/dist/esm/biz-components/ProductLottery/types.js.map +2 -2
  333. package/dist/esm/biz-components/ProductNav/ProductNav.d.ts +1 -1
  334. package/dist/esm/biz-components/PromotionalBar/index.d.ts +3 -2
  335. package/dist/esm/biz-components/PromotionalBar/index.js +1 -1
  336. package/dist/esm/biz-components/PromotionalBar/index.js.map +3 -3
  337. package/dist/esm/biz-components/SceneShelfV2/index.d.ts +113 -0
  338. package/dist/esm/biz-components/SceneShelfV2/index.js +2 -0
  339. package/dist/esm/biz-components/SceneShelfV2/index.js.map +7 -0
  340. package/dist/esm/biz-components/SceneShelfV3/ProductCard.d.ts +89 -0
  341. package/dist/esm/biz-components/SceneShelfV3/ProductCard.js +2 -0
  342. package/dist/esm/biz-components/SceneShelfV3/ProductCard.js.map +7 -0
  343. package/dist/esm/biz-components/SceneShelfV3/index.d.ts +79 -0
  344. package/dist/esm/biz-components/SceneShelfV3/index.js +2 -0
  345. package/dist/esm/biz-components/SceneShelfV3/index.js.map +7 -0
  346. package/dist/esm/biz-components/SceneShelfV3/types.d.ts +19 -0
  347. package/dist/esm/biz-components/SceneShelfV3/types.js +1 -0
  348. package/dist/esm/biz-components/SceneShelfV3/types.js.map +7 -0
  349. package/dist/esm/biz-components/SecondaryBanner/SecondaryBannerCarousel.d.ts +21 -0
  350. package/dist/esm/biz-components/SecondaryBanner/SecondaryBannerCarousel.js +2 -0
  351. package/dist/esm/biz-components/SecondaryBanner/SecondaryBannerCarousel.js.map +7 -0
  352. package/dist/esm/biz-components/SecondaryBanner/index.d.ts +65 -1
  353. package/dist/esm/biz-components/SecondaryBanner/index.js +1 -1
  354. package/dist/esm/biz-components/SecondaryBanner/index.js.map +3 -3
  355. package/dist/esm/biz-components/SelectStore/index.d.ts +1 -1
  356. package/dist/esm/biz-components/ShelfDisplay/index.d.ts +1 -1
  357. package/dist/esm/biz-components/Slogan/index.d.ts +1 -1
  358. package/dist/esm/biz-components/Spacer/index.d.ts +1 -1
  359. package/dist/esm/biz-components/Specs/index.d.ts +1 -1
  360. package/dist/esm/biz-components/SpecsComparison/SpecsComparison.d.ts +1 -1
  361. package/dist/esm/biz-components/TabWithImage/TabWithImage.d.ts +1 -1
  362. package/dist/esm/biz-components/Tabs/Tabs.d.ts +1 -1
  363. package/dist/esm/biz-components/TabsGroup/index.d.ts +1 -1
  364. package/dist/esm/biz-components/TabsWithMedia/TabsWithMedia.d.ts +1 -1
  365. package/dist/esm/biz-components/ThreeDCarousel/ThreeDCarousel.d.ts +1 -1
  366. package/dist/esm/biz-components/Title/index.d.ts +1 -1
  367. package/dist/esm/biz-components/Title/index.js +1 -1
  368. package/dist/esm/biz-components/Title/index.js.map +3 -3
  369. package/dist/esm/biz-components/Title/types.d.ts +53 -1
  370. package/dist/esm/biz-components/VideoFeature/VideoFeature.d.ts +1 -1
  371. package/dist/esm/biz-components/WheelLottery/BaseModal.js +1 -1
  372. package/dist/esm/biz-components/WheelLottery/BaseModal.js.map +2 -2
  373. package/dist/esm/biz-components/WheelLottery/ErrorModal.js +1 -1
  374. package/dist/esm/biz-components/WheelLottery/ErrorModal.js.map +2 -2
  375. package/dist/esm/biz-components/WheelLottery/MyRewardsModal.js +1 -1
  376. package/dist/esm/biz-components/WheelLottery/MyRewardsModal.js.map +2 -2
  377. package/dist/esm/biz-components/WheelLottery/WinnerModal.js +1 -1
  378. package/dist/esm/biz-components/WheelLottery/WinnerModal.js.map +2 -2
  379. package/dist/esm/biz-components/WheelLottery/index.d.ts +2 -1
  380. package/dist/esm/biz-components/WheelLottery/index.js +1 -1
  381. package/dist/esm/biz-components/WheelLottery/index.js.map +3 -3
  382. package/dist/esm/biz-components/WheelLottery/types.d.ts +6 -0
  383. package/dist/esm/biz-components/WheelLottery/types.js.map +2 -2
  384. package/dist/esm/biz-components/WhyChoose/WhyChoose.d.ts +1 -1
  385. package/dist/esm/biz-components/index.d.ts +7 -0
  386. package/dist/esm/biz-components/index.js +1 -1
  387. package/dist/esm/biz-components/index.js.map +3 -3
  388. package/dist/esm/hooks/useExposure.d.ts +4 -3
  389. package/dist/esm/hooks/useExposure.js +1 -1
  390. package/dist/esm/hooks/useExposure.js.map +3 -3
  391. package/dist/esm/hooks/useGridRowCount.d.ts +16 -0
  392. package/dist/esm/hooks/useGridRowCount.js +2 -0
  393. package/dist/esm/hooks/useGridRowCount.js.map +7 -0
  394. package/dist/esm/hooks/useViewItemList.d.ts +21 -0
  395. package/dist/esm/hooks/useViewItemList.js +2 -0
  396. package/dist/esm/hooks/useViewItemList.js.map +7 -0
  397. package/dist/esm/index.d.ts +1 -0
  398. package/dist/esm/index.js +1 -1
  399. package/dist/esm/index.js.map +3 -3
  400. package/dist/esm/shared/Styles.js +1 -1
  401. package/dist/esm/shared/Styles.js.map +3 -3
  402. package/dist/esm/shared/trackUrlRef.d.ts +9 -0
  403. package/dist/esm/shared/trackUrlRef.js +1 -1
  404. package/dist/esm/shared/trackUrlRef.js.map +3 -3
  405. package/dist/esm/types/props.d.ts +18 -1
  406. package/dist/tokens/anker.css +2 -2
  407. package/dist/tokens/eufy.css +2 -2
  408. package/dist/tokens/eufyMake.css +2 -2
  409. package/dist/tokens/soundcore.css +2 -2
  410. package/package.json +1 -1
  411. package/style.css +224 -26
  412. package/tailwind.config.js +14 -2
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/biz-components/LotteryShared/PrizePool.tsx"],
4
- "sourcesContent": ["/**\n * PrizePool - \u5956\u54C1\u6C60\u7EC4\u4EF6\n *\n * \u5C55\u793A\u6240\u6709\u53EF\u83B7\u5F97\u7684\u5956\u54C1\u5217\u8868,\u652F\u6301\u6A2A\u5411\u6EDA\u52A8\u548C\u9F20\u6807\u62D6\u62FD\u3002\n * \u57FA\u4E8E Figma \u8BBE\u8BA1\u7A3F\u5B9E\u73B0\u54CD\u5E94\u5F0F\u5E03\u5C40\u3002\n *\n * Figma \u8BBE\u8BA1\u7A3F: https://www.figma.com/design/DhWsPamqTM76eMHS0aIQqw\n * \u8BBE\u8BA1\u8282\u70B9: 498:6894 (Prize Pool section)\n *\n * @module PrizePool\n * @date 2026-01-30\n */\n\n'use client'\n\nimport React, { useState, useCallback, useEffect, useRef } from 'react'\nimport { cn } from '../../helpers/index.js'\nimport type { Prize, WinningInfo, PrizePoolProps } from './types.js'\nimport { Heading, Picture } from '../../components/index.js'\nimport { useDraggableScroll } from '../../hooks/useDraggableScroll.js'\n\n// ============================================================================\n// \u60EF\u6027\u6EDA\u52A8\u5E38\u91CF\n// ============================================================================\n\nconst MOMENTUM_FRICTION = 0.95 // \u6469\u64E6\u529B\u7CFB\u6570\nconst MIN_VELOCITY = 0.1 // \u6700\u5C0F\u901F\u5EA6\u9608\u503C\nconst FRAME_TIME = 16 // 16ms per frame (60fps)\n\n// ============================================================================\n// PrizePool \u7EC4\u4EF6\n// ============================================================================\n\n/**\n * PrizePool - \u5956\u54C1\u6C60\u5C55\u793A\u7EC4\u4EF6\n *\n * \u7279\u6027:\n * - \u6A2A\u5411\u6EDA\u52A8\u5217\u8868(mobile/tablet)\n * - \u9F20\u6807\u62D6\u62FD\u6EDA\u52A8\uFF08\u57FA\u4E8E Pointer Events API\uFF09\n * - \u89E6\u6478\u53CB\u597D\n * - \u8FB9\u7F18\u6E10\u9690\u6548\u679C\n * - \u663E\u793A\u5956\u54C1\u56FE\u7247\u3001\u6392\u540D(1st/2nd/3rd)\u548C\u540D\u79F0\n * - \u652F\u6301\u54CD\u5E94\u5F0F\u5E03\u5C40\n * - \u663E\u793A\u4E2D\u5956\u4EBA\u540D\u5355(\u81EA\u52A8\u6EDA\u52A8\u5FAA\u73AF)\n * - \u5B8C\u6574\u7684\u60EF\u6027\u6EDA\u52A8\u52A8\u753B\n */\nexport const PrizePool: React.FC<PrizePoolProps> = ({\n theme,\n prizes,\n title = 'Prize Pool',\n winningInfos,\n className,\n}) => {\n // Hooks \u5FC5\u987B\u5728\u6761\u4EF6\u5224\u65AD\u4E4B\u524D\u8C03\u7528\n // \u62D6\u62FD\u6EDA\u52A8 Hook\n const { containerRef, canScrollLeft, canScrollRight } = useDraggableScroll({\n dragSpeed: 1.2,\n enableMomentum: true,\n dragElastic: 0.1,\n })\n\n // \u62D6\u62FD\u72B6\u6001 - \u4F7F\u7528 ref \u907F\u514D\u95ED\u5305\u95EE\u9898\n const isDraggingRef = useRef(false)\n const [isDragging, setIsDragging] = useState(false)\n\n // \u62D6\u62FD\u76F8\u5173 refs\n const initialScrollLeftRef = useRef(0)\n const initialPointerXRef = useRef(0)\n const velocityRef = useRef(0)\n const lastPointerXRef = useRef(0)\n const lastTimeRef = useRef(0)\n const momentumAnimationRef = useRef<number | null>(null)\n\n // \u5904\u7406\u62D6\u62FD\u5F00\u59CB\n const handleDragStart = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n const container = containerRef.current\n if (!container) return\n\n // \u4F7F\u7528 setPointerCapture \u786E\u4FDD\u5373\u4F7F\u9F20\u6807\u79FB\u51FA\u5BB9\u5668\uFF0C\u4E8B\u4EF6\u4ECD\u80FD\u89E6\u53D1\n e.currentTarget.setPointerCapture(e.pointerId)\n\n isDraggingRef.current = true\n setIsDragging(true)\n initialScrollLeftRef.current = container.scrollLeft\n initialPointerXRef.current = e.clientX\n lastPointerXRef.current = e.clientX\n lastTimeRef.current = Date.now()\n velocityRef.current = 0\n\n // \u53D6\u6D88\u6B63\u5728\u8FDB\u884C\u7684\u60EF\u6027\u6EDA\u52A8\n if (momentumAnimationRef.current !== null) {\n cancelAnimationFrame(momentumAnimationRef.current)\n momentumAnimationRef.current = null\n }\n\n // \u53EA\u963B\u6B62\u6587\u672C\u9009\u62E9\uFF0C\u4E0D\u963B\u6B62 pointer \u4E8B\u4EF6\n document.body.style.userSelect = 'none'\n },\n [containerRef]\n )\n\n // \u5904\u7406\u62D6\u62FD\u4E2D\n const handleDragMove = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n if (!isDraggingRef.current) return\n\n const container = containerRef.current\n if (!container) return\n\n const currentX = e.clientX\n const deltaPixels = initialPointerXRef.current - currentX\n\n // \u8BA1\u7B97\u901F\u5EA6\uFF08\u7528\u4E8E\u60EF\u6027\u6EDA\u52A8\uFF09\n const now = Date.now()\n const timeDelta = Math.max(now - lastTimeRef.current, 1)\n velocityRef.current = ((currentX - lastPointerXRef.current) / timeDelta) * -1\n\n lastPointerXRef.current = currentX\n lastTimeRef.current = now\n\n // \u66F4\u65B0\u6EDA\u52A8\u4F4D\u7F6E\n const newScrollLeft = initialScrollLeftRef.current + deltaPixels\n const maxScroll = container.scrollWidth - container.clientWidth\n\n // \u8FB9\u754C\u7EA6\u675F + \u8D8A\u754C\u963B\u529B\n if (newScrollLeft < 0) {\n container.scrollLeft = newScrollLeft * 0.5\n } else if (newScrollLeft > maxScroll) {\n const overshoot = newScrollLeft - maxScroll\n container.scrollLeft = maxScroll + overshoot * 0.5\n } else {\n container.scrollLeft = newScrollLeft\n }\n\n // \u53EA\u5728\u6D4F\u89C8\u5668\u73AF\u5883\u89E6\u53D1 scroll \u4E8B\u4EF6\n if (typeof window !== 'undefined') {\n container.dispatchEvent(new Event('scroll', { bubbles: true }))\n }\n },\n [containerRef]\n )\n\n // \u60EF\u6027\u6EDA\u52A8\u52A8\u753B - \u5FC5\u987B\u5728 handleDragEnd \u4E4B\u524D\u5B9A\u4E49\n const animateMomentumScroll = useCallback((container: HTMLDivElement, initialVelocity: number) => {\n let velocity = initialVelocity\n const maxScroll = container.scrollWidth - container.clientWidth\n\n const animate = () => {\n velocity *= MOMENTUM_FRICTION\n\n if (Math.abs(velocity) < MIN_VELOCITY) {\n momentumAnimationRef.current = null\n return\n }\n\n const newScroll = container.scrollLeft + velocity * FRAME_TIME\n\n if (newScroll < 0) {\n container.scrollLeft = 0\n momentumAnimationRef.current = null\n return\n }\n\n if (newScroll > maxScroll) {\n container.scrollLeft = maxScroll\n momentumAnimationRef.current = null\n return\n }\n\n container.scrollLeft = newScroll\n // \u53EA\u5728\u6D4F\u89C8\u5668\u73AF\u5883\u89E6\u53D1 scroll \u4E8B\u4EF6\n if (typeof window !== 'undefined') {\n container.dispatchEvent(new Event('scroll', { bubbles: true }))\n }\n\n momentumAnimationRef.current = requestAnimationFrame(animate)\n }\n\n momentumAnimationRef.current = requestAnimationFrame(animate)\n }, [])\n\n // \u5904\u7406\u62D6\u62FD\u7ED3\u675F\n const handleDragEnd = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n if (!isDraggingRef.current) return\n\n // \u91CA\u653E pointer capture\n if (e.currentTarget.hasPointerCapture(e.pointerId)) {\n e.currentTarget.releasePointerCapture(e.pointerId)\n }\n\n isDraggingRef.current = false\n setIsDragging(false)\n\n const container = containerRef.current\n if (!container) return\n\n // \u6062\u590D\u6587\u672C\u9009\u62E9\n document.body.style.userSelect = 'auto'\n\n // \u542F\u52A8\u60EF\u6027\u6EDA\u52A8\n if (Math.abs(velocityRef.current) > MIN_VELOCITY) {\n animateMomentumScroll(container, velocityRef.current)\n }\n },\n [containerRef, animateMomentumScroll]\n )\n\n // \u6E05\u7406\uFF1A\u7EC4\u4EF6\u5378\u8F7D\u65F6\u53D6\u6D88\u52A8\u753B\n useEffect(() => {\n return () => {\n if (momentumAnimationRef.current !== null) {\n cancelAnimationFrame(momentumAnimationRef.current)\n }\n }\n }, [])\n\n // \u9632\u5FA1\u6027\u7F16\u7A0B:\u5904\u7406 undefined \u6216\u7A7A\u6570\u7EC4\n if (!prizes || prizes.length === 0) {\n return null\n }\n\n return (\n <div className={cn('prize-pool-content', theme === 'dark' ? 'aiui-dark' : '', className)}>\n <div\n className={cn(\n 'border-b ',\n 'py-[16px]',\n 'desktop:pt-[24px]',\n theme === 'dark' ? 'border-[#3A3C40]' : 'border-[#dadce0]'\n )}\n >\n <div\n className={cn(\n 'prize-pool-container',\n 'mb-4 px-[16px]',\n 'desktop:px-[24px]',\n 'lg-desktop:px-[32px]',\n className\n )}\n >\n {/* \u6807\u9898 */}\n <Heading size={2} className={cn('prize-pool-title', 'text-info-primary')}>\n {title}\n </Heading>\n </div>\n\n {/* \u5956\u54C1\u5217\u8868 - \u652F\u6301\u62D6\u62FD\u6EDA\u52A8 */}\n <div className=\"relative\">\n {/* \u5DE6\u8FB9\u7F18\u6E10\u9690\u906E\u7F69 */}\n {canScrollLeft && (\n <div\n className={cn(\n 'pointer-events-none',\n 'absolute inset-y-0 left-0 z-10',\n 'desktop:w-[48px] w-[32px]',\n theme === 'dark'\n ? 'bg-gradient-to-r from-[#1D1D1F] to-transparent'\n : 'bg-gradient-to-r from-[#EAEAEC] to-transparent'\n )}\n aria-hidden=\"true\"\n />\n )}\n\n {/* \u53F3\u8FB9\u7F18\u6E10\u9690\u906E\u7F69 */}\n {canScrollRight && (\n <div\n className={cn(\n 'pointer-events-none',\n 'absolute inset-y-0 right-0 z-10',\n 'desktop:w-[48px] w-[32px]',\n theme === 'dark'\n ? 'bg-gradient-to-l from-[#1D1D1F] to-transparent'\n : 'bg-gradient-to-l from-[#EAEAEC] to-transparent'\n )}\n aria-hidden=\"true\"\n />\n )}\n\n {/* \u6EDA\u52A8\u5BB9\u5668 */}\n <div\n ref={containerRef}\n className={cn(\n 'px-[16px]',\n 'desktop:px-[24px]',\n 'lg-desktop:px-[32px]',\n 'overflow-x-auto overflow-y-hidden',\n 'scrollbar-hide',\n isDragging && 'cursor-grabbing'\n )}\n style={{\n WebkitOverflowScrolling: 'touch', // iOS \u5E73\u6ED1\u6EDA\u52A8\n scrollBehavior: 'auto',\n }}\n onPointerDown={handleDragStart}\n onPointerMove={handleDragMove}\n onPointerUp={handleDragEnd}\n onPointerLeave={handleDragEnd}\n onPointerCancel={handleDragEnd}\n >\n <div\n className={cn(\n 'prize-pool-list',\n 'flex items-center gap-[16px]',\n 'cursor-grab active:cursor-grabbing',\n 'select-none'\n )}\n >\n {prizes.map((prize, index) => (\n <React.Fragment key={prize.prizeKey}>\n <PrizePoolItem prize={prize} />\n {/* \u6A2A\u5411\u5206\u9694\u7EBF */}\n {index < prizes.length - 1 && (\n <div\n className={cn(\n 'prize-divider',\n 'lg-desktop:h-[54px]',\n 'h-[48px] w-0',\n 'border-l',\n theme === 'dark' ? 'border-[#3A3C40]' : 'border-[#dadce0]',\n 'shrink-0'\n )}\n aria-hidden=\"true\"\n />\n )}\n </React.Fragment>\n ))}\n </div>\n </div>\n </div>\n </div>\n\n {/* \u4E2D\u5956\u4EBA\u540D\u5355 - \u81EA\u52A8\u6EDA\u52A8 */}\n {winningInfos && winningInfos.length > 0 && <WinnersList winningInfos={winningInfos} />}\n </div>\n )\n}\n\n// ============================================================================\n// PrizePoolItem \u5B50\u7EC4\u4EF6 - \u5355\u4E2A\u5956\u54C1\u5361\u7247\n// ============================================================================\n\ninterface PrizePoolItemProps {\n prize: Prize\n}\n\n/**\n * PrizePoolItem - \u5956\u54C1\u6C60\u4E2D\u7684\u5355\u4E2A\u5956\u54C1\u5361\u7247\n *\n * \u5C55\u793A\u5956\u54C1\u56FE\u7247\u3001\u6392\u540D\u548C\u540D\u79F0,\u5E26\u60AC\u505C\u6548\u679C\u3002\n */\nconst PrizePoolItem: React.FC<PrizePoolItemProps> = ({ prize }) => {\n return (\n <div\n className={cn(\n 'prize-pool-item',\n 'flex items-start gap-[8px]',\n 'shrink-0',\n 'h-[80px] w-[280px]',\n 'desktop:h-[96px] desktop:w-[320px]',\n 'lg-desktop:h-[108px]'\n )}\n >\n {/* \u5956\u54C1\u56FE\u7247 */}\n <Picture\n source={prize.image.url}\n alt={prize.image.alt || `\u5956\u54C1: ${prize.name}${prize.rank ? `, \u6392\u540D ${prize.rank}` : ''}`}\n className={cn(\n 'prize-pool-image',\n 'size-[80px]',\n 'desktop:size-[96px]',\n 'lg-desktop:size-[108px]',\n 'flex-none rounded-lg object-cover',\n 'pointer-events-none' // \u9632\u6B62\u56FE\u7247\u62D6\u62FD\u5E72\u6270\n )}\n />\n\n {/* \u5956\u54C1\u4FE1\u606F */}\n <div\n className={cn(\n 'prize-pool-info',\n 'flex flex-1 flex-col items-start justify-end',\n 'text-info-primary',\n 'min-w-0' // \u786E\u4FDD\u6587\u672C\u53EF\u4EE5\u88AB\u622A\u65AD\n )}\n >\n {/* \u6392\u540D\u6807\u8BC6(1st/2nd/3rd,\u53EF\u9009) */}\n <p\n className={cn(\n 'prize-rank',\n 'h-[20px] text-[14px] font-bold leading-[1.2] ',\n 'desktop:h-[22px] desktop:text-[16px]',\n 'lg-desktop:h-[25px] lg-desktop:text-[18px]',\n {\n 'text-[#FF6B00]': prize.rank === '1st' || prize.rank === '2nd' || prize.rank === '3rd', // \u6A59\u8272\n // 'text-[#767880]': prize.rank === 'others', // \u7070\u8272\n }\n )}\n >\n {prize?.rank || ''}\n </p>\n\n {/* \u5956\u54C1\u540D\u79F0 - \u6700\u591A\u663E\u793A 2 \u884C,\u8D85\u51FA\u663E\u793A\u7701\u7565\u53F7 */}\n <p\n className={cn(\n 'prize-pool-name',\n 'text-[14px] font-semibold leading-[1.4] ',\n 'desktop:text-[16px]',\n 'lg-desktop:text-[18px]',\n 'line-clamp-2 overflow-hidden text-ellipsis', // \u6700\u591A 2 \u884C\n 'text-info-primary',\n 'w-full'\n )}\n title={prize.name} // \u60AC\u505C\u663E\u793A\u5B8C\u6574\u540D\u79F0\n >\n {prize.name}\n </p>\n </div>\n </div>\n )\n}\n\n// ============================================================================\n// WinnersList \u5B50\u7EC4\u4EF6 - \u4E2D\u5956\u4EBA\u540D\u5355\u81EA\u52A8\u6EDA\u52A8(\u4F7F\u7528 Swiper)\n// ============================================================================\n\ninterface WinnersListProps {\n winningInfos: WinningInfo[]\n}\n\n/**\n * WinnersList - \u4E2D\u5956\u4EBA\u540D\u5355\u6EDA\u52A8\u7EC4\u4EF6\n *\n * \u4F7F\u7528\u7EAF CSS \u52A8\u753B\u5B9E\u73B0\u8DD1\u9A6C\u706F\u6548\u679C\n *\n * \u7279\u6027:\n * - \u7EAF CSS keyframe \u52A8\u753B\uFF0C\u65E0 JavaScript \u8BA1\u7B97\n * - \u8F7B\u91CF\u7EA7\u5B9E\u73B0\uFF0C\u65E0\u9700\u7B2C\u4E09\u65B9\u5E93\n * - \u54CD\u5E94\u5F0F\u8BBE\u8BA1\n * - \u7EBF\u6027\u6EDA\u52A8\uFF0C\u6D41\u7545\u81EA\u7136\n */\nconst WinnersList: React.FC<WinnersListProps> = ({ winningInfos }) => {\n // \u590D\u5236\u5185\u5BB9\u4EE5\u5B9E\u73B0\u65E0\u7F1D\u5FAA\u73AF\n // \u53EA\u67094\u6761\u8BB0\u5F55\u65F6\u4E0D\u590D\u5236,\u9759\u6001\u663E\u793A\n // \u67095\u6761\u6216\u66F4\u591A\u8BB0\u5F55\u65F6,\u590D\u52361\u6B21\u4EE5\u5B9E\u73B0\u65E0\u7F1D\u6EDA\u52A8\n const duplicatedInfos = winningInfos.length <= 4 ? winningInfos : [...winningInfos, ...winningInfos]\n\n // \u662F\u5426\u542F\u7528\u6EDA\u52A8\u52A8\u753B(\u53EA\u6709\u591A\u6761\u8BB0\u5F55\u65F6\u542F\u7528)\n const enableAnimation = winningInfos.length > 2\n\n return (\n <div className={cn('winners-list-wrapper', 'py-[12px]', 'laptop:py-[16px]', 'overflow-hidden')}>\n <div\n className={cn('winners-list-scroll', 'flex gap-[32px]', enableAnimation ? 'animate-marquee-x px-0' : 'px-4')}\n >\n {duplicatedInfos.map((winner, index) => (\n <div\n key={`${winner.winningKey}-${index}`}\n className={cn(\n 'winner-item',\n 'flex items-center gap-[8px]',\n 'whitespace-nowrap',\n 'text-[14px] font-semibold text-[#767880]',\n 'desktop:text-[16px]',\n 'lg-desktop:text-[18px]'\n )}\n >\n <span className=\"winner-name\">{winner.userName}</span>\n <span className=\"winner-text\">has won the</span>\n <span className=\"winner-prize\">{winner.prizeName}</span>\n </div>\n ))}\n </div>\n </div>\n )\n}\n\n// ============================================================================\n// \u9ED8\u8BA4\u5BFC\u51FA\n// ============================================================================\n\nexport default PrizePool\n"],
5
- "mappings": "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",
6
- "names": ["PrizePool_exports", "__export", "PrizePool", "PrizePool_default", "__toCommonJS", "import_jsx_runtime", "import_react", "import_helpers", "import_components", "import_useDraggableScroll", "MOMENTUM_FRICTION", "MIN_VELOCITY", "FRAME_TIME", "theme", "prizes", "title", "winningInfos", "className", "containerRef", "canScrollLeft", "canScrollRight", "isDraggingRef", "isDragging", "setIsDragging", "initialScrollLeftRef", "initialPointerXRef", "velocityRef", "lastPointerXRef", "lastTimeRef", "momentumAnimationRef", "handleDragStart", "e", "container", "handleDragMove", "currentX", "deltaPixels", "now", "timeDelta", "newScrollLeft", "maxScroll", "overshoot", "animateMomentumScroll", "initialVelocity", "velocity", "animate", "newScroll", "handleDragEnd", "prize", "index", "React", "PrizePoolItem", "WinnersList", "duplicatedInfos", "enableAnimation", "winner"]
4
+ "sourcesContent": ["/**\n * PrizePool - \u5956\u54C1\u6C60\u7EC4\u4EF6\n *\n * \u5C55\u793A\u6240\u6709\u53EF\u83B7\u5F97\u7684\u5956\u54C1\u5217\u8868,\u652F\u6301\u6A2A\u5411\u6EDA\u52A8\u548C\u9F20\u6807\u62D6\u62FD\u3002\n * \u57FA\u4E8E Figma \u8BBE\u8BA1\u7A3F\u5B9E\u73B0\u54CD\u5E94\u5F0F\u5E03\u5C40\u3002\n *\n * Figma \u8BBE\u8BA1\u7A3F: https://www.figma.com/design/DhWsPamqTM76eMHS0aIQqw\n * \u8BBE\u8BA1\u8282\u70B9: 498:6894 (Prize Pool section)\n *\n * @module PrizePool\n * @date 2026-01-30\n */\n\n'use client'\n\nimport React, { useState, useCallback, useEffect, useRef } from 'react'\nimport { cn } from '../../helpers/index.js'\nimport type { Prize, WinningInfo, PrizePoolProps } from './types.js'\nimport { Heading, Picture } from '../../components/index.js'\nimport { useDraggableScroll } from '../../hooks/useDraggableScroll.js'\n\n// ============================================================================\n// \u60EF\u6027\u6EDA\u52A8\u5E38\u91CF\n// ============================================================================\n\nconst MOMENTUM_FRICTION = 0.95 // \u6469\u64E6\u529B\u7CFB\u6570\nconst MIN_VELOCITY = 0.1 // \u6700\u5C0F\u901F\u5EA6\u9608\u503C\nconst FRAME_TIME = 16 // 16ms per frame (60fps)\n\n// ============================================================================\n// PrizePool \u7EC4\u4EF6\n// ============================================================================\n\n/**\n * PrizePool - \u5956\u54C1\u6C60\u5C55\u793A\u7EC4\u4EF6\n *\n * \u7279\u6027:\n * - \u6A2A\u5411\u6EDA\u52A8\u5217\u8868(mobile/tablet)\n * - \u9F20\u6807\u62D6\u62FD\u6EDA\u52A8\uFF08\u57FA\u4E8E Pointer Events API\uFF09\n * - \u89E6\u6478\u53CB\u597D\n * - \u8FB9\u7F18\u6E10\u9690\u6548\u679C\n * - \u663E\u793A\u5956\u54C1\u56FE\u7247\u3001\u6392\u540D(1st/2nd/3rd)\u548C\u540D\u79F0\n * - \u652F\u6301\u54CD\u5E94\u5F0F\u5E03\u5C40\n * - \u663E\u793A\u4E2D\u5956\u4EBA\u540D\u5355(\u81EA\u52A8\u6EDA\u52A8\u5FAA\u73AF)\n * - \u5B8C\u6574\u7684\u60EF\u6027\u6EDA\u52A8\u52A8\u753B\n */\nexport const PrizePool: React.FC<PrizePoolProps> = ({\n theme,\n prizes,\n title = 'Prize Pool',\n winningInfos,\n winnerNameTemplate,\n className,\n}) => {\n // Hooks \u5FC5\u987B\u5728\u6761\u4EF6\u5224\u65AD\u4E4B\u524D\u8C03\u7528\n // \u62D6\u62FD\u6EDA\u52A8 Hook\n const { containerRef, canScrollLeft, canScrollRight } = useDraggableScroll({\n dragSpeed: 1.2,\n enableMomentum: true,\n dragElastic: 0.1,\n })\n\n // \u62D6\u62FD\u72B6\u6001 - \u4F7F\u7528 ref \u907F\u514D\u95ED\u5305\u95EE\u9898\n const isDraggingRef = useRef(false)\n const [isDragging, setIsDragging] = useState(false)\n\n // \u62D6\u62FD\u76F8\u5173 refs\n const initialScrollLeftRef = useRef(0)\n const initialPointerXRef = useRef(0)\n const velocityRef = useRef(0)\n const lastPointerXRef = useRef(0)\n const lastTimeRef = useRef(0)\n const momentumAnimationRef = useRef<number | null>(null)\n\n // \u5904\u7406\u62D6\u62FD\u5F00\u59CB\n const handleDragStart = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n const container = containerRef.current\n if (!container) return\n\n // \u4F7F\u7528 setPointerCapture \u786E\u4FDD\u5373\u4F7F\u9F20\u6807\u79FB\u51FA\u5BB9\u5668\uFF0C\u4E8B\u4EF6\u4ECD\u80FD\u89E6\u53D1\n e.currentTarget.setPointerCapture(e.pointerId)\n\n isDraggingRef.current = true\n setIsDragging(true)\n initialScrollLeftRef.current = container.scrollLeft\n initialPointerXRef.current = e.clientX\n lastPointerXRef.current = e.clientX\n lastTimeRef.current = Date.now()\n velocityRef.current = 0\n\n // \u53D6\u6D88\u6B63\u5728\u8FDB\u884C\u7684\u60EF\u6027\u6EDA\u52A8\n if (momentumAnimationRef.current !== null) {\n cancelAnimationFrame(momentumAnimationRef.current)\n momentumAnimationRef.current = null\n }\n\n // \u53EA\u963B\u6B62\u6587\u672C\u9009\u62E9\uFF0C\u4E0D\u963B\u6B62 pointer \u4E8B\u4EF6\n document.body.style.userSelect = 'none'\n },\n [containerRef]\n )\n\n // \u5904\u7406\u62D6\u62FD\u4E2D\n const handleDragMove = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n if (!isDraggingRef.current) return\n\n const container = containerRef.current\n if (!container) return\n\n const currentX = e.clientX\n const deltaPixels = initialPointerXRef.current - currentX\n\n // \u8BA1\u7B97\u901F\u5EA6\uFF08\u7528\u4E8E\u60EF\u6027\u6EDA\u52A8\uFF09\n const now = Date.now()\n const timeDelta = Math.max(now - lastTimeRef.current, 1)\n velocityRef.current = ((currentX - lastPointerXRef.current) / timeDelta) * -1\n\n lastPointerXRef.current = currentX\n lastTimeRef.current = now\n\n // \u66F4\u65B0\u6EDA\u52A8\u4F4D\u7F6E\n const newScrollLeft = initialScrollLeftRef.current + deltaPixels\n const maxScroll = container.scrollWidth - container.clientWidth\n\n // \u8FB9\u754C\u7EA6\u675F + \u8D8A\u754C\u963B\u529B\n if (newScrollLeft < 0) {\n container.scrollLeft = newScrollLeft * 0.5\n } else if (newScrollLeft > maxScroll) {\n const overshoot = newScrollLeft - maxScroll\n container.scrollLeft = maxScroll + overshoot * 0.5\n } else {\n container.scrollLeft = newScrollLeft\n }\n\n // \u53EA\u5728\u6D4F\u89C8\u5668\u73AF\u5883\u89E6\u53D1 scroll \u4E8B\u4EF6\n if (typeof window !== 'undefined') {\n container.dispatchEvent(new Event('scroll', { bubbles: true }))\n }\n },\n [containerRef]\n )\n\n // \u60EF\u6027\u6EDA\u52A8\u52A8\u753B - \u5FC5\u987B\u5728 handleDragEnd \u4E4B\u524D\u5B9A\u4E49\n const animateMomentumScroll = useCallback((container: HTMLDivElement, initialVelocity: number) => {\n let velocity = initialVelocity\n const maxScroll = container.scrollWidth - container.clientWidth\n\n const animate = () => {\n velocity *= MOMENTUM_FRICTION\n\n if (Math.abs(velocity) < MIN_VELOCITY) {\n momentumAnimationRef.current = null\n return\n }\n\n const newScroll = container.scrollLeft + velocity * FRAME_TIME\n\n if (newScroll < 0) {\n container.scrollLeft = 0\n momentumAnimationRef.current = null\n return\n }\n\n if (newScroll > maxScroll) {\n container.scrollLeft = maxScroll\n momentumAnimationRef.current = null\n return\n }\n\n container.scrollLeft = newScroll\n // \u53EA\u5728\u6D4F\u89C8\u5668\u73AF\u5883\u89E6\u53D1 scroll \u4E8B\u4EF6\n if (typeof window !== 'undefined') {\n container.dispatchEvent(new Event('scroll', { bubbles: true }))\n }\n\n momentumAnimationRef.current = requestAnimationFrame(animate)\n }\n\n momentumAnimationRef.current = requestAnimationFrame(animate)\n }, [])\n\n // \u5904\u7406\u62D6\u62FD\u7ED3\u675F\n const handleDragEnd = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n if (!isDraggingRef.current) return\n\n // \u91CA\u653E pointer capture\n if (e.currentTarget.hasPointerCapture(e.pointerId)) {\n e.currentTarget.releasePointerCapture(e.pointerId)\n }\n\n isDraggingRef.current = false\n setIsDragging(false)\n\n const container = containerRef.current\n if (!container) return\n\n // \u6062\u590D\u6587\u672C\u9009\u62E9\n document.body.style.userSelect = 'auto'\n\n // \u542F\u52A8\u60EF\u6027\u6EDA\u52A8\n if (Math.abs(velocityRef.current) > MIN_VELOCITY) {\n animateMomentumScroll(container, velocityRef.current)\n }\n },\n [containerRef, animateMomentumScroll]\n )\n\n // \u6E05\u7406\uFF1A\u7EC4\u4EF6\u5378\u8F7D\u65F6\u53D6\u6D88\u52A8\u753B\n useEffect(() => {\n return () => {\n if (momentumAnimationRef.current !== null) {\n cancelAnimationFrame(momentumAnimationRef.current)\n }\n }\n }, [])\n\n // \u9632\u5FA1\u6027\u7F16\u7A0B:\u5904\u7406 undefined \u6216\u7A7A\u6570\u7EC4\n if (!prizes || prizes.length === 0) {\n return null\n }\n\n // Filter out try-again prizes from display (#646)\n const displayPrizes = prizes.filter(prize => prize.prizeKey !== 'try-again')\n\n return (\n <div className={cn('prize-pool-content', theme === 'dark' ? 'aiui-dark' : '', className)}>\n <div\n className={cn(\n 'border-b ',\n 'py-[16px]',\n 'desktop:pt-[24px]',\n theme === 'dark' ? 'border-[#3A3C40]' : 'border-[#dadce0]'\n )}\n >\n <div\n className={cn(\n 'prize-pool-container',\n 'mb-4 px-[16px]',\n 'desktop:px-[24px]',\n 'lg-desktop:px-[32px]',\n className\n )}\n >\n {/* \u6807\u9898 */}\n <Heading size={2} className={cn('prize-pool-title', 'text-info-primary')}>\n {title}\n </Heading>\n </div>\n\n {/* \u5956\u54C1\u5217\u8868 - \u652F\u6301\u62D6\u62FD\u6EDA\u52A8 */}\n <div className=\"relative\">\n {/* \u5DE6\u8FB9\u7F18\u6E10\u9690\u906E\u7F69 */}\n {canScrollLeft && (\n <div\n className={cn(\n 'pointer-events-none',\n 'absolute inset-y-0 left-0 z-10',\n 'desktop:w-[48px] w-[32px]',\n theme === 'dark'\n ? 'bg-gradient-to-r from-[#1D1D1F] to-transparent'\n : 'bg-gradient-to-r from-[#EAEAEC] to-transparent'\n )}\n aria-hidden=\"true\"\n />\n )}\n\n {/* \u53F3\u8FB9\u7F18\u6E10\u9690\u906E\u7F69 */}\n {canScrollRight && (\n <div\n className={cn(\n 'pointer-events-none',\n 'absolute inset-y-0 right-0 z-10',\n 'desktop:w-[48px] w-[32px]',\n theme === 'dark'\n ? 'bg-gradient-to-l from-[#1D1D1F] to-transparent'\n : 'bg-gradient-to-l from-[#EAEAEC] to-transparent'\n )}\n aria-hidden=\"true\"\n />\n )}\n\n {/* \u6EDA\u52A8\u5BB9\u5668 */}\n <div\n ref={containerRef}\n className={cn(\n 'px-[16px]',\n 'desktop:px-[24px]',\n 'lg-desktop:px-[32px]',\n 'overflow-x-auto overflow-y-hidden',\n 'scrollbar-hide',\n isDragging && 'cursor-grabbing'\n )}\n style={{\n WebkitOverflowScrolling: 'touch', // iOS \u5E73\u6ED1\u6EDA\u52A8\n scrollBehavior: 'auto',\n }}\n onPointerDown={handleDragStart}\n onPointerMove={handleDragMove}\n onPointerUp={handleDragEnd}\n onPointerLeave={handleDragEnd}\n onPointerCancel={handleDragEnd}\n >\n <div\n className={cn(\n 'prize-pool-list',\n 'flex items-center gap-[16px]',\n 'cursor-grab active:cursor-grabbing',\n 'select-none'\n )}\n >\n {displayPrizes.map((prize, index) => (\n <React.Fragment key={prize.prizeKey}>\n <PrizePoolItem prize={prize} />\n {/* \u6A2A\u5411\u5206\u9694\u7EBF */}\n {index < displayPrizes.length - 1 && (\n <div\n className={cn(\n 'prize-divider',\n 'lg-desktop:h-[54px]',\n 'h-[48px] w-0',\n 'border-l',\n theme === 'dark' ? 'border-[#3A3C40]' : 'border-[#dadce0]',\n 'shrink-0'\n )}\n aria-hidden=\"true\"\n />\n )}\n </React.Fragment>\n ))}\n </div>\n </div>\n </div>\n </div>\n\n {/* \u4E2D\u5956\u4EBA\u540D\u5355 - \u81EA\u52A8\u6EDA\u52A8 */}\n {winningInfos && winningInfos.length > 0 && (\n <WinnersList winningInfos={winningInfos} winnerNameTemplate={winnerNameTemplate} />\n )}\n </div>\n )\n}\n\n// ============================================================================\n// PrizePoolItem \u5B50\u7EC4\u4EF6 - \u5355\u4E2A\u5956\u54C1\u5361\u7247\n// ============================================================================\n\ninterface PrizePoolItemProps {\n prize: Prize\n}\n\n/**\n * PrizePoolItem - \u5956\u54C1\u6C60\u4E2D\u7684\u5355\u4E2A\u5956\u54C1\u5361\u7247\n *\n * \u5C55\u793A\u5956\u54C1\u56FE\u7247\u3001\u6392\u540D\u548C\u540D\u79F0,\u5E26\u60AC\u505C\u6548\u679C\u3002\n */\nconst PrizePoolItem: React.FC<PrizePoolItemProps> = ({ prize }) => {\n return (\n <div\n className={cn(\n 'prize-pool-item',\n 'flex items-start gap-[8px]',\n 'shrink-0',\n 'h-[80px] w-[280px]',\n 'desktop:h-[96px] desktop:w-[320px]',\n 'lg-desktop:h-[108px]'\n )}\n >\n {/* \u5956\u54C1\u56FE\u7247 */}\n <Picture\n source={prize.image.url}\n alt={prize.image.alt || `\u5956\u54C1: ${prize.name}${prize.rank ? `, \u6392\u540D ${prize.rank}` : ''}`}\n className={cn(\n 'prize-pool-image',\n 'size-[80px]',\n 'desktop:size-[96px]',\n 'lg-desktop:size-[108px]',\n 'flex-none rounded-lg object-cover',\n 'pointer-events-none' // \u9632\u6B62\u56FE\u7247\u62D6\u62FD\u5E72\u6270\n )}\n />\n\n {/* \u5956\u54C1\u4FE1\u606F */}\n <div\n className={cn(\n 'prize-pool-info',\n 'flex flex-1 flex-col items-start justify-end',\n 'text-info-primary',\n 'min-w-0' // \u786E\u4FDD\u6587\u672C\u53EF\u4EE5\u88AB\u622A\u65AD\n )}\n >\n {/* \u6392\u540D\u6807\u8BC6(1st/2nd/3rd,\u53EF\u9009) */}\n <p\n className={cn(\n 'prize-rank',\n 'h-[20px] text-[14px] font-bold leading-[1.2] ',\n 'desktop:h-[22px] desktop:text-[16px]',\n 'lg-desktop:h-[25px] lg-desktop:text-[18px]',\n {\n 'text-[#FF6B00]': prize.rank === '1st' || prize.rank === '2nd' || prize.rank === '3rd', // \u6A59\u8272\n // 'text-[#767880]': prize.rank === 'others', // \u7070\u8272\n }\n )}\n >\n {prize?.rank || ''}\n </p>\n\n {/* \u5956\u54C1\u540D\u79F0 - \u6700\u591A\u663E\u793A 2 \u884C,\u8D85\u51FA\u663E\u793A\u7701\u7565\u53F7 */}\n <p\n className={cn(\n 'prize-pool-name',\n 'text-[14px] font-semibold leading-[1.4] ',\n 'desktop:text-[16px]',\n 'lg-desktop:text-[18px]',\n 'line-clamp-2 overflow-hidden text-ellipsis', // \u6700\u591A 2 \u884C\n 'text-info-primary',\n 'w-full'\n )}\n title={prize.name} // \u60AC\u505C\u663E\u793A\u5B8C\u6574\u540D\u79F0\n >\n {prize.name}\n </p>\n </div>\n </div>\n )\n}\n\n// ============================================================================\n// WinnersList \u5B50\u7EC4\u4EF6 - \u4E2D\u5956\u4EBA\u540D\u5355\u81EA\u52A8\u6EDA\u52A8(\u4F7F\u7528 Swiper)\n// ============================================================================\n\ninterface WinnersListProps {\n winningInfos: WinningInfo[]\n /** Ticker \u6587\u6848\u6A21\u677F\uFF0C\u652F\u6301 {{name}} \u548C {{prize}} \u53D8\u91CF\u3002\u4E0D\u914D\u7F6E\u65F6\u56DE\u9000\u5230\u786C\u7F16\u7801\u9ED8\u8BA4\u3002 */\n winnerNameTemplate?: string\n}\n\n/**\n * WinnersList - \u4E2D\u5956\u4EBA\u540D\u5355\u6EDA\u52A8\u7EC4\u4EF6\n *\n * \u4F7F\u7528\u7EAF CSS \u52A8\u753B\u5B9E\u73B0\u8DD1\u9A6C\u706F\u6548\u679C\n *\n * \u7279\u6027:\n * - \u7EAF CSS keyframe \u52A8\u753B\uFF0C\u65E0 JavaScript \u8BA1\u7B97\n * - \u8F7B\u91CF\u7EA7\u5B9E\u73B0\uFF0C\u65E0\u9700\u7B2C\u4E09\u65B9\u5E93\n * - \u54CD\u5E94\u5F0F\u8BBE\u8BA1\n * - \u7EBF\u6027\u6EDA\u52A8\uFF0C\u6D41\u7545\u81EA\u7136\n */\nconst WinnersList: React.FC<WinnersListProps> = ({ winningInfos, winnerNameTemplate }) => {\n // \u590D\u5236\u5185\u5BB9\u4EE5\u5B9E\u73B0\u65E0\u7F1D\u5FAA\u73AF\n // \u53EA\u67094\u6761\u8BB0\u5F55\u65F6\u4E0D\u590D\u5236,\u9759\u6001\u663E\u793A\n // \u67095\u6761\u6216\u66F4\u591A\u8BB0\u5F55\u65F6,\u590D\u52361\u6B21\u4EE5\u5B9E\u73B0\u65E0\u7F1D\u6EDA\u52A8\n const duplicatedInfos = winningInfos.length <= 4 ? winningInfos : [...winningInfos, ...winningInfos]\n\n // \u662F\u5426\u542F\u7528\u6EDA\u52A8\u52A8\u753B(\u53EA\u6709\u591A\u6761\u8BB0\u5F55\u65F6\u542F\u7528)\n const enableAnimation = winningInfos.length > 2\n\n // \u89E3\u6790 ticker \u6A21\u677F\u5B57\u7B26\u4E32\uFF0C\u5C06 {{name}} \u548C {{prize}} \u66FF\u6362\u4E3A\u5B9E\u9645\u503C\n // \u4E0D\u542B\u53D8\u91CF\u65F6\u56DE\u9000\u5230\u539F\u59CB\u5B57\u7B26\u4E32\uFF0C\u65E0\u914D\u7F6E\u65F6\u56DE\u9000\u5230\u786C\u7F16\u7801\u9ED8\u8BA4\u503C\n const renderTickerPhrase = (winner: WinningInfo): string => {\n const template = winnerNameTemplate || '{{name}} just won {{prize}}!'\n return template.replace(/\\{\\{name\\}\\}/g, winner.userName).replace(/\\{\\{prize\\}\\}/g, winner.prizeName)\n }\n\n return (\n <div className={cn('winners-list-wrapper', 'py-[12px]', 'laptop:py-[16px]', 'overflow-hidden')}>\n <div\n className={cn('winners-list-scroll', 'flex gap-[32px]', enableAnimation ? 'animate-marquee-x px-0' : 'px-4')}\n >\n {duplicatedInfos.map((winner, index) => (\n <div\n key={`${winner.winningKey}-${index}`}\n className={cn(\n 'winner-item',\n 'flex items-center gap-[8px]',\n 'whitespace-nowrap',\n 'text-[14px] font-semibold text-[#767880]',\n 'desktop:text-[16px]',\n 'lg-desktop:text-[18px]'\n )}\n >\n <span className=\"winner-phrase\">{renderTickerPhrase(winner)}</span>\n </div>\n ))}\n </div>\n </div>\n )\n}\n\n// ============================================================================\n// \u9ED8\u8BA4\u5BFC\u51FA\n// ============================================================================\n\nexport default PrizePool\n"],
5
+ "mappings": "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",
6
+ "names": ["PrizePool_exports", "__export", "PrizePool", "PrizePool_default", "__toCommonJS", "import_jsx_runtime", "import_react", "import_helpers", "import_components", "import_useDraggableScroll", "MOMENTUM_FRICTION", "MIN_VELOCITY", "FRAME_TIME", "theme", "prizes", "title", "winningInfos", "winnerNameTemplate", "className", "containerRef", "canScrollLeft", "canScrollRight", "isDraggingRef", "isDragging", "setIsDragging", "initialScrollLeftRef", "initialPointerXRef", "velocityRef", "lastPointerXRef", "lastTimeRef", "momentumAnimationRef", "handleDragStart", "e", "container", "handleDragMove", "currentX", "deltaPixels", "now", "timeDelta", "newScrollLeft", "maxScroll", "overshoot", "animateMomentumScroll", "initialVelocity", "velocity", "animate", "newScroll", "handleDragEnd", "displayPrizes", "prize", "index", "React", "PrizePoolItem", "WinnersList", "duplicatedInfos", "enableAnimation", "renderTickerPhrase", "winner"]
7
7
  }
@@ -21,7 +21,7 @@ import type { WinnerModalProps } from './types.js';
21
21
  * - 确认按钮
22
22
  * - 右上角关闭按钮
23
23
  */
24
- export declare const WinnerModal: ({ isOpen, prize, title, prizeTitle, prizeImage, prizeDescription, learnMoreUrl, learnMoreText, onClose, confirmText, onConfirm, confirmUrl, className, couponCode, couponDiscount, couponUnit, expiresAt, codeText, copyText, copiedText, onCopyCode, theme, }: WinnerModalProps & {
24
+ export declare const WinnerModal: ({ isOpen, prize, title, prizeTitle, prizeImage, prizeDescription, winnerNote, learnMoreUrl, learnMoreText, onClose, confirmText, onConfirm, confirmUrl, className, couponCode, couponDiscount, couponUnit, expiresAt, codeText, copyText, copiedText, onCopyCode, theme, }: WinnerModalProps & {
25
25
  theme?: "light" | "dark";
26
26
  }) => import("react/jsx-runtime").JSX.Element | null;
27
27
  export default WinnerModal;
@@ -1,2 +1,2 @@
1
- "use strict";"use client";var Y=Object.create;var x=Object.defineProperty;var _=Object.getOwnPropertyDescriptor;var j=Object.getOwnPropertyNames;var D=Object.getPrototypeOf,F=Object.prototype.hasOwnProperty;var G=(a,e)=>{for(var l in e)x(a,l,{get:e[l],enumerable:!0})},w=(a,e,l,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let p of j(e))!F.call(a,p)&&p!==l&&x(a,p,{get:()=>e[p],enumerable:!(o=_(e,p))||o.enumerable});return a};var I=(a,e,l)=>(l=a!=null?Y(D(a)):{},w(e||!a||!a.__esModule?x(l,"default",{value:a,enumerable:!0}):l,a)),J=a=>w(x({},"__esModule",{value:!0}),a);var K={};G(K,{WinnerModal:()=>y,default:()=>q});module.exports=J(K);var t=require("react/jsx-runtime"),i=I(require("react")),n=require("../../helpers/index.js"),s=require("../../components/index.js"),k=require("./BaseModal.js");const y=({isOpen:a,prize:e,title:l="You Have Won",prizeTitle:o,prizeImage:p,prizeDescription:f,learnMoreUrl:d,learnMoreText:W="Learn More",onClose:u,confirmText:B="Okay, Got It",onConfirm:M,confirmUrl:b,className:O,couponCode:m,couponDiscount:c,couponUnit:P="Off",expiresAt:N,codeText:T="CODE:",copyText:C="COPY",copiedText:E="COPIED",onCopyCode:v,theme:H="light"})=>{const[R,g]=i.default.useState(!1),r=i.default.useRef(null);i.default.useEffect(()=>()=>{r.current&&clearTimeout(r.current)},[]);const L=h=>{r.current&&clearTimeout(r.current),navigator.clipboard.writeText(h),v&&v?.(h),g(!0),r.current=setTimeout(()=>{g(!1)},3e3)};if(!a||!e)return null;const S=()=>{b&&window.open(b,"_blank","noopener,noreferrer"),M?.(),u()};return(0,t.jsxs)(k.BaseModal,{isOpen:a,onClose:u,className:O,maxWidth:"max-w-[358px] laptop:max-w-[480px]",ariaLabelledBy:"winner-modal-title",theme:H,children:[(0,t.jsxs)("div",{className:"laptop:px-8 laptop:pt-4 flex flex-col items-center px-6 pt-2",children:[(0,t.jsxs)("div",{className:"w-full",children:[(0,t.jsx)(s.Heading,{size:2,className:(0,n.cn)("laptop:mb-2 mb-1 text-center tracking-[-0.32px]"),children:l}),(0,t.jsx)("p",{className:"laptop:text-[18px] desktop:text-[16px] text-center text-[14px] font-[700] text-[#1D1D1F]",children:o||e.name}),d&&(0,t.jsx)("div",{className:"laptop:mt-4 mt-3 text-center",children:(0,t.jsx)("a",{href:d,target:"_blank",rel:"noopener noreferrer",className:(0,n.cn)("laptop:text-[14px] text-center text-[12px]","text-blue-600 hover:text-blue-700","font-medium underline","transition-colors"),children:W})})]}),(0,t.jsx)("div",{className:(0,n.cn)("mx-auto flex items-center justify-center","laptop:my-6 laptop:size-[200px] my-4 size-[160px]"),children:(p||e.image)&&(0,t.jsx)(s.Picture,{source:p||e?.image?.url,alt:e?.image?.alt||o||e?.name,className:(0,n.cn)("h-auto w-full")})}),(c||m)&&(0,t.jsxs)("div",{className:"laptop:mb-4 mb-2 flex w-full flex-col items-center",children:[c&&(0,t.jsxs)("span",{className:"text-brand-0 laptop:mb-2 laptop:text-[18px] mb-1 text-[16px] font-bold",children:[c," ",P]}),m&&(0,t.jsxs)("div",{className:"text-brand-0 laptop:text-[16px] flex items-center gap-2 text-center text-[14px] font-bold",children:[(0,t.jsxs)("span",{className:"max-w-[300px] truncate",children:[T,m]}),(0,t.jsx)("button",{onClick:()=>L(m),className:"underline",style:{minWidth:60},children:R?E:C})]}),N&&(0,t.jsxs)("span",{className:"laptop:mt-2 mt-1 text-[12px] text-[#767880]",children:["\u6709\u6548\u671F\u81F3\uFF1A",N]})]}),f&&(0,t.jsx)("p",{className:(0,n.cn)("laptop:text-[16px] laptop:mb-2 mb-1 px-4 text-center text-[14px] font-[700] text-[#767880]"),children:f})]}),(0,t.jsx)("div",{className:"laptop:px-8 laptop:pb-8 px-6 pb-6",children:(0,t.jsx)(s.Button,{onClick:S,className:(0,n.cn)("w-full"),children:B})})]})};var q=y;
1
+ "use strict";"use client";var _=Object.create;var x=Object.defineProperty;var j=Object.getOwnPropertyDescriptor;var D=Object.getOwnPropertyNames;var F=Object.getPrototypeOf,G=Object.prototype.hasOwnProperty;var I=(a,e)=>{for(var l in e)x(a,l,{get:e[l],enumerable:!0})},k=(a,e,l,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let p of D(e))!G.call(a,p)&&p!==l&&x(a,p,{get:()=>e[p],enumerable:!(o=j(e,p))||o.enumerable});return a};var J=(a,e,l)=>(l=a!=null?_(F(a)):{},k(e||!a||!a.__esModule?x(l,"default",{value:a,enumerable:!0}):l,a)),q=a=>k(x({},"__esModule",{value:!0}),a);var Q={};I(Q,{WinnerModal:()=>W,default:()=>K});module.exports=q(Q);var t=require("react/jsx-runtime"),i=J(require("react")),n=require("../../helpers/index.js"),s=require("../../components/index.js"),y=require("./BaseModal.js");const W=({isOpen:a,prize:e,title:l="You Have Won",prizeTitle:o,prizeImage:p,prizeDescription:d,winnerNote:f,learnMoreUrl:u,learnMoreText:B="Learn More",onClose:b,confirmText:M="Okay, Got It",onConfirm:O,confirmUrl:N,className:P,couponCode:r,couponDiscount:c,couponUnit:T="Off",expiresAt:v,codeText:C="CODE:",copyText:E="COPY",copiedText:H="COPIED",onCopyCode:h,theme:R="light"})=>{const[L,g]=i.default.useState(!1),m=i.default.useRef(null);i.default.useEffect(()=>()=>{m.current&&clearTimeout(m.current)},[]);const S=w=>{m.current&&clearTimeout(m.current),navigator.clipboard.writeText(w),h&&h?.(w),g(!0),m.current=setTimeout(()=>{g(!1)},3e3)};if(!a||!e)return null;const Y=()=>{N&&window.open(N,"_blank","noopener,noreferrer"),O?.(),b()};return(0,t.jsxs)(y.BaseModal,{isOpen:a,onClose:b,className:P,maxWidth:"max-w-[358px] laptop:max-w-[480px]",ariaLabelledBy:"winner-modal-title",theme:R,children:[(0,t.jsxs)("div",{className:"laptop:px-8 laptop:pt-4 flex flex-col items-center px-6 pt-2",children:[(0,t.jsxs)("div",{className:"w-full",children:[(0,t.jsx)(s.Heading,{size:2,className:(0,n.cn)("laptop:mb-2 mb-1 text-center tracking-[-0.32px]"),children:l}),(0,t.jsx)("p",{className:"laptop:text-[18px] desktop:text-[16px] text-center text-[14px] font-[700] text-[#1D1D1F]",children:o||e.name}),u&&(0,t.jsx)("div",{className:"laptop:mt-4 mt-3 hidden text-center",children:(0,t.jsx)("a",{href:u,target:"_blank",rel:"noopener noreferrer",className:(0,n.cn)("laptop:text-[14px] text-center text-[12px]","text-blue-600 hover:text-blue-700","font-medium underline","transition-colors"),children:B})})]}),(0,t.jsx)("div",{className:(0,n.cn)("mx-auto flex items-center justify-center","laptop:my-6 laptop:size-[200px] my-4 size-[160px]"),children:(p||e.image)&&(0,t.jsx)(s.Picture,{source:p||e?.image?.url,alt:e?.image?.alt||o||e?.name,className:(0,n.cn)("h-auto w-full")})}),(c||r)&&(0,t.jsxs)("div",{className:"laptop:mb-4 mb-2 flex w-full flex-col items-center",children:[c&&(0,t.jsxs)("span",{className:"text-brand-0 laptop:mb-2 laptop:text-[18px] mb-1 text-[16px] font-bold",children:[c," ",T]}),r&&(0,t.jsxs)("div",{className:"text-brand-0 laptop:text-[16px] flex items-center gap-2 text-center text-[14px] font-bold",children:[(0,t.jsxs)("span",{className:"max-w-[300px] truncate",children:[C,r]}),(0,t.jsx)("button",{onClick:()=>S(r),className:"underline",style:{minWidth:60},children:L?H:E})]}),v&&(0,t.jsxs)("span",{className:"laptop:mt-2 mt-1 text-[12px] text-[#767880]",children:["\u6709\u6548\u671F\u81F3\uFF1A",v]})]}),f??d?(0,t.jsx)("p",{className:(0,n.cn)("laptop:text-[16px] laptop:mb-2 mb-1 px-4 text-center text-[14px] font-[700] text-[#767880]"),children:f??d}):null]}),(0,t.jsx)("div",{className:"laptop:px-8 laptop:pb-8 px-6 pb-6",children:(0,t.jsx)(s.Button,{onClick:Y,className:(0,n.cn)("w-full"),children:M})})]})};var K=W;
2
2
  //# sourceMappingURL=WinnerModal.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/biz-components/LotteryShared/WinnerModal.tsx"],
4
- "sourcesContent": ["/**\n * WinnerModal - \u4E2D\u5956\u5F39\u7A97\u7EC4\u4EF6\n *\n * \u57FA\u4E8E\u622A\u56FE\u8BBE\u8BA1\u5B9E\u73B0\u7684\u4E2D\u5956\u7ED3\u679C\u5C55\u793A\u5F39\u7A97\u3002\n * \u5305\u542B\u6807\u9898\u3001\u5956\u54C1\u4FE1\u606F\u3001\u4F18\u60E0\u7801\u548C\u786E\u8BA4\u6309\u94AE\u3002\n *\n * @module WinnerModal\n * @date 2025-12-24\n */\n\n'use client'\n\nimport React from 'react'\nimport { cn } from '../../helpers/index.js'\nimport type { WinnerModalProps } from './types.js'\nimport { Picture, Heading, Button } from '../../components/index.js'\nimport { BaseModal } from './BaseModal.js'\n\n// ============================================================================\n// WinnerModal \u7EC4\u4EF6\n// ============================================================================\n\n/**\n * WinnerModal \u4E2D\u5956\u5F39\u7A97\u7EC4\u4EF6\n *\n * \u6839\u636E\u8BBE\u8BA1\u7A3F\u5B9E\u73B0\u7684\u4E2D\u5956\u7ED3\u679C\u5C55\u793A\u5F39\u7A97,\u5305\u542B:\n * - \u534A\u900F\u660E\u906E\u7F69\u5C42\n * - \u767D\u8272\u5706\u89D2\u5361\u7247\u5BB9\u5668\n * - \u6807\u9898 \"You Have Won\"\n * - \u5956\u54C1\u540D\u79F0\n * - \u4F18\u60E0\u5238\u56FE\u7247\uFF0820% Off\uFF09\n * - \u4F18\u60E0\u7801\u548C\u8FC7\u671F\u65F6\u95F4\n * - \u786E\u8BA4\u6309\u94AE\n * - \u53F3\u4E0A\u89D2\u5173\u95ED\u6309\u94AE\n */\nexport const WinnerModal = ({\n isOpen,\n prize,\n title = 'You Have Won',\n prizeTitle,\n prizeImage,\n prizeDescription,\n learnMoreUrl,\n learnMoreText = 'Learn More',\n onClose,\n confirmText = 'Okay, Got It',\n onConfirm,\n confirmUrl,\n className,\n couponCode,\n couponDiscount,\n couponUnit = 'Off',\n expiresAt,\n codeText = 'CODE:',\n copyText = 'COPY',\n copiedText = 'COPIED',\n onCopyCode,\n theme = 'light',\n}: WinnerModalProps & { theme?: 'light' | 'dark' }) => {\n // \u590D\u5236\u72B6\u6001\n const [copied, setCopied] = React.useState(false)\n const timerRef = React.useRef<NodeJS.Timeout | null>(null)\n\n React.useEffect(() => {\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current)\n }\n }, [])\n\n // \u590D\u5236\u64CD\u4F5C\n const handleCopy = (code: string) => {\n if (timerRef.current) clearTimeout(timerRef.current)\n\n navigator.clipboard.writeText(code)\n if (onCopyCode) onCopyCode?.(code)\n setCopied(true)\n timerRef.current = setTimeout(() => {\n setCopied(false)\n }, 3000)\n }\n\n // \u4E0D\u663E\u793A\u5F39\u7A97\u6216\u65E0\u5956\u54C1\u6570\u636E\u65F6\u8FD4\u56DE null\n if (!isOpen || !prize) {\n return null\n }\n\n // \u786E\u8BA4\u6309\u94AE\u70B9\u51FB\u5904\u7406\n const handleConfirm = () => {\n if (confirmUrl) {\n window.open(confirmUrl, '_blank', 'noopener,noreferrer')\n }\n onConfirm?.()\n onClose()\n }\n\n return (\n <BaseModal\n isOpen={isOpen}\n onClose={onClose}\n className={className}\n maxWidth=\"max-w-[358px] laptop:max-w-[480px]\"\n ariaLabelledBy=\"winner-modal-title\"\n theme={theme}\n >\n <div className=\"laptop:px-8 laptop:pt-4 flex flex-col items-center px-6 pt-2\">\n {/* =================================================================\n \u5F39\u7A97\u6807\u9898\n ================================================================= */}\n <div className=\"w-full\">\n <Heading size={2} className={cn('laptop:mb-2 mb-1 text-center tracking-[-0.32px]')}>\n {title}\n </Heading>\n\n <p className=\"laptop:text-[18px] desktop:text-[16px] text-center text-[14px] font-[700] text-[#1D1D1F]\">\n {prizeTitle || prize.name}\n </p>\n\n {/* =================================================================\n Learn More \u6309\u94AE\n ================================================================= */}\n {learnMoreUrl && (\n <div className=\"laptop:mt-4 mt-3 text-center\">\n <a\n href={learnMoreUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n 'laptop:text-[14px] text-center text-[12px]',\n 'text-blue-600 hover:text-blue-700',\n 'font-medium underline',\n 'transition-colors'\n )}\n >\n {learnMoreText}\n </a>\n </div>\n )}\n </div>\n\n {/* =================================================================\n \u5956\u54C1\u56FE\u7247\n ================================================================= */}\n\n <div\n className={cn(\n 'mx-auto flex items-center justify-center',\n 'laptop:my-6 laptop:size-[200px] my-4 size-[160px]'\n )}\n >\n {(prizeImage || prize.image) && (\n <Picture\n source={prizeImage || prize?.image?.url}\n alt={prize?.image?.alt || prizeTitle || prize?.name}\n className={cn('h-auto w-full')}\n />\n )}\n </div>\n\n {/* =================================================================\n \u6298\u6263\u548C\u4F18\u60E0\u7801\u590D\u5236\n ================================================================= */}\n {(couponDiscount || couponCode) && (\n <div className=\"laptop:mb-4 mb-2 flex w-full flex-col items-center\">\n {couponDiscount && (\n <span className=\"text-brand-0 laptop:mb-2 laptop:text-[18px] mb-1 text-[16px] font-bold\">\n {couponDiscount} {couponUnit}\n </span>\n )}\n {couponCode && (\n <div className=\"text-brand-0 laptop:text-[16px] flex items-center gap-2 text-center text-[14px] font-bold\">\n <span className=\"max-w-[300px] truncate\">\n {codeText}\n {couponCode}\n </span>\n <button onClick={() => handleCopy(couponCode!)} className=\"underline\" style={{ minWidth: 60 }}>\n {copied ? copiedText : copyText}\n </button>\n </div>\n )}\n {expiresAt && <span className=\"laptop:mt-2 mt-1 text-[12px] text-[#767880]\">\u6709\u6548\u671F\u81F3\uFF1A{expiresAt}</span>}\n </div>\n )}\n\n {/* =================================================================\n \u5956\u54C1\u8BE6\u60C5\u63CF\u8FF0\n ================================================================= */}\n {prizeDescription && (\n <p\n className={cn('laptop:text-[16px] laptop:mb-2 mb-1 px-4 text-center text-[14px] font-[700] text-[#767880]')}\n >\n {prizeDescription}\n </p>\n )}\n </div>\n\n {/* =================================================================\n \u786E\u8BA4\u6309\u94AE\n ================================================================= */}\n <div className=\"laptop:px-8 laptop:pb-8 px-6 pb-6\">\n <Button onClick={handleConfirm} className={cn('w-full')}>\n {confirmText}\n </Button>\n </div>\n </BaseModal>\n )\n}\n\n// ============================================================================\n// \u9ED8\u8BA4\u5BFC\u51FA\n// ============================================================================\n\nexport default WinnerModal\n"],
5
- "mappings": "ukBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,iBAAAE,EAAA,YAAAC,IAAA,eAAAC,EAAAJ,GA4GQ,IAAAK,EAAA,6BAhGRC,EAAkB,oBAClBC,EAAmB,kCAEnBC,EAAyC,qCACzCC,EAA0B,0BAmBnB,MAAMP,EAAc,CAAC,CAC1B,OAAAQ,EACA,MAAAC,EACA,MAAAC,EAAQ,eACR,WAAAC,EACA,WAAAC,EACA,iBAAAC,EACA,aAAAC,EACA,cAAAC,EAAgB,aAChB,QAAAC,EACA,YAAAC,EAAc,eACd,UAAAC,EACA,WAAAC,EACA,UAAAC,EACA,WAAAC,EACA,eAAAC,EACA,WAAAC,EAAa,MACb,UAAAC,EACA,SAAAC,EAAW,QACX,SAAAC,EAAW,OACX,WAAAC,EAAa,SACb,WAAAC,EACA,MAAAC,EAAQ,OACV,IAAuD,CAErD,KAAM,CAACC,EAAQC,CAAS,EAAI,EAAAC,QAAM,SAAS,EAAK,EAC1CC,EAAW,EAAAD,QAAM,OAA8B,IAAI,EAEzD,EAAAA,QAAM,UAAU,IACP,IAAM,CACPC,EAAS,SAAS,aAAaA,EAAS,OAAO,CACrD,EACC,CAAC,CAAC,EAGL,MAAMC,EAAcC,GAAiB,CAC/BF,EAAS,SAAS,aAAaA,EAAS,OAAO,EAEnD,UAAU,UAAU,UAAUE,CAAI,EAC9BP,GAAYA,IAAaO,CAAI,EACjCJ,EAAU,EAAI,EACdE,EAAS,QAAU,WAAW,IAAM,CAClCF,EAAU,EAAK,CACjB,EAAG,GAAI,CACT,EAGA,GAAI,CAACvB,GAAU,CAACC,EACd,OAAO,KAIT,MAAM2B,EAAgB,IAAM,CACtBjB,GACF,OAAO,KAAKA,EAAY,SAAU,qBAAqB,EAEzDD,IAAY,EACZF,EAAQ,CACV,EAEA,SACE,QAAC,aACC,OAAQR,EACR,QAASQ,EACT,UAAWI,EACX,SAAS,qCACT,eAAe,qBACf,MAAOS,EAEP,qBAAC,OAAI,UAAU,+DAIb,qBAAC,OAAI,UAAU,SACb,oBAAC,WAAQ,KAAM,EAAG,aAAW,MAAG,iDAAiD,EAC9E,SAAAnB,EACH,KAEA,OAAC,KAAE,UAAU,2FACV,SAAAC,GAAcF,EAAM,KACvB,EAKCK,MACC,OAAC,OAAI,UAAU,+BACb,mBAAC,KACC,KAAMA,EACN,OAAO,SACP,IAAI,sBACJ,aAAW,MACT,6CACA,oCACA,wBACA,mBACF,EAEC,SAAAC,EACH,EACF,GAEJ,KAMA,OAAC,OACC,aAAW,MACT,2CACA,mDACF,EAEE,UAAAH,GAAcH,EAAM,WACpB,OAAC,WACC,OAAQG,GAAcH,GAAO,OAAO,IACpC,IAAKA,GAAO,OAAO,KAAOE,GAAcF,GAAO,KAC/C,aAAW,MAAG,eAAe,EAC/B,EAEJ,GAKEa,GAAkBD,OAClB,QAAC,OAAI,UAAU,qDACZ,UAAAC,MACC,QAAC,QAAK,UAAU,yEACb,UAAAA,EAAe,IAAEC,GACpB,EAEDF,MACC,QAAC,OAAI,UAAU,4FACb,qBAAC,QAAK,UAAU,yBACb,UAAAI,EACAJ,GACH,KACA,OAAC,UAAO,QAAS,IAAMa,EAAWb,CAAW,EAAG,UAAU,YAAY,MAAO,CAAE,SAAU,EAAG,EACzF,SAAAS,EAASH,EAAaD,EACzB,GACF,EAEDF,MAAa,QAAC,QAAK,UAAU,8CAA8C,2CAAMA,GAAU,GAC9F,EAMDX,MACC,OAAC,KACC,aAAW,MAAG,4FAA4F,EAEzG,SAAAA,EACH,GAEJ,KAKA,OAAC,OAAI,UAAU,oCACb,mBAAC,UAAO,QAASuB,EAAe,aAAW,MAAG,QAAQ,EACnD,SAAAnB,EACH,EACF,GACF,CAEJ,EAMA,IAAOhB,EAAQD",
6
- "names": ["WinnerModal_exports", "__export", "WinnerModal", "WinnerModal_default", "__toCommonJS", "import_jsx_runtime", "import_react", "import_helpers", "import_components", "import_BaseModal", "isOpen", "prize", "title", "prizeTitle", "prizeImage", "prizeDescription", "learnMoreUrl", "learnMoreText", "onClose", "confirmText", "onConfirm", "confirmUrl", "className", "couponCode", "couponDiscount", "couponUnit", "expiresAt", "codeText", "copyText", "copiedText", "onCopyCode", "theme", "copied", "setCopied", "React", "timerRef", "handleCopy", "code", "handleConfirm"]
4
+ "sourcesContent": ["/**\n * WinnerModal - \u4E2D\u5956\u5F39\u7A97\u7EC4\u4EF6\n *\n * \u57FA\u4E8E\u622A\u56FE\u8BBE\u8BA1\u5B9E\u73B0\u7684\u4E2D\u5956\u7ED3\u679C\u5C55\u793A\u5F39\u7A97\u3002\n * \u5305\u542B\u6807\u9898\u3001\u5956\u54C1\u4FE1\u606F\u3001\u4F18\u60E0\u7801\u548C\u786E\u8BA4\u6309\u94AE\u3002\n *\n * @module WinnerModal\n * @date 2025-12-24\n */\n\n'use client'\n\nimport React from 'react'\nimport { cn } from '../../helpers/index.js'\nimport type { WinnerModalProps } from './types.js'\nimport { Picture, Heading, Button } from '../../components/index.js'\nimport { BaseModal } from './BaseModal.js'\n\n// ============================================================================\n// WinnerModal \u7EC4\u4EF6\n// ============================================================================\n\n/**\n * WinnerModal \u4E2D\u5956\u5F39\u7A97\u7EC4\u4EF6\n *\n * \u6839\u636E\u8BBE\u8BA1\u7A3F\u5B9E\u73B0\u7684\u4E2D\u5956\u7ED3\u679C\u5C55\u793A\u5F39\u7A97,\u5305\u542B:\n * - \u534A\u900F\u660E\u906E\u7F69\u5C42\n * - \u767D\u8272\u5706\u89D2\u5361\u7247\u5BB9\u5668\n * - \u6807\u9898 \"You Have Won\"\n * - \u5956\u54C1\u540D\u79F0\n * - \u4F18\u60E0\u5238\u56FE\u7247\uFF0820% Off\uFF09\n * - \u4F18\u60E0\u7801\u548C\u8FC7\u671F\u65F6\u95F4\n * - \u786E\u8BA4\u6309\u94AE\n * - \u53F3\u4E0A\u89D2\u5173\u95ED\u6309\u94AE\n */\nexport const WinnerModal = ({\n isOpen,\n prize,\n title = 'You Have Won',\n prizeTitle,\n prizeImage,\n prizeDescription,\n winnerNote,\n learnMoreUrl,\n learnMoreText = 'Learn More',\n onClose,\n confirmText = 'Okay, Got It',\n onConfirm,\n confirmUrl,\n className,\n couponCode,\n couponDiscount,\n couponUnit = 'Off',\n expiresAt,\n codeText = 'CODE:',\n copyText = 'COPY',\n copiedText = 'COPIED',\n onCopyCode,\n theme = 'light',\n}: WinnerModalProps & { theme?: 'light' | 'dark' }) => {\n // \u590D\u5236\u72B6\u6001\n const [copied, setCopied] = React.useState(false)\n const timerRef = React.useRef<NodeJS.Timeout | null>(null)\n\n React.useEffect(() => {\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current)\n }\n }, [])\n\n // \u590D\u5236\u64CD\u4F5C\n const handleCopy = (code: string) => {\n if (timerRef.current) clearTimeout(timerRef.current)\n\n navigator.clipboard.writeText(code)\n if (onCopyCode) onCopyCode?.(code)\n setCopied(true)\n timerRef.current = setTimeout(() => {\n setCopied(false)\n }, 3000)\n }\n\n // \u4E0D\u663E\u793A\u5F39\u7A97\u6216\u65E0\u5956\u54C1\u6570\u636E\u65F6\u8FD4\u56DE null\n if (!isOpen || !prize) {\n return null\n }\n\n // \u786E\u8BA4\u6309\u94AE\u70B9\u51FB\u5904\u7406\n const handleConfirm = () => {\n if (confirmUrl) {\n window.open(confirmUrl, '_blank', 'noopener,noreferrer')\n }\n onConfirm?.()\n onClose()\n }\n\n return (\n <BaseModal\n isOpen={isOpen}\n onClose={onClose}\n className={className}\n maxWidth=\"max-w-[358px] laptop:max-w-[480px]\"\n ariaLabelledBy=\"winner-modal-title\"\n theme={theme}\n >\n <div className=\"laptop:px-8 laptop:pt-4 flex flex-col items-center px-6 pt-2\">\n {/* =================================================================\n \u5F39\u7A97\u6807\u9898\n ================================================================= */}\n <div className=\"w-full\">\n <Heading size={2} className={cn('laptop:mb-2 mb-1 text-center tracking-[-0.32px]')}>\n {title}\n </Heading>\n\n <p className=\"laptop:text-[18px] desktop:text-[16px] text-center text-[14px] font-[700] text-[#1D1D1F]\">\n {prizeTitle || prize.name}\n </p>\n\n {/* =================================================================\n Learn More \u6309\u94AE\n ================================================================= */}\n {learnMoreUrl && (\n <div className=\"laptop:mt-4 mt-3 hidden text-center\">\n <a\n href={learnMoreUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n 'laptop:text-[14px] text-center text-[12px]',\n 'text-blue-600 hover:text-blue-700',\n 'font-medium underline',\n 'transition-colors'\n )}\n >\n {learnMoreText}\n </a>\n </div>\n )}\n </div>\n\n {/* =================================================================\n \u5956\u54C1\u56FE\u7247\n ================================================================= */}\n\n <div\n className={cn(\n 'mx-auto flex items-center justify-center',\n 'laptop:my-6 laptop:size-[200px] my-4 size-[160px]'\n )}\n >\n {(prizeImage || prize.image) && (\n <Picture\n source={prizeImage || prize?.image?.url}\n alt={prize?.image?.alt || prizeTitle || prize?.name}\n className={cn('h-auto w-full')}\n />\n )}\n </div>\n\n {/* =================================================================\n \u6298\u6263\u548C\u4F18\u60E0\u7801\u590D\u5236\n ================================================================= */}\n {(couponDiscount || couponCode) && (\n <div className=\"laptop:mb-4 mb-2 flex w-full flex-col items-center\">\n {couponDiscount && (\n <span className=\"text-brand-0 laptop:mb-2 laptop:text-[18px] mb-1 text-[16px] font-bold\">\n {couponDiscount} {couponUnit}\n </span>\n )}\n {couponCode && (\n <div className=\"text-brand-0 laptop:text-[16px] flex items-center gap-2 text-center text-[14px] font-bold\">\n <span className=\"max-w-[300px] truncate\">\n {codeText}\n {couponCode}\n </span>\n <button onClick={() => handleCopy(couponCode!)} className=\"underline\" style={{ minWidth: 60 }}>\n {copied ? copiedText : copyText}\n </button>\n </div>\n )}\n {expiresAt && <span className=\"laptop:mt-2 mt-1 text-[12px] text-[#767880]\">\u6709\u6548\u671F\u81F3\uFF1A{expiresAt}</span>}\n </div>\n )}\n\n {/* =================================================================\n \u5956\u54C1\u8BE6\u60C5\u63CF\u8FF0\uFF08winner note\uFF09\n ================================================================= */}\n {(winnerNote ?? prizeDescription) ? (\n <p\n className={cn('laptop:text-[16px] laptop:mb-2 mb-1 px-4 text-center text-[14px] font-[700] text-[#767880]')}\n >\n {winnerNote ?? prizeDescription}\n </p>\n ) : null}\n </div>\n\n {/* =================================================================\n \u786E\u8BA4\u6309\u94AE\n ================================================================= */}\n <div className=\"laptop:px-8 laptop:pb-8 px-6 pb-6\">\n <Button onClick={handleConfirm} className={cn('w-full')}>\n {confirmText}\n </Button>\n </div>\n </BaseModal>\n )\n}\n\n// ============================================================================\n// \u9ED8\u8BA4\u5BFC\u51FA\n// ============================================================================\n\nexport default WinnerModal\n"],
5
+ "mappings": "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",
6
+ "names": ["WinnerModal_exports", "__export", "WinnerModal", "WinnerModal_default", "__toCommonJS", "import_jsx_runtime", "import_react", "import_helpers", "import_components", "import_BaseModal", "isOpen", "prize", "title", "prizeTitle", "prizeImage", "prizeDescription", "winnerNote", "learnMoreUrl", "learnMoreText", "onClose", "confirmText", "onConfirm", "confirmUrl", "className", "couponCode", "couponDiscount", "couponUnit", "expiresAt", "codeText", "copyText", "copiedText", "onCopyCode", "theme", "copied", "setCopied", "React", "timerRef", "handleCopy", "code", "handleConfirm"]
7
7
  }
@@ -7,6 +7,7 @@
7
7
  * @date 2026-04-07
8
8
  */
9
9
  import type { Theme, Img } from '../../types/props.js';
10
+ import type { SerializedEditorState, SerializedLexicalNode } from '@payloadcms/richtext-lexical/lexical';
10
11
  export type { Theme, Img };
11
12
  /**
12
13
  * 奖品(Prize)
@@ -49,6 +50,14 @@ export interface Prize {
49
50
  * @optional
50
51
  */
51
52
  price?: string;
53
+ /** 奖品维度的中奖弹窗覆盖配置;未配置时由接入层回退到全局配置 */
54
+ winnerModalConfig?: {
55
+ winnerNote?: string;
56
+ confirmText?: string;
57
+ confirmUrl?: string;
58
+ learnMoreUrl?: string;
59
+ learnMoreText?: string;
60
+ };
52
61
  }
53
62
  /**
54
63
  * 中奖信息(WinningInfo)
@@ -324,9 +333,17 @@ export interface WinnerModalConfig extends CopyTextConfig, CouponConfig, PrizeTi
324
333
  prizeImage?: string;
325
334
  /**
326
335
  * 中奖弹窗奖品详情描述
336
+ * @deprecated 语义不明确,请改用 `winnerNote`(code/copy 下方专用说明文字)
327
337
  * @optional
328
338
  */
329
339
  prizeDescription?: string;
340
+ /**
341
+ * code/copy 区域正下方的专用说明文字。
342
+ * 仅在明确配置时展示;未配置时不渲染任何内容。
343
+ * 优先级高于 `prizeDescription`。
344
+ * @optional
345
+ */
346
+ winnerNote?: string;
330
347
  /**
331
348
  * 中奖弹窗 Learn More 链接
332
349
  * @optional
@@ -386,6 +403,19 @@ export interface RulesModalConfig {
386
403
  */
387
404
  rulesTitle?: string;
388
405
  }
406
+ /**
407
+ * ProductLottery 顶栏右侧跳转按钮配置
408
+ */
409
+ export interface ActionButtonConfig {
410
+ /**
411
+ * 按钮文本;为空时不展示
412
+ */
413
+ text?: string;
414
+ /**
415
+ * 跳转链接;为空时不展示
416
+ */
417
+ url?: string;
418
+ }
389
419
  /**
390
420
  * My Rewards 弹窗配置
391
421
  *
@@ -440,6 +470,16 @@ export interface MyRewardsModalConfig extends CopyTextConfig, PrizeTimeTextConfi
440
470
  * 是否可复制码
441
471
  */
442
472
  showCopyCode?: boolean;
473
+ /**
474
+ * 每奖励可配置的显示文案(覆盖全局 status label 映射)
475
+ * @optional
476
+ */
477
+ statusText?: string;
478
+ /**
479
+ * 是否可用(用于控制颜色和复制按钮状态)
480
+ * @optional
481
+ */
482
+ available?: boolean;
443
483
  }>;
444
484
  /**
445
485
  * My Rewards 按钮文本
@@ -465,6 +505,34 @@ export interface MyRewardsModalConfig extends CopyTextConfig, PrizeTimeTextConfi
465
505
  * @optional
466
506
  */
467
507
  emptyText?: string;
508
+ /**
509
+ * 复制失败提示文案
510
+ * @optional
511
+ */
512
+ copyError?: string;
513
+ /**
514
+ * 可用状态文案
515
+ * @default "Available"
516
+ * @optional
517
+ */
518
+ availableText?: string;
519
+ /**
520
+ * 已使用状态文案
521
+ * @default "Used"
522
+ * @optional
523
+ */
524
+ usedStatusText?: string;
525
+ /**
526
+ * 已过期状态文案
527
+ * @default "Expired"
528
+ * @optional
529
+ */
530
+ expiredText?: string;
531
+ /**
532
+ * 未知状态文案
533
+ * @optional
534
+ */
535
+ notFoundText?: string;
468
536
  }
469
537
  /**
470
538
  * 错误弹窗配置
@@ -581,6 +649,13 @@ export interface PrizePoolProps {
581
649
  * 自定义类名
582
650
  */
583
651
  className?: string;
652
+ /**
653
+ * 中奖滚动 Ticker 文案模板
654
+ * 支持变量:{{name}} 获奖者昵称,{{prize}} 奖品名称
655
+ * @default "{{name}} just won {{prize}}!"
656
+ * @optional
657
+ */
658
+ winnerNameTemplate?: string;
584
659
  }
585
660
  /** 活动机制模式 */
586
661
  export type ChanceMechanismType = 'methods' | 'input';
@@ -602,6 +677,18 @@ export interface ChanceInputConfig {
602
677
  validationErrorText?: string;
603
678
  /** 输入框默认值(如登录用户 email,支持异步填充) @optional */
604
679
  defaultValue?: string;
680
+ /** 接入方按需禁用输入框内容更改 */
681
+ disabled?: boolean;
682
+ /** 是否禁止浏览器自动填充(尤其是 email 自动填充) */
683
+ disableAutofill?: boolean;
684
+ /** 协议告知富文本;配置时才展示协议勾选 UI */
685
+ agreementNotice?: string | SerializedEditorState<SerializedLexicalNode>;
686
+ /** 协议未勾选时的提示文案;配置协议后点击提交但未勾选时展示 */
687
+ agreementWarningText?: string;
688
+ /** 输入模式提交按钮点击埋点:data-headless-type-name */
689
+ submitTrackTypeName?: string;
690
+ /** 输入模式提交按钮点击埋点:data-headless-title-desc-button */
691
+ submitTrackTitleDescButton?: string;
605
692
  }
606
693
  /**
607
694
  * ChanceMethods 获取机会组件 Props
@@ -667,6 +754,12 @@ export interface ChanceMethodsProps {
667
754
  mechanismType?: ChanceMechanismType;
668
755
  /** 输入框配置(仅 mechanismType='input' 时使用) */
669
756
  inputConfig?: ChanceInputConfig;
757
+ /** 协议是否已勾选(供外层统一控制左右两侧抽奖入口) */
758
+ isAgreementChecked?: boolean;
759
+ /** 协议勾选状态变更回调 */
760
+ onAgreementCheckedChange?: (checked: boolean) => void;
761
+ /** 外层注入的协议提示文案(用于统一拦截左右两侧抽奖入口时展示在按钮下方) */
762
+ agreementErrorText?: string;
670
763
  }
671
764
  /**
672
765
  * WinnerModal 中奖弹窗组件 Props
@@ -694,8 +787,16 @@ export interface WinnerModalProps extends CopyTextConfig, CouponConfig, PrizeTim
694
787
  prizeImage?: string;
695
788
  /**
696
789
  * 奖品详情描述(可选)
790
+ * @deprecated 语义不明确,请改用 `winnerNote`(code/copy 下方专用说明文字)
697
791
  */
698
792
  prizeDescription?: string;
793
+ /**
794
+ * code/copy 区域正下方的专用说明文字。
795
+ * 仅在明确配置时展示;未配置时不渲染任何内容。
796
+ * 优先级高于 `prizeDescription`。
797
+ * @optional
798
+ */
799
+ winnerNote?: string;
699
800
  /**
700
801
  * Learn More 链接(可选)
701
802
  */
@@ -1,2 +1,2 @@
1
- "use strict";var o=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var p=(e,n)=>{for(var i in n)o(e,i,{get:n[i],enumerable:!0})},d=(e,n,i,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let t of a(n))!g.call(e,t)&&t!==i&&o(e,t,{get:()=>n[t],enumerable:!(r=s(n,t))||r.enumerable});return e};var c=e=>d(o({},"__esModule",{value:!0}),e);var C={};p(C,{DEFAULT_CHANCE_METHODS:()=>l,isChanceMethod:()=>f,isPrize:()=>m,isWinningInfo:()=>h});module.exports=c(C);const l=[{methodKey:"default-share",type:"share",title:"Share on your socials",description:"Share this event on your social media",buttonText:"Redeem now",onLoginRequired:()=>{alert("Please log in to share and get a chance!")},onClick:()=>{console.warn("ChanceMethod.onClick not implemented. Please provide a custom onClick handler.")},disabled:!1},{methodKey:"default-points",type:"points",title:"Spend 100 points",description:"Use your reward points to get a chance",buttonText:"Redeem now",onLoginRequired:()=>{alert("Please log in to share and get a chance!")},onClick:()=>{console.warn("ChanceMethod.onClick not implemented. Please provide a custom onClick handler.")},disabled:!1},{methodKey:"default-refer",type:"refer",title:"Refer a friend",description:"Invite your friends to join",buttonText:"Redeem now",onLoginRequired:()=>{alert("Please log in to share and get a chance!")},onClick:()=>{console.warn("ChanceMethod.onClick not implemented. Please provide a custom onClick handler.")},disabled:!1}];function m(e){return typeof e=="object"&&e!==null&&"prizeKey"in e&&"name"in e&&"image"in e&&typeof e.prizeKey=="string"&&typeof e.name=="string"&&typeof e.image=="object"}function f(e){return typeof e=="object"&&e!==null&&"methodKey"in e&&"type"in e&&"title"in e&&"description"in e&&"onClick"in e&&typeof e.methodKey=="string"&&typeof e.type=="string"&&typeof e.title=="string"&&typeof e.description=="string"&&typeof e.onClick=="function"}function h(e){return typeof e=="object"&&e!==null&&"winningKey"in e&&"userName"in e&&"prizeName"in e&&typeof e.winningKey=="string"&&typeof e.userName=="string"&&typeof e.prizeName=="string"}
1
+ "use strict";var r=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var p=(e,t)=>{for(var i in t)r(e,i,{get:t[i],enumerable:!0})},l=(e,t,i,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of a(t))!g.call(e,n)&&n!==i&&r(e,n,{get:()=>t[n],enumerable:!(o=s(t,n))||o.enumerable});return e};var d=e=>l(r({},"__esModule",{value:!0}),e);var x={};p(x,{DEFAULT_CHANCE_METHODS:()=>c,isChanceMethod:()=>f,isPrize:()=>m,isWinningInfo:()=>h});module.exports=d(x);const c=[{methodKey:"default-share",type:"share",title:"Share on your socials",description:"Share this event on your social media",buttonText:"Redeem now",onLoginRequired:()=>{alert("Please log in to share and get a chance!")},onClick:()=>{console.warn("ChanceMethod.onClick not implemented. Please provide a custom onClick handler.")},disabled:!1},{methodKey:"default-points",type:"points",title:"Spend 100 points",description:"Use your reward points to get a chance",buttonText:"Redeem now",onLoginRequired:()=>{alert("Please log in to share and get a chance!")},onClick:()=>{console.warn("ChanceMethod.onClick not implemented. Please provide a custom onClick handler.")},disabled:!1},{methodKey:"default-refer",type:"refer",title:"Refer a friend",description:"Invite your friends to join",buttonText:"Redeem now",onLoginRequired:()=>{alert("Please log in to share and get a chance!")},onClick:()=>{console.warn("ChanceMethod.onClick not implemented. Please provide a custom onClick handler.")},disabled:!1}];function m(e){return typeof e=="object"&&e!==null&&"prizeKey"in e&&"name"in e&&"image"in e&&typeof e.prizeKey=="string"&&typeof e.name=="string"&&typeof e.image=="object"}function f(e){return typeof e=="object"&&e!==null&&"methodKey"in e&&"type"in e&&"title"in e&&"description"in e&&"onClick"in e&&typeof e.methodKey=="string"&&typeof e.type=="string"&&typeof e.title=="string"&&typeof e.description=="string"&&typeof e.onClick=="function"}function h(e){return typeof e=="object"&&e!==null&&"winningKey"in e&&"userName"in e&&"prizeName"in e&&typeof e.winningKey=="string"&&typeof e.userName=="string"&&typeof e.prizeName=="string"}
2
2
  //# sourceMappingURL=types.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/biz-components/LotteryShared/types.ts"],
4
- "sourcesContent": ["/**\n * \u62BD\u5956\u7EC4\u4EF6\u5171\u4EAB\u7C7B\u578B\u5B9A\u4E49\n *\n * \u5305\u542B\u6240\u6709\u62BD\u5956\u7EC4\u4EF6\uFF08WheelLottery, ProductLottery \u7B49\uFF09\u5171\u7528\u7684\u7C7B\u578B\u3001\u63A5\u53E3\u548C\u5E38\u91CF\u3002\n *\n * @module LotterySharedTypes\n * @date 2026-04-07\n */\n\nimport type { Theme, Img } from '../../types/props.js'\n\n// Re-export Theme and Img for convenience\nexport type { Theme, Img }\n\n// ============================================================================\n// \u6838\u5FC3\u5B9E\u4F53\u7C7B\u578B\n// ============================================================================\n\n/**\n * \u5956\u54C1\uFF08Prize\uFF09\n *\n * \u4EE3\u8868\u62BD\u5956\u6D3B\u52A8\u4E2D\u7684\u4E00\u4E2A\u5956\u54C1\uFF0C\u5305\u542B\u663E\u793A\u6240\u9700\u7684\u6240\u6709\u4FE1\u606F\u3002\n *\n * @example\n * ```tsx\n * const prize: Prize = {\n * prizeKey: 'prize-001',\n * name: 'Anker Prime Charger (100W, 3 Ports, GaN)',\n * image: { url: 'https://images.unsplash.com/photo-123', alt: 'Charger' },\n * rank: '1st',\n * price: '$79.99'\n * }\n * ```\n */\nexport interface Prize {\n /**\n * \u552F\u4E00\u6807\u8BC6\u7B26\uFF0C\u7528\u4E8E React key \u548C\u4E2D\u5956\u7ED3\u679C\u5339\u914D\n */\n prizeKey: string\n\n /**\n * \u5956\u54C1\u540D\u79F0\uFF0C\u663E\u793A\u5728\u8F6C\u76D8\u548C\u5956\u6C60\u4E2D\n * @maxLength 100\n */\n name: string\n\n /**\n * \u5956\u54C1\u56FE\u7247\u5BF9\u8C61\uFF0C\u5305\u542B url \u548C alt\n */\n image: Img\n\n /**\n * \u6392\u540D\u6807\u8BC6\uFF0C\u4EC5\u5728 Prize Pool \u4E2D\u663E\u793A\n * @optional\n */\n rank?: '1st' | '2nd' | '3rd'\n\n /**\n * \u4EF7\u683C\u6216\u6298\u6263\u4FE1\u606F\uFF0C\u663E\u793A\u5728\u5956\u6C60\u4E2D\n * @example \"$99.99\" | \"12% Off\"\n * @optional\n */\n price?: string\n}\n\n/**\n * \u4E2D\u5956\u4FE1\u606F\uFF08WinningInfo\uFF09\n *\n * \u4EE3\u8868\u4E00\u6761\u4E2D\u5956\u8BB0\u5F55\uFF0C\u7528\u4E8E\u5E95\u90E8\u6EDA\u52A8\u6761\u5C55\u793A\uFF0C\u8425\u9020\u6D3B\u52A8\u6C1B\u56F4\u3002\n *\n * @example\n * ```tsx\n * const winningInfo: WinningInfo = {\n * winningKey: 'win-001',\n * userName: 'Shuqi***',\n * prizeName: '12% Off Discount',\n * timestamp: 1702800000000\n * }\n * ```\n */\nexport interface WinningInfo {\n /**\n * \u552F\u4E00\u6807\u8BC6\u7B26\n */\n winningKey: string\n\n /**\n * \u7528\u6237\u540D\uFF08\u5DF2\u8131\u654F\uFF09\uFF0C\u5982 \"Shuqi***\"\n * @note \u5047\u8BBE\u4F20\u5165\u7684\u7528\u6237\u540D\u5DF2\u7ECF\u8FC7\u8131\u654F\u5904\u7406\uFF0C\u7EC4\u4EF6\u5185\u90E8\u4E0D\u518D\u5904\u7406\n */\n userName: string\n\n /**\n * \u4E2D\u5956\u5956\u54C1\u540D\u79F0\n */\n prizeName: string\n\n /**\n * \u4E2D\u5956\u65F6\u95F4\u6233\uFF08\u6BEB\u79D2\uFF09\n * @optional\n */\n timestamp?: number\n}\n\n/**\n * \u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\u7C7B\u578B\n */\nexport type ChanceMethodType = 'share' | 'points' | 'refer' | string\n\n/**\n * \u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\u72B6\u6001\n */\nexport type ChanceMethodStatus = 'pending' | 'completed' | 'used'\n\n/**\n * \u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\uFF08ChanceMethod\uFF09\n *\n * \u4EE3\u8868\u4E00\u79CD\u83B7\u53D6\u62BD\u5956\u673A\u4F1A\u7684\u65B9\u5F0F\uFF0C\u652F\u6301\u7075\u6D3B\u914D\u7F6E\uFF08\u5206\u4EAB\u3001\u79EF\u5206\u3001\u63A8\u8350\u7B49\uFF09\u3002\n *\n * @example\n * ```tsx\n * const chanceMethod: ChanceMethod = {\n * methodKey: 'share-001',\n * type: 'share',\n * title: 'Share on your socials',\n * description: 'Share this event on your social media',\n * buttonText: 'Redeem now',\n * onClick: () => console.log('Share clicked'),\n * disabled: false,\n * status: 'pending'\n * }\n * ```\n */\nexport interface ChanceMethod {\n /**\n * \u552F\u4E00\u6807\u8BC6\u7B26\n */\n methodKey: string\n\n /**\n * \u65B9\u5F0F\u7C7B\u578B\uFF0C\u652F\u6301\u9884\u5B9A\u4E49\u7C7B\u578B\uFF08'share', 'points', 'refer'\uFF09\u6216\u81EA\u5B9A\u4E49\u7C7B\u578B\n */\n type: ChanceMethodType\n\n /**\n * \u65B9\u5F0F\u6807\u9898\uFF0C\u5982 \"Share on your socials\"\n */\n title: string\n\n /**\n * \u8BE6\u7EC6\u8BF4\u660E\u6587\u5B57\n */\n description: string\n\n /**\n * \u6309\u94AE\u6587\u6848\uFF0C\u9ED8\u8BA4 \"Redeem now\"\n * @default \"Redeem now\"\n * @optional\n */\n buttonText?: string\n\n completed?: string\n\n used?: string\n\n /**\n * \u672A\u767B\u5F55\u65F6\u70B9\u51FB GO \u6309\u94AE\u7684\u56DE\u8C03\n * @example\n * ```tsx\n * onLoginRequired={() => {\n * // \u6253\u5F00\u767B\u5F55\u5F39\u7A97\u6216\u8DF3\u8F6C\u767B\u5F55\u9875\n * router.push('/login')\n * }}\n * ```\n */\n onLoginRequired?: () => void\n\n /**\n * \u70B9\u51FB\u6309\u94AE\u65F6\u7684\u56DE\u8C03\u51FD\u6570\n * @note \u4E1A\u52A1\u903B\u8F91\uFF08\u5982\u79EF\u5206\u6263\u9664\u3001\u5206\u4EAB\u9A8C\u8BC1\uFF09\u7531\u7236\u7EC4\u4EF6\u5904\u7406\n */\n onClick: () => void\n\n /**\n * \u662F\u5426\u7981\u7528\u8BE5\u65B9\u5F0F\n * @default false\n * @optional\n */\n disabled?: boolean\n\n /**\n * \u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\u7684\u72B6\u6001\n * - pending: \u672A\u5B8C\u6210\uFF08\u9ED8\u8BA4\u72B6\u6001\uFF09\n * - completed: \u5DF2\u5B8C\u6210/\u5DF2\u83B7\u5F97\n * - used: \u5DF2\u4F7F\u7528\n * @default \"pending\"\n * @optional\n */\n status?: ChanceMethodStatus\n\n /**\n * \u662F\u5426\u663E\u793A\u52A0\u8F7D\u72B6\u6001\n * @default false\n * @optional\n */\n loading?: boolean\n\n /**\n * \u662F\u5426\u5728\u70B9\u51FB\u65F6\u6253\u5F00\u5206\u4EAB\u5F39\u7A97\n * @default false\n * @optional\n */\n openShareModal?: boolean\n}\n\n/**\n * \u7528\u6237\u6570\u636E\uFF08UserData\uFF09\n *\n * \u4EE3\u8868\u5F53\u524D\u7528\u6237\u7684\u62BD\u5956\u76F8\u5173\u6570\u636E\n *\n * @example\n * ```tsx\n * const userData: UserData = {\n * isLoggedIn: true,\n * availableChances: 3,\n * wonPrizes: [\n * { id: 'prize-001', name: 'Charger', image: 'https://...', timestamp: 1702800000000 }\n * ]\n * }\n * ```\n */\nexport interface UserData {\n /**\n * \u7528\u6237\u662F\u5426\u5DF2\u767B\u5F55\n */\n isLoggedIn: boolean\n\n /**\n * \u5F53\u524D\u53EF\u4F7F\u7528\u7684\u62BD\u5956\u6B21\u6570\n * @default 0\n */\n availableChances: number\n\n /**\n * \u603B\u673A\u4F1A\u6570\uFF08\u7528\u4E8E\u663E\u793A\u8FDB\u5EA6\uFF0C\u4F8B\u5982 \"3/5\"\uFF09\n * @default undefined\n * @optional\n */\n totalChances?: number\n\n /**\n * \u5DF2\u83B7\u5F97\u7684\u5956\u54C1\u5217\u8868\n * @optional\n */\n wonPrizes?: Array<Prize & { timestamp?: number }>\n\n /** * \u7528\u6237\u7535\u5B50\u90AE\u7BB1\uFF08\u53EF\u9009\uFF0C\u7528\u4E8E\u53D1\u9001\u4E2D\u5956\u901A\u77E5\u7B49\uFF09\n * @optional\n */\n email?: string\n}\n\n/**\n * \u7F13\u52A8\u51FD\u6570\u7C7B\u578B\n */\nexport type EasingFunction = 'ease-out' | 'ease-in-out' | 'linear'\n\n// ============================================================================\n// \u516C\u5171\u6587\u6848\u914D\u7F6E\u7C7B\u578B\n// ============================================================================\n\n/**\n * \u590D\u5236\u64CD\u4F5C\u76F8\u5173\u6587\u6848\u914D\u7F6E\uFF08\u516C\u5171\u7C7B\u578B\uFF09\n * \u7528\u4E8E\u6240\u6709\u5305\u542B\u590D\u5236\u529F\u80FD\u7684\u7EC4\u4EF6\n */\nexport interface CopyTextConfig {\n /**\n * \u590D\u5236\u6309\u94AE\u6587\u672C\n * @default \"COPY\"\n */\n copyText?: string\n\n /**\n * \u590D\u5236\u6210\u529F\u540E\u7684\u6309\u94AE\u6587\u672C\n * @default \"COPIED\"\n */\n copiedText?: string\n}\n\n/**\n * \u4F18\u60E0\u7801\u76F8\u5173\u914D\u7F6E\uFF08\u516C\u5171\u7C7B\u578B\uFF09\n * \u7528\u4E8E\u6240\u6709\u5C55\u793A\u4F18\u60E0\u7801\u7684\u7EC4\u4EF6\n */\nexport interface CouponConfig {\n /**\n * \u4EE3\u7801\u6587\u672C\u524D\u7F00\n * @default \"CODE:\"\n */\n codeText?: string\n\n /**\n * \u4F18\u60E0\u7801\n */\n couponCode?: string\n\n /**\n * \u4F18\u60E0\u7801\u8FC7\u671F\u65F6\u95F4\n */\n expiresAt?: string\n\n /**\n * \u4F18\u60E0\u5238\u6298\u6263\u6587\u672C\uFF08\u4F8B\u5982 \"20%\"\uFF09\n */\n couponDiscount?: string\n\n /**\n * \u4F18\u60E0\u5238\u5355\u4F4D\u6587\u672C\n * @default \"Off\"\n */\n couponUnit?: string\n}\n\n/**\n * \u5956\u52B1\u65F6\u95F4\u6587\u6848\u914D\u7F6E\uFF08\u516C\u5171\u7C7B\u578B\uFF09\n */\nexport interface PrizeTimeTextConfig {\n /**\n * \u5956\u52B1\u65F6\u95F4\u6587\u672C\u524D\u7F00\n * @default \"Prize time:\"\n */\n prizeText?: string\n}\n\n/**\n * \u4E2D\u5956\u5F39\u7A97\u914D\u7F6E\uFF08WinnerModalConfig\uFF09\n *\n * \u7528\u4E8E\u914D\u7F6E\u4E2D\u5956\u5F39\u7A97\u7684\u5C55\u793A\u5185\u5BB9\uFF0C\u901A\u5E38\u7531\u62BD\u5956\u63A5\u53E3\u8FD4\u56DE\u63D0\u4F9B\n *\n * @example\n * ```tsx\n * const winnerModalConfig: WinnerModalConfig = {\n * title: 'Congratulations!',\n * prizeTitle: 'Anker Prime Charger',\n * prizeImage: 'https://...',\n * prizeDescription: 'High-speed charging for all your devices',\n * learnMoreUrl: 'https://...',\n * learnMoreText: 'View Details',\n * couponCode: 'ANKER2024',\n * expiresAt: '2024-12-31',\n * couponDiscount: '20%',\n * couponUnit: 'Off',\n * confirmText: 'Claim Now'\n * }\n * ```\n */\nexport interface WinnerModalConfig extends CopyTextConfig, CouponConfig, PrizeTimeTextConfig {\n /**\n * \u4E2D\u5956\u5F39\u7A97\u6807\u9898\n * @default \"You Have Won\"\n * @optional\n */\n title?: string\n\n /**\n * \u4E2D\u5956\u5F39\u7A97\u5956\u54C1\u6807\u9898\uFF08\u4F18\u5148\u7EA7\u9AD8\u4E8E prize.name\uFF09\n * @optional\n */\n prizeTitle?: string\n\n /**\n * \u4E2D\u5956\u5F39\u7A97\u5956\u54C1\u56FE\u7247 URL\uFF08\u4F18\u5148\u7EA7\u9AD8\u4E8E prize.image\uFF09\n * @optional\n */\n prizeImage?: string\n\n /**\n * \u4E2D\u5956\u5F39\u7A97\u5956\u54C1\u8BE6\u60C5\u63CF\u8FF0\n * @optional\n */\n prizeDescription?: string\n\n /**\n * \u4E2D\u5956\u5F39\u7A97 Learn More \u94FE\u63A5\n * @optional\n */\n learnMoreUrl?: string\n\n /**\n * \u4E2D\u5956\u5F39\u7A97 Learn More \u6309\u94AE\u6587\u672C\n * @default \"Learn More\"\n * @optional\n */\n learnMoreText?: string\n\n /**\n * \u4E2D\u5956\u5F39\u7A97\u786E\u8BA4\u6309\u94AE\u6587\u672C\n * @default \"Okay, Got It\"\n * @optional\n */\n confirmText?: string\n\n /** \u786E\u8BA4\u6309\u94AE\u8DF3\u8F6C\u94FE\u63A5\uFF0C\u914D\u7F6E\u540E\u70B9\u51FB\u6309\u94AE\u5C06\u5728\u65B0\u6807\u7B7E\u9875\u6253\u5F00\u6B64\u94FE\u63A5 @optional */\n confirmUrl?: string\n}\n\n/**\n * Rules \u5F39\u7A97\u914D\u7F6E\n *\n * @example\n * ```tsx\n * rulesModalConfig={{\n * rulesData: [\n * { item: '$100 instead of $200, 10 tickets/day.' },\n * { item: '$100 for $120, 50 tickets/day.' }\n * ],\n * rulesText: 'Game Rules',\n * rulesTitle: 'Activity Rules'\n * }}\n * ```\n */\nexport interface RulesModalConfig {\n /**\n * \u89C4\u5219\u6570\u636E\u5217\u8868\n * @optional\n */\n rulesData?: Array<{\n /**\n * \u89C4\u5219\u9879\u5185\u5BB9\n */\n item: string\n }>\n\n /**\n * Rules \u6309\u94AE\u6587\u672C\n * @default \"Rules\"\n * @optional\n */\n rulesText?: string\n\n /**\n * \u5F39\u7A97\u6807\u9898\n * @default \"Rules\"\n * @optional\n */\n rulesTitle?: string\n}\n\n/**\n * My Rewards \u5F39\u7A97\u914D\u7F6E\n *\n * @example\n * ```tsx\n * myRewardsModalConfig={{\n * rewardsData: [\n * {\n * id: '1',\n * name: 'Anker Charger',\n * code: 'ANKER2024',\n * status: 'Available',\n * prizeTime: '2024-01-01',\n * showCopyCode: true\n * }\n * ],\n * myRewardsText: 'My Prizes',\n * codeText: 'CODE:',\n * copyText: 'COPY',\n * prizeText: 'Prize time:',\n * emptyText: 'No rewards yet'\n * }}\n * ```\n */\nexport interface MyRewardsModalConfig extends CopyTextConfig, PrizeTimeTextConfig {\n /**\n * \u5956\u52B1\u6570\u636E\u5217\u8868\n * @optional\n */\n rewardsData?: Array<{\n /**\n * \u5956\u52B1 ID\n */\n id: string\n /**\n * \u5956\u52B1\u540D\u79F0\n */\n name: string\n /**\n * \u4F18\u60E0\u7801\uFF08\u53EF\u9009\uFF09\n */\n code?: string\n /**\n * \u72B6\u6001\n */\n status: 'Available' | 'Expired' | 'Used'\n /**\n * \u5956\u52B1\u65F6\u95F4\n */\n prizeTime?: string\n /**\n * \u662F\u5426\u53EF\u590D\u5236\u7801\n */\n showCopyCode?: boolean\n }>\n\n /**\n * My Rewards \u6309\u94AE\u6587\u672C\n * @default \"My Rewards\"\n * @optional\n */\n myRewardsText?: string\n\n /**\n * \u5F39\u7A97\u6807\u9898\n * @default \"My Rewards\"\n * @optional\n */\n myRewardsTitle?: string\n\n /**\n * \u4EE3\u7801\u6587\u672C\u524D\u7F00\n * @default \"CODE:\"\n * @optional\n */\n codeText?: string\n\n /**\n * \u7A7A\u72B6\u6001\u63D0\u793A\u6587\u672C\n * @default \"No rewards yet\"\n * @optional\n */\n emptyText?: string\n}\n\n/**\n * \u9519\u8BEF\u5F39\u7A97\u914D\u7F6E\n * @example\n * ```tsx\n * errorModalConfig={{\n * title: 'Oops!',\n * message: 'Something went wrong during the lottery process.',\n * confirmText: 'OK, I get'\n * }}\n * ```\n */\nexport interface ErrorModalConfig {\n /**\n * \u5F39\u7A97\u6807\u9898\n * @default \"Oops!\"\n * @optional\n */\n title?: string\n /**\n * \u9519\u8BEF\u6D88\u606F\u5185\u5BB9\n * @default \"Something went wrong during the lottery process.\"\n * @optional\n */\n message?: string\n /**\n * \u786E\u8BA4\u6309\u94AE\u6587\u672C\n * @default \"OK, I get\"\n * @optional\n */\n confirmText?: string\n}\n\n/**\n * \u793E\u4EA4\u5E73\u53F0\u7C7B\u578B\n */\nexport type SocialPlatform = 'facebook' | 'twitter' | 'instagram' | 'linkedin' | 'tiktok' | 'youtube'\n\n/**\n * \u793E\u4EA4\u5E73\u53F0\u914D\u7F6E\n */\nexport interface SharePlatformConfig {\n /**\n * \u5E73\u53F0\u7C7B\u578B\n */\n platform: SocialPlatform\n\n /**\n * \u5E73\u53F0\u540D\u79F0\n */\n name: string\n\n /**\n * \u5206\u4EAB URL\uFF08\u53EF\u9009\uFF0C\u5982\u679C\u63D0\u4F9B\u5219\u76F4\u63A5\u8DF3\u8F6C\uFF09\n */\n url?: string\n\n /**\n * \u70B9\u51FB\u56DE\u8C03\uFF08\u5982\u679C\u63D0\u4F9B url \u5219\u6B64\u56DE\u8C03\u4F1A\u5728\u8DF3\u8F6C\u524D\u6267\u884C\uFF09\n */\n onClick?: () => void\n\n /**\n * \u662F\u5426\u7981\u7528\n */\n disabled?: boolean\n}\n\n/**\n * \u5206\u4EAB\u5F39\u7A97\u914D\u7F6E\n */\nexport interface ShareModalConfig {\n /**\n * \u5F39\u7A97\u6807\u9898\n * @default \"Share to Get More Chances\"\n */\n title?: string\n\n /**\n * \u526F\u6807\u9898/\u5F15\u5BFC\u6587\u6848\n * @default \"Share to Play Again Keep Trying! You Could Still Win Big!\"\n */\n subtitle?: string\n\n /**\n * \u5E95\u90E8\u63D0\u793A\u6587\u6848\n * @default \"Note: Maximum of 3 times per participant.\"\n */\n note?: string\n\n /**\n * \u793E\u4EA4\u5E73\u53F0\u914D\u7F6E\u5217\u8868\n */\n platforms?: SharePlatformConfig[]\n\n /**\n * \u5206\u4EAB\u6210\u529F\u56DE\u8C03\n */\n onShareSuccess?: (platform: SocialPlatform) => void\n}\n\n// ============================================================================\n// \u5B50\u7EC4\u4EF6 Props \u63A5\u53E3\n// ============================================================================\n\n/**\n * PrizePool \u5956\u54C1\u6C60\u7EC4\u4EF6 Props\n */\nexport interface PrizePoolProps {\n /**\n * \u4E3B\u9898\u6A21\u5F0F\n * @optional\n */\n theme?: Theme\n\n /**\n * \u5956\u54C1\u5217\u8868(\u901A\u5E38\u662F\u5168\u90E8 8 \u4E2A\u5956\u54C1)\n */\n prizes: Prize[]\n\n /**\n * \u6807\u9898\u6587\u672C\n * @default \"Prize Pool\"\n */\n title?: string\n\n /**\n * \u4E2D\u5956\u4EBA\u540D\u5355\u6570\u636E\n * @optional\n */\n winningInfos?: WinningInfo[]\n\n /**\n * \u81EA\u5B9A\u4E49\u7C7B\u540D\n */\n className?: string\n}\n\n/** \u6D3B\u52A8\u673A\u5236\u6A21\u5F0F */\nexport type ChanceMechanismType = 'methods' | 'input'\n\n/** \u8F93\u5165\u6846\u914D\u7F6E\uFF08\u4EC5 mechanismType='input' \u65F6\u4F7F\u7528\uFF09 */\nexport interface ChanceInputConfig {\n /** \u8F93\u5165\u6846\u5360\u4F4D\u6587\u672C @default \"Enter your order number\" */\n placeholder?: string\n /** \u63D0\u4EA4\u6309\u94AE\u6587\u6848 @default \"Spin and Win\" */\n submitText?: string\n /** \u8F93\u5165\u503C\u63D0\u4EA4\u56DE\u8C03 */\n onSubmit?: (value: string) => void | Promise<void>\n /** \u662F\u5426\u6B63\u5728\u63D0\u4EA4 */\n isSubmitting?: boolean\n /** \u8F93\u5165\u6846\u7C7B\u578B @default \"text\" */\n inputType?: 'text' | 'email' | 'number'\n /** \u9A8C\u8BC1\u6B63\u5219 (\u53EF\u9009) */\n validationPattern?: string\n /** \u9A8C\u8BC1\u5931\u8D25\u63D0\u793A\u6587\u6848 */\n validationErrorText?: string\n /** \u8F93\u5165\u6846\u9ED8\u8BA4\u503C\uFF08\u5982\u767B\u5F55\u7528\u6237 email\uFF0C\u652F\u6301\u5F02\u6B65\u586B\u5145\uFF09 @optional */\n defaultValue?: string\n}\n\n/**\n * ChanceMethods \u83B7\u53D6\u673A\u4F1A\u7EC4\u4EF6 Props\n */\nexport interface ChanceMethodsProps {\n /**\n * \u4E3B\u9898\u6A21\u5F0F\n * @optional\n */\n theme?: Theme\n\n /**\n * \u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\u5217\u8868\n */\n methods: ChanceMethod[]\n\n /**\n * \u6807\u9898\u6587\u672C\n * @default \"Want more chances to win?\"\n */\n title?: string\n\n /**\n * \u526F\u6807\u9898(\u53EF\u9009)\n */\n subtitle?: string\n\n /**\n * \u5E95\u90E8\u63D0\u793A\u6587\u672C(\u53EF\u9009)\n */\n footerNote?: string\n\n /**\n * \u767B\u5F55\u7528\u6237\u6570\u636E\uFF08\u53EF\u9009\uFF09\n * @optional\n */\n userData?: UserData\n\n /**\n * \u6253\u5F00\u5206\u4EAB\u5F39\u7A97\u56DE\u8C03\uFF08\u53EF\u9009\uFF09\n * @optional\n */\n onOpenShareModal?: () => void\n\n /**\n * \u5FBD\u7AE0\u6587\u6848\n * @default \"Chance +1\"\n */\n chanceBadgeText?: string\n\n /**\n * \u5DF2\u5B8C\u6210\u72B6\u6001\u6587\u6848\n * @default \"Completed\"\n */\n completedText?: string\n\n /**\n * \u5DF2\u4F7F\u7528\u72B6\u6001\u6587\u6848\n * @default \"Used\"\n */\n usedText?: string\n\n /**\n * \u52A0\u8F7D\u4E2D\u6587\u6848\n * @default \"Loading...\"\n */\n loadingText?: string\n\n /**\n * \u81EA\u5B9A\u4E49\u7C7B\u540D\n */\n className?: string\n\n /** \u6D3B\u52A8\u673A\u5236\u6A21\u5F0F @default 'methods' */\n mechanismType?: ChanceMechanismType\n /** \u8F93\u5165\u6846\u914D\u7F6E\uFF08\u4EC5 mechanismType='input' \u65F6\u4F7F\u7528\uFF09 */\n inputConfig?: ChanceInputConfig\n}\n\n/**\n * WinnerModal \u4E2D\u5956\u5F39\u7A97\u7EC4\u4EF6 Props\n */\nexport interface WinnerModalProps extends CopyTextConfig, CouponConfig, PrizeTimeTextConfig {\n /**\n * \u662F\u5426\u663E\u793A\u5F39\u7A97\n */\n isOpen: boolean\n\n /**\n * \u4E2D\u5956\u5956\u54C1\u4FE1\u606F\n */\n prize: Prize | null\n\n /**\n * \u5F39\u7A97\u6807\u9898\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4 \"You Have Won\"\uFF09\n */\n title?: string\n\n /**\n * \u5956\u54C1\u6807\u9898\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4\u4F7F\u7528 prize.name\uFF09\n */\n prizeTitle?: string\n\n /**\n * \u5956\u54C1\u56FE\u7247 URL\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4\u4F7F\u7528 prize.image\uFF09\n */\n prizeImage?: string\n\n /**\n * \u5956\u54C1\u8BE6\u60C5\u63CF\u8FF0\uFF08\u53EF\u9009\uFF09\n */\n prizeDescription?: string\n\n /**\n * Learn More \u94FE\u63A5\uFF08\u53EF\u9009\uFF09\n */\n learnMoreUrl?: string\n\n /**\n * Learn More \u6309\u94AE\u6587\u672C\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4 \"Learn More\"\uFF09\n */\n learnMoreText?: string\n\n /**\n * \u590D\u5236\u7801\u70B9\u51FB\u56DE\u8C03\n */\n onCopyCode?: (code: string) => void\n\n /**\n * \u5173\u95ED\u5F39\u7A97\u56DE\u8C03\n */\n onClose: () => void\n\n /**\n * \u786E\u8BA4\u6309\u94AE\u6587\u672C\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4 \"Okay, Got It\"\uFF09\n */\n confirmText?: string\n\n /** \u786E\u8BA4\u6309\u94AE\u8DF3\u8F6C\u94FE\u63A5 @optional */\n confirmUrl?: string\n\n /**\n * \u786E\u8BA4\u6309\u94AE\u70B9\u51FB\u56DE\u8C03\uFF08\u53EF\u9009\uFF09\n */\n onConfirm?: () => void\n\n /**\n * \u81EA\u5B9A\u4E49\u7C7B\u540D\n */\n className?: string\n}\n\n// ============================================================================\n// \u9ED8\u8BA4\u914D\u7F6E\n// ============================================================================\n\n/**\n * \u9ED8\u8BA4\u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\uFF083\u79CD\uFF09\n * @note \u7236\u7EC4\u4EF6\u9700\u8981\u8986\u76D6 onClick \u56DE\u8C03\u4EE5\u5B9E\u73B0\u5177\u4F53\u4E1A\u52A1\u903B\u8F91\n */\nexport const DEFAULT_CHANCE_METHODS: ChanceMethod[] = [\n {\n methodKey: 'default-share',\n type: 'share',\n title: 'Share on your socials',\n description: 'Share this event on your social media',\n buttonText: 'Redeem now',\n onLoginRequired: () => {\n alert('Please log in to share and get a chance!')\n },\n onClick: () => {\n console.warn('ChanceMethod.onClick not implemented. Please provide a custom onClick handler.')\n },\n disabled: false,\n },\n {\n methodKey: 'default-points',\n type: 'points',\n title: 'Spend 100 points',\n description: 'Use your reward points to get a chance',\n buttonText: 'Redeem now',\n onLoginRequired: () => {\n alert('Please log in to share and get a chance!')\n },\n onClick: () => {\n console.warn('ChanceMethod.onClick not implemented. Please provide a custom onClick handler.')\n },\n disabled: false,\n },\n {\n methodKey: 'default-refer',\n type: 'refer',\n title: 'Refer a friend',\n description: 'Invite your friends to join',\n buttonText: 'Redeem now',\n onLoginRequired: () => {\n alert('Please log in to share and get a chance!')\n },\n onClick: () => {\n console.warn('ChanceMethod.onClick not implemented. Please provide a custom onClick handler.')\n },\n disabled: false,\n },\n]\n\n// ============================================================================\n// \u7C7B\u578B\u5B88\u536B\n// ============================================================================\n\n/**\n * \u68C0\u67E5\u662F\u5426\u4E3A\u6709\u6548\u7684 Prize \u5BF9\u8C61\n * @param value \u5F85\u68C0\u67E5\u7684\u503C\n * @returns \u662F\u5426\u4E3A\u6709\u6548\u7684 Prize\n */\nexport function isPrize(value: unknown): value is Prize {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'prizeKey' in value &&\n 'name' in value &&\n 'image' in value &&\n typeof (value as Prize).prizeKey === 'string' &&\n typeof (value as Prize).name === 'string' &&\n typeof (value as Prize).image === 'object'\n )\n}\n\n/**\n * \u68C0\u67E5\u662F\u5426\u4E3A\u6709\u6548\u7684 ChanceMethod \u5BF9\u8C61\n * @param value \u5F85\u68C0\u67E5\u7684\u503C\n * @returns \u662F\u5426\u4E3A\u6709\u6548\u7684 ChanceMethod\n */\nexport function isChanceMethod(value: unknown): value is ChanceMethod {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'methodKey' in value &&\n 'type' in value &&\n 'title' in value &&\n 'description' in value &&\n 'onClick' in value &&\n typeof (value as ChanceMethod).methodKey === 'string' &&\n typeof (value as ChanceMethod).type === 'string' &&\n typeof (value as ChanceMethod).title === 'string' &&\n typeof (value as ChanceMethod).description === 'string' &&\n typeof (value as ChanceMethod).onClick === 'function'\n )\n}\n\n/**\n * \u68C0\u67E5\u662F\u5426\u4E3A\u6709\u6548\u7684 WinningInfo \u5BF9\u8C61\n * @param value \u5F85\u68C0\u67E5\u7684\u503C\n * @returns \u662F\u5426\u4E3A\u6709\u6548\u7684 WinningInfo\n */\nexport function isWinningInfo(value: unknown): value is WinningInfo {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'winningKey' in value &&\n 'userName' in value &&\n 'prizeName' in value &&\n typeof (value as WinningInfo).winningKey === 'string' &&\n typeof (value as WinningInfo).userName === 'string' &&\n typeof (value as WinningInfo).prizeName === 'string'\n )\n}\n\n// ============================================================================\n// \u5BFC\u51FA\u7C7B\u578B\u522B\u540D\uFF08\u7528\u4E8E\u7B80\u5316\u4F7F\u7528\uFF09\n// ============================================================================\n\n/**\n * \u62BD\u5956\u56DE\u8C03\u51FD\u6570\u7C7B\u578B\n */\nexport type OnSpinEndCallback = (prize: Prize) => void\n\n/**\n * \u83B7\u53D6\u673A\u4F1A\u70B9\u51FB\u56DE\u8C03\u51FD\u6570\u7C7B\u578B\n */\nexport type OnChanceMethodClick = () => void\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,4BAAAE,EAAA,mBAAAC,EAAA,YAAAC,EAAA,kBAAAC,IAAA,eAAAC,EAAAN,GAm1BO,MAAME,EAAyC,CACpD,CACE,UAAW,gBACX,KAAM,QACN,MAAO,wBACP,YAAa,wCACb,WAAY,aACZ,gBAAiB,IAAM,CACrB,MAAM,0CAA0C,CAClD,EACA,QAAS,IAAM,CACb,QAAQ,KAAK,gFAAgF,CAC/F,EACA,SAAU,EACZ,EACA,CACE,UAAW,iBACX,KAAM,SACN,MAAO,mBACP,YAAa,yCACb,WAAY,aACZ,gBAAiB,IAAM,CACrB,MAAM,0CAA0C,CAClD,EACA,QAAS,IAAM,CACb,QAAQ,KAAK,gFAAgF,CAC/F,EACA,SAAU,EACZ,EACA,CACE,UAAW,gBACX,KAAM,QACN,MAAO,iBACP,YAAa,8BACb,WAAY,aACZ,gBAAiB,IAAM,CACrB,MAAM,0CAA0C,CAClD,EACA,QAAS,IAAM,CACb,QAAQ,KAAK,gFAAgF,CAC/F,EACA,SAAU,EACZ,CACF,EAWO,SAASE,EAAQG,EAAgC,CACtD,OACE,OAAOA,GAAU,UACjBA,IAAU,MACV,aAAcA,GACd,SAAUA,GACV,UAAWA,GACX,OAAQA,EAAgB,UAAa,UACrC,OAAQA,EAAgB,MAAS,UACjC,OAAQA,EAAgB,OAAU,QAEtC,CAOO,SAASJ,EAAeI,EAAuC,CACpE,OACE,OAAOA,GAAU,UACjBA,IAAU,MACV,cAAeA,GACf,SAAUA,GACV,UAAWA,GACX,gBAAiBA,GACjB,YAAaA,GACb,OAAQA,EAAuB,WAAc,UAC7C,OAAQA,EAAuB,MAAS,UACxC,OAAQA,EAAuB,OAAU,UACzC,OAAQA,EAAuB,aAAgB,UAC/C,OAAQA,EAAuB,SAAY,UAE/C,CAOO,SAASF,EAAcE,EAAsC,CAClE,OACE,OAAOA,GAAU,UACjBA,IAAU,MACV,eAAgBA,GAChB,aAAcA,GACd,cAAeA,GACf,OAAQA,EAAsB,YAAe,UAC7C,OAAQA,EAAsB,UAAa,UAC3C,OAAQA,EAAsB,WAAc,QAEhD",
4
+ "sourcesContent": ["/**\n * \u62BD\u5956\u7EC4\u4EF6\u5171\u4EAB\u7C7B\u578B\u5B9A\u4E49\n *\n * \u5305\u542B\u6240\u6709\u62BD\u5956\u7EC4\u4EF6\uFF08WheelLottery, ProductLottery \u7B49\uFF09\u5171\u7528\u7684\u7C7B\u578B\u3001\u63A5\u53E3\u548C\u5E38\u91CF\u3002\n *\n * @module LotterySharedTypes\n * @date 2026-04-07\n */\n\nimport type { Theme, Img } from '../../types/props.js'\nimport type { SerializedEditorState, SerializedLexicalNode } from '@payloadcms/richtext-lexical/lexical'\n\n// Re-export Theme and Img for convenience\nexport type { Theme, Img }\n\n// ============================================================================\n// \u6838\u5FC3\u5B9E\u4F53\u7C7B\u578B\n// ============================================================================\n\n/**\n * \u5956\u54C1\uFF08Prize\uFF09\n *\n * \u4EE3\u8868\u62BD\u5956\u6D3B\u52A8\u4E2D\u7684\u4E00\u4E2A\u5956\u54C1\uFF0C\u5305\u542B\u663E\u793A\u6240\u9700\u7684\u6240\u6709\u4FE1\u606F\u3002\n *\n * @example\n * ```tsx\n * const prize: Prize = {\n * prizeKey: 'prize-001',\n * name: 'Anker Prime Charger (100W, 3 Ports, GaN)',\n * image: { url: 'https://images.unsplash.com/photo-123', alt: 'Charger' },\n * rank: '1st',\n * price: '$79.99'\n * }\n * ```\n */\nexport interface Prize {\n /**\n * \u552F\u4E00\u6807\u8BC6\u7B26\uFF0C\u7528\u4E8E React key \u548C\u4E2D\u5956\u7ED3\u679C\u5339\u914D\n */\n prizeKey: string\n\n /**\n * \u5956\u54C1\u540D\u79F0\uFF0C\u663E\u793A\u5728\u8F6C\u76D8\u548C\u5956\u6C60\u4E2D\n * @maxLength 100\n */\n name: string\n\n /**\n * \u5956\u54C1\u56FE\u7247\u5BF9\u8C61\uFF0C\u5305\u542B url \u548C alt\n */\n image: Img\n\n /**\n * \u6392\u540D\u6807\u8BC6\uFF0C\u4EC5\u5728 Prize Pool \u4E2D\u663E\u793A\n * @optional\n */\n rank?: '1st' | '2nd' | '3rd'\n\n /**\n * \u4EF7\u683C\u6216\u6298\u6263\u4FE1\u606F\uFF0C\u663E\u793A\u5728\u5956\u6C60\u4E2D\n * @example \"$99.99\" | \"12% Off\"\n * @optional\n */\n price?: string\n\n /** \u5956\u54C1\u7EF4\u5EA6\u7684\u4E2D\u5956\u5F39\u7A97\u8986\u76D6\u914D\u7F6E\uFF1B\u672A\u914D\u7F6E\u65F6\u7531\u63A5\u5165\u5C42\u56DE\u9000\u5230\u5168\u5C40\u914D\u7F6E */\n winnerModalConfig?: {\n winnerNote?: string\n confirmText?: string\n confirmUrl?: string\n learnMoreUrl?: string\n learnMoreText?: string\n }\n}\n\n/**\n * \u4E2D\u5956\u4FE1\u606F\uFF08WinningInfo\uFF09\n *\n * \u4EE3\u8868\u4E00\u6761\u4E2D\u5956\u8BB0\u5F55\uFF0C\u7528\u4E8E\u5E95\u90E8\u6EDA\u52A8\u6761\u5C55\u793A\uFF0C\u8425\u9020\u6D3B\u52A8\u6C1B\u56F4\u3002\n *\n * @example\n * ```tsx\n * const winningInfo: WinningInfo = {\n * winningKey: 'win-001',\n * userName: 'Shuqi***',\n * prizeName: '12% Off Discount',\n * timestamp: 1702800000000\n * }\n * ```\n */\nexport interface WinningInfo {\n /**\n * \u552F\u4E00\u6807\u8BC6\u7B26\n */\n winningKey: string\n\n /**\n * \u7528\u6237\u540D\uFF08\u5DF2\u8131\u654F\uFF09\uFF0C\u5982 \"Shuqi***\"\n * @note \u5047\u8BBE\u4F20\u5165\u7684\u7528\u6237\u540D\u5DF2\u7ECF\u8FC7\u8131\u654F\u5904\u7406\uFF0C\u7EC4\u4EF6\u5185\u90E8\u4E0D\u518D\u5904\u7406\n */\n userName: string\n\n /**\n * \u4E2D\u5956\u5956\u54C1\u540D\u79F0\n */\n prizeName: string\n\n /**\n * \u4E2D\u5956\u65F6\u95F4\u6233\uFF08\u6BEB\u79D2\uFF09\n * @optional\n */\n timestamp?: number\n}\n\n/**\n * \u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\u7C7B\u578B\n */\nexport type ChanceMethodType = 'share' | 'points' | 'refer' | string\n\n/**\n * \u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\u72B6\u6001\n */\nexport type ChanceMethodStatus = 'pending' | 'completed' | 'used'\n\n/**\n * \u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\uFF08ChanceMethod\uFF09\n *\n * \u4EE3\u8868\u4E00\u79CD\u83B7\u53D6\u62BD\u5956\u673A\u4F1A\u7684\u65B9\u5F0F\uFF0C\u652F\u6301\u7075\u6D3B\u914D\u7F6E\uFF08\u5206\u4EAB\u3001\u79EF\u5206\u3001\u63A8\u8350\u7B49\uFF09\u3002\n *\n * @example\n * ```tsx\n * const chanceMethod: ChanceMethod = {\n * methodKey: 'share-001',\n * type: 'share',\n * title: 'Share on your socials',\n * description: 'Share this event on your social media',\n * buttonText: 'Redeem now',\n * onClick: () => console.log('Share clicked'),\n * disabled: false,\n * status: 'pending'\n * }\n * ```\n */\nexport interface ChanceMethod {\n /**\n * \u552F\u4E00\u6807\u8BC6\u7B26\n */\n methodKey: string\n\n /**\n * \u65B9\u5F0F\u7C7B\u578B\uFF0C\u652F\u6301\u9884\u5B9A\u4E49\u7C7B\u578B\uFF08'share', 'points', 'refer'\uFF09\u6216\u81EA\u5B9A\u4E49\u7C7B\u578B\n */\n type: ChanceMethodType\n\n /**\n * \u65B9\u5F0F\u6807\u9898\uFF0C\u5982 \"Share on your socials\"\n */\n title: string\n\n /**\n * \u8BE6\u7EC6\u8BF4\u660E\u6587\u5B57\n */\n description: string\n\n /**\n * \u6309\u94AE\u6587\u6848\uFF0C\u9ED8\u8BA4 \"Redeem now\"\n * @default \"Redeem now\"\n * @optional\n */\n buttonText?: string\n\n completed?: string\n\n used?: string\n\n /**\n * \u672A\u767B\u5F55\u65F6\u70B9\u51FB GO \u6309\u94AE\u7684\u56DE\u8C03\n * @example\n * ```tsx\n * onLoginRequired={() => {\n * // \u6253\u5F00\u767B\u5F55\u5F39\u7A97\u6216\u8DF3\u8F6C\u767B\u5F55\u9875\n * router.push('/login')\n * }}\n * ```\n */\n onLoginRequired?: () => void\n\n /**\n * \u70B9\u51FB\u6309\u94AE\u65F6\u7684\u56DE\u8C03\u51FD\u6570\n * @note \u4E1A\u52A1\u903B\u8F91\uFF08\u5982\u79EF\u5206\u6263\u9664\u3001\u5206\u4EAB\u9A8C\u8BC1\uFF09\u7531\u7236\u7EC4\u4EF6\u5904\u7406\n */\n onClick: () => void\n\n /**\n * \u662F\u5426\u7981\u7528\u8BE5\u65B9\u5F0F\n * @default false\n * @optional\n */\n disabled?: boolean\n\n /**\n * \u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\u7684\u72B6\u6001\n * - pending: \u672A\u5B8C\u6210\uFF08\u9ED8\u8BA4\u72B6\u6001\uFF09\n * - completed: \u5DF2\u5B8C\u6210/\u5DF2\u83B7\u5F97\n * - used: \u5DF2\u4F7F\u7528\n * @default \"pending\"\n * @optional\n */\n status?: ChanceMethodStatus\n\n /**\n * \u662F\u5426\u663E\u793A\u52A0\u8F7D\u72B6\u6001\n * @default false\n * @optional\n */\n loading?: boolean\n\n /**\n * \u662F\u5426\u5728\u70B9\u51FB\u65F6\u6253\u5F00\u5206\u4EAB\u5F39\u7A97\n * @default false\n * @optional\n */\n openShareModal?: boolean\n}\n\n/**\n * \u7528\u6237\u6570\u636E\uFF08UserData\uFF09\n *\n * \u4EE3\u8868\u5F53\u524D\u7528\u6237\u7684\u62BD\u5956\u76F8\u5173\u6570\u636E\n *\n * @example\n * ```tsx\n * const userData: UserData = {\n * isLoggedIn: true,\n * availableChances: 3,\n * wonPrizes: [\n * { id: 'prize-001', name: 'Charger', image: 'https://...', timestamp: 1702800000000 }\n * ]\n * }\n * ```\n */\nexport interface UserData {\n /**\n * \u7528\u6237\u662F\u5426\u5DF2\u767B\u5F55\n */\n isLoggedIn: boolean\n\n /**\n * \u5F53\u524D\u53EF\u4F7F\u7528\u7684\u62BD\u5956\u6B21\u6570\n * @default 0\n */\n availableChances: number\n\n /**\n * \u603B\u673A\u4F1A\u6570\uFF08\u7528\u4E8E\u663E\u793A\u8FDB\u5EA6\uFF0C\u4F8B\u5982 \"3/5\"\uFF09\n * @default undefined\n * @optional\n */\n totalChances?: number\n\n /**\n * \u5DF2\u83B7\u5F97\u7684\u5956\u54C1\u5217\u8868\n * @optional\n */\n wonPrizes?: Array<Prize & { timestamp?: number }>\n\n /** * \u7528\u6237\u7535\u5B50\u90AE\u7BB1\uFF08\u53EF\u9009\uFF0C\u7528\u4E8E\u53D1\u9001\u4E2D\u5956\u901A\u77E5\u7B49\uFF09\n * @optional\n */\n email?: string\n}\n\n/**\n * \u7F13\u52A8\u51FD\u6570\u7C7B\u578B\n */\nexport type EasingFunction = 'ease-out' | 'ease-in-out' | 'linear'\n\n// ============================================================================\n// \u516C\u5171\u6587\u6848\u914D\u7F6E\u7C7B\u578B\n// ============================================================================\n\n/**\n * \u590D\u5236\u64CD\u4F5C\u76F8\u5173\u6587\u6848\u914D\u7F6E\uFF08\u516C\u5171\u7C7B\u578B\uFF09\n * \u7528\u4E8E\u6240\u6709\u5305\u542B\u590D\u5236\u529F\u80FD\u7684\u7EC4\u4EF6\n */\nexport interface CopyTextConfig {\n /**\n * \u590D\u5236\u6309\u94AE\u6587\u672C\n * @default \"COPY\"\n */\n copyText?: string\n\n /**\n * \u590D\u5236\u6210\u529F\u540E\u7684\u6309\u94AE\u6587\u672C\n * @default \"COPIED\"\n */\n copiedText?: string\n}\n\n/**\n * \u4F18\u60E0\u7801\u76F8\u5173\u914D\u7F6E\uFF08\u516C\u5171\u7C7B\u578B\uFF09\n * \u7528\u4E8E\u6240\u6709\u5C55\u793A\u4F18\u60E0\u7801\u7684\u7EC4\u4EF6\n */\nexport interface CouponConfig {\n /**\n * \u4EE3\u7801\u6587\u672C\u524D\u7F00\n * @default \"CODE:\"\n */\n codeText?: string\n\n /**\n * \u4F18\u60E0\u7801\n */\n couponCode?: string\n\n /**\n * \u4F18\u60E0\u7801\u8FC7\u671F\u65F6\u95F4\n */\n expiresAt?: string\n\n /**\n * \u4F18\u60E0\u5238\u6298\u6263\u6587\u672C\uFF08\u4F8B\u5982 \"20%\"\uFF09\n */\n couponDiscount?: string\n\n /**\n * \u4F18\u60E0\u5238\u5355\u4F4D\u6587\u672C\n * @default \"Off\"\n */\n couponUnit?: string\n}\n\n/**\n * \u5956\u52B1\u65F6\u95F4\u6587\u6848\u914D\u7F6E\uFF08\u516C\u5171\u7C7B\u578B\uFF09\n */\nexport interface PrizeTimeTextConfig {\n /**\n * \u5956\u52B1\u65F6\u95F4\u6587\u672C\u524D\u7F00\n * @default \"Prize time:\"\n */\n prizeText?: string\n}\n\n/**\n * \u4E2D\u5956\u5F39\u7A97\u914D\u7F6E\uFF08WinnerModalConfig\uFF09\n *\n * \u7528\u4E8E\u914D\u7F6E\u4E2D\u5956\u5F39\u7A97\u7684\u5C55\u793A\u5185\u5BB9\uFF0C\u901A\u5E38\u7531\u62BD\u5956\u63A5\u53E3\u8FD4\u56DE\u63D0\u4F9B\n *\n * @example\n * ```tsx\n * const winnerModalConfig: WinnerModalConfig = {\n * title: 'Congratulations!',\n * prizeTitle: 'Anker Prime Charger',\n * prizeImage: 'https://...',\n * prizeDescription: 'High-speed charging for all your devices',\n * learnMoreUrl: 'https://...',\n * learnMoreText: 'View Details',\n * couponCode: 'ANKER2024',\n * expiresAt: '2024-12-31',\n * couponDiscount: '20%',\n * couponUnit: 'Off',\n * confirmText: 'Claim Now'\n * }\n * ```\n */\nexport interface WinnerModalConfig extends CopyTextConfig, CouponConfig, PrizeTimeTextConfig {\n /**\n * \u4E2D\u5956\u5F39\u7A97\u6807\u9898\n * @default \"You Have Won\"\n * @optional\n */\n title?: string\n\n /**\n * \u4E2D\u5956\u5F39\u7A97\u5956\u54C1\u6807\u9898\uFF08\u4F18\u5148\u7EA7\u9AD8\u4E8E prize.name\uFF09\n * @optional\n */\n prizeTitle?: string\n\n /**\n * \u4E2D\u5956\u5F39\u7A97\u5956\u54C1\u56FE\u7247 URL\uFF08\u4F18\u5148\u7EA7\u9AD8\u4E8E prize.image\uFF09\n * @optional\n */\n prizeImage?: string\n\n /**\n * \u4E2D\u5956\u5F39\u7A97\u5956\u54C1\u8BE6\u60C5\u63CF\u8FF0\n * @deprecated \u8BED\u4E49\u4E0D\u660E\u786E\uFF0C\u8BF7\u6539\u7528 `winnerNote`\uFF08code/copy \u4E0B\u65B9\u4E13\u7528\u8BF4\u660E\u6587\u5B57\uFF09\n * @optional\n */\n prizeDescription?: string\n\n /**\n * code/copy \u533A\u57DF\u6B63\u4E0B\u65B9\u7684\u4E13\u7528\u8BF4\u660E\u6587\u5B57\u3002\n * \u4EC5\u5728\u660E\u786E\u914D\u7F6E\u65F6\u5C55\u793A\uFF1B\u672A\u914D\u7F6E\u65F6\u4E0D\u6E32\u67D3\u4EFB\u4F55\u5185\u5BB9\u3002\n * \u4F18\u5148\u7EA7\u9AD8\u4E8E `prizeDescription`\u3002\n * @optional\n */\n winnerNote?: string\n\n /**\n * \u4E2D\u5956\u5F39\u7A97 Learn More \u94FE\u63A5\n * @optional\n */\n learnMoreUrl?: string\n\n /**\n * \u4E2D\u5956\u5F39\u7A97 Learn More \u6309\u94AE\u6587\u672C\n * @default \"Learn More\"\n * @optional\n */\n learnMoreText?: string\n\n /**\n * \u4E2D\u5956\u5F39\u7A97\u786E\u8BA4\u6309\u94AE\u6587\u672C\n * @default \"Okay, Got It\"\n * @optional\n */\n confirmText?: string\n\n /** \u786E\u8BA4\u6309\u94AE\u8DF3\u8F6C\u94FE\u63A5\uFF0C\u914D\u7F6E\u540E\u70B9\u51FB\u6309\u94AE\u5C06\u5728\u65B0\u6807\u7B7E\u9875\u6253\u5F00\u6B64\u94FE\u63A5 @optional */\n confirmUrl?: string\n}\n\n/**\n * Rules \u5F39\u7A97\u914D\u7F6E\n *\n * @example\n * ```tsx\n * rulesModalConfig={{\n * rulesData: [\n * { item: '$100 instead of $200, 10 tickets/day.' },\n * { item: '$100 for $120, 50 tickets/day.' }\n * ],\n * rulesText: 'Game Rules',\n * rulesTitle: 'Activity Rules'\n * }}\n * ```\n */\nexport interface RulesModalConfig {\n /**\n * \u89C4\u5219\u6570\u636E\u5217\u8868\n * @optional\n */\n rulesData?: Array<{\n /**\n * \u89C4\u5219\u9879\u5185\u5BB9\n */\n item: string\n }>\n\n /**\n * Rules \u6309\u94AE\u6587\u672C\n * @default \"Rules\"\n * @optional\n */\n rulesText?: string\n\n /**\n * \u5F39\u7A97\u6807\u9898\n * @default \"Rules\"\n * @optional\n */\n rulesTitle?: string\n}\n\n/**\n * ProductLottery \u9876\u680F\u53F3\u4FA7\u8DF3\u8F6C\u6309\u94AE\u914D\u7F6E\n */\nexport interface ActionButtonConfig {\n /**\n * \u6309\u94AE\u6587\u672C\uFF1B\u4E3A\u7A7A\u65F6\u4E0D\u5C55\u793A\n */\n text?: string\n\n /**\n * \u8DF3\u8F6C\u94FE\u63A5\uFF1B\u4E3A\u7A7A\u65F6\u4E0D\u5C55\u793A\n */\n url?: string\n}\n\n/**\n * My Rewards \u5F39\u7A97\u914D\u7F6E\n *\n * @example\n * ```tsx\n * myRewardsModalConfig={{\n * rewardsData: [\n * {\n * id: '1',\n * name: 'Anker Charger',\n * code: 'ANKER2024',\n * status: 'Available',\n * prizeTime: '2024-01-01',\n * showCopyCode: true\n * }\n * ],\n * myRewardsText: 'My Prizes',\n * codeText: 'CODE:',\n * copyText: 'COPY',\n * prizeText: 'Prize time:',\n * emptyText: 'No rewards yet'\n * }}\n * ```\n */\nexport interface MyRewardsModalConfig extends CopyTextConfig, PrizeTimeTextConfig {\n /**\n * \u5956\u52B1\u6570\u636E\u5217\u8868\n * @optional\n */\n rewardsData?: Array<{\n /**\n * \u5956\u52B1 ID\n */\n id: string\n /**\n * \u5956\u52B1\u540D\u79F0\n */\n name: string\n /**\n * \u4F18\u60E0\u7801\uFF08\u53EF\u9009\uFF09\n */\n code?: string\n /**\n * \u72B6\u6001\n */\n status: 'Available' | 'Expired' | 'Used'\n /**\n * \u5956\u52B1\u65F6\u95F4\n */\n prizeTime?: string\n /**\n * \u662F\u5426\u53EF\u590D\u5236\u7801\n */\n showCopyCode?: boolean\n /**\n * \u6BCF\u5956\u52B1\u53EF\u914D\u7F6E\u7684\u663E\u793A\u6587\u6848\uFF08\u8986\u76D6\u5168\u5C40 status label \u6620\u5C04\uFF09\n * @optional\n */\n statusText?: string\n\n /**\n * \u662F\u5426\u53EF\u7528\uFF08\u7528\u4E8E\u63A7\u5236\u989C\u8272\u548C\u590D\u5236\u6309\u94AE\u72B6\u6001\uFF09\n * @optional\n */\n available?: boolean\n }>\n\n /**\n * My Rewards \u6309\u94AE\u6587\u672C\n * @default \"My Rewards\"\n * @optional\n */\n myRewardsText?: string\n\n /**\n * \u5F39\u7A97\u6807\u9898\n * @default \"My Rewards\"\n * @optional\n */\n myRewardsTitle?: string\n\n /**\n * \u4EE3\u7801\u6587\u672C\u524D\u7F00\n * @default \"CODE:\"\n * @optional\n */\n codeText?: string\n\n /**\n * \u7A7A\u72B6\u6001\u63D0\u793A\u6587\u672C\n * @default \"No rewards yet\"\n * @optional\n */\n emptyText?: string\n\n /**\n * \u590D\u5236\u5931\u8D25\u63D0\u793A\u6587\u6848\n * @optional\n */\n copyError?: string\n\n /**\n * \u53EF\u7528\u72B6\u6001\u6587\u6848\n * @default \"Available\"\n * @optional\n */\n availableText?: string\n\n /**\n * \u5DF2\u4F7F\u7528\u72B6\u6001\u6587\u6848\n * @default \"Used\"\n * @optional\n */\n usedStatusText?: string\n\n /**\n * \u5DF2\u8FC7\u671F\u72B6\u6001\u6587\u6848\n * @default \"Expired\"\n * @optional\n */\n expiredText?: string\n\n /**\n * \u672A\u77E5\u72B6\u6001\u6587\u6848\n * @optional\n */\n notFoundText?: string\n}\n\n/**\n * \u9519\u8BEF\u5F39\u7A97\u914D\u7F6E\n * @example\n * ```tsx\n * errorModalConfig={{\n * title: 'Oops!',\n * message: 'Something went wrong during the lottery process.',\n * confirmText: 'OK, I get'\n * }}\n * ```\n */\nexport interface ErrorModalConfig {\n /**\n * \u5F39\u7A97\u6807\u9898\n * @default \"Oops!\"\n * @optional\n */\n title?: string\n /**\n * \u9519\u8BEF\u6D88\u606F\u5185\u5BB9\n * @default \"Something went wrong during the lottery process.\"\n * @optional\n */\n message?: string\n /**\n * \u786E\u8BA4\u6309\u94AE\u6587\u672C\n * @default \"OK, I get\"\n * @optional\n */\n confirmText?: string\n}\n\n/**\n * \u793E\u4EA4\u5E73\u53F0\u7C7B\u578B\n */\nexport type SocialPlatform = 'facebook' | 'twitter' | 'instagram' | 'linkedin' | 'tiktok' | 'youtube'\n\n/**\n * \u793E\u4EA4\u5E73\u53F0\u914D\u7F6E\n */\nexport interface SharePlatformConfig {\n /**\n * \u5E73\u53F0\u7C7B\u578B\n */\n platform: SocialPlatform\n\n /**\n * \u5E73\u53F0\u540D\u79F0\n */\n name: string\n\n /**\n * \u5206\u4EAB URL\uFF08\u53EF\u9009\uFF0C\u5982\u679C\u63D0\u4F9B\u5219\u76F4\u63A5\u8DF3\u8F6C\uFF09\n */\n url?: string\n\n /**\n * \u70B9\u51FB\u56DE\u8C03\uFF08\u5982\u679C\u63D0\u4F9B url \u5219\u6B64\u56DE\u8C03\u4F1A\u5728\u8DF3\u8F6C\u524D\u6267\u884C\uFF09\n */\n onClick?: () => void\n\n /**\n * \u662F\u5426\u7981\u7528\n */\n disabled?: boolean\n}\n\n/**\n * \u5206\u4EAB\u5F39\u7A97\u914D\u7F6E\n */\nexport interface ShareModalConfig {\n /**\n * \u5F39\u7A97\u6807\u9898\n * @default \"Share to Get More Chances\"\n */\n title?: string\n\n /**\n * \u526F\u6807\u9898/\u5F15\u5BFC\u6587\u6848\n * @default \"Share to Play Again Keep Trying! You Could Still Win Big!\"\n */\n subtitle?: string\n\n /**\n * \u5E95\u90E8\u63D0\u793A\u6587\u6848\n * @default \"Note: Maximum of 3 times per participant.\"\n */\n note?: string\n\n /**\n * \u793E\u4EA4\u5E73\u53F0\u914D\u7F6E\u5217\u8868\n */\n platforms?: SharePlatformConfig[]\n\n /**\n * \u5206\u4EAB\u6210\u529F\u56DE\u8C03\n */\n onShareSuccess?: (platform: SocialPlatform) => void\n}\n\n// ============================================================================\n// \u5B50\u7EC4\u4EF6 Props \u63A5\u53E3\n// ============================================================================\n\n/**\n * PrizePool \u5956\u54C1\u6C60\u7EC4\u4EF6 Props\n */\nexport interface PrizePoolProps {\n /**\n * \u4E3B\u9898\u6A21\u5F0F\n * @optional\n */\n theme?: Theme\n\n /**\n * \u5956\u54C1\u5217\u8868(\u901A\u5E38\u662F\u5168\u90E8 8 \u4E2A\u5956\u54C1)\n */\n prizes: Prize[]\n\n /**\n * \u6807\u9898\u6587\u672C\n * @default \"Prize Pool\"\n */\n title?: string\n\n /**\n * \u4E2D\u5956\u4EBA\u540D\u5355\u6570\u636E\n * @optional\n */\n winningInfos?: WinningInfo[]\n\n /**\n * \u81EA\u5B9A\u4E49\u7C7B\u540D\n */\n className?: string\n\n /**\n * \u4E2D\u5956\u6EDA\u52A8 Ticker \u6587\u6848\u6A21\u677F\n * \u652F\u6301\u53D8\u91CF\uFF1A{{name}} \u83B7\u5956\u8005\u6635\u79F0\uFF0C{{prize}} \u5956\u54C1\u540D\u79F0\n * @default \"{{name}} just won {{prize}}!\"\n * @optional\n */\n winnerNameTemplate?: string\n}\n\n/** \u6D3B\u52A8\u673A\u5236\u6A21\u5F0F */\nexport type ChanceMechanismType = 'methods' | 'input'\n\n/** \u8F93\u5165\u6846\u914D\u7F6E\uFF08\u4EC5 mechanismType='input' \u65F6\u4F7F\u7528\uFF09 */\nexport interface ChanceInputConfig {\n /** \u8F93\u5165\u6846\u5360\u4F4D\u6587\u672C @default \"Enter your order number\" */\n placeholder?: string\n /** \u63D0\u4EA4\u6309\u94AE\u6587\u6848 @default \"Spin and Win\" */\n submitText?: string\n /** \u8F93\u5165\u503C\u63D0\u4EA4\u56DE\u8C03 */\n onSubmit?: (value: string) => void | Promise<void>\n /** \u662F\u5426\u6B63\u5728\u63D0\u4EA4 */\n isSubmitting?: boolean\n /** \u8F93\u5165\u6846\u7C7B\u578B @default \"text\" */\n inputType?: 'text' | 'email' | 'number'\n /** \u9A8C\u8BC1\u6B63\u5219 (\u53EF\u9009) */\n validationPattern?: string\n /** \u9A8C\u8BC1\u5931\u8D25\u63D0\u793A\u6587\u6848 */\n validationErrorText?: string\n /** \u8F93\u5165\u6846\u9ED8\u8BA4\u503C\uFF08\u5982\u767B\u5F55\u7528\u6237 email\uFF0C\u652F\u6301\u5F02\u6B65\u586B\u5145\uFF09 @optional */\n defaultValue?: string\n\n /** \u63A5\u5165\u65B9\u6309\u9700\u7981\u7528\u8F93\u5165\u6846\u5185\u5BB9\u66F4\u6539 */\n disabled?: boolean\n\n /** \u662F\u5426\u7981\u6B62\u6D4F\u89C8\u5668\u81EA\u52A8\u586B\u5145\uFF08\u5C24\u5176\u662F email \u81EA\u52A8\u586B\u5145\uFF09 */\n disableAutofill?: boolean\n\n /** \u534F\u8BAE\u544A\u77E5\u5BCC\u6587\u672C\uFF1B\u914D\u7F6E\u65F6\u624D\u5C55\u793A\u534F\u8BAE\u52FE\u9009 UI */\n agreementNotice?: string | SerializedEditorState<SerializedLexicalNode>\n\n /** \u534F\u8BAE\u672A\u52FE\u9009\u65F6\u7684\u63D0\u793A\u6587\u6848\uFF1B\u914D\u7F6E\u534F\u8BAE\u540E\u70B9\u51FB\u63D0\u4EA4\u4F46\u672A\u52FE\u9009\u65F6\u5C55\u793A */\n agreementWarningText?: string\n\n /** \u8F93\u5165\u6A21\u5F0F\u63D0\u4EA4\u6309\u94AE\u70B9\u51FB\u57CB\u70B9\uFF1Adata-headless-type-name */\n submitTrackTypeName?: string\n\n /** \u8F93\u5165\u6A21\u5F0F\u63D0\u4EA4\u6309\u94AE\u70B9\u51FB\u57CB\u70B9\uFF1Adata-headless-title-desc-button */\n submitTrackTitleDescButton?: string\n}\n\n/**\n * ChanceMethods \u83B7\u53D6\u673A\u4F1A\u7EC4\u4EF6 Props\n */\nexport interface ChanceMethodsProps {\n /**\n * \u4E3B\u9898\u6A21\u5F0F\n * @optional\n */\n theme?: Theme\n\n /**\n * \u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\u5217\u8868\n */\n methods: ChanceMethod[]\n\n /**\n * \u6807\u9898\u6587\u672C\n * @default \"Want more chances to win?\"\n */\n title?: string\n\n /**\n * \u526F\u6807\u9898(\u53EF\u9009)\n */\n subtitle?: string\n\n /**\n * \u5E95\u90E8\u63D0\u793A\u6587\u672C(\u53EF\u9009)\n */\n footerNote?: string\n\n /**\n * \u767B\u5F55\u7528\u6237\u6570\u636E\uFF08\u53EF\u9009\uFF09\n * @optional\n */\n userData?: UserData\n\n /**\n * \u6253\u5F00\u5206\u4EAB\u5F39\u7A97\u56DE\u8C03\uFF08\u53EF\u9009\uFF09\n * @optional\n */\n onOpenShareModal?: () => void\n\n /**\n * \u5FBD\u7AE0\u6587\u6848\n * @default \"Chance +1\"\n */\n chanceBadgeText?: string\n\n /**\n * \u5DF2\u5B8C\u6210\u72B6\u6001\u6587\u6848\n * @default \"Completed\"\n */\n completedText?: string\n\n /**\n * \u5DF2\u4F7F\u7528\u72B6\u6001\u6587\u6848\n * @default \"Used\"\n */\n usedText?: string\n\n /**\n * \u52A0\u8F7D\u4E2D\u6587\u6848\n * @default \"Loading...\"\n */\n loadingText?: string\n\n /**\n * \u81EA\u5B9A\u4E49\u7C7B\u540D\n */\n className?: string\n\n /** \u6D3B\u52A8\u673A\u5236\u6A21\u5F0F @default 'methods' */\n mechanismType?: ChanceMechanismType\n /** \u8F93\u5165\u6846\u914D\u7F6E\uFF08\u4EC5 mechanismType='input' \u65F6\u4F7F\u7528\uFF09 */\n inputConfig?: ChanceInputConfig\n\n /** \u534F\u8BAE\u662F\u5426\u5DF2\u52FE\u9009\uFF08\u4F9B\u5916\u5C42\u7EDF\u4E00\u63A7\u5236\u5DE6\u53F3\u4E24\u4FA7\u62BD\u5956\u5165\u53E3\uFF09 */\n isAgreementChecked?: boolean\n\n /** \u534F\u8BAE\u52FE\u9009\u72B6\u6001\u53D8\u66F4\u56DE\u8C03 */\n onAgreementCheckedChange?: (checked: boolean) => void\n\n /** \u5916\u5C42\u6CE8\u5165\u7684\u534F\u8BAE\u63D0\u793A\u6587\u6848\uFF08\u7528\u4E8E\u7EDF\u4E00\u62E6\u622A\u5DE6\u53F3\u4E24\u4FA7\u62BD\u5956\u5165\u53E3\u65F6\u5C55\u793A\u5728\u6309\u94AE\u4E0B\u65B9\uFF09 */\n agreementErrorText?: string\n}\n\n/**\n * WinnerModal \u4E2D\u5956\u5F39\u7A97\u7EC4\u4EF6 Props\n */\nexport interface WinnerModalProps extends CopyTextConfig, CouponConfig, PrizeTimeTextConfig {\n /**\n * \u662F\u5426\u663E\u793A\u5F39\u7A97\n */\n isOpen: boolean\n\n /**\n * \u4E2D\u5956\u5956\u54C1\u4FE1\u606F\n */\n prize: Prize | null\n\n /**\n * \u5F39\u7A97\u6807\u9898\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4 \"You Have Won\"\uFF09\n */\n title?: string\n\n /**\n * \u5956\u54C1\u6807\u9898\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4\u4F7F\u7528 prize.name\uFF09\n */\n prizeTitle?: string\n\n /**\n * \u5956\u54C1\u56FE\u7247 URL\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4\u4F7F\u7528 prize.image\uFF09\n */\n prizeImage?: string\n\n /**\n * \u5956\u54C1\u8BE6\u60C5\u63CF\u8FF0\uFF08\u53EF\u9009\uFF09\n * @deprecated \u8BED\u4E49\u4E0D\u660E\u786E\uFF0C\u8BF7\u6539\u7528 `winnerNote`\uFF08code/copy \u4E0B\u65B9\u4E13\u7528\u8BF4\u660E\u6587\u5B57\uFF09\n */\n prizeDescription?: string\n\n /**\n * code/copy \u533A\u57DF\u6B63\u4E0B\u65B9\u7684\u4E13\u7528\u8BF4\u660E\u6587\u5B57\u3002\n * \u4EC5\u5728\u660E\u786E\u914D\u7F6E\u65F6\u5C55\u793A\uFF1B\u672A\u914D\u7F6E\u65F6\u4E0D\u6E32\u67D3\u4EFB\u4F55\u5185\u5BB9\u3002\n * \u4F18\u5148\u7EA7\u9AD8\u4E8E `prizeDescription`\u3002\n * @optional\n */\n winnerNote?: string\n\n /**\n * Learn More \u94FE\u63A5\uFF08\u53EF\u9009\uFF09\n */\n learnMoreUrl?: string\n\n /**\n * Learn More \u6309\u94AE\u6587\u672C\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4 \"Learn More\"\uFF09\n */\n learnMoreText?: string\n\n /**\n * \u590D\u5236\u7801\u70B9\u51FB\u56DE\u8C03\n */\n onCopyCode?: (code: string) => void\n\n /**\n * \u5173\u95ED\u5F39\u7A97\u56DE\u8C03\n */\n onClose: () => void\n\n /**\n * \u786E\u8BA4\u6309\u94AE\u6587\u672C\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4 \"Okay, Got It\"\uFF09\n */\n confirmText?: string\n\n /** \u786E\u8BA4\u6309\u94AE\u8DF3\u8F6C\u94FE\u63A5 @optional */\n confirmUrl?: string\n\n /**\n * \u786E\u8BA4\u6309\u94AE\u70B9\u51FB\u56DE\u8C03\uFF08\u53EF\u9009\uFF09\n */\n onConfirm?: () => void\n\n /**\n * \u81EA\u5B9A\u4E49\u7C7B\u540D\n */\n className?: string\n}\n\n// ============================================================================\n// \u9ED8\u8BA4\u914D\u7F6E\n// ============================================================================\n\n/**\n * \u9ED8\u8BA4\u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\uFF083\u79CD\uFF09\n * @note \u7236\u7EC4\u4EF6\u9700\u8981\u8986\u76D6 onClick \u56DE\u8C03\u4EE5\u5B9E\u73B0\u5177\u4F53\u4E1A\u52A1\u903B\u8F91\n */\nexport const DEFAULT_CHANCE_METHODS: ChanceMethod[] = [\n {\n methodKey: 'default-share',\n type: 'share',\n title: 'Share on your socials',\n description: 'Share this event on your social media',\n buttonText: 'Redeem now',\n onLoginRequired: () => {\n alert('Please log in to share and get a chance!')\n },\n onClick: () => {\n console.warn('ChanceMethod.onClick not implemented. Please provide a custom onClick handler.')\n },\n disabled: false,\n },\n {\n methodKey: 'default-points',\n type: 'points',\n title: 'Spend 100 points',\n description: 'Use your reward points to get a chance',\n buttonText: 'Redeem now',\n onLoginRequired: () => {\n alert('Please log in to share and get a chance!')\n },\n onClick: () => {\n console.warn('ChanceMethod.onClick not implemented. Please provide a custom onClick handler.')\n },\n disabled: false,\n },\n {\n methodKey: 'default-refer',\n type: 'refer',\n title: 'Refer a friend',\n description: 'Invite your friends to join',\n buttonText: 'Redeem now',\n onLoginRequired: () => {\n alert('Please log in to share and get a chance!')\n },\n onClick: () => {\n console.warn('ChanceMethod.onClick not implemented. Please provide a custom onClick handler.')\n },\n disabled: false,\n },\n]\n\n// ============================================================================\n// \u7C7B\u578B\u5B88\u536B\n// ============================================================================\n\n/**\n * \u68C0\u67E5\u662F\u5426\u4E3A\u6709\u6548\u7684 Prize \u5BF9\u8C61\n * @param value \u5F85\u68C0\u67E5\u7684\u503C\n * @returns \u662F\u5426\u4E3A\u6709\u6548\u7684 Prize\n */\nexport function isPrize(value: unknown): value is Prize {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'prizeKey' in value &&\n 'name' in value &&\n 'image' in value &&\n typeof (value as Prize).prizeKey === 'string' &&\n typeof (value as Prize).name === 'string' &&\n typeof (value as Prize).image === 'object'\n )\n}\n\n/**\n * \u68C0\u67E5\u662F\u5426\u4E3A\u6709\u6548\u7684 ChanceMethod \u5BF9\u8C61\n * @param value \u5F85\u68C0\u67E5\u7684\u503C\n * @returns \u662F\u5426\u4E3A\u6709\u6548\u7684 ChanceMethod\n */\nexport function isChanceMethod(value: unknown): value is ChanceMethod {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'methodKey' in value &&\n 'type' in value &&\n 'title' in value &&\n 'description' in value &&\n 'onClick' in value &&\n typeof (value as ChanceMethod).methodKey === 'string' &&\n typeof (value as ChanceMethod).type === 'string' &&\n typeof (value as ChanceMethod).title === 'string' &&\n typeof (value as ChanceMethod).description === 'string' &&\n typeof (value as ChanceMethod).onClick === 'function'\n )\n}\n\n/**\n * \u68C0\u67E5\u662F\u5426\u4E3A\u6709\u6548\u7684 WinningInfo \u5BF9\u8C61\n * @param value \u5F85\u68C0\u67E5\u7684\u503C\n * @returns \u662F\u5426\u4E3A\u6709\u6548\u7684 WinningInfo\n */\nexport function isWinningInfo(value: unknown): value is WinningInfo {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'winningKey' in value &&\n 'userName' in value &&\n 'prizeName' in value &&\n typeof (value as WinningInfo).winningKey === 'string' &&\n typeof (value as WinningInfo).userName === 'string' &&\n typeof (value as WinningInfo).prizeName === 'string'\n )\n}\n\n// ============================================================================\n// \u5BFC\u51FA\u7C7B\u578B\u522B\u540D\uFF08\u7528\u4E8E\u7B80\u5316\u4F7F\u7528\uFF09\n// ============================================================================\n\n/**\n * \u62BD\u5956\u56DE\u8C03\u51FD\u6570\u7C7B\u578B\n */\nexport type OnSpinEndCallback = (prize: Prize) => void\n\n/**\n * \u83B7\u53D6\u673A\u4F1A\u70B9\u51FB\u56DE\u8C03\u51FD\u6570\u7C7B\u578B\n */\nexport type OnChanceMethodClick = () => void\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,4BAAAE,EAAA,mBAAAC,EAAA,YAAAC,EAAA,kBAAAC,IAAA,eAAAC,EAAAN,GA68BO,MAAME,EAAyC,CACpD,CACE,UAAW,gBACX,KAAM,QACN,MAAO,wBACP,YAAa,wCACb,WAAY,aACZ,gBAAiB,IAAM,CACrB,MAAM,0CAA0C,CAClD,EACA,QAAS,IAAM,CACb,QAAQ,KAAK,gFAAgF,CAC/F,EACA,SAAU,EACZ,EACA,CACE,UAAW,iBACX,KAAM,SACN,MAAO,mBACP,YAAa,yCACb,WAAY,aACZ,gBAAiB,IAAM,CACrB,MAAM,0CAA0C,CAClD,EACA,QAAS,IAAM,CACb,QAAQ,KAAK,gFAAgF,CAC/F,EACA,SAAU,EACZ,EACA,CACE,UAAW,gBACX,KAAM,QACN,MAAO,iBACP,YAAa,8BACb,WAAY,aACZ,gBAAiB,IAAM,CACrB,MAAM,0CAA0C,CAClD,EACA,QAAS,IAAM,CACb,QAAQ,KAAK,gFAAgF,CAC/F,EACA,SAAU,EACZ,CACF,EAWO,SAASE,EAAQG,EAAgC,CACtD,OACE,OAAOA,GAAU,UACjBA,IAAU,MACV,aAAcA,GACd,SAAUA,GACV,UAAWA,GACX,OAAQA,EAAgB,UAAa,UACrC,OAAQA,EAAgB,MAAS,UACjC,OAAQA,EAAgB,OAAU,QAEtC,CAOO,SAASJ,EAAeI,EAAuC,CACpE,OACE,OAAOA,GAAU,UACjBA,IAAU,MACV,cAAeA,GACf,SAAUA,GACV,UAAWA,GACX,gBAAiBA,GACjB,YAAaA,GACb,OAAQA,EAAuB,WAAc,UAC7C,OAAQA,EAAuB,MAAS,UACxC,OAAQA,EAAuB,OAAU,UACzC,OAAQA,EAAuB,aAAgB,UAC/C,OAAQA,EAAuB,SAAY,UAE/C,CAOO,SAASF,EAAcE,EAAsC,CAClE,OACE,OAAOA,GAAU,UACjBA,IAAU,MACV,eAAgBA,GAChB,aAAcA,GACd,cAAeA,GACf,OAAQA,EAAsB,YAAe,UAC7C,OAAQA,EAAsB,UAAa,UAC3C,OAAQA,EAAsB,WAAc,QAEhD",
6
6
  "names": ["types_exports", "__export", "DEFAULT_CHANCE_METHODS", "isChanceMethod", "isPrize", "isWinningInfo", "__toCommonJS", "value"]
7
7
  }
@@ -1,6 +1,7 @@
1
1
  import React from 'react';
2
2
  import type { MarqueeProps, MarqueeItemProps, MarqueeImageContentProps, MarqueeTextContentProps } from './type.js';
3
3
  import { type SwiperRef } from 'swiper/react';
4
+ import 'swiper/css';
4
5
  declare const MarqueeItem: {
5
6
  ({ data, configuration }: MarqueeItemProps): import("react/jsx-runtime").JSX.Element;
6
7
  displayName: string;
@@ -10,7 +11,7 @@ declare const MarqueeImageContent: {
10
11
  displayName: string;
11
12
  };
12
13
  declare const MarqueeTextContent: React.ForwardRefExoticComponent<MarqueeTextContentProps & React.RefAttributes<HTMLDivElement>>;
13
- declare const _default: React.ForwardRefExoticComponent<Omit<MarqueeProps & React.RefAttributes<SwiperRef>, "container" | keyof import("../../shared/Styles.js").StylesProps> & import("../../shared/Styles.js").StylesProps & import("../../shared/Styles.js").ContainerProps & React.RefAttributes<unknown>> & {
14
+ declare const _default: React.ForwardRefExoticComponent<Omit<MarqueeProps & React.RefAttributes<SwiperRef>, "container" | keyof import("../../shared/Styles.js").StylesProps> & import("../../shared/Styles.js").StylesProps & import("../WheelLottery/index.js").ContainerProps & React.RefAttributes<unknown>> & {
14
15
  readonly $$typeof: symbol;
15
16
  };
16
17
  export default _default;