@anker-in/headless-ui 1.1.74 → 1.1.76

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 (216) hide show
  1. package/dist/cjs/biz-components/ActiveShelf/ProductCard.js +1 -1
  2. package/dist/cjs/biz-components/ActiveShelf/ProductCard.js.map +2 -2
  3. package/dist/cjs/biz-components/ActivityMechanism/index.d.ts +9 -0
  4. package/dist/cjs/biz-components/ActivityMechanism/index.js +2 -0
  5. package/dist/cjs/biz-components/ActivityMechanism/index.js.map +7 -0
  6. package/dist/cjs/biz-components/ActivityMechanism/types.d.ts +43 -0
  7. package/dist/cjs/biz-components/ActivityMechanism/types.js +2 -0
  8. package/dist/cjs/biz-components/ActivityMechanism/types.js.map +7 -0
  9. package/dist/cjs/biz-components/ActivitySchedule/index.d.ts +3 -0
  10. package/dist/cjs/biz-components/ActivitySchedule/index.js +2 -0
  11. package/dist/cjs/biz-components/ActivitySchedule/index.js.map +7 -0
  12. package/dist/cjs/biz-components/ActivitySchedule/types.d.ts +44 -0
  13. package/dist/cjs/biz-components/ActivitySchedule/types.js +2 -0
  14. package/dist/cjs/biz-components/ActivitySchedule/types.js.map +7 -0
  15. package/dist/cjs/biz-components/AnchorNavigation/index.d.ts +20 -0
  16. package/dist/cjs/biz-components/AnchorNavigation/index.js +1 -1
  17. package/dist/cjs/biz-components/AnchorNavigation/index.js.map +3 -3
  18. package/dist/cjs/biz-components/EventSchedule/index.js +1 -1
  19. package/dist/cjs/biz-components/EventSchedule/index.js.map +2 -2
  20. package/dist/cjs/biz-components/FooterNavigation/index.js +1 -1
  21. package/dist/cjs/biz-components/FooterNavigation/index.js.map +3 -3
  22. package/dist/cjs/biz-components/FooterNavigation/types.d.ts +7 -0
  23. package/dist/cjs/biz-components/FooterNavigation/types.js +1 -1
  24. package/dist/cjs/biz-components/FooterNavigation/types.js.map +2 -2
  25. package/dist/cjs/biz-components/GiftShelf/index.d.ts +3 -0
  26. package/dist/cjs/biz-components/GiftShelf/index.js +2 -0
  27. package/dist/cjs/biz-components/GiftShelf/index.js.map +7 -0
  28. package/dist/cjs/biz-components/GiftShelf/types.d.ts +120 -0
  29. package/dist/cjs/biz-components/GiftShelf/types.js +2 -0
  30. package/dist/cjs/biz-components/GiftShelf/types.js.map +7 -0
  31. package/dist/cjs/biz-components/GiftTierShelf/index.d.ts +3 -0
  32. package/dist/cjs/biz-components/GiftTierShelf/index.js +2 -0
  33. package/dist/cjs/biz-components/GiftTierShelf/index.js.map +7 -0
  34. package/dist/cjs/biz-components/GiftTierShelf/types.d.ts +75 -0
  35. package/dist/cjs/biz-components/GiftTierShelf/types.js +2 -0
  36. package/dist/cjs/biz-components/GiftTierShelf/types.js.map +7 -0
  37. package/dist/cjs/biz-components/HeroBanner/HeroBanner.js +1 -1
  38. package/dist/cjs/biz-components/HeroBanner/HeroBanner.js.map +2 -2
  39. package/dist/cjs/biz-components/HeroBanner/types.d.ts +2 -0
  40. package/dist/cjs/biz-components/HeroBanner/types.js +1 -1
  41. package/dist/cjs/biz-components/HeroBanner/types.js.map +1 -1
  42. package/dist/cjs/biz-components/ImageWithText/ImageWithText.js +1 -1
  43. package/dist/cjs/biz-components/ImageWithText/ImageWithText.js.map +2 -2
  44. package/dist/cjs/biz-components/Ksp/index.d.ts +45 -6
  45. package/dist/cjs/biz-components/Ksp/index.js +1 -1
  46. package/dist/cjs/biz-components/Ksp/index.js.map +3 -3
  47. package/dist/cjs/biz-components/MediaPlayerBase/index.js +1 -1
  48. package/dist/cjs/biz-components/MediaPlayerBase/index.js.map +3 -3
  49. package/dist/cjs/biz-components/PromotionalBar/index.js +1 -1
  50. package/dist/cjs/biz-components/PromotionalBar/index.js.map +3 -3
  51. package/dist/cjs/biz-components/ThreeDCarousel/ThreeDCarousel.js +1 -1
  52. package/dist/cjs/biz-components/ThreeDCarousel/ThreeDCarousel.js.map +2 -2
  53. package/dist/cjs/biz-components/Title/index.js +1 -1
  54. package/dist/cjs/biz-components/Title/index.js.map +3 -3
  55. package/dist/cjs/biz-components/Title/types.d.ts +10 -1
  56. package/dist/cjs/biz-components/Title/types.js +1 -1
  57. package/dist/cjs/biz-components/Title/types.js.map +1 -1
  58. package/dist/cjs/biz-components/VideoModal/index.js +1 -1
  59. package/dist/cjs/biz-components/VideoModal/index.js.map +2 -2
  60. package/dist/cjs/biz-components/WheelLottery/BaseModal.d.ts +61 -0
  61. package/dist/cjs/biz-components/WheelLottery/BaseModal.js +2 -0
  62. package/dist/cjs/biz-components/WheelLottery/BaseModal.js.map +7 -0
  63. package/dist/cjs/biz-components/WheelLottery/ChanceMethods.d.ts +25 -0
  64. package/dist/cjs/biz-components/WheelLottery/ChanceMethods.js +2 -0
  65. package/dist/cjs/biz-components/WheelLottery/ChanceMethods.js.map +7 -0
  66. package/dist/cjs/biz-components/WheelLottery/ErrorModal.d.ts +47 -0
  67. package/dist/cjs/biz-components/WheelLottery/ErrorModal.js +2 -0
  68. package/dist/cjs/biz-components/WheelLottery/ErrorModal.js.map +7 -0
  69. package/dist/cjs/biz-components/WheelLottery/MyRewardsModal.d.ts +101 -0
  70. package/dist/cjs/biz-components/WheelLottery/MyRewardsModal.js +2 -0
  71. package/dist/cjs/biz-components/WheelLottery/MyRewardsModal.js.map +7 -0
  72. package/dist/cjs/biz-components/WheelLottery/PrizePool.d.ts +29 -0
  73. package/dist/cjs/biz-components/WheelLottery/PrizePool.js +2 -0
  74. package/dist/cjs/biz-components/WheelLottery/PrizePool.js.map +7 -0
  75. package/dist/cjs/biz-components/WheelLottery/RulesModal.d.ts +56 -0
  76. package/dist/cjs/biz-components/WheelLottery/RulesModal.js +2 -0
  77. package/dist/cjs/biz-components/WheelLottery/RulesModal.js.map +7 -0
  78. package/dist/cjs/biz-components/WheelLottery/ShareModal.d.ts +79 -0
  79. package/dist/cjs/biz-components/WheelLottery/ShareModal.js +2 -0
  80. package/dist/cjs/biz-components/WheelLottery/ShareModal.js.map +7 -0
  81. package/dist/cjs/biz-components/WheelLottery/Wheel.d.ts +27 -0
  82. package/dist/cjs/biz-components/WheelLottery/Wheel.js +2 -0
  83. package/dist/cjs/biz-components/WheelLottery/Wheel.js.map +7 -0
  84. package/dist/cjs/biz-components/WheelLottery/WinnerModal.d.ts +27 -0
  85. package/dist/cjs/biz-components/WheelLottery/WinnerModal.js +2 -0
  86. package/dist/cjs/biz-components/WheelLottery/WinnerModal.js.map +7 -0
  87. package/dist/cjs/biz-components/WheelLottery/index.d.ts +48 -0
  88. package/dist/cjs/biz-components/WheelLottery/index.js +2 -0
  89. package/dist/cjs/biz-components/WheelLottery/index.js.map +7 -0
  90. package/dist/cjs/biz-components/WheelLottery/types.d.ts +1229 -0
  91. package/dist/cjs/biz-components/WheelLottery/types.js +2 -0
  92. package/dist/cjs/biz-components/WheelLottery/types.js.map +7 -0
  93. package/dist/cjs/biz-components/index.d.ts +11 -0
  94. package/dist/cjs/biz-components/index.js +1 -1
  95. package/dist/cjs/biz-components/index.js.map +3 -3
  96. package/dist/cjs/components/Countdown.d.ts +27 -4
  97. package/dist/cjs/components/Countdown.js +1 -1
  98. package/dist/cjs/components/Countdown.js.map +3 -3
  99. package/dist/cjs/hooks/useCountDown.js +1 -1
  100. package/dist/cjs/hooks/useCountDown.js.map +3 -3
  101. package/dist/cjs/hooks/useDraggableScroll.d.ts +77 -0
  102. package/dist/cjs/hooks/useDraggableScroll.js +2 -0
  103. package/dist/cjs/hooks/useDraggableScroll.js.map +7 -0
  104. package/dist/esm/biz-components/ActiveShelf/ProductCard.js +1 -1
  105. package/dist/esm/biz-components/ActiveShelf/ProductCard.js.map +2 -2
  106. package/dist/esm/biz-components/ActivityMechanism/index.d.ts +9 -0
  107. package/dist/esm/biz-components/ActivityMechanism/index.js +2 -0
  108. package/dist/esm/biz-components/ActivityMechanism/index.js.map +7 -0
  109. package/dist/esm/biz-components/ActivityMechanism/types.d.ts +43 -0
  110. package/dist/esm/biz-components/ActivityMechanism/types.js +1 -0
  111. package/dist/esm/biz-components/ActivityMechanism/types.js.map +7 -0
  112. package/dist/esm/biz-components/ActivitySchedule/index.d.ts +3 -0
  113. package/dist/esm/biz-components/ActivitySchedule/index.js +2 -0
  114. package/dist/esm/biz-components/ActivitySchedule/index.js.map +7 -0
  115. package/dist/esm/biz-components/ActivitySchedule/types.d.ts +44 -0
  116. package/dist/esm/biz-components/ActivitySchedule/types.js +1 -0
  117. package/dist/esm/biz-components/ActivitySchedule/types.js.map +7 -0
  118. package/dist/esm/biz-components/AnchorNavigation/index.d.ts +20 -0
  119. package/dist/esm/biz-components/AnchorNavigation/index.js +1 -1
  120. package/dist/esm/biz-components/AnchorNavigation/index.js.map +3 -3
  121. package/dist/esm/biz-components/EventSchedule/index.js +1 -1
  122. package/dist/esm/biz-components/EventSchedule/index.js.map +3 -3
  123. package/dist/esm/biz-components/FooterNavigation/index.js +1 -1
  124. package/dist/esm/biz-components/FooterNavigation/index.js.map +3 -3
  125. package/dist/esm/biz-components/FooterNavigation/types.d.ts +7 -0
  126. package/dist/esm/biz-components/FooterNavigation/types.js.map +2 -2
  127. package/dist/esm/biz-components/GiftShelf/index.d.ts +3 -0
  128. package/dist/esm/biz-components/GiftShelf/index.js +2 -0
  129. package/dist/esm/biz-components/GiftShelf/index.js.map +7 -0
  130. package/dist/esm/biz-components/GiftShelf/types.d.ts +120 -0
  131. package/dist/esm/biz-components/GiftShelf/types.js +1 -0
  132. package/dist/esm/biz-components/GiftShelf/types.js.map +7 -0
  133. package/dist/esm/biz-components/GiftTierShelf/index.d.ts +3 -0
  134. package/dist/esm/biz-components/GiftTierShelf/index.js +2 -0
  135. package/dist/esm/biz-components/GiftTierShelf/index.js.map +7 -0
  136. package/dist/esm/biz-components/GiftTierShelf/types.d.ts +75 -0
  137. package/dist/esm/biz-components/GiftTierShelf/types.js +1 -0
  138. package/dist/esm/biz-components/GiftTierShelf/types.js.map +7 -0
  139. package/dist/esm/biz-components/HeroBanner/HeroBanner.js +1 -1
  140. package/dist/esm/biz-components/HeroBanner/HeroBanner.js.map +2 -2
  141. package/dist/esm/biz-components/HeroBanner/types.d.ts +2 -0
  142. package/dist/esm/biz-components/ImageWithText/ImageWithText.js +1 -1
  143. package/dist/esm/biz-components/ImageWithText/ImageWithText.js.map +2 -2
  144. package/dist/esm/biz-components/Ksp/index.d.ts +45 -6
  145. package/dist/esm/biz-components/Ksp/index.js +1 -1
  146. package/dist/esm/biz-components/Ksp/index.js.map +3 -3
  147. package/dist/esm/biz-components/MediaPlayerBase/index.js +1 -1
  148. package/dist/esm/biz-components/MediaPlayerBase/index.js.map +3 -3
  149. package/dist/esm/biz-components/PromotionalBar/index.js +1 -1
  150. package/dist/esm/biz-components/PromotionalBar/index.js.map +3 -3
  151. package/dist/esm/biz-components/ThreeDCarousel/ThreeDCarousel.js +1 -1
  152. package/dist/esm/biz-components/ThreeDCarousel/ThreeDCarousel.js.map +2 -2
  153. package/dist/esm/biz-components/Title/index.js +1 -1
  154. package/dist/esm/biz-components/Title/index.js.map +3 -3
  155. package/dist/esm/biz-components/Title/types.d.ts +10 -1
  156. package/dist/esm/biz-components/VideoModal/index.js +1 -1
  157. package/dist/esm/biz-components/VideoModal/index.js.map +2 -2
  158. package/dist/esm/biz-components/WheelLottery/BaseModal.d.ts +61 -0
  159. package/dist/esm/biz-components/WheelLottery/BaseModal.js +2 -0
  160. package/dist/esm/biz-components/WheelLottery/BaseModal.js.map +7 -0
  161. package/dist/esm/biz-components/WheelLottery/ChanceMethods.d.ts +25 -0
  162. package/dist/esm/biz-components/WheelLottery/ChanceMethods.js +2 -0
  163. package/dist/esm/biz-components/WheelLottery/ChanceMethods.js.map +7 -0
  164. package/dist/esm/biz-components/WheelLottery/ErrorModal.d.ts +47 -0
  165. package/dist/esm/biz-components/WheelLottery/ErrorModal.js +2 -0
  166. package/dist/esm/biz-components/WheelLottery/ErrorModal.js.map +7 -0
  167. package/dist/esm/biz-components/WheelLottery/MyRewardsModal.d.ts +101 -0
  168. package/dist/esm/biz-components/WheelLottery/MyRewardsModal.js +2 -0
  169. package/dist/esm/biz-components/WheelLottery/MyRewardsModal.js.map +7 -0
  170. package/dist/esm/biz-components/WheelLottery/PrizePool.d.ts +29 -0
  171. package/dist/esm/biz-components/WheelLottery/PrizePool.js +2 -0
  172. package/dist/esm/biz-components/WheelLottery/PrizePool.js.map +7 -0
  173. package/dist/esm/biz-components/WheelLottery/RulesModal.d.ts +56 -0
  174. package/dist/esm/biz-components/WheelLottery/RulesModal.js +2 -0
  175. package/dist/esm/biz-components/WheelLottery/RulesModal.js.map +7 -0
  176. package/dist/esm/biz-components/WheelLottery/ShareModal.d.ts +79 -0
  177. package/dist/esm/biz-components/WheelLottery/ShareModal.js +2 -0
  178. package/dist/esm/biz-components/WheelLottery/ShareModal.js.map +7 -0
  179. package/dist/esm/biz-components/WheelLottery/Wheel.d.ts +27 -0
  180. package/dist/esm/biz-components/WheelLottery/Wheel.js +2 -0
  181. package/dist/esm/biz-components/WheelLottery/Wheel.js.map +7 -0
  182. package/dist/esm/biz-components/WheelLottery/WinnerModal.d.ts +27 -0
  183. package/dist/esm/biz-components/WheelLottery/WinnerModal.js +2 -0
  184. package/dist/esm/biz-components/WheelLottery/WinnerModal.js.map +7 -0
  185. package/dist/esm/biz-components/WheelLottery/index.d.ts +48 -0
  186. package/dist/esm/biz-components/WheelLottery/index.js +2 -0
  187. package/dist/esm/biz-components/WheelLottery/index.js.map +7 -0
  188. package/dist/esm/biz-components/WheelLottery/types.d.ts +1229 -0
  189. package/dist/esm/biz-components/WheelLottery/types.js +2 -0
  190. package/dist/esm/biz-components/WheelLottery/types.js.map +7 -0
  191. package/dist/esm/biz-components/index.d.ts +11 -0
  192. package/dist/esm/biz-components/index.js +1 -1
  193. package/dist/esm/biz-components/index.js.map +2 -2
  194. package/dist/esm/components/Countdown.d.ts +27 -4
  195. package/dist/esm/components/Countdown.js +1 -1
  196. package/dist/esm/components/Countdown.js.map +3 -3
  197. package/dist/esm/hooks/useCountDown.js +1 -1
  198. package/dist/esm/hooks/useCountDown.js.map +3 -3
  199. package/dist/esm/hooks/useDraggableScroll.d.ts +77 -0
  200. package/dist/esm/hooks/useDraggableScroll.js +2 -0
  201. package/dist/esm/hooks/useDraggableScroll.js.map +7 -0
  202. package/package.json +1 -1
  203. package/style.css +6252 -862
  204. package/tailwind.config.js +18 -2
  205. package/dist/cjs/biz-components/HeroBanner/Countdown.d.ts +0 -10
  206. package/dist/cjs/biz-components/HeroBanner/Countdown.js +0 -2
  207. package/dist/cjs/biz-components/HeroBanner/Countdown.js.map +0 -7
  208. package/dist/cjs/biz-components/Title/Countdown.d.ts +0 -14
  209. package/dist/cjs/biz-components/Title/Countdown.js +0 -2
  210. package/dist/cjs/biz-components/Title/Countdown.js.map +0 -7
  211. package/dist/esm/biz-components/HeroBanner/Countdown.d.ts +0 -10
  212. package/dist/esm/biz-components/HeroBanner/Countdown.js +0 -2
  213. package/dist/esm/biz-components/HeroBanner/Countdown.js.map +0 -7
  214. package/dist/esm/biz-components/Title/Countdown.d.ts +0 -14
  215. package/dist/esm/biz-components/Title/Countdown.js +0 -2
  216. package/dist/esm/biz-components/Title/Countdown.js.map +0 -7
