@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,2 @@
1
+ const n="https://cdn.shopify.com/s/files/1/0517/2199/4432/files/2790697ba78c1a85d953787a8be9b258.png?v=1766371471",i="https://cdn.shopify.com/s/files/1/0582/4669/3040/files/2790697ba78c1a85d953787a8be9b258.png?v=1767610632",t="https://cdn.shopify.com/s/files/1/0517/2199/4432/files/be866c03-4d29-4d59-a8d4-39f5d64bbc0e_ae_e_6.png?v=1766374361",o="https://cdn.shopify.com/s/files/1/0517/2199/4432/files/ad63174a-3da0-4dcd-ac61-c83172c7893c_ae_e_8.png?v=1766374392",r=[{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}],s={spinDuration:4e3,easing:"ease-out",chanceTitle:"Want more chances to win?"},a={isSpinning:!1,currentRotation:0,winningPrize:null,isButtonDisabled:!1,isFinished:!1};function g(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 d(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 l(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"}export{r as DEFAULT_CHANCE_METHODS,i as DEFAULT_POINTER_DISABLE_IMAGE,n as DEFAULT_POINTER_IMAGE,t as DEFAULT_WHEEL_BG_6_PRIZES,o as DEFAULT_WHEEL_BG_8_PRIZES,s as DEFAULT_WHEEL_CONFIG,a as INITIAL_WHEEL_STATE,d as isChanceMethod,g as isPrize,l as isWinningInfo};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/biz-components/WheelLottery/types.ts"],
4
+ "sourcesContent": ["/**\n * \u5927\u8F6C\u76D8\u62BD\u5956\u7EC4\u4EF6\uFF08WheelLottery\uFF09\u7C7B\u578B\u5B9A\u4E49\n *\n * @module WheelLotteryTypes\n * @date 2025-12-17\n */\n\nimport type { Theme, Img } from '../../types/props.js'\n\n// ============================================================================\n// Imperative Handle \u63A5\u53E3\n// ============================================================================\n\n/**\n * WheelLottery \u7EC4\u4EF6\u547D\u4EE4\u5F0F\u63A7\u5236\u63A5\u53E3\n *\n * \u901A\u8FC7 ref \u66B4\u9732\u7ED9\u7236\u7EC4\u4EF6\uFF0C\u7528\u4E8E\u5916\u90E8\u63A7\u5236\u5F39\u7A97\u7B49\u72B6\u6001\n *\n * @example\n * ```tsx\n * const lotteryRef = useRef<WheelLotteryHandle>(null)\n *\n * <WheelLottery ref={lotteryRef} prizes={prizes} />\n *\n * // \u5916\u90E8\u89E6\u53D1\u9519\u8BEF\u5F39\u7A97\n * lotteryRef.current?.showError({\n * title: 'Network Error',\n * message: 'Failed to connect to server',\n * confirmText: 'Retry'\n * })\n *\n * // \u663E\u793A\u89C4\u5219\u5F39\u7A97\n * lotteryRef.current?.showRules()\n *\n * // \u5173\u95ED\u6240\u6709\u5F39\u7A97\n * lotteryRef.current?.hideAllModals()\n * ```\n */\nexport interface WheelLotteryHandle {\n /**\n * \u663E\u793A\u9519\u8BEF\u5F39\u7A97\n * @param config \u9519\u8BEF\u5F39\u7A97\u914D\u7F6E\n */\n showError: (config: {\n /** \u9519\u8BEF\u4FE1\u606F */\n message: string\n /** \u6807\u9898\uFF08\u53EF\u9009\uFF09 */\n title?: string\n /** \u786E\u8BA4\u6309\u94AE\u6587\u672C\uFF08\u53EF\u9009\uFF09 */\n confirmText?: string\n }) => void\n\n /**\n * \u9690\u85CF\u9519\u8BEF\u5F39\u7A97\n */\n hideError: () => void\n\n /**\n * \u663E\u793A\u672A\u4E2D\u5956\u5F39\u7A97\uFF08\u4F7F\u7528 ErrorModal\uFF09\n * @param config \u672A\u4E2D\u5956\u5F39\u7A97\u914D\u7F6E\n */\n showNoWin: (config?: {\n /** \u6807\u9898\uFF08\u53EF\u9009\uFF09 */\n title?: string\n /** \u63D0\u793A\u4FE1\u606F\uFF08\u53EF\u9009\uFF09 */\n message?: string\n /** \u786E\u8BA4\u6309\u94AE\u6587\u672C\uFF08\u53EF\u9009\uFF09 */\n confirmText?: string\n }) => void\n\n /**\n * \u9690\u85CF\u672A\u4E2D\u5956\u5F39\u7A97\n */\n hideNoWin: () => void\n\n /**\n * \u663E\u793A\u4E2D\u5956\u5F39\u7A97\n * @param prize \u4E2D\u5956\u5956\u54C1\n * @param config \u4E2D\u5956\u5F39\u7A97\u914D\u7F6E\uFF08\u53EF\u9009\uFF09\n */\n showWinner: (prize: Prize, config?: Partial<WinnerModalConfig>) => void\n\n /**\n * \u9690\u85CF\u4E2D\u5956\u5F39\u7A97\n */\n hideWinner: () => void\n\n /**\n * \u663E\u793A\u89C4\u5219\u5F39\u7A97\n */\n showRules: () => void\n\n /**\n * \u9690\u85CF\u89C4\u5219\u5F39\u7A97\n */\n hideRules: () => void\n\n /**\n * \u663E\u793A\u6211\u7684\u5956\u52B1\u5F39\u7A97\n */\n showRewards: () => void\n\n /**\n * \u9690\u85CF\u6211\u7684\u5956\u52B1\u5F39\u7A97\n */\n hideRewards: () => void\n\n /**\n * \u663E\u793A\u5206\u4EAB\u5F39\u7A97\n * @param config \u5206\u4EAB\u5F39\u7A97\u914D\u7F6E\uFF08\u53EF\u9009\uFF09\n */\n showShare: (config?: Partial<ShareModalConfig>) => void\n\n /**\n * \u9690\u85CF\u5206\u4EAB\u5F39\u7A97\n */\n hideShare: () => void\n\n /**\n * \u5173\u95ED\u6240\u6709\u5F39\u7A97\n */\n hideAllModals: () => void\n}\n\n// ============================================================================\n// \u9ED8\u8BA4\u56FE\u7247\u7D20\u6750\u5E38\u91CF\n// ============================================================================\n\n/**\n * \u9ED8\u8BA4\u8F6C\u76D8\u6307\u9488\u56FE\u7247 URL\n */\nexport const DEFAULT_POINTER_IMAGE =\n 'https://cdn.shopify.com/s/files/1/0517/2199/4432/files/2790697ba78c1a85d953787a8be9b258.png?v=1766371471'\n\nexport const DEFAULT_POINTER_DISABLE_IMAGE =\n 'https://cdn.shopify.com/s/files/1/0582/4669/3040/files/2790697ba78c1a85d953787a8be9b258.png?v=1767610632'\n\n/**\n * \u9ED8\u8BA4\u8F6C\u76D8\u5E95\u56FE\uFF086 \u4E2A\u5956\u54C1\uFF09\n */\nexport const DEFAULT_WHEEL_BG_6_PRIZES =\n 'https://cdn.shopify.com/s/files/1/0517/2199/4432/files/be866c03-4d29-4d59-a8d4-39f5d64bbc0e_ae_e_6.png?v=1766374361'\n\n/**\n * \u9ED8\u8BA4\u8F6C\u76D8\u5E95\u56FE\uFF088 \u4E2A\u5956\u54C1\uFF09\n */\nexport const DEFAULT_WHEEL_BG_8_PRIZES =\n 'https://cdn.shopify.com/s/files/1/0517/2199/4432/files/ad63174a-3da0-4dcd-ac61-c83172c7893c_ae_e_8.png?v=1766374392'\n\n// ============================================================================\n// \u6838\u5FC3\u5B9E\u4F53\u7C7B\u578B\n// ============================================================================\n\n/**\n * \u5956\u54C1\uFF08Prize\uFF09\n *\n * \u4EE3\u8868\u8F6C\u76D8\u4E0A\u7684\u4E00\u4E2A\u5956\u54C1\u533A\u5757\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\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// \u7EC4\u4EF6 Props \u63A5\u53E3\n// ============================================================================\n\n/**\n * WheelLottery \u7EC4\u4EF6 Props\n *\n * @example\n * ```tsx\n * <WheelLottery\n * prizes={prizes}\n * winningPrizeId=\"prize-003\"\n * spinDuration={4000}\n * easing=\"ease-out\"\n * chanceMethods={chanceMethods}\n * chanceTitle=\"Want more chances to win?\"\n * winningInfos={winningInfos}\n * onSpinStart={() => console.log('Spin started')}\n * onSpinEnd={(prize) => alert(`You won ${prize.name}`)}\n * />\n * ```\n */\nexport interface WheelLotteryProps {\n // ========== \u5FC5\u9700 Props ==========\n\n /**\n * 8 \u4E2A\u5956\u54C1\u6570\u7EC4\uFF08\u5FC5\u9700\uFF09\n * @minLength 8\n * @maxLength 8\n * @validation \u5982\u679C\u957F\u5EA6\u4E0D\u7B49\u4E8E 8\uFF0C\u5E94\u5728\u5F00\u53D1\u73AF\u5883\u4E0B\u8F93\u51FA\u8B66\u544A\n */\n prizes: Prize[]\n\n // ========== \u8F6C\u76D8\u914D\u7F6E Props\uFF08\u53EF\u9009\uFF09 ==========\n\n /**\n * \u4E3B\u9898\u8272\n */\n theme?: Theme\n\n /**\n * \u6307\u5B9A\u4E2D\u5956\u5956\u54C1\u7684 ID\uFF0C\u7528\u4E8E\u6D4B\u8BD5\u6216\u670D\u52A1\u7AEF\u51B3\u5B9A\u7ED3\u679C\n * @note \u5FC5\u987B\u662F prizes \u6570\u7EC4\u4E2D\u67D0\u4E2A Prize \u7684 id\n * @optional\n */\n winningPrizeId?: string\n\n /**\n * \u65CB\u8F6C\u65F6\u957F\uFF08\u6BEB\u79D2\uFF09\n * @default 4000\n * @range 3000-5000\n * @optional\n */\n spinDuration?: number\n\n /**\n * \u7F13\u52A8\u51FD\u6570\n * @default \"ease-out\"\n * @optional\n */\n easing?: EasingFunction\n\n /**\n * \u8F6C\u76D8\u5E95\u56FE URL\uFF08\u652F\u6301 6 \u4E2A\u6216 8 \u4E2A\u5956\u54C1\u7684\u80CC\u666F\u56FE\uFF09\n * @default \u6839\u636E prizes.length \u81EA\u52A8\u9009\u62E9 6 \u6216 8 \u5956\u54C1\u5E95\u56FE\n * @optional\n */\n wheelBackgroundImage?: string\n\n /**\n * \u8F6C\u76D8\u6307\u9488\u56FE\u7247 URL\n * @default \u9ED8\u8BA4\u6307\u9488\u56FE\u7247\n * @optional\n */\n pointerImage?: string\n\n // ========== \u83B7\u53D6\u673A\u4F1A\u533A\u57DF Props\uFF08\u53EF\u9009\uFF09 ==========\n\n /**\n * \u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\u6570\u7EC4\n * @default DEFAULT_CHANCE_METHODS\uFF083\u79CD\u9ED8\u8BA4\u65B9\u5F0F\uFF1A\u5206\u4EAB\u3001\u79EF\u5206\u3001\u63A8\u8350\uFF09\n * @note \u5F53\u6570\u7EC4\u4E3A\u7A7A\u65F6\uFF0C\u9690\u85CF\u6574\u4E2A\"\u83B7\u53D6\u673A\u4F1A\"\u533A\u57DF\n * @optional\n */\n chanceMethods?: ChanceMethod[]\n\n /**\n * \u83B7\u53D6\u673A\u4F1A\u533A\u57DF\u6807\u9898\n * @default \"Want more chances to win?\"\n * @optional\n */\n chanceTitle?: string\n\n /**\n * \u83B7\u53D6\u673A\u4F1A\u533A\u57DF\u526F\u6807\u9898\n * @optional\n */\n chanceSubtitle?: string\n\n /**\n * \u83B7\u53D6\u673A\u4F1A\u533A\u57DF\u5E95\u90E8\u63D0\u793A\n * @optional\n */\n chanceFooterNote?: string\n\n /**\n * \u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\u6587\u6848\u914D\u7F6E\n * @optional\n */\n chanceMethodsText?: {\n chanceBadgeText?: string\n completedText?: string\n usedText?: string\n loadingText?: string\n }\n\n // ========== \u4E2D\u5956\u4FE1\u606F Props\uFF08\u53EF\u9009\uFF09 ==========\n\n /**\n * \u4E2D\u5956\u4FE1\u606F\u6570\u7EC4\uFF0C\u7528\u4E8E\u5E95\u90E8\u6EDA\u52A8\u6761\u5C55\u793A\n * @default []\n * @note \u5F53\u6570\u7EC4\u4E3A\u7A7A\u65F6\uFF0C\u9690\u85CF\u5E95\u90E8\u6EDA\u52A8\u6761\u6216\u663E\u793A\u9ED8\u8BA4\u63D0\u793A\n * @optional\n */\n winningInfos?: WinningInfo[]\n\n /**\n * \u5956\u54C1\u6C60\u5C55\u793A\u533A\u57DF\u6807\u9898\n * @default \"Prize Pool\"\n * @optional\n */\n prizesTitle?: string\n\n // ========== \u56DE\u8C03\u51FD\u6570 Props\uFF08\u53EF\u9009\uFF09 ==========\n\n /**\n * \u62BD\u5956\u5F00\u59CB\u65F6\u7684\u56DE\u8C03\uFF0C\u8FD4\u56DE Promise \u4EE5\u652F\u6301\u5F02\u6B65\u63A5\u53E3\u8C03\u7528\n * @returns Promise<string> - \u4E2D\u5956\u5956\u54C1\u7684 ID\uFF0C\u5982\u679C\u63A5\u53E3\u5931\u8D25\u5219 reject\n * @optional\n * @example\n * ```tsx\n * onSpinStart={async () => {\n * const result = await fetch('/api/lottery')\n * const data = await result.json()\n * return data.prizeId // \u8FD4\u56DE\u4E2D\u5956\u5956\u54C1 ID\n * }}\n * ```\n */\n onSpinStart?: () => Promise<string>\n\n /**\n * \u62BD\u5956\u7ED3\u675F\u65F6\u7684\u56DE\u8C03\uFF0C\u4F20\u9012\u4E2D\u5956\u5956\u54C1\n * @param prize \u4E2D\u5956\u5956\u54C1\u5BF9\u8C61\n * @optional\n */\n onSpinEnd?: (prize: Prize) => void\n\n /**\n * \u62BD\u5956\u9519\u8BEF\u65F6\u7684\u56DE\u8C03\n * @param error \u9519\u8BEF\u4FE1\u606F\n * @optional\n */\n onSpinError?: (error: Error) => void\n\n // ========== \u4E2D\u5956\u5F39\u7A97\u914D\u7F6E Props\uFF08\u53EF\u9009\uFF09 ==========\n\n /**\n * \u4E2D\u5956\u5F39\u7A97\u914D\u7F6E\u5BF9\u8C61\uFF0C\u901A\u5E38\u7531\u62BD\u5956\u63A5\u53E3\u8FD4\u56DE\u63D0\u4F9B\n * @optional\n * @example\n * ```tsx\n * winnerModalConfig={{\n * title: 'Congratulations!',\n * prizeTitle: 'Anker Prime Charger',\n * prizeImage: 'https://...',\n * prizeDescription: 'High-speed charging',\n * learnMoreUrl: 'https://...',\n * couponCode: 'ANKER2024',\n * expiresAt: '2024-12-31',\n * couponDiscount: '20%',\n * confirmText: 'Claim Now'\n * }}\n * ```\n */\n winnerModalConfig?: WinnerModalConfig\n\n rulesModalConfig?: RulesModalConfig\n\n myRewardsModalConfig?: MyRewardsModalConfig\n\n errorModalConfig?: ErrorModalConfig\n\n /**\n * \u5206\u4EAB\u5F39\u7A97\u914D\u7F6E\n * @optional\n */\n shareModalConfig?: ShareModalConfig\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 // ========== \u7528\u6237\u76F8\u5173 Props\uFF08\u53EF\u9009\uFF09 ==========\n\n /**\n * \u7528\u6237\u6570\u636E\n * @optional\n * @example\n * ```tsx\n * userData={{\n * isLoggedIn: true,\n * availableChances: 3,\n * wonPrizes: [{ id: 'prize-001', name: 'Charger', image: 'https://...' }]\n * }}\n * ```\n */\n userData?: UserData\n\n /**\n * \u672A\u767B\u5F55\u65F6\u7684\u63D0\u793A\u6587\u6848\n * @default \"Please log in to participate\"\n * @optional\n */\n loginPromptText?: string\n\n /**\n * \u767B\u5F55\u6309\u94AE\u6587\u6848\n * @default \"Log In\"\n * @optional\n */\n loginButtonText?: string\n\n /**\n * \u6B21\u6570\u4E0D\u8DB3\u65F6\u7684\u63D0\u793A\u6587\u6848\n * @default \"You have no chances left\"\n * @optional\n */\n noChancesText?: string\n\n // ========== \u5F39\u7A97\u76F8\u5173 Props\uFF08\u53EF\u9009\uFF09 ==========\n\n /**\n * \u590D\u5236\u4F18\u60E0\u7801\u56DE\u8C03\n * @optional\n */\n onCopyCode?: (code: string) => void\n\n /**\n * Rules \u6309\u94AE\u6587\u672C\n * @default \"Rules\"\n * @optional\n */\n rulesText?: string\n\n /**\n * Opportunities \u6587\u672C\u6570\u7EC4\n * @default [\"Accumulate\", \"lottery opportunities\"]\n * @optional\n */\n opportunitiesText?: string[]\n\n /**\n * My Rewards \u6309\u94AE\u6587\u672C\n * @default \"My Rewards\"\n * @optional\n */\n myRewardsText?: string\n\n /**\n * \u672A\u4E2D\u5956\u5F39\u7A97\u6807\u9898\n * @default \"Sorry, You Didn't Win This Time\"\n * @optional\n */\n noWinTitle?: string\n\n /**\n * \u672A\u4E2D\u5956\u5F39\u7A97\u526F\u6807\u9898\n * @default \"Keep Trying, You Could Still Win Big!\"\n * @optional\n */\n noWinSubtitle?: string\n\n // ========== My Rewards \u5F39\u7A97\u6587\u6848\u914D\u7F6E\uFF08\u53EF\u9009\uFF09 ==========\n\n /**\n * My Rewards \u5F39\u7A97\u65E0\u5956\u52B1\u65F6\u7684\u63D0\u793A\u6587\u672C\n * @default \"No rewards yet\"\n * @optional\n */\n rewardsEmptyText?: string\n\n /**\n * My Rewards \u5F39\u7A97 CODE \u6807\u7B7E\u6587\u672C\n * @default \"CODE:\"\n * @optional\n */\n rewardsCodeLabel?: string\n\n /**\n * My Rewards \u5F39\u7A97\u590D\u5236\u6309\u94AE\u6587\u672C\n * @default \"Copy\"\n * @optional\n */\n rewardsCopyButtonText?: string\n\n /**\n * My Rewards \u5F39\u7A97\u5956\u52B1\u65F6\u95F4\u6807\u7B7E\u6587\u672C\n * @default \"Prize time:\"\n * @optional\n */\n rewardsPrizeTimeLabel?: string\n\n // ========== BaseModal \u914D\u7F6E\uFF08\u53EF\u9009\uFF09 ==========\n\n /**\n * \u5F39\u7A97\u5173\u95ED\u6309\u94AE\u7684 aria-label\n * @default \"\u5173\u95ED\u5F39\u7A97\"\n * @optional\n */\n modalCloseButtonAriaLabel?: string\n\n // ========== \u6837\u5F0F\u76F8\u5173 Props\uFF08\u53EF\u9009\uFF09 ==========\n\n /**\n * \u81EA\u5B9A\u4E49 CSS \u7C7B\u540D\uFF0C\u7528\u4E8E\u8986\u76D6\u6216\u6269\u5C55\u9ED8\u8BA4\u6837\u5F0F\n * @optional\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 * \u9ED8\u8BA4\u8F6C\u76D8\u914D\u7F6E\n */\n\nexport const DEFAULT_WHEEL_CONFIG = {\n spinDuration: 4000, // 4 \u79D2\n easing: 'ease-out' as EasingFunction,\n chanceTitle: 'Want more chances to win?',\n}\n\n// ============================================================================\n// \u5185\u90E8\u72B6\u6001\u7C7B\u578B\uFF08\u4EC5\u4F9B\u7EC4\u4EF6\u5185\u90E8\u4F7F\u7528\uFF09\n// ============================================================================\n\n/**\n * \u8F6C\u76D8\u8FD0\u884C\u65F6\u72B6\u6001\uFF08\u7EC4\u4EF6\u5185\u90E8\u4F7F\u7528\uFF09\n * @internal\n */\nexport interface WheelState {\n /**\n * \u8F6C\u76D8\u662F\u5426\u6B63\u5728\u65CB\u8F6C\n */\n isSpinning: boolean\n\n /**\n * \u5F53\u524D\u65CB\u8F6C\u89D2\u5EA6\uFF08\u5EA6\u6570\uFF09\n */\n currentRotation: number\n\n /**\n * \u4E2D\u5956\u5956\u54C1\uFF0C\u62BD\u5956\u7ED3\u675F\u540E\u8BBE\u7F6E\n */\n winningPrize: Prize | null\n\n /**\n * GO \u6309\u94AE\u662F\u5426\u7981\u7528\n */\n isButtonDisabled: boolean\n\n /**\n * \u662F\u5426\u5DF2\u5B8C\u6210\u62BD\u5956\uFF08\u7528\u4E8E\u63A7\u5236\u8F6C\u76D8\u662F\u5426\u663E\u793A\u521D\u59CB\u65CB\u8F6C\u52A8\u753B\uFF09\n */\n isFinished: boolean\n}\n\n/**\n * \u521D\u59CB\u8F6C\u76D8\u72B6\u6001\n * @internal\n */\nexport const INITIAL_WHEEL_STATE: WheelState = {\n isSpinning: false,\n currentRotation: 0,\n winningPrize: null,\n isButtonDisabled: false,\n isFinished: false,\n}\n\n// ============================================================================\n// \u5B50\u7EC4\u4EF6 Props \u7C7B\u578B\n// ============================================================================\n\n/**\n * Wheel \u8F6C\u76D8\u7EC4\u4EF6 Props\n */\nexport interface WheelProps {\n /**\n * \u4E3B\u9898\u6A21\u5F0F\n * @optional\n */\n theme?: Theme\n\n /**\n * 8 \u4E2A\u5956\u54C1\u6570\u7EC4\n */\n prizes: Prize[]\n\n /**\n * \u5F53\u524D\u65CB\u8F6C\u89D2\u5EA6(\u5EA6\u6570)\n */\n rotation: number\n\n /**\n * \u662F\u5426\u6B63\u5728\u65CB\u8F6C\n */\n isSpinning: boolean\n\n /**\n * \u662F\u5426\u5DF2\u5B8C\u6210\u62BD\u5956\uFF08\u7528\u4E8E\u63A7\u5236\u8F6C\u76D8\u662F\u5426\u663E\u793A\u521D\u59CB\u65CB\u8F6C\u52A8\u753B\uFF09\n */\n isFinished?: boolean\n\n /**\n * GO \u6309\u94AE\u662F\u5426\u7981\u7528\n */\n isButtonDisabled: boolean\n\n /**\n * GO \u6309\u94AE\u70B9\u51FB\u56DE\u8C03\n */\n onGoClick: () => void\n\n /**\n * \u8F6C\u76D8\u5E95\u56FE URL\uFF08\u53EF\u9009\uFF09\n */\n wheelBackgroundImage?: string\n\n /**\n * \u8F6C\u76D8\u6307\u9488\u56FE\u7247 URL\uFF08\u53EF\u9009\uFF09\n */\n pointerImage?: 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 * \u81EA\u5B9A\u4E49\u7C7B\u540D\n */\n className?: string\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/**\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\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 /**\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// \u5DE5\u5177\u7C7B\u578B\n// ============================================================================\n\n/**\n * \u9A8C\u8BC1\u7ED3\u679C\n */\nexport interface ValidationResult {\n valid: boolean\n error?: string\n}\n\n/**\n * \u5956\u54C1\u9A8C\u8BC1\u9009\u9879\n */\nexport interface ValidatePrizesOptions {\n /**\n * \u662F\u5426\u5141\u8BB8\u7F3A\u5C11 rank \u5B57\u6BB5\n * @default true\n */\n allowMissingRank?: boolean\n\n /**\n * \u662F\u5426\u5141\u8BB8\u7F3A\u5C11 price \u5B57\u6BB5\n * @default true\n */\n allowMissingPrice?: boolean\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": "AAmIO,MAAMA,EACX,2GAEWC,EACX,2GAKWC,EACX,sHAKWC,EACX,sHAm8BWC,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,EAMaC,EAAuB,CAClC,aAAc,IACd,OAAQ,WACR,YAAa,2BACf,EAyCaC,EAAkC,CAC7C,WAAY,GACZ,gBAAiB,EACjB,aAAc,KACd,iBAAkB,GAClB,WAAY,EACd,EAgSO,SAASC,EAAQC,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,SAASC,EAAeD,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,SAASE,EAAcF,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
+ "names": ["DEFAULT_POINTER_IMAGE", "DEFAULT_POINTER_DISABLE_IMAGE", "DEFAULT_WHEEL_BG_6_PRIZES", "DEFAULT_WHEEL_BG_8_PRIZES", "DEFAULT_CHANCE_METHODS", "DEFAULT_WHEEL_CONFIG", "INITIAL_WHEEL_STATE", "isPrize", "value", "isChanceMethod", "isWinningInfo"]
7
+ }
@@ -1,3 +1,11 @@
1
+ export { default as ActivitySchedule } from './ActivitySchedule/index.js';
2
+ export type { ActivityScheduleProps, ActivityScheduleData, ActivityScheduleItem } from './ActivitySchedule/types.js';
3
+ export { default as GiftShelf } from './GiftShelf/index.js';
4
+ export type { GiftShelfProps, GiftShelfData, GiftShelfItem, CountdownConfig, ResponsiveBackgroundImage as GiftShelfResponsiveBackgroundImage, } from './GiftShelf/types.js';
5
+ export { default as GiftTierShelf } from './GiftTierShelf/index.js';
6
+ export type { GiftTierShelfProps, GiftTierShelfData, GiftTierItem, GiftTierProduct } from './GiftTierShelf/types.js';
7
+ export { default as ActivityMechanism } from './ActivityMechanism/index.js';
8
+ export type { ActivityMechanismProps, ActivityMechanismItem, ActivityMechanismSemanticName, ResponsiveBackgroundImage, } from './ActivityMechanism/types.js';
1
9
  export { default as BrandEquity } from './BrandEquity/index.js';
2
10
  export { default as MemberEquity } from './MemberEquity/index.js';
3
11
  export { default as Slogan } from './Slogan/index.js';
@@ -61,6 +69,8 @@ export { default as FootCharger } from './FootCharger/index.js';
61
69
  export { default as BrandCardLink } from './BrandCardLink/index.js';
62
70
  export type { BrandCardLinkProps, BrandCardLinkItemProps } from './BrandCardLink/types.js';
63
71
  export * as IPRedirect from './IPRedirect/index.js';
72
+ export { default as WheelLottery } from './WheelLottery/index.js';
73
+ export type { WheelLotteryProps, WheelLotteryHandle, Prize, ChanceMethod, WinningInfo, UserData, } from './WheelLottery/types.js';
64
74
  export { default as ProductCompare } from './ProductCompare/index.js';
65
75
  export type { ProductCompareProps, ProductItemData } from './ProductCompare/index.js';
66
76
  export { default as Ksp } from './Ksp/index.js';
@@ -134,6 +144,7 @@ export declare const PAYLOAD_COMPONENT_MAP: {
134
144
  'ipc-footcharger': string;
135
145
  'ipc-ga-block': string;
136
146
  'ipc-giftbox': string;
147
+ 'ipc-giftshelf': string;
137
148
  'ipc-graphic': string;
138
149
  'ipc-graphicmore': string;
139
150
  'ipc-graphicoverlay': string;
@@ -1,2 +1,2 @@
1
- import{default as a}from"./BrandEquity/index.js";import{default as i}from"./MemberEquity/index.js";import{default as s}from"./Slogan/index.js";import{default as f}from"./Title/index.js";import{default as u}from"./Spacer/index.js";import{default as n}from"./ShelfDisplay/index.js";import{default as x}from"./Evaluate/index.js";import{default as y}from"./Category/index.js";import{default as C}from"./HeroBanner/index.js";import{default as M}from"./AccordionCards/index.js";import{default as B}from"./Graphic/index.js";import{default as F}from"./MediaPlayerBase/index.js";import{default as v}from"./MediaPlayerSticky/index.js";import{default as j}from"./MediaPlayerMulti/index.js";import{default as w}from"./Marquee/index.js";import{default as G}from"./MarqueeReview/index.js";import{default as q}from"./WhyChoose/index.js";import{default as L}from"./Faq/index.js";import{MarqueeItem as O,MarqueeImageContent as W,MarqueeTextContent as V}from"./Marquee/index.js";import{default as R}from"./MultiLayoutGraphicBlock/index.js";import{default as _}from"./GraphicAttractionBlock/index.js";import{default as Y}from"./HeaderNavigation/index.js";import{default as Q}from"./FooterNavigation/index.js";import{default as X}from"./SearchPage/index.js";import{IPC_SEARCH_PAGE as $,SearchPageTabType as ee}from"./SearchPage/types.js";import{withLayout as te}from"../shared/Styles.js";import{default as oe}from"./AiuiProvider/index.js";import{default as pe}from"./Tabs/index.js";import{default as de}from"./CreativeModule/index.js";import{default as ce}from"./GraphicOverlay/index.js";import{default as le}from"./Specs/index.js";import{default as me}from"./TabsGroup/index.js";import{default as he}from"./Listing/BizProductProvider.js";import{default as Pe}from"./Listing/components/PurchaseBar/index.js";import{default as Se}from"./Listing/components/PurchaseBar/ProductActions/index.js";import{default as ge}from"./Listing/components/ProductCard/index.js";import{default as Te}from"./Listing/components/ProductCard/ProductDetail/ProductBenefitsTabs/index.js";import{default as Ie}from"./Listing/components/ProductCard/ProductDetail/ProductHighlight/index.js";import{default as be}from"./Listing/components/ProductCard/ProductDetail/ProductFreeGift/index.js";import{default as De}from"./Listing/components/ProductCard/ProductDetail/ProductExchangePurchase/index.js";import{default as Ae}from"./Listing/components/ProductCard/ProductDetail/ProductOptions/index.js";import{default as ke}from"./Listing/components/ProductCard/ProductDetail/ProductBundle/index.js";import{default as Ee}from"./Listing/components/ProductCard/ProductGridBox.js";import{default as Ne}from"./Listing/components/ProductCard/ProductGallery/index.js";import{default as We}from"./Listing/components/ProductCard/ProductDetail/index.js";import{default as He}from"./Listing/components/ProductCard/ProductSummary/index.js";import{default as Ke}from"./Listing/components/ProductCard/ProductDetail/BenefitsTab.js";import{default as ze}from"./Listing/components/PaidShipping/index.js";import{default as Je}from"./GraphicMore/index.js";import{default as Ue}from"./Features/index.js";import{default as Ze}from"./AplusDesc/index.js";import{default as er}from"./GiftBox/index.js";import{default as tr}from"./SelectStore/index.js";import{default as or}from"./DownLoad/index.js";import{default as pr}from"./FootCharger/index.js";import{default as dr}from"./BrandCardLink/index.js";import*as fr from"./IPRedirect/index.js";import{default as ur}from"./ProductCompare/index.js";import{default as nr}from"./Ksp/index.js";import{default as xr}from"./ImageTextFeature/index.js";import{default as yr}from"./FeatureCards/index.js";import{default as Cr}from"./FeaturedBlogPosts/index.js";import{default as Mr}from"./ImageWithText/index.js";import{default as Br}from"./VideoFeature/index.js";import{default as Fr}from"./TabsWithMedia/index.js";import{default as vr}from"./TabWithImage/index.js";import{default as jr}from"./FeatureShowcase/index.js";import{default as wr}from"./ProductHero/index.js";import{default as Gr}from"./SpecsComparison/index.js";import{default as qr}from"./MediaSceneSwitcher/index.js";import{default as Lr}from"./MediaSceneSwitcherV2/index.js";import{default as Or}from"./ThreeDCarousel/index.js";import{default as Vr}from"./ProductNav/index.js";import{default as Rr}from"./AnchorNavigation/index.js";import{default as _r}from"./PromotionalBar/index.js";import{default as Yr}from"./EventSchedule/index.js";import{default as Qr}from"./SecondaryBanner/index.js";import{default as Xr}from"./BuyOneGetOneShelf/index.js";import{default as $r}from"./ActiveShelf/index.js";import{default as rt}from"./MediaShelf/index.js";import{default as at,CreditsProductCard as ot}from"./CreditsShelf/index.js";import{default as pt,SceneProductCard as st}from"./SceneShelf/index.js";import{default as ft}from"./MediaEndorsement/index.js";import{default as ut}from"./ImageOverlayShelf/index.js";import{default as nt}from"./MiniCart/index.js";import{default as xt}from"./MiniCart/CircleProgress.js";import{default as yt,MiniCartDialog as Pt}from"./MiniCart/MiniCartDialog.js";const e={"ipc-accordioncards":"AccordionCards","ipc-aplusdesc":"AplusDesc","ipc-banner":"HeroBanner","ipc-brand-equity":"BrandEquity","ipc-category":"Category","ipc-collection-banner":"CollectionBanner","ipc-collection-shelves":"CollectionShelves","ipc-creativemodule":"CreativeModule","ipc-download":"DownLoad","ipc-evaluate":"Evaluate","ipc-faq":"Faq","ipc-features":"Features","ipc-footcharger":"FootCharger","ipc-ga-block":"GraphicAttractionBlock","ipc-giftbox":"GiftBox","ipc-graphic":"Graphic","ipc-graphicmore":"GraphicMore","ipc-graphicoverlay":"GraphicOverlay","ipc-marquee":"Marquee","ipc-mediaplayerbase":"MediaPlayerBase","ipc-mediaplayermulti":"MediaPlayerMulti","ipc-mediaplayersticky":"MediaPlayerSticky","ipc-member-equity":"MemberEquity","ipc-mlg-block":"MultiLayoutGraphicBlock","ipc-search-page-tabs":"SearchPageBlock","ipc-selectstore":"SelectStore","ipc-shelfdisplay":"ShelfDisplay","ipc-slogan":"Slogan","ipc-spacer":"Spacer","ipc-specs":"Specs","ipc-tabs":"Tabs","ipc-text-marquee":"TextMarquee","ipc-title":"Title","ipc-whychoose":"WhyChoose","ipc-product-nav":"ProductNav","ipc-brand-card-link":"BrandCardLink","ipc-ipredirect":"IPRedirect",ksp:"Ksp","ipc-secondary-banner":"SecondaryBanner","ipc-active-shelf":"ActiveShelf","ipc-media-shelf":"MediaShelf","ipc-bogo-shelf":"BuyOneGetOneShelf","ipc-media-endorsement":"MediaEndorsement"};export{M as AccordionCards,$r as ActiveShelf,oe as AiuiProvider,Rr as AnchorNavigation,Ze as AplusDesc,Ke as BenefitsTab,he as BizProductProvider,dr as BrandCardLink,a as BrandEquity,Xr as BuyOneGetOneShelf,y as Category,de as CreativeModule,ot as CreditsProductCard,at as CreditsShelf,or as DownLoad,x as Evaluate,Yr as EventSchedule,L as Faq,yr as FeatureCards,jr as FeatureShowcase,Cr as FeaturedBlogPosts,Ue as Features,pr as FootCharger,Q as FooterNavigation,er as GiftBox,B as Graphic,_ as GraphicAttractionBlock,Je as GraphicMore,ce as GraphicOverlay,Y as HeaderNavigation,C as HeroBanner,$ as IPC_SEARCH_PAGE,fr as IPRedirect,ut as ImageOverlayShelf,xr as ImageTextFeature,Mr as ImageWithText,nr as Ksp,w as Marquee,W as MarqueeImageContent,O as MarqueeItem,G as MarqueeReview,V as MarqueeTextContent,ft as MediaEndorsement,F as MediaPlayerBase,j as MediaPlayerMulti,v as MediaPlayerSticky,qr as MediaSceneSwitcher,Lr as MediaSceneSwitcherV2,rt as MediaShelf,i as MemberEquity,nt as MiniCart,xt as MiniCartCircleProgress,yt as MiniCartDialog,Pt as MiniCartDialogComponent,R as MultiLayoutGraphicBlock,e as PAYLOAD_COMPONENT_MAP,ze as PaidShipping,Se as ProductActions,Te as ProductBenefitsTabs,ke as ProductBundle,ge as ProductCard,ur as ProductCompare,We as ProductDetail,De as ProductExchangePurchase,be as ProductFreeGift,Ne as ProductGallery,Ee as ProductGridBox,wr as ProductHero,Ie as ProductHighlight,Vr as ProductNav,Ae as ProductOptions,He as ProductSummary,_r as PromotionalBar,Pe as PurchaseBar,st as SceneProductCard,pt as SceneShelf,X as SearchPage,ee as SearchPageTabType,Qr as SecondaryBanner,tr as SelectStore,n as ShelfDisplay,s as Slogan,u as Spacer,le as Specs,Gr as SpecsComparison,me as TabGroup,vr as TabWithImage,pe as Tabs,Fr as TabsWithMedia,Or as ThreeDCarousel,f as Title,Br as VideoFeature,q as WhyChoose,te as withLayout};
1
+ import{default as a}from"./ActivitySchedule/index.js";import{default as i}from"./GiftShelf/index.js";import{default as s}from"./GiftTierShelf/index.js";import{default as d}from"./ActivityMechanism/index.js";import{default as l}from"./BrandEquity/index.js";import{default as m}from"./MemberEquity/index.js";import{default as x}from"./Slogan/index.js";import{default as y}from"./Title/index.js";import{default as P}from"./Spacer/index.js";import{default as g}from"./ShelfDisplay/index.js";import{default as B}from"./Evaluate/index.js";import{default as T}from"./Category/index.js";import{default as F}from"./HeroBanner/index.js";import{default as j}from"./AccordionCards/index.js";import{default as D}from"./Graphic/index.js";import{default as k}from"./MediaPlayerBase/index.js";import{default as L}from"./MediaPlayerSticky/index.js";import{default as E}from"./MediaPlayerMulti/index.js";import{default as N}from"./Marquee/index.js";import{default as R}from"./MarqueeReview/index.js";import{default as V}from"./WhyChoose/index.js";import{default as _}from"./Faq/index.js";import{MarqueeItem as U,MarqueeImageContent as Y,MarqueeTextContent as J}from"./Marquee/index.js";import{default as X}from"./MultiLayoutGraphicBlock/index.js";import{default as $}from"./GraphicAttractionBlock/index.js";import{default as te}from"./HeaderNavigation/index.js";import{default as ae}from"./FooterNavigation/index.js";import{default as ie}from"./SearchPage/index.js";import{IPC_SEARCH_PAGE as se,SearchPageTabType as fe}from"./SearchPage/types.js";import{withLayout as ce}from"../shared/Styles.js";import{default as ue}from"./AiuiProvider/index.js";import{default as ne}from"./Tabs/index.js";import{default as he}from"./CreativeModule/index.js";import{default as Se}from"./GraphicOverlay/index.js";import{default as Ce}from"./Specs/index.js";import{default as Me}from"./TabsGroup/index.js";import{default as ve}from"./Listing/BizProductProvider.js";import{default as Ie}from"./Listing/components/PurchaseBar/index.js";import{default as Ge}from"./Listing/components/PurchaseBar/ProductActions/index.js";import{default as Ae}from"./Listing/components/ProductCard/index.js";import{default as be}from"./Listing/components/ProductCard/ProductDetail/ProductBenefitsTabs/index.js";import{default as we}from"./Listing/components/ProductCard/ProductDetail/ProductHighlight/index.js";import{default as qe}from"./Listing/components/ProductCard/ProductDetail/ProductFreeGift/index.js";import{default as We}from"./Listing/components/ProductCard/ProductDetail/ProductExchangePurchase/index.js";import{default as Oe}from"./Listing/components/ProductCard/ProductDetail/ProductOptions/index.js";import{default as He}from"./Listing/components/ProductCard/ProductDetail/ProductBundle/index.js";import{default as Ke}from"./Listing/components/ProductCard/ProductGridBox.js";import{default as ze}from"./Listing/components/ProductCard/ProductGallery/index.js";import{default as Ye}from"./Listing/components/ProductCard/ProductDetail/index.js";import{default as Qe}from"./Listing/components/ProductCard/ProductSummary/index.js";import{default as Ze}from"./Listing/components/ProductCard/ProductDetail/BenefitsTab.js";import{default as et}from"./Listing/components/PaidShipping/index.js";import{default as rt}from"./GraphicMore/index.js";import{default as ot}from"./Features/index.js";import{default as pt}from"./AplusDesc/index.js";import{default as ft}from"./GiftBox/index.js";import{default as ct}from"./SelectStore/index.js";import{default as ut}from"./DownLoad/index.js";import{default as nt}from"./FootCharger/index.js";import{default as ht}from"./BrandCardLink/index.js";import*as yt from"./IPRedirect/index.js";import{default as Pt}from"./WheelLottery/index.js";import{default as gt}from"./ProductCompare/index.js";import{default as Bt}from"./Ksp/index.js";import{default as Tt}from"./ImageTextFeature/index.js";import{default as Ft}from"./FeatureCards/index.js";import{default as jt}from"./FeaturedBlogPosts/index.js";import{default as Dt}from"./ImageWithText/index.js";import{default as kt}from"./VideoFeature/index.js";import{default as Lt}from"./TabsWithMedia/index.js";import{default as Et}from"./TabWithImage/index.js";import{default as Nt}from"./FeatureShowcase/index.js";import{default as Rt}from"./ProductHero/index.js";import{default as Vt}from"./SpecsComparison/index.js";import{default as _t}from"./MediaSceneSwitcher/index.js";import{default as Ut}from"./MediaSceneSwitcherV2/index.js";import{default as Jt}from"./ThreeDCarousel/index.js";import{default as Xt}from"./ProductNav/index.js";import{default as $t}from"./AnchorNavigation/index.js";import{default as tr}from"./PromotionalBar/index.js";import{default as ar}from"./EventSchedule/index.js";import{default as ir}from"./SecondaryBanner/index.js";import{default as sr}from"./BuyOneGetOneShelf/index.js";import{default as dr}from"./ActiveShelf/index.js";import{default as lr}from"./MediaShelf/index.js";import{default as mr,CreditsProductCard as nr}from"./CreditsShelf/index.js";import{default as hr,SceneProductCard as yr}from"./SceneShelf/index.js";import{default as Pr}from"./MediaEndorsement/index.js";import{default as gr}from"./ImageOverlayShelf/index.js";import{default as Br}from"./MiniCart/index.js";import{default as Tr}from"./MiniCart/CircleProgress.js";import{default as Fr,MiniCartDialog as Gr}from"./MiniCart/MiniCartDialog.js";const e={"ipc-accordioncards":"AccordionCards","ipc-aplusdesc":"AplusDesc","ipc-banner":"HeroBanner","ipc-brand-equity":"BrandEquity","ipc-category":"Category","ipc-collection-banner":"CollectionBanner","ipc-collection-shelves":"CollectionShelves","ipc-creativemodule":"CreativeModule","ipc-download":"DownLoad","ipc-evaluate":"Evaluate","ipc-faq":"Faq","ipc-features":"Features","ipc-footcharger":"FootCharger","ipc-ga-block":"GraphicAttractionBlock","ipc-giftbox":"GiftBox","ipc-giftshelf":"GiftShelf","ipc-graphic":"Graphic","ipc-graphicmore":"GraphicMore","ipc-graphicoverlay":"GraphicOverlay","ipc-marquee":"Marquee","ipc-mediaplayerbase":"MediaPlayerBase","ipc-mediaplayermulti":"MediaPlayerMulti","ipc-mediaplayersticky":"MediaPlayerSticky","ipc-member-equity":"MemberEquity","ipc-mlg-block":"MultiLayoutGraphicBlock","ipc-search-page-tabs":"SearchPageBlock","ipc-selectstore":"SelectStore","ipc-shelfdisplay":"ShelfDisplay","ipc-slogan":"Slogan","ipc-spacer":"Spacer","ipc-specs":"Specs","ipc-tabs":"TabsBlock","ipc-text-marquee":"TextMarquee","ipc-title":"Title","ipc-whychoose":"WhyChoose","ipc-product-nav":"ProductNav","ipc-brand-card-link":"BrandCardLink","ipc-ipredirect":"IPRedirect",ksp:"Ksp","ipc-secondary-banner":"SecondaryBanner","ipc-active-shelf":"ActiveShelf","ipc-media-shelf":"MediaShelf","ipc-bogo-shelf":"BuyOneGetOneShelf","ipc-media-endorsement":"MediaEndorsement"};export{j as AccordionCards,dr as ActiveShelf,d as ActivityMechanism,a as ActivitySchedule,ue as AiuiProvider,$t as AnchorNavigation,pt as AplusDesc,Ze as BenefitsTab,ve as BizProductProvider,ht as BrandCardLink,l as BrandEquity,sr as BuyOneGetOneShelf,T as Category,he as CreativeModule,nr as CreditsProductCard,mr as CreditsShelf,ut as DownLoad,B as Evaluate,ar as EventSchedule,_ as Faq,Ft as FeatureCards,Nt as FeatureShowcase,jt as FeaturedBlogPosts,ot as Features,nt as FootCharger,ae as FooterNavigation,ft as GiftBox,i as GiftShelf,s as GiftTierShelf,D as Graphic,$ as GraphicAttractionBlock,rt as GraphicMore,Se as GraphicOverlay,te as HeaderNavigation,F as HeroBanner,se as IPC_SEARCH_PAGE,yt as IPRedirect,gr as ImageOverlayShelf,Tt as ImageTextFeature,Dt as ImageWithText,Bt as Ksp,N as Marquee,Y as MarqueeImageContent,U as MarqueeItem,R as MarqueeReview,J as MarqueeTextContent,Pr as MediaEndorsement,k as MediaPlayerBase,E as MediaPlayerMulti,L as MediaPlayerSticky,_t as MediaSceneSwitcher,Ut as MediaSceneSwitcherV2,lr as MediaShelf,m as MemberEquity,Br as MiniCart,Tr as MiniCartCircleProgress,Fr as MiniCartDialog,Gr as MiniCartDialogComponent,X as MultiLayoutGraphicBlock,e as PAYLOAD_COMPONENT_MAP,et as PaidShipping,Ge as ProductActions,be as ProductBenefitsTabs,He as ProductBundle,Ae as ProductCard,gt as ProductCompare,Ye as ProductDetail,We as ProductExchangePurchase,qe as ProductFreeGift,ze as ProductGallery,Ke as ProductGridBox,Rt as ProductHero,we as ProductHighlight,Xt as ProductNav,Oe as ProductOptions,Qe as ProductSummary,tr as PromotionalBar,Ie as PurchaseBar,yr as SceneProductCard,hr as SceneShelf,ie as SearchPage,fe as SearchPageTabType,ir as SecondaryBanner,ct as SelectStore,g as ShelfDisplay,x as Slogan,P as Spacer,Ce as Specs,Vt as SpecsComparison,Me as TabGroup,Et as TabWithImage,ne as Tabs,Lt as TabsWithMedia,Jt as ThreeDCarousel,y as Title,kt as VideoFeature,Pt as WheelLottery,V as WhyChoose,ce as withLayout};
2
2
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/biz-components/index.ts"],
4
- "sourcesContent": ["export { default as BrandEquity } from './BrandEquity/index.js'\nexport { default as MemberEquity } from './MemberEquity/index.js'\nexport { default as Slogan } from './Slogan/index.js'\nexport { default as Title } from './Title/index.js'\nexport { default as Spacer } from './Spacer/index.js'\nexport { default as ShelfDisplay } from './ShelfDisplay/index.js'\nexport { default as Evaluate } from './Evaluate/index.js'\nexport { default as Category } from './Category/index.js'\nexport { default as HeroBanner } from './HeroBanner/index.js'\nexport { default as AccordionCards } from './AccordionCards/index.js'\nexport { default as Graphic } from './Graphic/index.js'\nexport { default as MediaPlayerBase } from './MediaPlayerBase/index.js'\nexport { default as MediaPlayerSticky } from './MediaPlayerSticky/index.js'\nexport { default as MediaPlayerMulti } from './MediaPlayerMulti/index.js'\nexport { default as Marquee } from './Marquee/index.js'\nexport { default as MarqueeReview } from './MarqueeReview/index.js'\nexport type { MarqueeReviewProps, MarqueeReviewData, ReviewItem } from './MarqueeReview/index.js'\nexport { default as WhyChoose } from './WhyChoose/index.js'\nexport { default as Faq } from './Faq/index.js'\nexport { MarqueeItem, MarqueeImageContent, MarqueeTextContent } from './Marquee/index.js'\nexport { default as MultiLayoutGraphicBlock } from './MultiLayoutGraphicBlock/index.js'\nexport type { MultiLayoutGraphicBlockProps } from './MultiLayoutGraphicBlock/index.js'\nexport { default as GraphicAttractionBlock } from './GraphicAttractionBlock/index.js'\nexport type { GraphicAttractionBlockProps } from './GraphicAttractionBlock/index.js'\nexport { default as HeaderNavigation } from './HeaderNavigation/index.js'\nexport { default as FooterNavigation } from './FooterNavigation/index.js'\nexport { default as SearchPage } from './SearchPage/index.js'\nexport type { SearchPageProps } from './SearchPage/types.js'\nexport { IPC_SEARCH_PAGE, SearchPageTabType } from './SearchPage/types.js'\n\nexport { withLayout } from '../shared/Styles.js'\nexport { default as AiuiProvider } from './AiuiProvider/index.js'\nexport { default as Tabs } from './Tabs/index.js'\nexport { default as CreativeModule } from './CreativeModule/index.js'\nexport { default as GraphicOverlay } from './GraphicOverlay/index.js'\nexport { default as Specs } from './Specs/index.js'\nexport { default as TabGroup } from './TabsGroup/index.js'\n\nexport { default as BizProductProvider } from './Listing/BizProductProvider.js'\nexport { default as PurchaseBar } from './Listing/components/PurchaseBar/index.js'\nexport { default as ProductActions } from './Listing/components/PurchaseBar/ProductActions/index.js'\nexport type { ProductActionsProps } from './Listing/components/PurchaseBar/ProductActions/index.js'\nexport { default as ProductCard } from './Listing/components/ProductCard/index.js'\nexport { default as ProductBenefitsTabs } from './Listing/components/ProductCard/ProductDetail/ProductBenefitsTabs/index.js'\nexport { default as ProductHighlight } from './Listing/components/ProductCard/ProductDetail/ProductHighlight/index.js'\nexport { default as ProductFreeGift } from './Listing/components/ProductCard/ProductDetail/ProductFreeGift/index.js'\nexport { default as ProductExchangePurchase } from './Listing/components/ProductCard/ProductDetail/ProductExchangePurchase/index.js'\nexport { default as ProductOptions } from './Listing/components/ProductCard/ProductDetail/ProductOptions/index.js'\nexport { default as ProductBundle } from './Listing/components/ProductCard/ProductDetail/ProductBundle/index.js'\nexport { default as ProductGridBox } from './Listing/components/ProductCard/ProductGridBox.js'\nexport { default as ProductGallery } from './Listing/components/ProductCard/ProductGallery/index.js'\nexport { default as ProductDetail } from './Listing/components/ProductCard/ProductDetail/index.js'\nexport { default as ProductSummary } from './Listing/components/ProductCard/ProductSummary/index.js'\nexport { default as BenefitsTab } from './Listing/components/ProductCard/ProductDetail/BenefitsTab.js'\nexport { default as PaidShipping } from './Listing/components/PaidShipping/index.js'\n\nexport { default as GraphicMore } from './GraphicMore/index.js'\nexport { default as Features } from './Features/index.js'\nexport { default as AplusDesc } from './AplusDesc/index.js'\nexport { default as GiftBox } from './GiftBox/index.js'\nexport { default as SelectStore } from './SelectStore/index.js'\nexport { default as DownLoad } from './DownLoad/index.js'\nexport { default as FootCharger } from './FootCharger/index.js'\nexport { default as BrandCardLink } from './BrandCardLink/index.js'\nexport type { BrandCardLinkProps, BrandCardLinkItemProps } from './BrandCardLink/types.js'\n\nexport * as IPRedirect from './IPRedirect/index.js'\n\nexport { default as ProductCompare } from './ProductCompare/index.js'\nexport type { ProductCompareProps, ProductItemData } from './ProductCompare/index.js'\nexport { default as Ksp } from './Ksp/index.js'\nexport type { KspProps, KspData, KspCardItem } from './Ksp/index.js'\nexport { default as ImageTextFeature } from './ImageTextFeature/index.js'\nexport type { ImageTextFeatureProps, ImageTextFeatureItem } from './ImageTextFeature/index.js'\nexport { default as FeatureCards } from './FeatureCards/index.js'\nexport type { FeatureCardsProps, FeatureCardItem } from './FeatureCards/index.js'\nexport { default as FeaturedBlogPosts } from './FeaturedBlogPosts/index.js'\nexport type {\n FeaturedBlogPostsProps,\n FeaturedBlogPostsData,\n FeaturedBlogPostItem,\n FeaturedBlogPostSpan,\n} from './FeaturedBlogPosts/index.js'\nexport { default as ImageWithText } from './ImageWithText/index.js'\nexport type { ImageWithTextProps } from './ImageWithText/index.js'\nexport { default as VideoFeature } from './VideoFeature/index.js'\nexport type { VideoFeatureProps } from './VideoFeature/index.js'\nexport { default as TabsWithMedia } from './TabsWithMedia/index.js'\nexport type { TabsWithMediaProps, TabItem, TimeIndex } from './TabsWithMedia/index.js'\nexport { default as TabWithImage } from './TabWithImage/index.js'\nexport type { TabWithImageProps, TabWithImageDataItem } from './TabWithImage/index.js'\nexport { default as FeatureShowcase } from './FeatureShowcase/index.js'\nexport type { FeatureShowcaseProps, FeatureShowcaseItem } from './FeatureShowcase/index.js'\nexport { default as ProductHero } from './ProductHero/index.js'\nexport type { ProductHeroProps } from './ProductHero/index.js'\nexport { default as SpecsComparison } from './SpecsComparison/index.js'\nexport type {\n SpecsComparisonProps,\n SpecsComparisonMenuItem,\n SpecsComparisonLeftMenuItem,\n} from './SpecsComparison/index.js'\nexport { default as MediaSceneSwitcher } from './MediaSceneSwitcher/index.js'\nexport type { MediaSceneSwitcherProps } from './MediaSceneSwitcher/types.js'\nexport { default as MediaSceneSwitcherV2 } from './MediaSceneSwitcherV2/index.js'\nexport type {\n MediaSceneSwitcherV2Props,\n MediaSceneSwitcherV2Data,\n MediaSceneSwitcherV2Item,\n MediaSceneSwitcherV2Layout,\n} from './MediaSceneSwitcherV2/index.js'\nexport { default as ThreeDCarousel } from './ThreeDCarousel/index.js'\nexport type { ThreeDCarouselProps } from './ThreeDCarousel/index.js'\nexport { default as ProductNav } from './ProductNav/index.js'\nexport type { ProductNavProps, TabLink, AnchorItem, BuyButton } from './ProductNav/index.js'\nexport { default as AnchorNavigation } from './AnchorNavigation/index.js'\nexport { default as PromotionalBar } from './PromotionalBar/index.js'\nexport { default as EventSchedule } from './EventSchedule/index.js'\nexport { default as SecondaryBanner } from './SecondaryBanner/index.js'\nexport { default as BuyOneGetOneShelf } from './BuyOneGetOneShelf/index.js'\nexport { default as ActiveShelf } from './ActiveShelf/index.js'\nexport { default as MediaShelf } from './MediaShelf/index.js'\nexport { default as CreditsShelf, CreditsProductCard } from './CreditsShelf/index.js'\nexport type {\n CreditsShelfSemanticName,\n CreditsProductCardData,\n CopyConfig as CreditsShelfCopyConfig,\n ButtonFunctionType as CreditsShelfButtonFunctionType,\n} from './CreditsShelf/index.js'\nexport { default as SceneShelf, SceneProductCard } from './SceneShelf/index.js'\nexport type { SceneShelfSemanticName, SceneProductCardData, SceneProductCardSemanticName } from './SceneShelf/index.js'\n\nexport { default as MediaEndorsement } from './MediaEndorsement/index.js'\nexport type {\n MediaEndorsementProps,\n MediaEndorsementData,\n MediaEndorsementItem,\n MediaEndorsementSemanticName,\n} from './MediaEndorsement/index.js'\n\n// Copy configuration types and defaults\nexport type {\n CopyConfig as MediaShelfCopyConfig,\n ButtonFunctionType as MediaShelfButtonFunctionType,\n} from './MediaShelf/types.js'\nexport type { CopyConfig as ActiveShelfCopyConfig, ButtonFunctionType } from './ActiveShelf/types.js'\n\nexport {\n default as ImageOverlayShelf,\n type ButtonFunctionType as ImageOverlayShelfButtonFunctionType,\n} from './ImageOverlayShelf/index.js'\n\n// MiniCart \u7EC4\u4EF6\u53CA\u7C7B\u578B\u5BFC\u51FA\nexport { default as MiniCart } from './MiniCart/index.js'\nexport type { Cart, CartLineItem, MiniCartData, MiniCartProps, CircleProgressConfig } from './MiniCart/index.js'\nexport { default as MiniCartCircleProgress } from './MiniCart/CircleProgress.js'\nexport type { CircleProgressProps as MiniCartCircleProgressProps } from './MiniCart/CircleProgress.js'\nexport { default as MiniCartDialog, MiniCartDialog as MiniCartDialogComponent } from './MiniCart/MiniCartDialog.js'\nexport type {\n MiniCartDialogProps,\n MiniCartDialogCopy,\n MiniCartDialogSemanticName,\n CartData,\n} from './MiniCart/MiniCartDialog.js'\n\n/**\n * \u7EC4\u4EF6\u6620\u5C04\u5BF9\u8C61\n */\n\nexport const PAYLOAD_COMPONENT_MAP = {\n 'ipc-accordioncards': 'AccordionCards',\n 'ipc-aplusdesc': 'AplusDesc',\n 'ipc-banner': 'HeroBanner',\n 'ipc-brand-equity': 'BrandEquity',\n 'ipc-category': 'Category',\n 'ipc-collection-banner': 'CollectionBanner',\n 'ipc-collection-shelves': 'CollectionShelves',\n 'ipc-creativemodule': 'CreativeModule',\n 'ipc-download': 'DownLoad',\n 'ipc-evaluate': 'Evaluate',\n 'ipc-faq': 'Faq',\n 'ipc-features': 'Features',\n 'ipc-footcharger': 'FootCharger',\n 'ipc-ga-block': 'GraphicAttractionBlock',\n 'ipc-giftbox': 'GiftBox',\n 'ipc-graphic': 'Graphic',\n 'ipc-graphicmore': 'GraphicMore',\n 'ipc-graphicoverlay': 'GraphicOverlay',\n 'ipc-marquee': 'Marquee',\n 'ipc-mediaplayerbase': 'MediaPlayerBase',\n 'ipc-mediaplayermulti': 'MediaPlayerMulti',\n 'ipc-mediaplayersticky': 'MediaPlayerSticky',\n 'ipc-member-equity': 'MemberEquity',\n 'ipc-mlg-block': 'MultiLayoutGraphicBlock',\n 'ipc-search-page-tabs': 'SearchPageBlock',\n 'ipc-selectstore': 'SelectStore',\n 'ipc-shelfdisplay': 'ShelfDisplay',\n 'ipc-slogan': 'Slogan',\n 'ipc-spacer': 'Spacer',\n 'ipc-specs': 'Specs',\n 'ipc-tabs': 'Tabs',\n 'ipc-text-marquee': 'TextMarquee',\n 'ipc-title': 'Title',\n 'ipc-whychoose': 'WhyChoose',\n 'ipc-product-nav': 'ProductNav',\n 'ipc-brand-card-link': 'BrandCardLink',\n 'ipc-ipredirect': 'IPRedirect',\n ksp: 'Ksp',\n 'ipc-secondary-banner': 'SecondaryBanner',\n /**\n * \u6D3B\u52A8\u8D27\u67B6\n */\n 'ipc-active-shelf': 'ActiveShelf',\n 'ipc-media-shelf': 'MediaShelf',\n /**\n * \u6D3B\u52A8\u4E70\u8D60\u8D27\u67B6\n */\n 'ipc-bogo-shelf': 'BuyOneGetOneShelf',\n 'ipc-media-endorsement': 'MediaEndorsement',\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["export { default as ActivitySchedule } from './ActivitySchedule/index.js'\nexport type { ActivityScheduleProps, ActivityScheduleData, ActivityScheduleItem } from './ActivitySchedule/types.js'\nexport { default as GiftShelf } from './GiftShelf/index.js'\nexport type {\n GiftShelfProps,\n GiftShelfData,\n GiftShelfItem,\n CountdownConfig,\n ResponsiveBackgroundImage as GiftShelfResponsiveBackgroundImage,\n} from './GiftShelf/types.js'\nexport { default as GiftTierShelf } from './GiftTierShelf/index.js'\nexport type { GiftTierShelfProps, GiftTierShelfData, GiftTierItem, GiftTierProduct } from './GiftTierShelf/types.js'\nexport { default as ActivityMechanism } from './ActivityMechanism/index.js'\nexport type {\n ActivityMechanismProps,\n ActivityMechanismItem,\n ActivityMechanismSemanticName,\n ResponsiveBackgroundImage,\n} from './ActivityMechanism/types.js'\nexport { default as BrandEquity } from './BrandEquity/index.js'\nexport { default as MemberEquity } from './MemberEquity/index.js'\nexport { default as Slogan } from './Slogan/index.js'\nexport { default as Title } from './Title/index.js'\nexport { default as Spacer } from './Spacer/index.js'\nexport { default as ShelfDisplay } from './ShelfDisplay/index.js'\nexport { default as Evaluate } from './Evaluate/index.js'\nexport { default as Category } from './Category/index.js'\nexport { default as HeroBanner } from './HeroBanner/index.js'\nexport { default as AccordionCards } from './AccordionCards/index.js'\nexport { default as Graphic } from './Graphic/index.js'\nexport { default as MediaPlayerBase } from './MediaPlayerBase/index.js'\nexport { default as MediaPlayerSticky } from './MediaPlayerSticky/index.js'\nexport { default as MediaPlayerMulti } from './MediaPlayerMulti/index.js'\nexport { default as Marquee } from './Marquee/index.js'\nexport { default as MarqueeReview } from './MarqueeReview/index.js'\nexport type { MarqueeReviewProps, MarqueeReviewData, ReviewItem } from './MarqueeReview/index.js'\nexport { default as WhyChoose } from './WhyChoose/index.js'\nexport { default as Faq } from './Faq/index.js'\nexport { MarqueeItem, MarqueeImageContent, MarqueeTextContent } from './Marquee/index.js'\nexport { default as MultiLayoutGraphicBlock } from './MultiLayoutGraphicBlock/index.js'\nexport type { MultiLayoutGraphicBlockProps } from './MultiLayoutGraphicBlock/index.js'\nexport { default as GraphicAttractionBlock } from './GraphicAttractionBlock/index.js'\nexport type { GraphicAttractionBlockProps } from './GraphicAttractionBlock/index.js'\nexport { default as HeaderNavigation } from './HeaderNavigation/index.js'\nexport { default as FooterNavigation } from './FooterNavigation/index.js'\nexport { default as SearchPage } from './SearchPage/index.js'\nexport type { SearchPageProps } from './SearchPage/types.js'\nexport { IPC_SEARCH_PAGE, SearchPageTabType } from './SearchPage/types.js'\n\nexport { withLayout } from '../shared/Styles.js'\nexport { default as AiuiProvider } from './AiuiProvider/index.js'\nexport { default as Tabs } from './Tabs/index.js'\nexport { default as CreativeModule } from './CreativeModule/index.js'\nexport { default as GraphicOverlay } from './GraphicOverlay/index.js'\nexport { default as Specs } from './Specs/index.js'\nexport { default as TabGroup } from './TabsGroup/index.js'\n\nexport { default as BizProductProvider } from './Listing/BizProductProvider.js'\nexport { default as PurchaseBar } from './Listing/components/PurchaseBar/index.js'\nexport { default as ProductActions } from './Listing/components/PurchaseBar/ProductActions/index.js'\nexport type { ProductActionsProps } from './Listing/components/PurchaseBar/ProductActions/index.js'\nexport { default as ProductCard } from './Listing/components/ProductCard/index.js'\nexport { default as ProductBenefitsTabs } from './Listing/components/ProductCard/ProductDetail/ProductBenefitsTabs/index.js'\nexport { default as ProductHighlight } from './Listing/components/ProductCard/ProductDetail/ProductHighlight/index.js'\nexport { default as ProductFreeGift } from './Listing/components/ProductCard/ProductDetail/ProductFreeGift/index.js'\nexport { default as ProductExchangePurchase } from './Listing/components/ProductCard/ProductDetail/ProductExchangePurchase/index.js'\nexport { default as ProductOptions } from './Listing/components/ProductCard/ProductDetail/ProductOptions/index.js'\nexport { default as ProductBundle } from './Listing/components/ProductCard/ProductDetail/ProductBundle/index.js'\nexport { default as ProductGridBox } from './Listing/components/ProductCard/ProductGridBox.js'\nexport { default as ProductGallery } from './Listing/components/ProductCard/ProductGallery/index.js'\nexport { default as ProductDetail } from './Listing/components/ProductCard/ProductDetail/index.js'\nexport { default as ProductSummary } from './Listing/components/ProductCard/ProductSummary/index.js'\nexport { default as BenefitsTab } from './Listing/components/ProductCard/ProductDetail/BenefitsTab.js'\nexport { default as PaidShipping } from './Listing/components/PaidShipping/index.js'\n\nexport { default as GraphicMore } from './GraphicMore/index.js'\nexport { default as Features } from './Features/index.js'\nexport { default as AplusDesc } from './AplusDesc/index.js'\nexport { default as GiftBox } from './GiftBox/index.js'\nexport { default as SelectStore } from './SelectStore/index.js'\nexport { default as DownLoad } from './DownLoad/index.js'\nexport { default as FootCharger } from './FootCharger/index.js'\nexport { default as BrandCardLink } from './BrandCardLink/index.js'\nexport type { BrandCardLinkProps, BrandCardLinkItemProps } from './BrandCardLink/types.js'\n\nexport * as IPRedirect from './IPRedirect/index.js'\n\nexport { default as WheelLottery } from './WheelLottery/index.js'\nexport type {\n WheelLotteryProps,\n WheelLotteryHandle,\n Prize,\n ChanceMethod,\n WinningInfo,\n UserData,\n} from './WheelLottery/types.js'\nexport { default as ProductCompare } from './ProductCompare/index.js'\nexport type { ProductCompareProps, ProductItemData } from './ProductCompare/index.js'\nexport { default as Ksp } from './Ksp/index.js'\nexport type { KspProps, KspData, KspCardItem } from './Ksp/index.js'\nexport { default as ImageTextFeature } from './ImageTextFeature/index.js'\nexport type { ImageTextFeatureProps, ImageTextFeatureItem } from './ImageTextFeature/index.js'\nexport { default as FeatureCards } from './FeatureCards/index.js'\nexport type { FeatureCardsProps, FeatureCardItem } from './FeatureCards/index.js'\nexport { default as FeaturedBlogPosts } from './FeaturedBlogPosts/index.js'\nexport type {\n FeaturedBlogPostsProps,\n FeaturedBlogPostsData,\n FeaturedBlogPostItem,\n FeaturedBlogPostSpan,\n} from './FeaturedBlogPosts/index.js'\nexport { default as ImageWithText } from './ImageWithText/index.js'\nexport type { ImageWithTextProps } from './ImageWithText/index.js'\nexport { default as VideoFeature } from './VideoFeature/index.js'\nexport type { VideoFeatureProps } from './VideoFeature/index.js'\nexport { default as TabsWithMedia } from './TabsWithMedia/index.js'\nexport type { TabsWithMediaProps, TabItem, TimeIndex } from './TabsWithMedia/index.js'\nexport { default as TabWithImage } from './TabWithImage/index.js'\nexport type { TabWithImageProps, TabWithImageDataItem } from './TabWithImage/index.js'\nexport { default as FeatureShowcase } from './FeatureShowcase/index.js'\nexport type { FeatureShowcaseProps, FeatureShowcaseItem } from './FeatureShowcase/index.js'\nexport { default as ProductHero } from './ProductHero/index.js'\nexport type { ProductHeroProps } from './ProductHero/index.js'\nexport { default as SpecsComparison } from './SpecsComparison/index.js'\nexport type {\n SpecsComparisonProps,\n SpecsComparisonMenuItem,\n SpecsComparisonLeftMenuItem,\n} from './SpecsComparison/index.js'\nexport { default as MediaSceneSwitcher } from './MediaSceneSwitcher/index.js'\nexport type { MediaSceneSwitcherProps } from './MediaSceneSwitcher/types.js'\nexport { default as MediaSceneSwitcherV2 } from './MediaSceneSwitcherV2/index.js'\nexport type {\n MediaSceneSwitcherV2Props,\n MediaSceneSwitcherV2Data,\n MediaSceneSwitcherV2Item,\n MediaSceneSwitcherV2Layout,\n} from './MediaSceneSwitcherV2/index.js'\nexport { default as ThreeDCarousel } from './ThreeDCarousel/index.js'\nexport type { ThreeDCarouselProps } from './ThreeDCarousel/index.js'\nexport { default as ProductNav } from './ProductNav/index.js'\nexport type { ProductNavProps, TabLink, AnchorItem, BuyButton } from './ProductNav/index.js'\nexport { default as AnchorNavigation } from './AnchorNavigation/index.js'\nexport { default as PromotionalBar } from './PromotionalBar/index.js'\nexport { default as EventSchedule } from './EventSchedule/index.js'\nexport { default as SecondaryBanner } from './SecondaryBanner/index.js'\nexport { default as BuyOneGetOneShelf } from './BuyOneGetOneShelf/index.js'\nexport { default as ActiveShelf } from './ActiveShelf/index.js'\nexport { default as MediaShelf } from './MediaShelf/index.js'\nexport { default as CreditsShelf, CreditsProductCard } from './CreditsShelf/index.js'\nexport type {\n CreditsShelfSemanticName,\n CreditsProductCardData,\n CopyConfig as CreditsShelfCopyConfig,\n ButtonFunctionType as CreditsShelfButtonFunctionType,\n} from './CreditsShelf/index.js'\nexport { default as SceneShelf, SceneProductCard } from './SceneShelf/index.js'\nexport type { SceneShelfSemanticName, SceneProductCardData, SceneProductCardSemanticName } from './SceneShelf/index.js'\n\nexport { default as MediaEndorsement } from './MediaEndorsement/index.js'\nexport type {\n MediaEndorsementProps,\n MediaEndorsementData,\n MediaEndorsementItem,\n MediaEndorsementSemanticName,\n} from './MediaEndorsement/index.js'\n\n// Copy configuration types and defaults\nexport type {\n CopyConfig as MediaShelfCopyConfig,\n ButtonFunctionType as MediaShelfButtonFunctionType,\n} from './MediaShelf/types.js'\nexport type { CopyConfig as ActiveShelfCopyConfig, ButtonFunctionType } from './ActiveShelf/types.js'\n\nexport {\n default as ImageOverlayShelf,\n type ButtonFunctionType as ImageOverlayShelfButtonFunctionType,\n} from './ImageOverlayShelf/index.js'\n\n// MiniCart \u7EC4\u4EF6\u53CA\u7C7B\u578B\u5BFC\u51FA\nexport { default as MiniCart } from './MiniCart/index.js'\nexport type { Cart, CartLineItem, MiniCartData, MiniCartProps, CircleProgressConfig } from './MiniCart/index.js'\nexport { default as MiniCartCircleProgress } from './MiniCart/CircleProgress.js'\nexport type { CircleProgressProps as MiniCartCircleProgressProps } from './MiniCart/CircleProgress.js'\nexport { default as MiniCartDialog, MiniCartDialog as MiniCartDialogComponent } from './MiniCart/MiniCartDialog.js'\nexport type {\n MiniCartDialogProps,\n MiniCartDialogCopy,\n MiniCartDialogSemanticName,\n CartData,\n} from './MiniCart/MiniCartDialog.js'\n\n/**\n * \u7EC4\u4EF6\u6620\u5C04\u5BF9\u8C61\n */\n\nexport const PAYLOAD_COMPONENT_MAP = {\n 'ipc-accordioncards': 'AccordionCards',\n 'ipc-aplusdesc': 'AplusDesc',\n 'ipc-banner': 'HeroBanner',\n 'ipc-brand-equity': 'BrandEquity',\n 'ipc-category': 'Category',\n 'ipc-collection-banner': 'CollectionBanner',\n 'ipc-collection-shelves': 'CollectionShelves',\n 'ipc-creativemodule': 'CreativeModule',\n 'ipc-download': 'DownLoad',\n 'ipc-evaluate': 'Evaluate',\n 'ipc-faq': 'Faq',\n 'ipc-features': 'Features',\n 'ipc-footcharger': 'FootCharger',\n 'ipc-ga-block': 'GraphicAttractionBlock',\n 'ipc-giftbox': 'GiftBox',\n 'ipc-giftshelf': 'GiftShelf',\n 'ipc-graphic': 'Graphic',\n 'ipc-graphicmore': 'GraphicMore',\n 'ipc-graphicoverlay': 'GraphicOverlay',\n 'ipc-marquee': 'Marquee',\n 'ipc-mediaplayerbase': 'MediaPlayerBase',\n 'ipc-mediaplayermulti': 'MediaPlayerMulti',\n 'ipc-mediaplayersticky': 'MediaPlayerSticky',\n 'ipc-member-equity': 'MemberEquity',\n 'ipc-mlg-block': 'MultiLayoutGraphicBlock',\n 'ipc-search-page-tabs': 'SearchPageBlock',\n 'ipc-selectstore': 'SelectStore',\n 'ipc-shelfdisplay': 'ShelfDisplay',\n 'ipc-slogan': 'Slogan',\n 'ipc-spacer': 'Spacer',\n 'ipc-specs': 'Specs',\n 'ipc-tabs': 'TabsBlock',\n 'ipc-text-marquee': 'TextMarquee',\n 'ipc-title': 'Title',\n 'ipc-whychoose': 'WhyChoose',\n 'ipc-product-nav': 'ProductNav',\n 'ipc-brand-card-link': 'BrandCardLink',\n 'ipc-ipredirect': 'IPRedirect',\n ksp: 'Ksp',\n 'ipc-secondary-banner': 'SecondaryBanner',\n /**\n * \u6D3B\u52A8\u8D27\u67B6\n */\n 'ipc-active-shelf': 'ActiveShelf',\n 'ipc-media-shelf': 'MediaShelf',\n /**\n * \u6D3B\u52A8\u4E70\u8D60\u8D27\u67B6\n */\n 'ipc-bogo-shelf': 'BuyOneGetOneShelf',\n 'ipc-media-endorsement': 'MediaEndorsement',\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["default", "MarqueeItem", "MarqueeImageContent", "MarqueeTextContent", "IPC_SEARCH_PAGE", "SearchPageTabType", "withLayout", "IPRedirect", "CreditsProductCard", "SceneProductCard", "MiniCartDialog", "PAYLOAD_COMPONENT_MAP"]
7
7
  }
@@ -5,7 +5,7 @@ declare const countdownVariants: (props?: ({
5
5
  align?: "left" | "center" | null | undefined;
6
6
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
7
  /**
8
- * 时间标签配置接口
8
+ * 时间标签配置接口 (singular keys)
9
9
  */
10
10
  export interface TimeLabels {
11
11
  /** 天的标签 */
@@ -17,6 +17,19 @@ export interface TimeLabels {
17
17
  /** 秒的标签 */
18
18
  second: string;
19
19
  }
20
+ /**
21
+ * 时间标签配置接口 (plural keys, e.g. from Title component)
22
+ */
23
+ export interface PluralTimeLabels {
24
+ days: string;
25
+ hours: string;
26
+ minutes: string;
27
+ seconds: string;
28
+ }
29
+ /**
30
+ * 时间标签输入类型 - 支持 singular 和 plural 键名,所有字段可选
31
+ */
32
+ export type TimeLabelsInput = Partial<TimeLabels & PluralTimeLabels>;
20
33
  /**
21
34
  * 倒计时组件Props接口
22
35
  */
@@ -27,8 +40,8 @@ export interface CountdownProps extends Omit<React.HTMLAttributes<HTMLDivElement
27
40
  endDate_tz?: string;
28
41
  /** 格式化用的locale,默认使用navigator.language */
29
42
  locale?: string;
30
- /** 时间标签配置,用于国际化 */
31
- timeLabels?: TimeLabels;
43
+ /** 时间标签配置,支持 singular (day/hour/minute/second) 和 plural (days/hours/minutes/seconds) 键名 */
44
+ timeLabels?: TimeLabelsInput;
32
45
  /** JSON字符串格式的时间标签(向后兼容) */
33
46
  dateFormat?: string;
34
47
  /** 倒计时结束回调 */
@@ -37,11 +50,21 @@ export interface CountdownProps extends Omit<React.HTMLAttributes<HTMLDivElement
37
50
  separator?: string;
38
51
  /** 隐藏已过期的倒计时,默认为 true */
39
52
  hideWhenExpired?: boolean;
53
+ /** 是否显示天数,默认为 true */
54
+ showDays?: boolean;
55
+ /** 是否显示小时,默认为 true */
56
+ showHours?: boolean;
57
+ /** 是否显示分钟,默认为 true */
58
+ showMinutes?: boolean;
59
+ /** 是否显示秒数,默认为 true */
60
+ showSeconds?: boolean;
61
+ /** 颜色主题 - 覆盖 variant 的颜色部分,保留布局/尺寸。不传则保持 variant 原有颜色 */
62
+ theme?: 'light' | 'dark';
40
63
  }
41
64
  /**
42
65
  * Countdown - 倒计时原子组件
43
66
  *
44
- * @description 用于显示倒计时的组件,支持天、时、分、秒显示,支持多种样式变体和尺寸
67
+ * @description 用于显示倒计时的组件,支持天、时、分、秒显示,支持多种样式变体、主题和单位可见性控制
45
68
  */
46
69
  declare const Countdown: React.ForwardRefExoticComponent<CountdownProps & React.RefAttributes<HTMLDivElement>>;
47
70
  export default Countdown;
@@ -1,2 +1,2 @@
1
- "use client";import{jsx as n,jsxs as o}from"react/jsx-runtime";import A,{useEffect as E,useRef as B,useState as L,useMemo as J}from"react";import{cva as d}from"class-variance-authority";import{cn as i}from"../helpers/index.js";const $=d("countdown-container flex w-full items-center",{variants:{variant:{outline:"gap-1",spacious:"gap-1"},align:{left:"justify-start",center:"justify-center"}},defaultVariants:{variant:"outline",align:"left"}}),u=d("time-block border-box rounded-box-small flex flex-col items-center justify-center overflow-hidden text-center text-xs",{variants:{variant:{outline:"border-info-primary text-info-primary desktop:size-12 desktop:p-1 size-10 border bg-transparent p-[2px]",spacious:"bg-info-white text-info-primary desktop:size-12 desktop:p-1 size-10 p-[2px]"}},defaultVariants:{variant:"outline"}}),m=d("time-number lg-desktop:text-[24px] desktop:leading-[120%] translate-y-[2px] whitespace-nowrap text-center text-[20px] font-bold leading-none"),w=d("separator desktop:text-2xl text-xl font-bold",{variants:{variant:{outline:"text-info-primary",spacious:"text-info-primary"}},defaultVariants:{variant:"outline"}}),p=(a,t=2)=>String(Math.abs(a)).padStart(t,"0"),f=()=>({day:"Day",hour:"Hours",minute:"Mins",second:"Secs"}),q=a=>{try{let t=a?.trim?.();return!t?.startsWith?.("{")||!t?.endsWith?.("}")?f():(t=t?.replace?.(/(\w+)\s*:/g,'"$1":'),{...f(),...JSON.parse(t)})}catch{return f()}},S=A.forwardRef(({className:a,endDate:t,endDate_tz:G,locale:K,timeLabels:x,dateFormat:v,onExpire:h,separator:b=":",hideWhenExpired:R=!0,variant:s,align:z,...C},H)=>{const c=J(()=>x||(v?q(v):f()),[x,v]),r=B(Date.parse(t)),[I,y]=L(()=>{const e=r.current;return isNaN(e)?0:Math.max(0,e-Date.now())}),[N,M]=L(()=>{const e=r.current;return!isNaN(e)&&e<=Date.now()});E(()=>{r.current=Date.parse(t);const e=r.current,l=isNaN(e)?0:Math.max(0,e-Date.now()),g=!isNaN(e)&&e<=Date.now();y(l),M(g)},[t]),E(()=>{if(N||isNaN(r.current))return;let e=!1;const l=()=>{const _=Date.now(),V=Math.max(0,r.current-_);y(V),V<=0&&!e&&(e=!0,M(!0),h?.())};l();const g=window.setInterval(l,1e3);return()=>clearInterval(g)},[h,N,t]);const D=Math.floor(I/1e3),j=D%60,k=Math.floor(D/60),P=k%60,T=Math.floor(k/60),O=T%24,W=Math.floor(T/24);return N&&R?null:o("div",{ref:H,className:i($({variant:s,align:z}),a),role:"timer","aria-live":"polite","aria-label":"countdown timer",...C,children:[o("div",{className:i(u({variant:s}),"time-days-box"),children:[n("div",{className:m(),children:p(W,2)}),n("div",{className:"truncate text-center text-[12px] font-bold",children:c.day})]}),n("div",{className:w({variant:s}),children:b}),o("div",{className:i(u({variant:s}),"time-hours-box"),children:[n("div",{className:m(),children:p(O,2)}),n("div",{className:"truncate text-center text-[12px] font-bold",children:c.hour})]}),n("div",{className:w({variant:s}),children:b}),o("div",{className:i(u({variant:s}),"time-minutes-box"),children:[n("div",{className:m(),children:p(P,2)}),n("div",{className:"truncate text-center text-[12px] font-bold",children:c.minute})]}),n("div",{className:w({variant:s}),children:b}),o("div",{className:i(u({variant:s}),"time-seconds-box"),children:[n("div",{className:m(),children:p(j,2)}),n("div",{className:"truncate text-center text-[12px] font-bold",children:c.second})]})]})});S.displayName="Countdown";var Y=S;export{Y as default};
1
+ "use client";import{jsx as i,jsxs as x}from"react/jsx-runtime";import R,{useEffect as z,useRef as U,useState as $,useMemo as X}from"react";import{cva as c}from"class-variance-authority";import{cn as g}from"../helpers/index.js";const Y=c("countdown-container flex w-full items-center",{variants:{variant:{outline:"gap-1",spacious:"gap-1"},align:{left:"justify-start",center:"justify-center"}},defaultVariants:{variant:"outline",align:"left"}}),Z=c("time-block border-box rounded-box-small flex flex-col items-center justify-center overflow-hidden text-center text-xs",{variants:{variant:{outline:"border-info-primary text-info-primary desktop:size-12 desktop:p-1 size-10 border bg-transparent p-[2px]",spacious:"bg-info-white text-info-primary desktop:size-12 desktop:p-1 size-10 p-[2px]"}},defaultVariants:{variant:"outline"}}),tt=c("time-number lg-desktop:text-[24px] translate-y-[2px] whitespace-nowrap text-center text-[20px] font-bold leading-none"),et=c("separator desktop:text-2xl text-xl font-bold",{variants:{variant:{outline:"text-info-primary",spacious:"text-info-primary"}},defaultVariants:{variant:"outline"}}),nt=t=>t?t==="light"?"bg-info-primary text-info-white border-transparent":"bg-container-secondary text-info-primary border-transparent":"",st=t=>t?"text-info-primary":"",d=(t,e=2)=>String(Math.abs(t)).padStart(e,"0"),j=()=>({day:"Day",hour:"Hours",minute:"Mins",second:"Secs"}),H=t=>{const e=j();return{day:t.day??t.days??e.day,hour:t.hour??t.hours??e.hour,minute:t.minute??t.minutes??e.minute,second:t.second??t.seconds??e.second}},rt=t=>{try{let e=t?.trim?.();return!e?.startsWith?.("{")||!e?.endsWith?.("}")?{}:(e=e?.replace?.(/(\w+)\s*:/g,'"$1":'),JSON.parse(e))}catch{return{}}},B=R.forwardRef(({className:t,endDate:e,endDate_tz:at,locale:ot,timeLabels:p,dateFormat:m,onExpire:h,separator:O=":",hideWhenExpired:W=!0,showDays:v=!0,showHours:y=!0,showMinutes:w=!0,showSeconds:T=!0,variant:f,align:A,theme:N,..._},F)=>{const l=X(()=>p?H(p):m?H(rt(m)):j(),[p,m]),s=U(Date.parse(e)),[J,L]=$(()=>{const n=s.current;return isNaN(n)?0:Math.max(0,n-Date.now())}),[u,M]=$(()=>{const n=s.current;return!isNaN(n)&&n<=Date.now()});z(()=>{s.current=Date.parse(e);const n=s.current,o=isNaN(n)?0:Math.max(0,n-Date.now()),b=!isNaN(n)&&n<=Date.now();L(o),M(b)},[e]),z(()=>{if(u||isNaN(s.current))return;let n=!1;const o=()=>{const Q=Date.now(),P=Math.max(0,s.current-Q);L(P),P<=0&&!n&&(n=!0,M(!0),h?.())};o();const b=window.setInterval(o,1e3);return()=>clearInterval(b)},[h,u,e]);const C=Math.floor(J/1e3),k=C%60,D=Math.floor(C/60),I=D%60,V=Math.floor(D/60),S=V%24,E=Math.floor(V/24),r=[];v&&r.push({value:E,label:l.day,cssClass:"time-days-box"}),y&&r.push({value:S,label:l.hour,cssClass:"time-hours-box"}),w&&r.push({value:I,label:l.minute,cssClass:"time-minutes-box"}),T&&r.push({value:k,label:l.second,cssClass:"time-seconds-box"});const a=[];v&&a.push(`${E} days`),y&&a.push(`${d(S)} hours`),w&&a.push(`${d(I)} minutes`),T&&a.push(`${d(k)} seconds`);const q=a.length>0?`${a.join(" ")} remaining`:"countdown timer";if(u&&W)return i("span",{role:"status","aria-live":"polite",className:"sr-only",children:"Countdown has ended"});const G=nt(N),K=st(N);return x("div",{ref:F,className:g(Y({variant:f,align:A}),t),role:"timer","aria-label":q,..._,children:[r.map((n,o)=>x(R.Fragment,{children:[x("div",{className:g(Z({variant:f}),G,n.cssClass),children:[i("div",{className:tt(),children:d(n.value,2)}),i("div",{className:"truncate text-center text-[12px] font-bold",children:n.label})]}),o<r.length-1&&i("div",{className:g(et({variant:f}),K),children:O})]},n.cssClass)),u&&i("span",{role:"status","aria-live":"polite",className:"sr-only",children:"Countdown has ended"})]})});B.displayName="Countdown";var ct=B;export{ct as default};
2
2
  //# sourceMappingURL=Countdown.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/components/Countdown.tsx"],
4
- "sourcesContent": ["'use client'\n\nimport React, { useEffect, useRef, useState, useMemo } from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../helpers/index.js'\n\n// \u5B9A\u4E49\u6837\u5F0F\u53D8\u4F53\nconst countdownVariants = cva(\n // \u57FA\u7840\u6837\u5F0F\uFF1A\u5012\u8BA1\u65F6\u5BB9\u5668\n 'countdown-container flex w-full items-center',\n {\n variants: {\n variant: {\n outline: 'gap-1',\n spacious: 'gap-1',\n },\n align: {\n left: 'justify-start',\n center: 'justify-center',\n },\n },\n defaultVariants: {\n variant: 'outline',\n align: 'left',\n },\n }\n)\n\nconst timeBlockVariants = cva(\n // \u57FA\u7840\u6837\u5F0F\uFF1A\u65F6\u95F4\u5757\n 'time-block border-box rounded-box-small flex flex-col items-center justify-center overflow-hidden text-center text-xs',\n {\n variants: {\n variant: {\n outline:\n 'border-info-primary text-info-primary desktop:size-12 desktop:p-1 size-10 border bg-transparent p-[2px]',\n spacious: 'bg-info-white text-info-primary desktop:size-12 desktop:p-1 size-10 p-[2px]',\n },\n },\n defaultVariants: {\n variant: 'outline',\n },\n }\n)\n\nconst timeNumberVariants = cva(\n 'time-number lg-desktop:text-[24px] desktop:leading-[120%] translate-y-[2px] whitespace-nowrap text-center text-[20px] font-bold leading-none'\n)\n\nconst separatorVariants = cva(\n // \u57FA\u7840\u6837\u5F0F\uFF1A\u5206\u9694\u7B26\n 'separator desktop:text-2xl text-xl font-bold',\n {\n variants: {\n variant: {\n outline: 'text-info-primary',\n spacious: 'text-info-primary',\n },\n },\n defaultVariants: {\n variant: 'outline',\n },\n }\n)\n\n/**\n * \u65F6\u95F4\u6807\u7B7E\u914D\u7F6E\u63A5\u53E3\n */\nexport interface TimeLabels {\n /** \u5929\u7684\u6807\u7B7E */\n day: string\n /** \u5C0F\u65F6\u7684\u6807\u7B7E */\n hour: string\n /** \u5206\u949F\u7684\u6807\u7B7E */\n minute: string\n /** \u79D2\u7684\u6807\u7B7E */\n second: string\n}\n\n/**\n * \u5012\u8BA1\u65F6\u7EC4\u4EF6Props\u63A5\u53E3\n */\nexport interface CountdownProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onExpire'>, VariantProps<typeof countdownVariants> {\n /** \u7ED3\u675F\u65F6\u95F4 - ISO\u683C\u5F0F\u5B57\u7B26\u4E32 */\n endDate: string\n /** \u7ED3\u675F\u65F6\u95F4\u65F6\u533A\uFF0C\u5982: America/Los_Angeles */\n endDate_tz?: string\n /** \u683C\u5F0F\u5316\u7528\u7684locale\uFF0C\u9ED8\u8BA4\u4F7F\u7528navigator.language */\n locale?: string\n /** \u65F6\u95F4\u6807\u7B7E\u914D\u7F6E\uFF0C\u7528\u4E8E\u56FD\u9645\u5316 */\n timeLabels?: TimeLabels\n /** JSON\u5B57\u7B26\u4E32\u683C\u5F0F\u7684\u65F6\u95F4\u6807\u7B7E\uFF08\u5411\u540E\u517C\u5BB9\uFF09 */\n dateFormat?: string\n /** \u5012\u8BA1\u65F6\u7ED3\u675F\u56DE\u8C03 */\n onExpire?: () => void\n /** \u5206\u9694\u7B26\u5B57\u7B26\uFF0C\u9ED8\u8BA4\u4E3A ':' */\n separator?: string\n /** \u9690\u85CF\u5DF2\u8FC7\u671F\u7684\u5012\u8BA1\u65F6\uFF0C\u9ED8\u8BA4\u4E3A true */\n hideWhenExpired?: boolean\n}\n\n/**\n * \u6570\u5B57\u8865\u96F6\u51FD\u6570\n */\nconst pad = (n: number, len = 2) => String(Math.abs(n)).padStart(len, '0')\n\n/**\n * \u9ED8\u8BA4\u65F6\u95F4\u6807\u7B7E\n */\nconst getDefaultTimeLabels = (): TimeLabels => ({\n day: 'Day',\n hour: 'Hours',\n minute: 'Mins',\n second: 'Secs',\n})\n\n/**\n * \u89E3\u6790dateFormat JSON\u5B57\u7B26\u4E32\uFF08\u5411\u540E\u517C\u5BB9\uFF09\n */\nconst safeStringToObject = (str: string): TimeLabels => {\n try {\n let jsonStr = str?.trim?.()\n if (!jsonStr?.startsWith?.('{') || !jsonStr?.endsWith?.('}')) {\n return getDefaultTimeLabels()\n }\n jsonStr = jsonStr?.replace?.(/(\\w+)\\s*:/g, '\"$1\":')\n return { ...getDefaultTimeLabels(), ...JSON.parse(jsonStr) }\n } catch (err) {\n return getDefaultTimeLabels()\n }\n}\n\n/**\n * Countdown - \u5012\u8BA1\u65F6\u539F\u5B50\u7EC4\u4EF6\n *\n * @description \u7528\u4E8E\u663E\u793A\u5012\u8BA1\u65F6\u7684\u7EC4\u4EF6\uFF0C\u652F\u6301\u5929\u3001\u65F6\u3001\u5206\u3001\u79D2\u663E\u793A\uFF0C\u652F\u6301\u591A\u79CD\u6837\u5F0F\u53D8\u4F53\u548C\u5C3A\u5BF8\n */\nconst Countdown = React.forwardRef<HTMLDivElement, CountdownProps>(\n (\n {\n className,\n endDate,\n endDate_tz,\n locale,\n timeLabels,\n dateFormat,\n onExpire,\n separator = ':',\n hideWhenExpired = true,\n variant,\n align,\n ...props\n },\n ref\n ) => {\n // \u786E\u5B9A\u6700\u7EC8\u4F7F\u7528\u7684\u65F6\u95F4\u6807\u7B7E\n const finalTimeLabels = useMemo(() => {\n if (timeLabels) return timeLabels\n if (dateFormat) return safeStringToObject(dateFormat)\n return getDefaultTimeLabels()\n }, [timeLabels, dateFormat])\n\n // \u89E3\u6790\u76EE\u6807\u65F6\u95F4\n const targetMsRef = useRef<number>(Date.parse(endDate))\n const [remainingMs, setRemainingMs] = useState<number>(() => {\n const t = targetMsRef.current\n return isNaN(t) ? 0 : Math.max(0, t - Date.now())\n })\n\n // \u5224\u65AD\u662F\u5426\u5DF2\u8FC7\u671F\n const [isExpired, setIsExpired] = useState<boolean>(() => {\n const t = targetMsRef.current\n return !isNaN(t) && t <= Date.now()\n })\n\n // \u5F53endDate\u6539\u53D8\u65F6\u66F4\u65B0\u76EE\u6807\u65F6\u95F4\n useEffect(() => {\n targetMsRef.current = Date.parse(endDate)\n const t = targetMsRef.current\n const newRemaining = isNaN(t) ? 0 : Math.max(0, t - Date.now())\n const newIsExpired = !isNaN(t) && t <= Date.now()\n\n setRemainingMs(newRemaining)\n setIsExpired(newIsExpired)\n }, [endDate])\n\n // \u542F\u52A8\u5012\u8BA1\u65F6\u5B9A\u65F6\u5668\n useEffect(() => {\n if (isExpired) return // \u5DF2\u8FC7\u671F\u5219\u4E0D\u542F\u52A8\n if (isNaN(targetMsRef.current)) return // \u65E0\u6548\u65E5\u671F\u4E0D\u542F\u52A8\n\n let expiredCalled = false\n const tick = () => {\n const now = Date.now()\n const remaining = Math.max(0, targetMsRef.current - now)\n setRemainingMs(remaining)\n\n if (remaining <= 0 && !expiredCalled) {\n expiredCalled = true\n setIsExpired(true)\n onExpire?.()\n }\n }\n\n tick() // \u7ACB\u5373\u6267\u884C\u4E00\u6B21\n const intervalId = window.setInterval(tick, 1000)\n\n return () => clearInterval(intervalId)\n }, [onExpire, isExpired, endDate])\n\n // \u8BA1\u7B97\u65F6\u95F4\u5355\u4F4D\n const totalSeconds = Math.floor(remainingMs / 1000)\n const seconds = totalSeconds % 60\n const totalMinutes = Math.floor(totalSeconds / 60)\n const minutes = totalMinutes % 60\n const totalHours = Math.floor(totalMinutes / 60)\n const hours = totalHours % 24\n const days = Math.floor(totalHours / 24)\n\n // \u5982\u679C\u5DF2\u8FC7\u671F\u4E14\u9700\u8981\u9690\u85CF\uFF0C\u5219\u8FD4\u56DEnull\n if (isExpired && hideWhenExpired) {\n return null\n }\n\n return (\n <div\n ref={ref}\n className={cn(countdownVariants({ variant, align }), className)}\n role=\"timer\"\n aria-live=\"polite\"\n aria-label=\"countdown timer\"\n {...props}\n >\n {/* \u5929 */}\n <div className={cn(timeBlockVariants({ variant }), 'time-days-box')}>\n <div className={timeNumberVariants()}>{pad(days, 2)}</div>\n <div className=\"truncate text-center text-[12px] font-bold\">{finalTimeLabels.day}</div>\n </div>\n\n <div className={separatorVariants({ variant })}>{separator}</div>\n\n {/* \u65F6 */}\n <div className={cn(timeBlockVariants({ variant }), 'time-hours-box')}>\n <div className={timeNumberVariants()}>{pad(hours, 2)}</div>\n <div className=\"truncate text-center text-[12px] font-bold\">{finalTimeLabels.hour}</div>\n </div>\n\n <div className={separatorVariants({ variant })}>{separator}</div>\n\n {/* \u5206 */}\n <div className={cn(timeBlockVariants({ variant }), 'time-minutes-box')}>\n <div className={timeNumberVariants()}>{pad(minutes, 2)}</div>\n <div className=\"truncate text-center text-[12px] font-bold\">{finalTimeLabels.minute}</div>\n </div>\n\n <div className={separatorVariants({ variant })}>{separator}</div>\n\n {/* \u79D2 */}\n <div className={cn(timeBlockVariants({ variant }), 'time-seconds-box')}>\n <div className={timeNumberVariants()}>{pad(seconds, 2)}</div>\n <div className=\"truncate text-center text-[12px] font-bold\">{finalTimeLabels.second}</div>\n </div>\n </div>\n )\n }\n)\n\nCountdown.displayName = 'Countdown'\n\nexport default Countdown\n"],
5
- "mappings": "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",
6
- "names": ["jsx", "jsxs", "React", "useEffect", "useRef", "useState", "useMemo", "cva", "cn", "countdownVariants", "timeBlockVariants", "timeNumberVariants", "separatorVariants", "pad", "n", "len", "getDefaultTimeLabels", "safeStringToObject", "str", "jsonStr", "Countdown", "className", "endDate", "endDate_tz", "locale", "timeLabels", "dateFormat", "onExpire", "separator", "hideWhenExpired", "variant", "align", "props", "ref", "finalTimeLabels", "targetMsRef", "remainingMs", "setRemainingMs", "t", "isExpired", "setIsExpired", "newRemaining", "newIsExpired", "expiredCalled", "tick", "now", "remaining", "intervalId", "totalSeconds", "seconds", "totalMinutes", "minutes", "totalHours", "hours", "days", "Countdown_default"]
4
+ "sourcesContent": ["'use client'\n\nimport React, { useEffect, useRef, useState, useMemo } from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../helpers/index.js'\n\n// \u5B9A\u4E49\u6837\u5F0F\u53D8\u4F53\nconst countdownVariants = cva(\n // \u57FA\u7840\u6837\u5F0F\uFF1A\u5012\u8BA1\u65F6\u5BB9\u5668\n 'countdown-container flex w-full items-center',\n {\n variants: {\n variant: {\n outline: 'gap-1',\n spacious: 'gap-1',\n },\n align: {\n left: 'justify-start',\n center: 'justify-center',\n },\n },\n defaultVariants: {\n variant: 'outline',\n align: 'left',\n },\n }\n)\n\nconst timeBlockVariants = cva(\n // \u57FA\u7840\u6837\u5F0F\uFF1A\u65F6\u95F4\u5757\n 'time-block border-box rounded-box-small flex flex-col items-center justify-center overflow-hidden text-center text-xs',\n {\n variants: {\n variant: {\n outline:\n 'border-info-primary text-info-primary desktop:size-12 desktop:p-1 size-10 border bg-transparent p-[2px]',\n spacious: 'bg-info-white text-info-primary desktop:size-12 desktop:p-1 size-10 p-[2px]',\n },\n },\n defaultVariants: {\n variant: 'outline',\n },\n }\n)\n\nconst timeNumberVariants = cva(\n 'time-number lg-desktop:text-[24px] translate-y-[2px] whitespace-nowrap text-center text-[20px] font-bold leading-none'\n)\n\nconst separatorVariants = cva(\n // \u57FA\u7840\u6837\u5F0F\uFF1A\u5206\u9694\u7B26\n 'separator desktop:text-2xl text-xl font-bold',\n {\n variants: {\n variant: {\n outline: 'text-info-primary',\n spacious: 'text-info-primary',\n },\n },\n defaultVariants: {\n variant: 'outline',\n },\n }\n)\n\n/**\n * \u4E3B\u9898\u8272\u8986\u76D6\u7C7B - \u4EC5\u5F53 theme \u4F20\u5165\u65F6\u8986\u76D6 variant \u7684\u989C\u8272\u90E8\u5206\uFF0C\u4FDD\u7559\u5E03\u5C40/\u5C3A\u5BF8\n */\nconst getTimeBlockThemeClasses = (theme?: 'light' | 'dark'): string => {\n if (!theme) return ''\n return theme === 'light'\n ? 'bg-info-primary text-info-white border-transparent'\n : 'bg-container-secondary text-info-primary border-transparent'\n}\n\nconst getSeparatorThemeClasses = (theme?: 'light' | 'dark'): string => {\n if (!theme) return ''\n return 'text-info-primary'\n}\n\n/**\n * \u65F6\u95F4\u6807\u7B7E\u914D\u7F6E\u63A5\u53E3 (singular keys)\n */\nexport interface TimeLabels {\n /** \u5929\u7684\u6807\u7B7E */\n day: string\n /** \u5C0F\u65F6\u7684\u6807\u7B7E */\n hour: string\n /** \u5206\u949F\u7684\u6807\u7B7E */\n minute: string\n /** \u79D2\u7684\u6807\u7B7E */\n second: string\n}\n\n/**\n * \u65F6\u95F4\u6807\u7B7E\u914D\u7F6E\u63A5\u53E3 (plural keys, e.g. from Title component)\n */\nexport interface PluralTimeLabels {\n days: string\n hours: string\n minutes: string\n seconds: string\n}\n\n/**\n * \u65F6\u95F4\u6807\u7B7E\u8F93\u5165\u7C7B\u578B - \u652F\u6301 singular \u548C plural \u952E\u540D\uFF0C\u6240\u6709\u5B57\u6BB5\u53EF\u9009\n */\nexport type TimeLabelsInput = Partial<TimeLabels & PluralTimeLabels>\n\n/**\n * \u5012\u8BA1\u65F6\u7EC4\u4EF6Props\u63A5\u53E3\n */\nexport interface CountdownProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onExpire'>, VariantProps<typeof countdownVariants> {\n /** \u7ED3\u675F\u65F6\u95F4 - ISO\u683C\u5F0F\u5B57\u7B26\u4E32 */\n endDate: string\n /** \u7ED3\u675F\u65F6\u95F4\u65F6\u533A\uFF0C\u5982: America/Los_Angeles */\n endDate_tz?: string\n /** \u683C\u5F0F\u5316\u7528\u7684locale\uFF0C\u9ED8\u8BA4\u4F7F\u7528navigator.language */\n locale?: string\n /** \u65F6\u95F4\u6807\u7B7E\u914D\u7F6E\uFF0C\u652F\u6301 singular (day/hour/minute/second) \u548C plural (days/hours/minutes/seconds) \u952E\u540D */\n timeLabels?: TimeLabelsInput\n /** JSON\u5B57\u7B26\u4E32\u683C\u5F0F\u7684\u65F6\u95F4\u6807\u7B7E\uFF08\u5411\u540E\u517C\u5BB9\uFF09 */\n dateFormat?: string\n /** \u5012\u8BA1\u65F6\u7ED3\u675F\u56DE\u8C03 */\n onExpire?: () => void\n /** \u5206\u9694\u7B26\u5B57\u7B26\uFF0C\u9ED8\u8BA4\u4E3A ':' */\n separator?: string\n /** \u9690\u85CF\u5DF2\u8FC7\u671F\u7684\u5012\u8BA1\u65F6\uFF0C\u9ED8\u8BA4\u4E3A true */\n hideWhenExpired?: boolean\n /** \u662F\u5426\u663E\u793A\u5929\u6570\uFF0C\u9ED8\u8BA4\u4E3A true */\n showDays?: boolean\n /** \u662F\u5426\u663E\u793A\u5C0F\u65F6\uFF0C\u9ED8\u8BA4\u4E3A true */\n showHours?: boolean\n /** \u662F\u5426\u663E\u793A\u5206\u949F\uFF0C\u9ED8\u8BA4\u4E3A true */\n showMinutes?: boolean\n /** \u662F\u5426\u663E\u793A\u79D2\u6570\uFF0C\u9ED8\u8BA4\u4E3A true */\n showSeconds?: boolean\n /** \u989C\u8272\u4E3B\u9898 - \u8986\u76D6 variant \u7684\u989C\u8272\u90E8\u5206\uFF0C\u4FDD\u7559\u5E03\u5C40/\u5C3A\u5BF8\u3002\u4E0D\u4F20\u5219\u4FDD\u6301 variant \u539F\u6709\u989C\u8272 */\n theme?: 'light' | 'dark'\n}\n\n/**\n * \u6570\u5B57\u8865\u96F6\u51FD\u6570\n */\nconst pad = (n: number, len = 2) => String(Math.abs(n)).padStart(len, '0')\n\n/**\n * \u9ED8\u8BA4\u65F6\u95F4\u6807\u7B7E\n */\nconst getDefaultTimeLabels = (): TimeLabels => ({\n day: 'Day',\n hour: 'Hours',\n minute: 'Mins',\n second: 'Secs',\n})\n\n/**\n * \u5C06 plural/singular \u6DF7\u5408\u6807\u7B7E\u89C4\u8303\u5316\u4E3A singular \u683C\u5F0F\n * singular \u952E\u4F18\u5148\u4E8E plural \u952E\uFF0C\u7F3A\u5931\u65F6\u4F7F\u7528\u9ED8\u8BA4\u503C\n */\nconst resolveTimeLabels = (labels: TimeLabelsInput): TimeLabels => {\n const defaults = getDefaultTimeLabels()\n return {\n day: labels.day ?? labels.days ?? defaults.day,\n hour: labels.hour ?? labels.hours ?? defaults.hour,\n minute: labels.minute ?? labels.minutes ?? defaults.minute,\n second: labels.second ?? labels.seconds ?? defaults.second,\n }\n}\n\n/**\n * \u89E3\u6790dateFormat JSON\u5B57\u7B26\u4E32\uFF08\u5411\u540E\u517C\u5BB9\uFF09\n */\nconst safeStringToObject = (str: string): TimeLabelsInput => {\n try {\n let jsonStr = str?.trim?.()\n if (!jsonStr?.startsWith?.('{') || !jsonStr?.endsWith?.('}')) {\n return {}\n }\n jsonStr = jsonStr?.replace?.(/(\\w+)\\s*:/g, '\"$1\":')\n return JSON.parse(jsonStr) as TimeLabelsInput\n } catch (err) {\n return {}\n }\n}\n\n/**\n * Countdown - \u5012\u8BA1\u65F6\u539F\u5B50\u7EC4\u4EF6\n *\n * @description \u7528\u4E8E\u663E\u793A\u5012\u8BA1\u65F6\u7684\u7EC4\u4EF6\uFF0C\u652F\u6301\u5929\u3001\u65F6\u3001\u5206\u3001\u79D2\u663E\u793A\uFF0C\u652F\u6301\u591A\u79CD\u6837\u5F0F\u53D8\u4F53\u3001\u4E3B\u9898\u548C\u5355\u4F4D\u53EF\u89C1\u6027\u63A7\u5236\n */\nconst Countdown = React.forwardRef<HTMLDivElement, CountdownProps>(\n (\n {\n className,\n endDate,\n endDate_tz,\n locale,\n timeLabels,\n dateFormat,\n onExpire,\n separator = ':',\n hideWhenExpired = true,\n showDays = true,\n showHours = true,\n showMinutes = true,\n showSeconds = true,\n variant,\n align,\n theme,\n ...props\n },\n ref\n ) => {\n // \u786E\u5B9A\u6700\u7EC8\u4F7F\u7528\u7684\u65F6\u95F4\u6807\u7B7E (\u652F\u6301 plural \u548C singular \u952E)\n const finalTimeLabels = useMemo(() => {\n if (timeLabels) return resolveTimeLabels(timeLabels)\n if (dateFormat) return resolveTimeLabels(safeStringToObject(dateFormat))\n return getDefaultTimeLabels()\n }, [timeLabels, dateFormat])\n\n // \u89E3\u6790\u76EE\u6807\u65F6\u95F4\n const targetMsRef = useRef<number>(Date.parse(endDate))\n const [remainingMs, setRemainingMs] = useState<number>(() => {\n const t = targetMsRef.current\n return isNaN(t) ? 0 : Math.max(0, t - Date.now())\n })\n\n // \u5224\u65AD\u662F\u5426\u5DF2\u8FC7\u671F\n const [isExpired, setIsExpired] = useState<boolean>(() => {\n const t = targetMsRef.current\n return !isNaN(t) && t <= Date.now()\n })\n\n // \u5F53endDate\u6539\u53D8\u65F6\u66F4\u65B0\u76EE\u6807\u65F6\u95F4\n useEffect(() => {\n targetMsRef.current = Date.parse(endDate)\n const t = targetMsRef.current\n const newRemaining = isNaN(t) ? 0 : Math.max(0, t - Date.now())\n const newIsExpired = !isNaN(t) && t <= Date.now()\n\n setRemainingMs(newRemaining)\n setIsExpired(newIsExpired)\n }, [endDate])\n\n // \u542F\u52A8\u5012\u8BA1\u65F6\u5B9A\u65F6\u5668\n useEffect(() => {\n if (isExpired) return // \u5DF2\u8FC7\u671F\u5219\u4E0D\u542F\u52A8\n if (isNaN(targetMsRef.current)) return // \u65E0\u6548\u65E5\u671F\u4E0D\u542F\u52A8\n\n let expiredCalled = false\n const tick = () => {\n const now = Date.now()\n const remaining = Math.max(0, targetMsRef.current - now)\n setRemainingMs(remaining)\n\n if (remaining <= 0 && !expiredCalled) {\n expiredCalled = true\n setIsExpired(true)\n onExpire?.()\n }\n }\n\n tick() // \u7ACB\u5373\u6267\u884C\u4E00\u6B21\n const intervalId = window.setInterval(tick, 1000)\n\n return () => clearInterval(intervalId)\n }, [onExpire, isExpired, endDate])\n\n // \u8BA1\u7B97\u65F6\u95F4\u5355\u4F4D\n const totalSeconds = Math.floor(remainingMs / 1000)\n const seconds = totalSeconds % 60\n const totalMinutes = Math.floor(totalSeconds / 60)\n const minutes = totalMinutes % 60\n const totalHours = Math.floor(totalMinutes / 60)\n const hours = totalHours % 24\n const days = Math.floor(totalHours / 24)\n\n // \u6784\u5EFA\u53EF\u89C1\u7684\u65F6\u95F4\u5355\u4F4D\u6570\u7EC4\n const units: Array<{ value: number; label: string; cssClass: string }> = []\n if (showDays) units.push({ value: days, label: finalTimeLabels.day, cssClass: 'time-days-box' })\n if (showHours) units.push({ value: hours, label: finalTimeLabels.hour, cssClass: 'time-hours-box' })\n if (showMinutes) units.push({ value: minutes, label: finalTimeLabels.minute, cssClass: 'time-minutes-box' })\n if (showSeconds) units.push({ value: seconds, label: finalTimeLabels.second, cssClass: 'time-seconds-box' })\n\n // \u6784\u5EFA\u52A8\u6001 aria-label\n const ariaLabelParts: string[] = []\n if (showDays) ariaLabelParts.push(`${days} days`)\n if (showHours) ariaLabelParts.push(`${pad(hours)} hours`)\n if (showMinutes) ariaLabelParts.push(`${pad(minutes)} minutes`)\n if (showSeconds) ariaLabelParts.push(`${pad(seconds)} seconds`)\n const ariaLabel = ariaLabelParts.length > 0 ? `${ariaLabelParts.join(' ')} remaining` : 'countdown timer'\n\n // \u5982\u679C\u5DF2\u8FC7\u671F\u4E14\u9700\u8981\u9690\u85CF\uFF0C\u4EC5\u4FDD\u7559 screen reader \u901A\u77E5\n if (isExpired && hideWhenExpired) {\n return (\n <span role=\"status\" aria-live=\"polite\" className=\"sr-only\">\n Countdown has ended\n </span>\n )\n }\n\n const timeBlockTheme = getTimeBlockThemeClasses(theme)\n const separatorTheme = getSeparatorThemeClasses(theme)\n\n return (\n <div\n ref={ref}\n className={cn(countdownVariants({ variant, align }), className)}\n role=\"timer\"\n aria-label={ariaLabel}\n {...props}\n >\n {units.map((unit, index) => (\n <React.Fragment key={unit.cssClass}>\n <div className={cn(timeBlockVariants({ variant }), timeBlockTheme, unit.cssClass)}>\n <div className={timeNumberVariants()}>{pad(unit.value, 2)}</div>\n <div className=\"truncate text-center text-[12px] font-bold\">{unit.label}</div>\n </div>\n {index < units.length - 1 && (\n <div className={cn(separatorVariants({ variant }), separatorTheme)}>{separator}</div>\n )}\n </React.Fragment>\n ))}\n {/* Visually hidden status for screen readers - announces only on expiry */}\n {isExpired && (\n <span role=\"status\" aria-live=\"polite\" className=\"sr-only\">\n Countdown has ended\n </span>\n )}\n </div>\n )\n }\n)\n\nCountdown.displayName = 'Countdown'\n\nexport default Countdown\n"],
5
+ "mappings": "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",
6
+ "names": ["jsx", "jsxs", "React", "useEffect", "useRef", "useState", "useMemo", "cva", "cn", "countdownVariants", "timeBlockVariants", "timeNumberVariants", "separatorVariants", "getTimeBlockThemeClasses", "theme", "getSeparatorThemeClasses", "pad", "n", "len", "getDefaultTimeLabels", "resolveTimeLabels", "labels", "defaults", "safeStringToObject", "str", "jsonStr", "Countdown", "className", "endDate", "endDate_tz", "locale", "timeLabels", "dateFormat", "onExpire", "separator", "hideWhenExpired", "showDays", "showHours", "showMinutes", "showSeconds", "variant", "align", "props", "ref", "finalTimeLabels", "targetMsRef", "remainingMs", "setRemainingMs", "t", "isExpired", "setIsExpired", "newRemaining", "newIsExpired", "expiredCalled", "tick", "now", "remaining", "intervalId", "totalSeconds", "seconds", "totalMinutes", "minutes", "totalHours", "hours", "days", "units", "ariaLabelParts", "ariaLabel", "timeBlockTheme", "separatorTheme", "unit", "index", "Countdown_default"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{useEffect as g,useState as f}from"react";const l=({endTime:s=""})=>{const[o,r]=f({days:"00",hours:"00",minutes:"00",seconds:"00"});return g(()=>{const n=e=>(e<0?0:Math.floor(e)).toString().padStart(2,"0"),c=new Date(s).getTime(),i=setInterval(()=>{const e=new Date().getTime(),t=c-e,u=n(t/(1e3*60*60*24)),a=n(t%(1e3*60*60*24)/(1e3*60*60)),m=n(t%(1e3*60*60)/(1e3*60)),d=n(t%(1e3*60)/1e3);r({days:u,hours:a,minutes:m,seconds:d})},1e3);return()=>clearInterval(i)},[s]),o};var D=l;export{D as default};
1
+ import{useEffect as l,useState as h}from"react";const w=({endTime:t=""})=>{const[o,r]=h({days:"00",hours:"00",minutes:"00",seconds:"00"});return l(()=>{const s=e=>(e<0?0:Math.floor(e)).toString().padStart(2,"0"),c=/Z$|[+-]\d{2}:?\d{2}$/.test(t),i=t&&!c?`${t}Z`:t,a=new Date(i).getTime(),u=setInterval(()=>{const e=new Date().getTime(),n=a-e,m=s(n/(1e3*60*60*24)),d=s(n%(1e3*60*60*24)/(1e3*60*60)),g=s(n%(1e3*60*60)/(1e3*60)),f=s(n%(1e3*60)/1e3);r({days:m,hours:d,minutes:g,seconds:f})},1e3);return()=>clearInterval(u)},[t]),o};var T=w;export{T as default};
2
2
  //# sourceMappingURL=useCountDown.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/hooks/useCountDown.ts"],
4
- "sourcesContent": ["import { useEffect, useState } from 'react'\n\ninterface Time {\n days: string\n hours: string\n minutes: string\n seconds: string\n}\n\nconst useCountDown = ({ endTime = '' }: { endTime?: string }) => {\n const [time, setTime] = useState<Time>({\n days: '00',\n hours: '00',\n minutes: '00',\n seconds: '00',\n })\n\n useEffect(() => {\n const format = (date: number) => {\n const number = date < 0 ? 0 : Math.floor(date)\n return number.toString().padStart(2, '0')\n }\n\n const countDownDate = new Date(endTime).getTime()\n\n const timer = setInterval(() => {\n const now = new Date().getTime()\n const distance = countDownDate - now\n\n const days = format(distance / (1000 * 60 * 60 * 24))\n const hours = format((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60))\n const minutes = format((distance % (1000 * 60 * 60)) / (1000 * 60))\n const seconds = format((distance % (1000 * 60)) / 1000)\n\n setTime({\n days,\n hours,\n minutes,\n seconds,\n })\n }, 1000)\n\n return () => clearInterval(timer)\n }, [endTime])\n\n return time\n}\n\nexport default useCountDown\n"],
5
- "mappings": "AAAA,OAAS,aAAAA,EAAW,YAAAC,MAAgB,QASpC,MAAMC,EAAe,CAAC,CAAE,QAAAC,EAAU,EAAG,IAA4B,CAC/D,KAAM,CAACC,EAAMC,CAAO,EAAIJ,EAAe,CACrC,KAAM,KACN,MAAO,KACP,QAAS,KACT,QAAS,IACX,CAAC,EAED,OAAAD,EAAU,IAAM,CACd,MAAMM,EAAUC,IACCA,EAAO,EAAI,EAAI,KAAK,MAAMA,CAAI,GAC/B,SAAS,EAAE,SAAS,EAAG,GAAG,EAGpCC,EAAgB,IAAI,KAAKL,CAAO,EAAE,QAAQ,EAE1CM,EAAQ,YAAY,IAAM,CAC9B,MAAMC,EAAM,IAAI,KAAK,EAAE,QAAQ,EACzBC,EAAWH,EAAgBE,EAE3BE,EAAON,EAAOK,GAAY,IAAO,GAAK,GAAK,GAAG,EAC9CE,EAAQP,EAAQK,GAAY,IAAO,GAAK,GAAK,KAAQ,IAAO,GAAK,GAAG,EACpEG,EAAUR,EAAQK,GAAY,IAAO,GAAK,KAAQ,IAAO,GAAG,EAC5DI,EAAUT,EAAQK,GAAY,IAAO,IAAO,GAAI,EAEtDN,EAAQ,CACN,KAAAO,EACA,MAAAC,EACA,QAAAC,EACA,QAAAC,CACF,CAAC,CACH,EAAG,GAAI,EAEP,MAAO,IAAM,cAAcN,CAAK,CAClC,EAAG,CAACN,CAAO,CAAC,EAELC,CACT,EAEA,IAAOY,EAAQd",
6
- "names": ["useEffect", "useState", "useCountDown", "endTime", "time", "setTime", "format", "date", "countDownDate", "timer", "now", "distance", "days", "hours", "minutes", "seconds", "useCountDown_default"]
4
+ "sourcesContent": ["import { useEffect, useState } from 'react'\n\ninterface Time {\n days: string\n hours: string\n minutes: string\n seconds: string\n}\n\nconst useCountDown = ({ endTime = '' }: { endTime?: string }) => {\n const [time, setTime] = useState<Time>({\n days: '00',\n hours: '00',\n minutes: '00',\n seconds: '00',\n })\n\n useEffect(() => {\n const format = (date: number) => {\n const number = date < 0 ? 0 : Math.floor(date)\n return number.toString().padStart(2, '0')\n }\n\n // \u786E\u4FDD ISO \u683C\u5F0F\u5B57\u7B26\u4E32\u4EE5 UTC \u65B9\u5F0F\u89E3\u6790\uFF08\u4E0E Banner \u7684 CountdownByEndDate \u884C\u4E3A\u4E00\u81F4\uFF09\n // \u65E0\u65F6\u533A\u4FE1\u606F\u7684 ISO \u5B57\u7B26\u4E32\uFF08\u5982 \"2025-12-31T23:59:59\"\uFF09\u9ED8\u8BA4\u6309\u672C\u5730\u65F6\u533A\u89E3\u6790\uFF0C\u4F1A\u5BFC\u81F4\u65F6\u533A\u654F\u611F\n // \u6DFB\u52A0 Z \u540E\u7F00\u5F3A\u5236\u6309 UTC \u89E3\u6790\uFF0C\u5DF2\u6709\u65F6\u533A\u4FE1\u606F\uFF08Z\u3001+08:00 \u7B49\uFF09\u7684\u5B57\u7B26\u4E32\u4E0D\u53D7\u5F71\u54CD\n const hasTimezone = /Z$|[+-]\\d{2}:?\\d{2}$/.test(endTime)\n const normalizedEndTime = endTime && !hasTimezone ? `${endTime}Z` : endTime\n const countDownDate = new Date(normalizedEndTime).getTime()\n\n const timer = setInterval(() => {\n const now = new Date().getTime()\n const distance = countDownDate - now\n\n const days = format(distance / (1000 * 60 * 60 * 24))\n const hours = format((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60))\n const minutes = format((distance % (1000 * 60 * 60)) / (1000 * 60))\n const seconds = format((distance % (1000 * 60)) / 1000)\n\n setTime({\n days,\n hours,\n minutes,\n seconds,\n })\n }, 1000)\n\n return () => clearInterval(timer)\n }, [endTime])\n\n return time\n}\n\nexport default useCountDown\n"],
5
+ "mappings": "AAAA,OAAS,aAAAA,EAAW,YAAAC,MAAgB,QASpC,MAAMC,EAAe,CAAC,CAAE,QAAAC,EAAU,EAAG,IAA4B,CAC/D,KAAM,CAACC,EAAMC,CAAO,EAAIJ,EAAe,CACrC,KAAM,KACN,MAAO,KACP,QAAS,KACT,QAAS,IACX,CAAC,EAED,OAAAD,EAAU,IAAM,CACd,MAAMM,EAAUC,IACCA,EAAO,EAAI,EAAI,KAAK,MAAMA,CAAI,GAC/B,SAAS,EAAE,SAAS,EAAG,GAAG,EAMpCC,EAAc,uBAAuB,KAAKL,CAAO,EACjDM,EAAoBN,GAAW,CAACK,EAAc,GAAGL,CAAO,IAAMA,EAC9DO,EAAgB,IAAI,KAAKD,CAAiB,EAAE,QAAQ,EAEpDE,EAAQ,YAAY,IAAM,CAC9B,MAAMC,EAAM,IAAI,KAAK,EAAE,QAAQ,EACzBC,EAAWH,EAAgBE,EAE3BE,EAAOR,EAAOO,GAAY,IAAO,GAAK,GAAK,GAAG,EAC9CE,EAAQT,EAAQO,GAAY,IAAO,GAAK,GAAK,KAAQ,IAAO,GAAK,GAAG,EACpEG,EAAUV,EAAQO,GAAY,IAAO,GAAK,KAAQ,IAAO,GAAG,EAC5DI,EAAUX,EAAQO,GAAY,IAAO,IAAO,GAAI,EAEtDR,EAAQ,CACN,KAAAS,EACA,MAAAC,EACA,QAAAC,EACA,QAAAC,CACF,CAAC,CACH,EAAG,GAAI,EAEP,MAAO,IAAM,cAAcN,CAAK,CAClC,EAAG,CAACR,CAAO,CAAC,EAELC,CACT,EAEA,IAAOc,EAAQhB",
6
+ "names": ["useEffect", "useState", "useCountDown", "endTime", "time", "setTime", "format", "date", "hasTimezone", "normalizedEndTime", "countDownDate", "timer", "now", "distance", "days", "hours", "minutes", "seconds", "useCountDown_default"]
7
7
  }