@@ -0,0 +1,1229 @@
1
+ /**
2
+ * 大转盘抽奖组件(WheelLottery)类型定义
3
+ *
4
+ * @module WheelLotteryTypes
5
+ * @date 2025-12-17
6
+ */
7
+ import type { Theme, Img } from '../../types/props.js';
8
+ /**
9
+ * WheelLottery 组件命令式控制接口
10
+ *
11
+ * 通过 ref 暴露给父组件,用于外部控制弹窗等状态
12
+ *
13
+ * @example
14
+ * ```tsx
15
+ * const lotteryRef = useRef<WheelLotteryHandle>(null)
16
+ *
17
+ * <WheelLottery ref={lotteryRef} prizes={prizes} />
18
+ *
19
+ * // 外部触发错误弹窗
20
+ * lotteryRef.current?.showError({
21
+ * title: 'Network Error',
22
+ * message: 'Failed to connect to server',
23
+ * confirmText: 'Retry'
24
+ * })
25
+ *
26
+ * // 显示规则弹窗
27
+ * lotteryRef.current?.showRules()
28
+ *
29
+ * // 关闭所有弹窗
30
+ * lotteryRef.current?.hideAllModals()
31
+ * ```
32
+ */
33
+ export interface WheelLotteryHandle {
34
+ /**
35
+ * 显示错误弹窗
36
+ * @param config 错误弹窗配置
37
+ */
38
+ showError: (config: {
39
+ /** 错误信息 */
40
+ message: string;
41
+ /** 标题(可选) */
42
+ title?: string;
43
+ /** 确认按钮文本(可选) */
44
+ confirmText?: string;
45
+ }) => void;
46
+ /**
47
+ * 隐藏错误弹窗
48
+ */
49
+ hideError: () => void;
50
+ /**
51
+ * 显示未中奖弹窗(使用 ErrorModal)
52
+ * @param config 未中奖弹窗配置
53
+ */
54
+ showNoWin: (config?: {
55
+ /** 标题(可选) */
56
+ title?: string;
57
+ /** 提示信息(可选) */
58
+ message?: string;
59
+ /** 确认按钮文本(可选) */
60
+ confirmText?: string;
61
+ }) => void;
62
+ /**
63
+ * 隐藏未中奖弹窗
64
+ */
65
+ hideNoWin: () => void;
66
+ /**
67
+ * 显示中奖弹窗
68
+ * @param prize 中奖奖品
69
+ * @param config 中奖弹窗配置(可选)
70
+ */
71
+ showWinner: (prize: Prize, config?: Partial<WinnerModalConfig>) => void;
72
+ /**
73
+ * 隐藏中奖弹窗
74
+ */
75
+ hideWinner: () => void;
76
+ /**
77
+ * 显示规则弹窗
78
+ */
79
+ showRules: () => void;
80
+ /**
81
+ * 隐藏规则弹窗
82
+ */
83
+ hideRules: () => void;
84
+ /**
85
+ * 显示我的奖励弹窗
86
+ */
87
+ showRewards: () => void;
88
+ /**
89
+ * 隐藏我的奖励弹窗
90
+ */
91
+ hideRewards: () => void;
92
+ /**
93
+ * 显示分享弹窗
94
+ * @param config 分享弹窗配置(可选)
95
+ */
96
+ showShare: (config?: Partial<ShareModalConfig>) => void;
97
+ /**
98
+ * 隐藏分享弹窗
99
+ */
100
+ hideShare: () => void;
101
+ /**
102
+ * 关闭所有弹窗
103
+ */
104
+ hideAllModals: () => void;
105
+ }
106
+ /**
107
+ * 默认转盘指针图片 URL
108
+ */
109
+ export declare const DEFAULT_POINTER_IMAGE = "https://cdn.shopify.com/s/files/1/0517/2199/4432/files/2790697ba78c1a85d953787a8be9b258.png?v=1766371471";
110
+ export declare const DEFAULT_POINTER_DISABLE_IMAGE = "https://cdn.shopify.com/s/files/1/0582/4669/3040/files/2790697ba78c1a85d953787a8be9b258.png?v=1767610632";
111
+ /**
112
+ * 默认转盘底图(6 个奖品)
113
+ */
114
+ export declare const DEFAULT_WHEEL_BG_6_PRIZES = "https://cdn.shopify.com/s/files/1/0517/2199/4432/files/be866c03-4d29-4d59-a8d4-39f5d64bbc0e_ae_e_6.png?v=1766374361";
115
+ /**
116
+ * 默认转盘底图(8 个奖品)
117
+ */
118
+ export declare const DEFAULT_WHEEL_BG_8_PRIZES = "https://cdn.shopify.com/s/files/1/0517/2199/4432/files/ad63174a-3da0-4dcd-ac61-c83172c7893c_ae_e_8.png?v=1766374392";
119
+ /**
120
+ * 奖品(Prize)
121
+ *
122
+ * 代表转盘上的一个奖品区块,包含显示所需的所有信息。
123
+ *
124
+ * @example
125
+ * ```tsx
126
+ * const prize: Prize = {
127
+ * prizeKey: 'prize-001',
128
+ * name: 'Anker Prime Charger (100W, 3 Ports, GaN)',
129
+ * image: { url: 'https://images.unsplash.com/photo-123', alt: 'Charger' },
130
+ * rank: '1st',
131
+ * price: '$79.99'
132
+ * }
133
+ * ```
134
+ */
135
+ export interface Prize {
136
+ /**
137
+ * 唯一标识符,用于 React key 和中奖结果匹配
138
+ */
139
+ prizeKey: string;
140
+ /**
141
+ * 奖品名称,显示在转盘和奖池中
142
+ * @maxLength 100
143
+ */
144
+ name: string;
145
+ /**
146
+ * 奖品图片对象,包含 url 和 alt
147
+ */
148
+ image: Img;
149
+ /**
150
+ * 排名标识,仅在 Prize Pool 中显示
151
+ * @optional
152
+ */
153
+ rank?: '1st' | '2nd' | '3rd';
154
+ /**
155
+ * 价格或折扣信息,显示在奖池中
156
+ * @example "$99.99" | "12% Off"
157
+ * @optional
158
+ */
159
+ price?: string;
160
+ }
161
+ /**
162
+ * 中奖信息(WinningInfo)
163
+ *
164
+ * 代表一条中奖记录,用于底部滚动条展示,营造活动氛围。
165
+ *
166
+ * @example
167
+ * ```tsx
168
+ * const winningInfo: WinningInfo = {
169
+ * winningKey: 'win-001',
170
+ * userName: 'Shuqi***',
171
+ * prizeName: '12% Off Discount',
172
+ * timestamp: 1702800000000
173
+ * }
174
+ * ```
175
+ */
176
+ export interface WinningInfo {
177
+ /**
178
+ * 唯一标识符
179
+ */
180
+ winningKey: string;
181
+ /**
182
+ * 用户名(已脱敏),如 "Shuqi***"
183
+ * @note 假设传入的用户名已经过脱敏处理,组件内部不再处理
184
+ */
185
+ userName: string;
186
+ /**
187
+ * 中奖奖品名称
188
+ */
189
+ prizeName: string;
190
+ /**
191
+ * 中奖时间戳(毫秒)
192
+ * @optional
193
+ */
194
+ timestamp?: number;
195
+ }
196
+ /**
197
+ * 获取机会方式类型
198
+ */
199
+ export type ChanceMethodType = 'share' | 'points' | 'refer' | string;
200
+ /**
201
+ * 获取机会方式状态
202
+ */
203
+ export type ChanceMethodStatus = 'pending' | 'completed' | 'used';
204
+ /**
205
+ * 获取机会方式(ChanceMethod)
206
+ *
207
+ * 代表一种获取抽奖机会的方式,支持灵活配置(分享、积分、推荐等)。
208
+ *
209
+ * @example
210
+ * ```tsx
211
+ * const chanceMethod: ChanceMethod = {
212
+ * methodKey: 'share-001',
213
+ * type: 'share',
214
+ * title: 'Share on your socials',
215
+ * description: 'Share this event on your social media',
216
+ * buttonText: 'Redeem now',
217
+ * onClick: () => console.log('Share clicked'),
218
+ * disabled: false,
219
+ * status: 'pending'
220
+ * }
221
+ * ```
222
+ */
223
+ export interface ChanceMethod {
224
+ /**
225
+ * 唯一标识符
226
+ */
227
+ methodKey: string;
228
+ /**
229
+ * 方式类型,支持预定义类型('share', 'points', 'refer')或自定义类型
230
+ */
231
+ type: ChanceMethodType;
232
+ /**
233
+ * 方式标题,如 "Share on your socials"
234
+ */
235
+ title: string;
236
+ /**
237
+ * 详细说明文字
238
+ */
239
+ description: string;
240
+ /**
241
+ * 按钮文案,默认 "Redeem now"
242
+ * @default "Redeem now"
243
+ * @optional
244
+ */
245
+ buttonText?: string;
246
+ completed?: string;
247
+ used?: string;
248
+ /**
249
+ * 未登录时点击 GO 按钮的回调
250
+ * @example
251
+ * ```tsx
252
+ * onLoginRequired={() => {
253
+ * // 打开登录弹窗或跳转登录页
254
+ * router.push('/login')
255
+ * }}
256
+ * ```
257
+ */
258
+ onLoginRequired?: () => void;
259
+ /**
260
+ * 点击按钮时的回调函数
261
+ * @note 业务逻辑(如积分扣除、分享验证)由父组件处理
262
+ */
263
+ onClick: () => void;
264
+ /**
265
+ * 是否禁用该方式
266
+ * @default false
267
+ * @optional
268
+ */
269
+ disabled?: boolean;
270
+ /**
271
+ * 获取机会方式的状态
272
+ * - pending: 未完成(默认状态)
273
+ * - completed: 已完成/已获得
274
+ * - used: 已使用
275
+ * @default "pending"
276
+ * @optional
277
+ */
278
+ status?: ChanceMethodStatus;
279
+ /**
280
+ * 是否显示加载状态
281
+ * @default false
282
+ * @optional
283
+ */
284
+ loading?: boolean;
285
+ /**
286
+ * 是否在点击时打开分享弹窗
287
+ * @default false
288
+ * @optional
289
+ */
290
+ openShareModal?: boolean;
291
+ }
292
+ /**
293
+ * 用户数据(UserData)
294
+ *
295
+ * 代表当前用户的抽奖相关数据
296
+ *
297
+ * @example
298
+ * ```tsx
299
+ * const userData: UserData = {
300
+ * isLoggedIn: true,
301
+ * availableChances: 3,
302
+ * wonPrizes: [
303
+ * { id: 'prize-001', name: 'Charger', image: 'https://...', timestamp: 1702800000000 }
304
+ * ]
305
+ * }
306
+ * ```
307
+ */
308
+ export interface UserData {
309
+ /**
310
+ * 用户是否已登录
311
+ */
312
+ isLoggedIn: boolean;
313
+ /**
314
+ * 当前可使用的抽奖次数
315
+ * @default 0
316
+ */
317
+ availableChances: number;
318
+ /**
319
+ * 总机会数(用于显示进度,例如 "3/5")
320
+ * @default undefined
321
+ * @optional
322
+ */
323
+ totalChances?: number;
324
+ /**
325
+ * 已获得的奖品列表
326
+ * @optional
327
+ */
328
+ wonPrizes?: Array<Prize & {
329
+ timestamp?: number;
330
+ }>;
331
+ /** * 用户电子邮箱(可选,用于发送中奖通知等)
332
+ * @optional
333
+ */
334
+ email?: string;
335
+ }
336
+ /**
337
+ * 缓动函数类型
338
+ */
339
+ export type EasingFunction = 'ease-out' | 'ease-in-out' | 'linear';
340
+ /**
341
+ * 复制操作相关文案配置(公共类型)
342
+ * 用于所有包含复制功能的组件
343
+ */
344
+ export interface CopyTextConfig {
345
+ /**
346
+ * 复制按钮文本
347
+ * @default "COPY"
348
+ */
349
+ copyText?: string;
350
+ /**
351
+ * 复制成功后的按钮文本
352
+ * @default "COPIED"
353
+ */
354
+ copiedText?: string;
355
+ }
356
+ /**
357
+ * 优惠码相关配置(公共类型)
358
+ * 用于所有展示优惠码的组件
359
+ */
360
+ export interface CouponConfig {
361
+ /**
362
+ * 代码文本前缀
363
+ * @default "CODE:"
364
+ */
365
+ codeText?: string;
366
+ /**
367
+ * 优惠码
368
+ */
369
+ couponCode?: string;
370
+ /**
371
+ * 优惠码过期时间
372
+ */
373
+ expiresAt?: string;
374
+ /**
375
+ * 优惠券折扣文本(例如 "20%")
376
+ */
377
+ couponDiscount?: string;
378
+ /**
379
+ * 优惠券单位文本
380
+ * @default "Off"
381
+ */
382
+ couponUnit?: string;
383
+ }
384
+ /**
385
+ * 奖励时间文案配置(公共类型)
386
+ */
387
+ export interface PrizeTimeTextConfig {
388
+ /**
389
+ * 奖励时间文本前缀
390
+ * @default "Prize time:"
391
+ */
392
+ prizeText?: string;
393
+ }
394
+ /**
395
+ * 中奖弹窗配置(WinnerModalConfig)
396
+ *
397
+ * 用于配置中奖弹窗的展示内容,通常由抽奖接口返回提供
398
+ *
399
+ * @example
400
+ * ```tsx
401
+ * const winnerModalConfig: WinnerModalConfig = {
402
+ * title: 'Congratulations!',
403
+ * prizeTitle: 'Anker Prime Charger',
404
+ * prizeImage: 'https://...',
405
+ * prizeDescription: 'High-speed charging for all your devices',
406
+ * learnMoreUrl: 'https://...',
407
+ * learnMoreText: 'View Details',
408
+ * couponCode: 'ANKER2024',
409
+ * expiresAt: '2024-12-31',
410
+ * couponDiscount: '20%',
411
+ * couponUnit: 'Off',
412
+ * confirmText: 'Claim Now'
413
+ * }
414
+ * ```
415
+ */
416
+ export interface WinnerModalConfig extends CopyTextConfig, CouponConfig, PrizeTimeTextConfig {
417
+ /**
418
+ * 中奖弹窗标题
419
+ * @default "You Have Won"
420
+ * @optional
421
+ */
422
+ title?: string;
423
+ /**
424
+ * 中奖弹窗奖品标题(优先级高于 prize.name)
425
+ * @optional
426
+ */
427
+ prizeTitle?: string;
428
+ /**
429
+ * 中奖弹窗奖品图片 URL(优先级高于 prize.image)
430
+ * @optional
431
+ */
432
+ prizeImage?: string;
433
+ /**
434
+ * 中奖弹窗奖品详情描述
435
+ * @optional
436
+ */
437
+ prizeDescription?: string;
438
+ /**
439
+ * 中奖弹窗 Learn More 链接
440
+ * @optional
441
+ */
442
+ learnMoreUrl?: string;
443
+ /**
444
+ * 中奖弹窗 Learn More 按钮文本
445
+ * @default "Learn More"
446
+ * @optional
447
+ */
448
+ learnMoreText?: string;
449
+ /**
450
+ * 中奖弹窗确认按钮文本
451
+ * @default "Okay, Got It"
452
+ * @optional
453
+ */
454
+ confirmText?: string;
455
+ }
456
+ /**
457
+ * Rules 弹窗配置
458
+ *
459
+ * @example
460
+ * ```tsx
461
+ * rulesModalConfig={{
462
+ * rulesData: [
463
+ * { item: '$100 instead of $200, 10 tickets/day.' },
464
+ * { item: '$100 for $120, 50 tickets/day.' }
465
+ * ],
466
+ * rulesText: 'Game Rules',
467
+ * rulesTitle: 'Activity Rules'
468
+ * }}
469
+ * ```
470
+ */
471
+ export interface RulesModalConfig {
472
+ /**
473
+ * 规则数据列表
474
+ * @optional
475
+ */
476
+ rulesData?: Array<{
477
+ /**
478
+ * 规则项内容
479
+ */
480
+ item: string;
481
+ }>;
482
+ /**
483
+ * Rules 按钮文本
484
+ * @default "Rules"
485
+ * @optional
486
+ */
487
+ rulesText?: string;
488
+ /**
489
+ * 弹窗标题
490
+ * @default "Rules"
491
+ * @optional
492
+ */
493
+ rulesTitle?: string;
494
+ }
495
+ /**
496
+ * My Rewards 弹窗配置
497
+ *
498
+ * @example
499
+ * ```tsx
500
+ * myRewardsModalConfig={{
501
+ * rewardsData: [
502
+ * {
503
+ * id: '1',
504
+ * name: 'Anker Charger',
505
+ * code: 'ANKER2024',
506
+ * status: 'Available',
507
+ * prizeTime: '2024-01-01',
508
+ * showCopyCode: true
509
+ * }
510
+ * ],
511
+ * myRewardsText: 'My Prizes',
512
+ * codeText: 'CODE:',
513
+ * copyText: 'COPY',
514
+ * prizeText: 'Prize time:',
515
+ * emptyText: 'No rewards yet'
516
+ * }}
517
+ * ```
518
+ */
519
+ export interface MyRewardsModalConfig extends CopyTextConfig, PrizeTimeTextConfig {
520
+ /**
521
+ * 奖励数据列表
522
+ * @optional
523
+ */
524
+ rewardsData?: Array<{
525
+ /**
526
+ * 奖励 ID
527
+ */
528
+ id: string;
529
+ /**
530
+ * 奖励名称
531
+ */
532
+ name: string;
533
+ /**
534
+ * 优惠码(可选)
535
+ */
536
+ code?: string;
537
+ /**
538
+ * 状态
539
+ */
540
+ status: 'Available' | 'Expired' | 'Used';
541
+ /**
542
+ * 奖励时间
543
+ */
544
+ prizeTime?: string;
545
+ /**
546
+ * 是否可复制码
547
+ */
548
+ showCopyCode?: boolean;
549
+ }>;
550
+ /**
551
+ * My Rewards 按钮文本
552
+ * @default "My Rewards"
553
+ * @optional
554
+ */
555
+ myRewardsText?: string;
556
+ /**
557
+ * 弹窗标题
558
+ * @default "My Rewards"
559
+ * @optional
560
+ */
561
+ myRewardsTitle?: string;
562
+ /**
563
+ * 代码文本前缀
564
+ * @default "CODE:"
565
+ * @optional
566
+ */
567
+ codeText?: string;
568
+ /**
569
+ * 空状态提示文本
570
+ * @default "No rewards yet"
571
+ * @optional
572
+ */
573
+ emptyText?: string;
574
+ }
575
+ /**
576
+ * 错误弹窗配置
577
+ * @example
578
+ * ```tsx
579
+ * errorModalConfig={{
580
+ * title: 'Oops!',
581
+ * message: 'Something went wrong during the lottery process.',
582
+ * confirmText: 'OK, I get'
583
+ * }}
584
+ * ```
585
+ */
586
+ export interface ErrorModalConfig {
587
+ /**
588
+ * 弹窗标题
589
+ * @default "Oops!"
590
+ * @optional
591
+ */
592
+ title?: string;
593
+ /**
594
+ * 错误消息内容
595
+ * @default "Something went wrong during the lottery process."
596
+ * @optional
597
+ */
598
+ message?: string;
599
+ /**
600
+ * 确认按钮文本
601
+ * @default "OK, I get"
602
+ * @optional
603
+ */
604
+ confirmText?: string;
605
+ }
606
+ /**
607
+ * 社交平台类型
608
+ */
609
+ export type SocialPlatform = 'facebook' | 'twitter' | 'instagram' | 'linkedin' | 'tiktok' | 'youtube';
610
+ /**
611
+ * 社交平台配置
612
+ */
613
+ export interface SharePlatformConfig {
614
+ /**
615
+ * 平台类型
616
+ */
617
+ platform: SocialPlatform;
618
+ /**
619
+ * 平台名称
620
+ */
621
+ name: string;
622
+ /**
623
+ * 分享 URL(可选,如果提供则直接跳转)
624
+ */
625
+ url?: string;
626
+ /**
627
+ * 点击回调(如果提供 url 则此回调会在跳转前执行)
628
+ */
629
+ onClick?: () => void;
630
+ /**
631
+ * 是否禁用
632
+ */
633
+ disabled?: boolean;
634
+ }
635
+ /**
636
+ * 分享弹窗配置
637
+ */
638
+ export interface ShareModalConfig {
639
+ /**
640
+ * 弹窗标题
641
+ * @default "Share to Get More Chances"
642
+ */
643
+ title?: string;
644
+ /**
645
+ * 副标题/引导文案
646
+ * @default "Share to Play Again Keep Trying! You Could Still Win Big!"
647
+ */
648
+ subtitle?: string;
649
+ /**
650
+ * 底部提示文案
651
+ * @default "Note: Maximum of 3 times per participant."
652
+ */
653
+ note?: string;
654
+ /**
655
+ * 社交平台配置列表
656
+ */
657
+ platforms?: SharePlatformConfig[];
658
+ /**
659
+ * 分享成功回调
660
+ */
661
+ onShareSuccess?: (platform: SocialPlatform) => void;
662
+ }
663
+ /**
664
+ * WheelLottery 组件 Props
665
+ *
666
+ * @example
667
+ * ```tsx
668
+ * <WheelLottery
669
+ * prizes={prizes}
670
+ * winningPrizeId="prize-003"
671
+ * spinDuration={4000}
672
+ * easing="ease-out"
673
+ * chanceMethods={chanceMethods}
674
+ * chanceTitle="Want more chances to win?"
675
+ * winningInfos={winningInfos}
676
+ * onSpinStart={() => console.log('Spin started')}
677
+ * onSpinEnd={(prize) => alert(`You won ${prize.name}`)}
678
+ * />
679
+ * ```
680
+ */
681
+ export interface WheelLotteryProps {
682
+ /**
683
+ * 8 个奖品数组(必需)
684
+ * @minLength 8
685
+ * @maxLength 8
686
+ * @validation 如果长度不等于 8,应在开发环境下输出警告
687
+ */
688
+ prizes: Prize[];
689
+ /**
690
+ * 主题色
691
+ */
692
+ theme?: Theme;
693
+ /**
694
+ * 指定中奖奖品的 ID,用于测试或服务端决定结果
695
+ * @note 必须是 prizes 数组中某个 Prize 的 id
696
+ * @optional
697
+ */
698
+ winningPrizeId?: string;
699
+ /**
700
+ * 旋转时长(毫秒)
701
+ * @default 4000
702
+ * @range 3000-5000
703
+ * @optional
704
+ */
705
+ spinDuration?: number;
706
+ /**
707
+ * 缓动函数
708
+ * @default "ease-out"
709
+ * @optional
710
+ */
711
+ easing?: EasingFunction;
712
+ /**
713
+ * 转盘底图 URL(支持 6 个或 8 个奖品的背景图)
714
+ * @default 根据 prizes.length 自动选择 6 或 8 奖品底图
715
+ * @optional
716
+ */
717
+ wheelBackgroundImage?: string;
718
+ /**
719
+ * 转盘指针图片 URL
720
+ * @default 默认指针图片
721
+ * @optional
722
+ */
723
+ pointerImage?: string;
724
+ /**
725
+ * 获取机会方式数组
726
+ * @default DEFAULT_CHANCE_METHODS(3种默认方式:分享、积分、推荐)
727
+ * @note 当数组为空时,隐藏整个"获取机会"区域
728
+ * @optional
729
+ */
730
+ chanceMethods?: ChanceMethod[];
731
+ /**
732
+ * 获取机会区域标题
733
+ * @default "Want more chances to win?"
734
+ * @optional
735
+ */
736
+ chanceTitle?: string;
737
+ /**
738
+ * 获取机会区域副标题
739
+ * @optional
740
+ */
741
+ chanceSubtitle?: string;
742
+ /**
743
+ * 获取机会区域底部提示
744
+ * @optional
745
+ */
746
+ chanceFooterNote?: string;
747
+ /**
748
+ * 获取机会方式文案配置
749
+ * @optional
750
+ */
751
+ chanceMethodsText?: {
752
+ chanceBadgeText?: string;
753
+ completedText?: string;
754
+ usedText?: string;
755
+ loadingText?: string;
756
+ };
757
+ /**
758
+ * 中奖信息数组,用于底部滚动条展示
759
+ * @default []
760
+ * @note 当数组为空时,隐藏底部滚动条或显示默认提示
761
+ * @optional
762
+ */
763
+ winningInfos?: WinningInfo[];
764
+ /**
765
+ * 奖品池展示区域标题
766
+ * @default "Prize Pool"
767
+ * @optional
768
+ */
769
+ prizesTitle?: string;
770
+ /**
771
+ * 抽奖开始时的回调,返回 Promise 以支持异步接口调用
772
+ * @returns Promise<string> - 中奖奖品的 ID,如果接口失败则 reject
773
+ * @optional
774
+ * @example
775
+ * ```tsx
776
+ * onSpinStart={async () => {
777
+ * const result = await fetch('/api/lottery')
778
+ * const data = await result.json()
779
+ * return data.prizeId // 返回中奖奖品 ID
780
+ * }}
781
+ * ```
782
+ */
783
+ onSpinStart?: () => Promise<string>;
784
+ /**
785
+ * 抽奖结束时的回调,传递中奖奖品
786
+ * @param prize 中奖奖品对象
787
+ * @optional
788
+ */
789
+ onSpinEnd?: (prize: Prize) => void;
790
+ /**
791
+ * 抽奖错误时的回调
792
+ * @param error 错误信息
793
+ * @optional
794
+ */
795
+ onSpinError?: (error: Error) => void;
796
+ /**
797
+ * 中奖弹窗配置对象,通常由抽奖接口返回提供
798
+ * @optional
799
+ * @example
800
+ * ```tsx
801
+ * winnerModalConfig={{
802
+ * title: 'Congratulations!',
803
+ * prizeTitle: 'Anker Prime Charger',
804
+ * prizeImage: 'https://...',
805
+ * prizeDescription: 'High-speed charging',
806
+ * learnMoreUrl: 'https://...',
807
+ * couponCode: 'ANKER2024',
808
+ * expiresAt: '2024-12-31',
809
+ * couponDiscount: '20%',
810
+ * confirmText: 'Claim Now'
811
+ * }}
812
+ * ```
813
+ */
814
+ winnerModalConfig?: WinnerModalConfig;
815
+ rulesModalConfig?: RulesModalConfig;
816
+ myRewardsModalConfig?: MyRewardsModalConfig;
817
+ errorModalConfig?: ErrorModalConfig;
818
+ /**
819
+ * 分享弹窗配置
820
+ * @optional
821
+ */
822
+ shareModalConfig?: ShareModalConfig;
823
+ /**
824
+ * 未登录时点击 GO 按钮的回调
825
+ * @example
826
+ * ```tsx
827
+ * onLoginRequired={() => {
828
+ * // 打开登录弹窗或跳转登录页
829
+ * router.push('/login')
830
+ * }}
831
+ * ```
832
+ */
833
+ onLoginRequired?: () => void;
834
+ /**
835
+ * 用户数据
836
+ * @optional
837
+ * @example
838
+ * ```tsx
839
+ * userData={{
840
+ * isLoggedIn: true,
841
+ * availableChances: 3,
842
+ * wonPrizes: [{ id: 'prize-001', name: 'Charger', image: 'https://...' }]
843
+ * }}
844
+ * ```
845
+ */
846
+ userData?: UserData;
847
+ /**
848
+ * 未登录时的提示文案
849
+ * @default "Please log in to participate"
850
+ * @optional
851
+ */
852
+ loginPromptText?: string;
853
+ /**
854
+ * 登录按钮文案
855
+ * @default "Log In"
856
+ * @optional
857
+ */
858
+ loginButtonText?: string;
859
+ /**
860
+ * 次数不足时的提示文案
861
+ * @default "You have no chances left"
862
+ * @optional
863
+ */
864
+ noChancesText?: string;
865
+ /**
866
+ * 复制优惠码回调
867
+ * @optional
868
+ */
869
+ onCopyCode?: (code: string) => void;
870
+ /**
871
+ * Rules 按钮文本
872
+ * @default "Rules"
873
+ * @optional
874
+ */
875
+ rulesText?: string;
876
+ /**
877
+ * Opportunities 文本数组
878
+ * @default ["Accumulate", "lottery opportunities"]
879
+ * @optional
880
+ */
881
+ opportunitiesText?: string[];
882
+ /**
883
+ * My Rewards 按钮文本
884
+ * @default "My Rewards"
885
+ * @optional
886
+ */
887
+ myRewardsText?: string;
888
+ /**
889
+ * 未中奖弹窗标题
890
+ * @default "Sorry, You Didn't Win This Time"
891
+ * @optional
892
+ */
893
+ noWinTitle?: string;
894
+ /**
895
+ * 未中奖弹窗副标题
896
+ * @default "Keep Trying, You Could Still Win Big!"
897
+ * @optional
898
+ */
899
+ noWinSubtitle?: string;
900
+ /**
901
+ * My Rewards 弹窗无奖励时的提示文本
902
+ * @default "No rewards yet"
903
+ * @optional
904
+ */
905
+ rewardsEmptyText?: string;
906
+ /**
907
+ * My Rewards 弹窗 CODE 标签文本
908
+ * @default "CODE:"
909
+ * @optional
910
+ */
911
+ rewardsCodeLabel?: string;
912
+ /**
913
+ * My Rewards 弹窗复制按钮文本
914
+ * @default "Copy"
915
+ * @optional
916
+ */
917
+ rewardsCopyButtonText?: string;
918
+ /**
919
+ * My Rewards 弹窗奖励时间标签文本
920
+ * @default "Prize time:"
921
+ * @optional
922
+ */
923
+ rewardsPrizeTimeLabel?: string;
924
+ /**
925
+ * 弹窗关闭按钮的 aria-label
926
+ * @default "关闭弹窗"
927
+ * @optional
928
+ */
929
+ modalCloseButtonAriaLabel?: string;
930
+ /**
931
+ * 自定义 CSS 类名,用于覆盖或扩展默认样式
932
+ * @optional
933
+ */
934
+ className?: string;
935
+ }
936
+ /**
937
+ * 默认获取机会方式(3种)
938
+ * @note 父组件需要覆盖 onClick 回调以实现具体业务逻辑
939
+ */
940
+ export declare const DEFAULT_CHANCE_METHODS: ChanceMethod[];
941
+ /**
942
+ * 默认转盘配置
943
+ */
944
+ export declare const DEFAULT_WHEEL_CONFIG: {
945
+ spinDuration: number;
946
+ easing: EasingFunction;
947
+ chanceTitle: string;
948
+ };
949
+ /**
950
+ * 转盘运行时状态(组件内部使用)
951
+ * @internal
952
+ */
953
+ export interface WheelState {
954
+ /**
955
+ * 转盘是否正在旋转
956
+ */
957
+ isSpinning: boolean;
958
+ /**
959
+ * 当前旋转角度(度数)
960
+ */
961
+ currentRotation: number;
962
+ /**
963
+ * 中奖奖品,抽奖结束后设置
964
+ */
965
+ winningPrize: Prize | null;
966
+ /**
967
+ * GO 按钮是否禁用
968
+ */
969
+ isButtonDisabled: boolean;
970
+ /**
971
+ * 是否已完成抽奖(用于控制转盘是否显示初始旋转动画)
972
+ */
973
+ isFinished: boolean;
974
+ }
975
+ /**
976
+ * 初始转盘状态
977
+ * @internal
978
+ */
979
+ export declare const INITIAL_WHEEL_STATE: WheelState;
980
+ /**
981
+ * Wheel 转盘组件 Props
982
+ */
983
+ export interface WheelProps {
984
+ /**
985
+ * 主题模式
986
+ * @optional
987
+ */
988
+ theme?: Theme;
989
+ /**
990
+ * 8 个奖品数组
991
+ */
992
+ prizes: Prize[];
993
+ /**
994
+ * 当前旋转角度(度数)
995
+ */
996
+ rotation: number;
997
+ /**
998
+ * 是否正在旋转
999
+ */
1000
+ isSpinning: boolean;
1001
+ /**
1002
+ * 是否已完成抽奖(用于控制转盘是否显示初始旋转动画)
1003
+ */
1004
+ isFinished?: boolean;
1005
+ /**
1006
+ * GO 按钮是否禁用
1007
+ */
1008
+ isButtonDisabled: boolean;
1009
+ /**
1010
+ * GO 按钮点击回调
1011
+ */
1012
+ onGoClick: () => void;
1013
+ /**
1014
+ * 转盘底图 URL(可选)
1015
+ */
1016
+ wheelBackgroundImage?: string;
1017
+ /**
1018
+ * 转盘指针图片 URL(可选)
1019
+ */
1020
+ pointerImage?: string;
1021
+ /**
1022
+ * 登录用户数据(可选)
1023
+ * @optional
1024
+ */
1025
+ userData?: UserData;
1026
+ /**
1027
+ * 打开分享弹窗回调(可选)
1028
+ * @optional
1029
+ */
1030
+ onOpenShareModal?: () => void;
1031
+ /**
1032
+ * 自定义类名
1033
+ */
1034
+ className?: string;
1035
+ }
1036
+ /**
1037
+ * PrizePool 奖品池组件 Props
1038
+ */
1039
+ export interface PrizePoolProps {
1040
+ /**
1041
+ * 主题模式
1042
+ * @optional
1043
+ */
1044
+ theme?: Theme;
1045
+ /**
1046
+ * 奖品列表(通常是全部 8 个奖品)
1047
+ */
1048
+ prizes: Prize[];
1049
+ /**
1050
+ * 标题文本
1051
+ * @default "Prize Pool"
1052
+ */
1053
+ title?: string;
1054
+ /**
1055
+ * 中奖人名单数据
1056
+ * @optional
1057
+ */
1058
+ winningInfos?: WinningInfo[];
1059
+ /**
1060
+ * 自定义类名
1061
+ */
1062
+ className?: string;
1063
+ }
1064
+ /**
1065
+ * ChanceMethods 获取机会组件 Props
1066
+ */
1067
+ export interface ChanceMethodsProps {
1068
+ /**
1069
+ * 主题模式
1070
+ * @optional
1071
+ */
1072
+ theme?: Theme;
1073
+ /**
1074
+ * 获取机会方式列表
1075
+ */
1076
+ methods: ChanceMethod[];
1077
+ /**
1078
+ * 标题文本
1079
+ * @default "Want more chances to win?"
1080
+ */
1081
+ title?: string;
1082
+ /**
1083
+ * 副标题(可选)
1084
+ */
1085
+ subtitle?: string;
1086
+ /**
1087
+ * 底部提示文本(可选)
1088
+ */
1089
+ footerNote?: string;
1090
+ /**
1091
+ * 登录用户数据(可选)
1092
+ * @optional
1093
+ */
1094
+ userData?: UserData;
1095
+ /**
1096
+ * 打开分享弹窗回调(可选)
1097
+ * @optional
1098
+ */
1099
+ onOpenShareModal?: () => void;
1100
+ /**
1101
+ * 徽章文案
1102
+ * @default "Chance +1"
1103
+ */
1104
+ chanceBadgeText?: string;
1105
+ /**
1106
+ * 已完成状态文案
1107
+ * @default "Completed"
1108
+ */
1109
+ completedText?: string;
1110
+ /**
1111
+ * 已使用状态文案
1112
+ * @default "Used"
1113
+ */
1114
+ usedText?: string;
1115
+ /**
1116
+ * 加载中文案
1117
+ * @default "Loading..."
1118
+ */
1119
+ loadingText?: string;
1120
+ /**
1121
+ * 自定义类名
1122
+ */
1123
+ className?: string;
1124
+ }
1125
+ /**
1126
+ * WinnerModal 中奖弹窗组件 Props
1127
+ */
1128
+ export interface WinnerModalProps extends CopyTextConfig, CouponConfig, PrizeTimeTextConfig {
1129
+ /**
1130
+ * 是否显示弹窗
1131
+ */
1132
+ isOpen: boolean;
1133
+ /**
1134
+ * 中奖奖品信息
1135
+ */
1136
+ prize: Prize | null;
1137
+ /**
1138
+ * 弹窗标题(可选,默认 "You Have Won")
1139
+ */
1140
+ title?: string;
1141
+ /**
1142
+ * 奖品标题(可选,默认使用 prize.name)
1143
+ */
1144
+ prizeTitle?: string;
1145
+ /**
1146
+ * 奖品图片 URL(可选,默认使用 prize.image)
1147
+ */
1148
+ prizeImage?: string;
1149
+ /**
1150
+ * 奖品详情描述(可选)
1151
+ */
1152
+ prizeDescription?: string;
1153
+ /**
1154
+ * Learn More 链接(可选)
1155
+ */
1156
+ learnMoreUrl?: string;
1157
+ /**
1158
+ * Learn More 按钮文本(可选,默认 "Learn More")
1159
+ */
1160
+ learnMoreText?: string;
1161
+ /**
1162
+ * 复制码点击回调
1163
+ */
1164
+ onCopyCode?: (code: string) => void;
1165
+ /**
1166
+ * 关闭弹窗回调
1167
+ */
1168
+ onClose: () => void;
1169
+ /**
1170
+ * 确认按钮文本(可选,默认 "Okay, Got It")
1171
+ */
1172
+ confirmText?: string;
1173
+ /**
1174
+ * 确认按钮点击回调(可选)
1175
+ */
1176
+ onConfirm?: () => void;
1177
+ /**
1178
+ * 自定义类名
1179
+ */
1180
+ className?: string;
1181
+ }
1182
+ /**
1183
+ * 验证结果
1184
+ */
1185
+ export interface ValidationResult {
1186
+ valid: boolean;
1187
+ error?: string;
1188
+ }
1189
+ /**
1190
+ * 奖品验证选项
1191
+ */
1192
+ export interface ValidatePrizesOptions {
1193
+ /**
1194
+ * 是否允许缺少 rank 字段
1195
+ * @default true
1196
+ */
1197
+ allowMissingRank?: boolean;
1198
+ /**
1199
+ * 是否允许缺少 price 字段
1200
+ * @default true
1201
+ */
1202
+ allowMissingPrice?: boolean;
1203
+ }
1204
+ /**
1205
+ * 检查是否为有效的 Prize 对象
1206
+ * @param value 待检查的值
1207
+ * @returns 是否为有效的 Prize
1208
+ */
1209
+ export declare function isPrize(value: unknown): value is Prize;
1210
+ /**
1211
+ * 检查是否为有效的 ChanceMethod 对象
1212
+ * @param value 待检查的值
1213
+ * @returns 是否为有效的 ChanceMethod
1214
+ */
1215
+ export declare function isChanceMethod(value: unknown): value is ChanceMethod;
1216
+ /**
1217
+ * 检查是否为有效的 WinningInfo 对象
1218
+ * @param value 待检查的值
1219
+ * @returns 是否为有效的 WinningInfo
1220
+ */
1221
+ export declare function isWinningInfo(value: unknown): value is WinningInfo;
1222
+ /**
1223
+ * 抽奖回调函数类型
1224
+ */
1225
+ export type OnSpinEndCallback = (prize: Prize) => void;
1226
+ /**
1227
+ * 获取机会点击回调函数类型
1228
+ */
1229
+ export type OnChanceMethodClick = () => void;