@anker-in/headless-ui 1.1.84 → 1.1.85

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 (140) hide show
  1. package/dist/cjs/biz-components/ActiveShelf/index.d.ts +2 -2
  2. package/dist/cjs/biz-components/ActiveShelf/index.js +1 -1
  3. package/dist/cjs/biz-components/ActiveShelf/index.js.map +3 -3
  4. package/dist/cjs/biz-components/EventSchedule/index.d.ts +2 -7
  5. package/dist/cjs/biz-components/EventSchedule/index.js +1 -1
  6. package/dist/cjs/biz-components/EventSchedule/index.js.map +3 -3
  7. package/dist/cjs/biz-components/FeaturedBlogPosts/index.d.ts +1 -6
  8. package/dist/cjs/biz-components/FeaturedBlogPosts/index.js +1 -1
  9. package/dist/cjs/biz-components/FeaturedBlogPosts/index.js.map +3 -3
  10. package/dist/cjs/biz-components/HeroBanner/HeroBanner.js +1 -1
  11. package/dist/cjs/biz-components/HeroBanner/HeroBanner.js.map +2 -2
  12. package/dist/cjs/biz-components/ImageOverlayShelf/index.d.ts +2 -2
  13. package/dist/cjs/biz-components/ImageOverlayShelf/index.js +1 -1
  14. package/dist/cjs/biz-components/ImageOverlayShelf/index.js.map +3 -3
  15. package/dist/cjs/biz-components/LotteryShared/BaseModal.d.ts +61 -0
  16. package/dist/cjs/biz-components/LotteryShared/BaseModal.js +2 -0
  17. package/dist/cjs/biz-components/LotteryShared/BaseModal.js.map +7 -0
  18. package/dist/cjs/biz-components/LotteryShared/ChanceMethods.d.ts +25 -0
  19. package/dist/cjs/biz-components/LotteryShared/ChanceMethods.js +2 -0
  20. package/dist/cjs/biz-components/LotteryShared/ChanceMethods.js.map +7 -0
  21. package/dist/cjs/biz-components/LotteryShared/ErrorModal.d.ts +47 -0
  22. package/dist/cjs/biz-components/LotteryShared/ErrorModal.js +2 -0
  23. package/dist/cjs/biz-components/LotteryShared/ErrorModal.js.map +7 -0
  24. package/dist/cjs/biz-components/LotteryShared/MyRewardsModal.d.ts +101 -0
  25. package/dist/cjs/biz-components/LotteryShared/MyRewardsModal.js +2 -0
  26. package/dist/cjs/biz-components/LotteryShared/MyRewardsModal.js.map +7 -0
  27. package/dist/cjs/biz-components/LotteryShared/PrizePool.d.ts +29 -0
  28. package/dist/cjs/biz-components/LotteryShared/PrizePool.js +2 -0
  29. package/dist/cjs/biz-components/LotteryShared/PrizePool.js.map +7 -0
  30. package/dist/cjs/biz-components/LotteryShared/RulesModal.d.ts +56 -0
  31. package/dist/cjs/biz-components/LotteryShared/RulesModal.js +2 -0
  32. package/dist/cjs/biz-components/LotteryShared/RulesModal.js.map +7 -0
  33. package/dist/cjs/biz-components/LotteryShared/ShareModal.d.ts +79 -0
  34. package/dist/cjs/biz-components/LotteryShared/ShareModal.js +2 -0
  35. package/dist/cjs/biz-components/LotteryShared/ShareModal.js.map +7 -0
  36. package/dist/cjs/biz-components/LotteryShared/WinnerModal.d.ts +27 -0
  37. package/dist/cjs/biz-components/LotteryShared/WinnerModal.js +2 -0
  38. package/dist/cjs/biz-components/LotteryShared/WinnerModal.js.map +7 -0
  39. package/dist/cjs/biz-components/LotteryShared/index.d.ts +23 -0
  40. package/dist/cjs/biz-components/LotteryShared/index.js +2 -0
  41. package/dist/cjs/biz-components/LotteryShared/index.js.map +7 -0
  42. package/dist/cjs/biz-components/LotteryShared/types.d.ts +760 -0
  43. package/dist/cjs/biz-components/LotteryShared/types.js +2 -0
  44. package/dist/cjs/biz-components/LotteryShared/types.js.map +7 -0
  45. package/dist/cjs/biz-components/MediaEndorsement/index.js +2 -2
  46. package/dist/cjs/biz-components/MediaEndorsement/index.js.map +2 -2
  47. package/dist/cjs/biz-components/MediaShelf/index.d.ts +2 -2
  48. package/dist/cjs/biz-components/MediaShelf/index.js +1 -1
  49. package/dist/cjs/biz-components/MediaShelf/index.js.map +3 -3
  50. package/dist/cjs/biz-components/ProductLottery/MediaDrawArea.d.ts +4 -0
  51. package/dist/cjs/biz-components/ProductLottery/MediaDrawArea.js +2 -0
  52. package/dist/cjs/biz-components/ProductLottery/MediaDrawArea.js.map +7 -0
  53. package/dist/cjs/biz-components/ProductLottery/index.d.ts +17 -0
  54. package/dist/cjs/biz-components/ProductLottery/index.js +2 -0
  55. package/dist/cjs/biz-components/ProductLottery/index.js.map +7 -0
  56. package/dist/cjs/biz-components/ProductLottery/types.d.ts +363 -0
  57. package/dist/cjs/biz-components/ProductLottery/types.js +2 -0
  58. package/dist/cjs/biz-components/ProductLottery/types.js.map +7 -0
  59. package/dist/cjs/biz-components/Specs/index.js +1 -1
  60. package/dist/cjs/biz-components/Specs/index.js.map +3 -3
  61. package/dist/cjs/biz-components/WheelLottery/index.d.ts +11 -11
  62. package/dist/cjs/biz-components/WheelLottery/index.js +1 -1
  63. package/dist/cjs/biz-components/WheelLottery/index.js.map +3 -3
  64. package/dist/cjs/biz-components/WheelLottery/types.d.ts +17 -723
  65. package/dist/cjs/biz-components/WheelLottery/types.js +1 -1
  66. package/dist/cjs/biz-components/WheelLottery/types.js.map +3 -3
  67. package/dist/cjs/biz-components/index.d.ts +2 -0
  68. package/dist/cjs/biz-components/index.js +1 -1
  69. package/dist/cjs/biz-components/index.js.map +3 -3
  70. package/dist/esm/biz-components/ActiveShelf/index.d.ts +2 -2
  71. package/dist/esm/biz-components/ActiveShelf/index.js +1 -1
  72. package/dist/esm/biz-components/ActiveShelf/index.js.map +3 -3
  73. package/dist/esm/biz-components/EventSchedule/index.d.ts +2 -7
  74. package/dist/esm/biz-components/EventSchedule/index.js +1 -1
  75. package/dist/esm/biz-components/EventSchedule/index.js.map +3 -3
  76. package/dist/esm/biz-components/FeaturedBlogPosts/index.d.ts +1 -6
  77. package/dist/esm/biz-components/FeaturedBlogPosts/index.js +1 -1
  78. package/dist/esm/biz-components/FeaturedBlogPosts/index.js.map +3 -3
  79. package/dist/esm/biz-components/HeroBanner/HeroBanner.js +1 -1
  80. package/dist/esm/biz-components/HeroBanner/HeroBanner.js.map +2 -2
  81. package/dist/esm/biz-components/ImageOverlayShelf/index.d.ts +2 -2
  82. package/dist/esm/biz-components/ImageOverlayShelf/index.js +1 -1
  83. package/dist/esm/biz-components/ImageOverlayShelf/index.js.map +3 -3
  84. package/dist/esm/biz-components/LotteryShared/BaseModal.d.ts +61 -0
  85. package/dist/esm/biz-components/LotteryShared/BaseModal.js +2 -0
  86. package/dist/esm/biz-components/LotteryShared/BaseModal.js.map +7 -0
  87. package/dist/esm/biz-components/LotteryShared/ChanceMethods.d.ts +25 -0
  88. package/dist/esm/biz-components/LotteryShared/ChanceMethods.js +2 -0
  89. package/dist/esm/biz-components/LotteryShared/ChanceMethods.js.map +7 -0
  90. package/dist/esm/biz-components/LotteryShared/ErrorModal.d.ts +47 -0
  91. package/dist/esm/biz-components/LotteryShared/ErrorModal.js +2 -0
  92. package/dist/esm/biz-components/LotteryShared/ErrorModal.js.map +7 -0
  93. package/dist/esm/biz-components/LotteryShared/MyRewardsModal.d.ts +101 -0
  94. package/dist/esm/biz-components/LotteryShared/MyRewardsModal.js +2 -0
  95. package/dist/esm/biz-components/LotteryShared/MyRewardsModal.js.map +7 -0
  96. package/dist/esm/biz-components/LotteryShared/PrizePool.d.ts +29 -0
  97. package/dist/esm/biz-components/LotteryShared/PrizePool.js +2 -0
  98. package/dist/esm/biz-components/LotteryShared/PrizePool.js.map +7 -0
  99. package/dist/esm/biz-components/LotteryShared/RulesModal.d.ts +56 -0
  100. package/dist/esm/biz-components/LotteryShared/RulesModal.js +2 -0
  101. package/dist/esm/biz-components/LotteryShared/RulesModal.js.map +7 -0
  102. package/dist/esm/biz-components/LotteryShared/ShareModal.d.ts +79 -0
  103. package/dist/esm/biz-components/LotteryShared/ShareModal.js +2 -0
  104. package/dist/esm/biz-components/LotteryShared/ShareModal.js.map +7 -0
  105. package/dist/esm/biz-components/LotteryShared/WinnerModal.d.ts +27 -0
  106. package/dist/esm/biz-components/LotteryShared/WinnerModal.js +2 -0
  107. package/dist/esm/biz-components/LotteryShared/WinnerModal.js.map +7 -0
  108. package/dist/esm/biz-components/LotteryShared/index.d.ts +23 -0
  109. package/dist/esm/biz-components/LotteryShared/index.js +2 -0
  110. package/dist/esm/biz-components/LotteryShared/index.js.map +7 -0
  111. package/dist/esm/biz-components/LotteryShared/types.d.ts +760 -0
  112. package/dist/esm/biz-components/LotteryShared/types.js +2 -0
  113. package/dist/esm/biz-components/LotteryShared/types.js.map +7 -0
  114. package/dist/esm/biz-components/MediaEndorsement/index.js +2 -2
  115. package/dist/esm/biz-components/MediaEndorsement/index.js.map +3 -3
  116. package/dist/esm/biz-components/MediaShelf/index.d.ts +2 -2
  117. package/dist/esm/biz-components/MediaShelf/index.js +1 -1
  118. package/dist/esm/biz-components/MediaShelf/index.js.map +3 -3
  119. package/dist/esm/biz-components/ProductLottery/MediaDrawArea.d.ts +4 -0
  120. package/dist/esm/biz-components/ProductLottery/MediaDrawArea.js +2 -0
  121. package/dist/esm/biz-components/ProductLottery/MediaDrawArea.js.map +7 -0
  122. package/dist/esm/biz-components/ProductLottery/index.d.ts +17 -0
  123. package/dist/esm/biz-components/ProductLottery/index.js +2 -0
  124. package/dist/esm/biz-components/ProductLottery/index.js.map +7 -0
  125. package/dist/esm/biz-components/ProductLottery/types.d.ts +363 -0
  126. package/dist/esm/biz-components/ProductLottery/types.js +2 -0
  127. package/dist/esm/biz-components/ProductLottery/types.js.map +7 -0
  128. package/dist/esm/biz-components/Specs/index.js +1 -1
  129. package/dist/esm/biz-components/Specs/index.js.map +3 -3
  130. package/dist/esm/biz-components/WheelLottery/index.d.ts +11 -11
  131. package/dist/esm/biz-components/WheelLottery/index.js +1 -1
  132. package/dist/esm/biz-components/WheelLottery/index.js.map +3 -3
  133. package/dist/esm/biz-components/WheelLottery/types.d.ts +17 -723
  134. package/dist/esm/biz-components/WheelLottery/types.js +1 -1
  135. package/dist/esm/biz-components/WheelLottery/types.js.map +3 -3
  136. package/dist/esm/biz-components/index.d.ts +2 -0
  137. package/dist/esm/biz-components/index.js +1 -1
  138. package/dist/esm/biz-components/index.js.map +2 -2
  139. package/package.json +1 -1
  140. package/style.css +77 -0
@@ -0,0 +1,2 @@
1
+ const n=[{methodKey:"default-share",type:"share",title:"Share on your socials",description:"Share this event on your social media",buttonText:"Redeem now",onLoginRequired:()=>{alert("Please log in to share and get a chance!")},onClick:()=>{console.warn("ChanceMethod.onClick not implemented. Please provide a custom onClick handler.")},disabled:!1},{methodKey:"default-points",type:"points",title:"Spend 100 points",description:"Use your reward points to get a chance",buttonText:"Redeem now",onLoginRequired:()=>{alert("Please log in to share and get a chance!")},onClick:()=>{console.warn("ChanceMethod.onClick not implemented. Please provide a custom onClick handler.")},disabled:!1},{methodKey:"default-refer",type:"refer",title:"Refer a friend",description:"Invite your friends to join",buttonText:"Redeem now",onLoginRequired:()=>{alert("Please log in to share and get a chance!")},onClick:()=>{console.warn("ChanceMethod.onClick not implemented. Please provide a custom onClick handler.")},disabled:!1}];function t(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 i(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 o(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{n as DEFAULT_CHANCE_METHODS,i as isChanceMethod,t as isPrize,o as isWinningInfo};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/biz-components/LotteryShared/types.ts"],
4
+ "sourcesContent": ["/**\n * \u62BD\u5956\u7EC4\u4EF6\u5171\u4EAB\u7C7B\u578B\u5B9A\u4E49\n *\n * \u5305\u542B\u6240\u6709\u62BD\u5956\u7EC4\u4EF6\uFF08WheelLottery, ProductLottery \u7B49\uFF09\u5171\u7528\u7684\u7C7B\u578B\u3001\u63A5\u53E3\u548C\u5E38\u91CF\u3002\n *\n * @module LotterySharedTypes\n * @date 2026-04-07\n */\n\nimport type { Theme, Img } from '../../types/props.js'\n\n// Re-export Theme and Img for convenience\nexport type { Theme, Img }\n\n// ============================================================================\n// \u6838\u5FC3\u5B9E\u4F53\u7C7B\u578B\n// ============================================================================\n\n/**\n * \u5956\u54C1\uFF08Prize\uFF09\n *\n * \u4EE3\u8868\u62BD\u5956\u6D3B\u52A8\u4E2D\u7684\u4E00\u4E2A\u5956\u54C1\uFF0C\u5305\u542B\u663E\u793A\u6240\u9700\u7684\u6240\u6709\u4FE1\u606F\u3002\n *\n * @example\n * ```tsx\n * const prize: Prize = {\n * prizeKey: 'prize-001',\n * name: 'Anker Prime Charger (100W, 3 Ports, GaN)',\n * image: { url: 'https://images.unsplash.com/photo-123', alt: 'Charger' },\n * rank: '1st',\n * price: '$79.99'\n * }\n * ```\n */\nexport interface Prize {\n /**\n * \u552F\u4E00\u6807\u8BC6\u7B26\uFF0C\u7528\u4E8E React key \u548C\u4E2D\u5956\u7ED3\u679C\u5339\u914D\n */\n prizeKey: string\n\n /**\n * \u5956\u54C1\u540D\u79F0\uFF0C\u663E\u793A\u5728\u8F6C\u76D8\u548C\u5956\u6C60\u4E2D\n * @maxLength 100\n */\n name: string\n\n /**\n * \u5956\u54C1\u56FE\u7247\u5BF9\u8C61\uFF0C\u5305\u542B url \u548C alt\n */\n image: Img\n\n /**\n * \u6392\u540D\u6807\u8BC6\uFF0C\u4EC5\u5728 Prize Pool \u4E2D\u663E\u793A\n * @optional\n */\n rank?: '1st' | '2nd' | '3rd'\n\n /**\n * \u4EF7\u683C\u6216\u6298\u6263\u4FE1\u606F\uFF0C\u663E\u793A\u5728\u5956\u6C60\u4E2D\n * @example \"$99.99\" | \"12% Off\"\n * @optional\n */\n price?: string\n}\n\n/**\n * \u4E2D\u5956\u4FE1\u606F\uFF08WinningInfo\uFF09\n *\n * \u4EE3\u8868\u4E00\u6761\u4E2D\u5956\u8BB0\u5F55\uFF0C\u7528\u4E8E\u5E95\u90E8\u6EDA\u52A8\u6761\u5C55\u793A\uFF0C\u8425\u9020\u6D3B\u52A8\u6C1B\u56F4\u3002\n *\n * @example\n * ```tsx\n * const winningInfo: WinningInfo = {\n * winningKey: 'win-001',\n * userName: 'Shuqi***',\n * prizeName: '12% Off Discount',\n * timestamp: 1702800000000\n * }\n * ```\n */\nexport interface WinningInfo {\n /**\n * \u552F\u4E00\u6807\u8BC6\u7B26\n */\n winningKey: string\n\n /**\n * \u7528\u6237\u540D\uFF08\u5DF2\u8131\u654F\uFF09\uFF0C\u5982 \"Shuqi***\"\n * @note \u5047\u8BBE\u4F20\u5165\u7684\u7528\u6237\u540D\u5DF2\u7ECF\u8FC7\u8131\u654F\u5904\u7406\uFF0C\u7EC4\u4EF6\u5185\u90E8\u4E0D\u518D\u5904\u7406\n */\n userName: string\n\n /**\n * \u4E2D\u5956\u5956\u54C1\u540D\u79F0\n */\n prizeName: string\n\n /**\n * \u4E2D\u5956\u65F6\u95F4\u6233\uFF08\u6BEB\u79D2\uFF09\n * @optional\n */\n timestamp?: number\n}\n\n/**\n * \u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\u7C7B\u578B\n */\nexport type ChanceMethodType = 'share' | 'points' | 'refer' | string\n\n/**\n * \u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\u72B6\u6001\n */\nexport type ChanceMethodStatus = 'pending' | 'completed' | 'used'\n\n/**\n * \u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\uFF08ChanceMethod\uFF09\n *\n * \u4EE3\u8868\u4E00\u79CD\u83B7\u53D6\u62BD\u5956\u673A\u4F1A\u7684\u65B9\u5F0F\uFF0C\u652F\u6301\u7075\u6D3B\u914D\u7F6E\uFF08\u5206\u4EAB\u3001\u79EF\u5206\u3001\u63A8\u8350\u7B49\uFF09\u3002\n *\n * @example\n * ```tsx\n * const chanceMethod: ChanceMethod = {\n * methodKey: 'share-001',\n * type: 'share',\n * title: 'Share on your socials',\n * description: 'Share this event on your social media',\n * buttonText: 'Redeem now',\n * onClick: () => console.log('Share clicked'),\n * disabled: false,\n * status: 'pending'\n * }\n * ```\n */\nexport interface ChanceMethod {\n /**\n * \u552F\u4E00\u6807\u8BC6\u7B26\n */\n methodKey: string\n\n /**\n * \u65B9\u5F0F\u7C7B\u578B\uFF0C\u652F\u6301\u9884\u5B9A\u4E49\u7C7B\u578B\uFF08'share', 'points', 'refer'\uFF09\u6216\u81EA\u5B9A\u4E49\u7C7B\u578B\n */\n type: ChanceMethodType\n\n /**\n * \u65B9\u5F0F\u6807\u9898\uFF0C\u5982 \"Share on your socials\"\n */\n title: string\n\n /**\n * \u8BE6\u7EC6\u8BF4\u660E\u6587\u5B57\n */\n description: string\n\n /**\n * \u6309\u94AE\u6587\u6848\uFF0C\u9ED8\u8BA4 \"Redeem now\"\n * @default \"Redeem now\"\n * @optional\n */\n buttonText?: string\n\n completed?: string\n\n used?: string\n\n /**\n * \u672A\u767B\u5F55\u65F6\u70B9\u51FB GO \u6309\u94AE\u7684\u56DE\u8C03\n * @example\n * ```tsx\n * onLoginRequired={() => {\n * // \u6253\u5F00\u767B\u5F55\u5F39\u7A97\u6216\u8DF3\u8F6C\u767B\u5F55\u9875\n * router.push('/login')\n * }}\n * ```\n */\n onLoginRequired?: () => void\n\n /**\n * \u70B9\u51FB\u6309\u94AE\u65F6\u7684\u56DE\u8C03\u51FD\u6570\n * @note \u4E1A\u52A1\u903B\u8F91\uFF08\u5982\u79EF\u5206\u6263\u9664\u3001\u5206\u4EAB\u9A8C\u8BC1\uFF09\u7531\u7236\u7EC4\u4EF6\u5904\u7406\n */\n onClick: () => void\n\n /**\n * \u662F\u5426\u7981\u7528\u8BE5\u65B9\u5F0F\n * @default false\n * @optional\n */\n disabled?: boolean\n\n /**\n * \u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\u7684\u72B6\u6001\n * - pending: \u672A\u5B8C\u6210\uFF08\u9ED8\u8BA4\u72B6\u6001\uFF09\n * - completed: \u5DF2\u5B8C\u6210/\u5DF2\u83B7\u5F97\n * - used: \u5DF2\u4F7F\u7528\n * @default \"pending\"\n * @optional\n */\n status?: ChanceMethodStatus\n\n /**\n * \u662F\u5426\u663E\u793A\u52A0\u8F7D\u72B6\u6001\n * @default false\n * @optional\n */\n loading?: boolean\n\n /**\n * \u662F\u5426\u5728\u70B9\u51FB\u65F6\u6253\u5F00\u5206\u4EAB\u5F39\u7A97\n * @default false\n * @optional\n */\n openShareModal?: boolean\n}\n\n/**\n * \u7528\u6237\u6570\u636E\uFF08UserData\uFF09\n *\n * \u4EE3\u8868\u5F53\u524D\u7528\u6237\u7684\u62BD\u5956\u76F8\u5173\u6570\u636E\n *\n * @example\n * ```tsx\n * const userData: UserData = {\n * isLoggedIn: true,\n * availableChances: 3,\n * wonPrizes: [\n * { id: 'prize-001', name: 'Charger', image: 'https://...', timestamp: 1702800000000 }\n * ]\n * }\n * ```\n */\nexport interface UserData {\n /**\n * \u7528\u6237\u662F\u5426\u5DF2\u767B\u5F55\n */\n isLoggedIn: boolean\n\n /**\n * \u5F53\u524D\u53EF\u4F7F\u7528\u7684\u62BD\u5956\u6B21\u6570\n * @default 0\n */\n availableChances: number\n\n /**\n * \u603B\u673A\u4F1A\u6570\uFF08\u7528\u4E8E\u663E\u793A\u8FDB\u5EA6\uFF0C\u4F8B\u5982 \"3/5\"\uFF09\n * @default undefined\n * @optional\n */\n totalChances?: number\n\n /**\n * \u5DF2\u83B7\u5F97\u7684\u5956\u54C1\u5217\u8868\n * @optional\n */\n wonPrizes?: Array<Prize & { timestamp?: number }>\n\n /** * \u7528\u6237\u7535\u5B50\u90AE\u7BB1\uFF08\u53EF\u9009\uFF0C\u7528\u4E8E\u53D1\u9001\u4E2D\u5956\u901A\u77E5\u7B49\uFF09\n * @optional\n */\n email?: string\n}\n\n/**\n * \u7F13\u52A8\u51FD\u6570\u7C7B\u578B\n */\nexport type EasingFunction = 'ease-out' | 'ease-in-out' | 'linear'\n\n// ============================================================================\n// \u516C\u5171\u6587\u6848\u914D\u7F6E\u7C7B\u578B\n// ============================================================================\n\n/**\n * \u590D\u5236\u64CD\u4F5C\u76F8\u5173\u6587\u6848\u914D\u7F6E\uFF08\u516C\u5171\u7C7B\u578B\uFF09\n * \u7528\u4E8E\u6240\u6709\u5305\u542B\u590D\u5236\u529F\u80FD\u7684\u7EC4\u4EF6\n */\nexport interface CopyTextConfig {\n /**\n * \u590D\u5236\u6309\u94AE\u6587\u672C\n * @default \"COPY\"\n */\n copyText?: string\n\n /**\n * \u590D\u5236\u6210\u529F\u540E\u7684\u6309\u94AE\u6587\u672C\n * @default \"COPIED\"\n */\n copiedText?: string\n}\n\n/**\n * \u4F18\u60E0\u7801\u76F8\u5173\u914D\u7F6E\uFF08\u516C\u5171\u7C7B\u578B\uFF09\n * \u7528\u4E8E\u6240\u6709\u5C55\u793A\u4F18\u60E0\u7801\u7684\u7EC4\u4EF6\n */\nexport interface CouponConfig {\n /**\n * \u4EE3\u7801\u6587\u672C\u524D\u7F00\n * @default \"CODE:\"\n */\n codeText?: string\n\n /**\n * \u4F18\u60E0\u7801\n */\n couponCode?: string\n\n /**\n * \u4F18\u60E0\u7801\u8FC7\u671F\u65F6\u95F4\n */\n expiresAt?: string\n\n /**\n * \u4F18\u60E0\u5238\u6298\u6263\u6587\u672C\uFF08\u4F8B\u5982 \"20%\"\uFF09\n */\n couponDiscount?: string\n\n /**\n * \u4F18\u60E0\u5238\u5355\u4F4D\u6587\u672C\n * @default \"Off\"\n */\n couponUnit?: string\n}\n\n/**\n * \u5956\u52B1\u65F6\u95F4\u6587\u6848\u914D\u7F6E\uFF08\u516C\u5171\u7C7B\u578B\uFF09\n */\nexport interface PrizeTimeTextConfig {\n /**\n * \u5956\u52B1\u65F6\u95F4\u6587\u672C\u524D\u7F00\n * @default \"Prize time:\"\n */\n prizeText?: string\n}\n\n/**\n * \u4E2D\u5956\u5F39\u7A97\u914D\u7F6E\uFF08WinnerModalConfig\uFF09\n *\n * \u7528\u4E8E\u914D\u7F6E\u4E2D\u5956\u5F39\u7A97\u7684\u5C55\u793A\u5185\u5BB9\uFF0C\u901A\u5E38\u7531\u62BD\u5956\u63A5\u53E3\u8FD4\u56DE\u63D0\u4F9B\n *\n * @example\n * ```tsx\n * const winnerModalConfig: WinnerModalConfig = {\n * title: 'Congratulations!',\n * prizeTitle: 'Anker Prime Charger',\n * prizeImage: 'https://...',\n * prizeDescription: 'High-speed charging for all your devices',\n * learnMoreUrl: 'https://...',\n * learnMoreText: 'View Details',\n * couponCode: 'ANKER2024',\n * expiresAt: '2024-12-31',\n * couponDiscount: '20%',\n * couponUnit: 'Off',\n * confirmText: 'Claim Now'\n * }\n * ```\n */\nexport interface WinnerModalConfig extends CopyTextConfig, CouponConfig, PrizeTimeTextConfig {\n /**\n * \u4E2D\u5956\u5F39\u7A97\u6807\u9898\n * @default \"You Have Won\"\n * @optional\n */\n title?: string\n\n /**\n * \u4E2D\u5956\u5F39\u7A97\u5956\u54C1\u6807\u9898\uFF08\u4F18\u5148\u7EA7\u9AD8\u4E8E prize.name\uFF09\n * @optional\n */\n prizeTitle?: string\n\n /**\n * \u4E2D\u5956\u5F39\u7A97\u5956\u54C1\u56FE\u7247 URL\uFF08\u4F18\u5148\u7EA7\u9AD8\u4E8E prize.image\uFF09\n * @optional\n */\n prizeImage?: string\n\n /**\n * \u4E2D\u5956\u5F39\u7A97\u5956\u54C1\u8BE6\u60C5\u63CF\u8FF0\n * @optional\n */\n prizeDescription?: string\n\n /**\n * \u4E2D\u5956\u5F39\u7A97 Learn More \u94FE\u63A5\n * @optional\n */\n learnMoreUrl?: string\n\n /**\n * \u4E2D\u5956\u5F39\u7A97 Learn More \u6309\u94AE\u6587\u672C\n * @default \"Learn More\"\n * @optional\n */\n learnMoreText?: string\n\n /**\n * \u4E2D\u5956\u5F39\u7A97\u786E\u8BA4\u6309\u94AE\u6587\u672C\n * @default \"Okay, Got It\"\n * @optional\n */\n confirmText?: string\n\n /** \u786E\u8BA4\u6309\u94AE\u8DF3\u8F6C\u94FE\u63A5\uFF0C\u914D\u7F6E\u540E\u70B9\u51FB\u6309\u94AE\u5C06\u5728\u65B0\u6807\u7B7E\u9875\u6253\u5F00\u6B64\u94FE\u63A5 @optional */\n confirmUrl?: string\n}\n\n/**\n * Rules \u5F39\u7A97\u914D\u7F6E\n *\n * @example\n * ```tsx\n * rulesModalConfig={{\n * rulesData: [\n * { item: '$100 instead of $200, 10 tickets/day.' },\n * { item: '$100 for $120, 50 tickets/day.' }\n * ],\n * rulesText: 'Game Rules',\n * rulesTitle: 'Activity Rules'\n * }}\n * ```\n */\nexport interface RulesModalConfig {\n /**\n * \u89C4\u5219\u6570\u636E\u5217\u8868\n * @optional\n */\n rulesData?: Array<{\n /**\n * \u89C4\u5219\u9879\u5185\u5BB9\n */\n item: string\n }>\n\n /**\n * Rules \u6309\u94AE\u6587\u672C\n * @default \"Rules\"\n * @optional\n */\n rulesText?: string\n\n /**\n * \u5F39\u7A97\u6807\u9898\n * @default \"Rules\"\n * @optional\n */\n rulesTitle?: string\n}\n\n/**\n * My Rewards \u5F39\u7A97\u914D\u7F6E\n *\n * @example\n * ```tsx\n * myRewardsModalConfig={{\n * rewardsData: [\n * {\n * id: '1',\n * name: 'Anker Charger',\n * code: 'ANKER2024',\n * status: 'Available',\n * prizeTime: '2024-01-01',\n * showCopyCode: true\n * }\n * ],\n * myRewardsText: 'My Prizes',\n * codeText: 'CODE:',\n * copyText: 'COPY',\n * prizeText: 'Prize time:',\n * emptyText: 'No rewards yet'\n * }}\n * ```\n */\nexport interface MyRewardsModalConfig extends CopyTextConfig, PrizeTimeTextConfig {\n /**\n * \u5956\u52B1\u6570\u636E\u5217\u8868\n * @optional\n */\n rewardsData?: Array<{\n /**\n * \u5956\u52B1 ID\n */\n id: string\n /**\n * \u5956\u52B1\u540D\u79F0\n */\n name: string\n /**\n * \u4F18\u60E0\u7801\uFF08\u53EF\u9009\uFF09\n */\n code?: string\n /**\n * \u72B6\u6001\n */\n status: 'Available' | 'Expired' | 'Used'\n /**\n * \u5956\u52B1\u65F6\u95F4\n */\n prizeTime?: string\n /**\n * \u662F\u5426\u53EF\u590D\u5236\u7801\n */\n showCopyCode?: boolean\n }>\n\n /**\n * My Rewards \u6309\u94AE\u6587\u672C\n * @default \"My Rewards\"\n * @optional\n */\n myRewardsText?: string\n\n /**\n * \u5F39\u7A97\u6807\u9898\n * @default \"My Rewards\"\n * @optional\n */\n myRewardsTitle?: string\n\n /**\n * \u4EE3\u7801\u6587\u672C\u524D\u7F00\n * @default \"CODE:\"\n * @optional\n */\n codeText?: string\n\n /**\n * \u7A7A\u72B6\u6001\u63D0\u793A\u6587\u672C\n * @default \"No rewards yet\"\n * @optional\n */\n emptyText?: string\n}\n\n/**\n * \u9519\u8BEF\u5F39\u7A97\u914D\u7F6E\n * @example\n * ```tsx\n * errorModalConfig={{\n * title: 'Oops!',\n * message: 'Something went wrong during the lottery process.',\n * confirmText: 'OK, I get'\n * }}\n * ```\n */\nexport interface ErrorModalConfig {\n /**\n * \u5F39\u7A97\u6807\u9898\n * @default \"Oops!\"\n * @optional\n */\n title?: string\n /**\n * \u9519\u8BEF\u6D88\u606F\u5185\u5BB9\n * @default \"Something went wrong during the lottery process.\"\n * @optional\n */\n message?: string\n /**\n * \u786E\u8BA4\u6309\u94AE\u6587\u672C\n * @default \"OK, I get\"\n * @optional\n */\n confirmText?: string\n}\n\n/**\n * \u793E\u4EA4\u5E73\u53F0\u7C7B\u578B\n */\nexport type SocialPlatform = 'facebook' | 'twitter' | 'instagram' | 'linkedin' | 'tiktok' | 'youtube'\n\n/**\n * \u793E\u4EA4\u5E73\u53F0\u914D\u7F6E\n */\nexport interface SharePlatformConfig {\n /**\n * \u5E73\u53F0\u7C7B\u578B\n */\n platform: SocialPlatform\n\n /**\n * \u5E73\u53F0\u540D\u79F0\n */\n name: string\n\n /**\n * \u5206\u4EAB URL\uFF08\u53EF\u9009\uFF0C\u5982\u679C\u63D0\u4F9B\u5219\u76F4\u63A5\u8DF3\u8F6C\uFF09\n */\n url?: string\n\n /**\n * \u70B9\u51FB\u56DE\u8C03\uFF08\u5982\u679C\u63D0\u4F9B url \u5219\u6B64\u56DE\u8C03\u4F1A\u5728\u8DF3\u8F6C\u524D\u6267\u884C\uFF09\n */\n onClick?: () => void\n\n /**\n * \u662F\u5426\u7981\u7528\n */\n disabled?: boolean\n}\n\n/**\n * \u5206\u4EAB\u5F39\u7A97\u914D\u7F6E\n */\nexport interface ShareModalConfig {\n /**\n * \u5F39\u7A97\u6807\u9898\n * @default \"Share to Get More Chances\"\n */\n title?: string\n\n /**\n * \u526F\u6807\u9898/\u5F15\u5BFC\u6587\u6848\n * @default \"Share to Play Again Keep Trying! You Could Still Win Big!\"\n */\n subtitle?: string\n\n /**\n * \u5E95\u90E8\u63D0\u793A\u6587\u6848\n * @default \"Note: Maximum of 3 times per participant.\"\n */\n note?: string\n\n /**\n * \u793E\u4EA4\u5E73\u53F0\u914D\u7F6E\u5217\u8868\n */\n platforms?: SharePlatformConfig[]\n\n /**\n * \u5206\u4EAB\u6210\u529F\u56DE\u8C03\n */\n onShareSuccess?: (platform: SocialPlatform) => void\n}\n\n// ============================================================================\n// \u5B50\u7EC4\u4EF6 Props \u63A5\u53E3\n// ============================================================================\n\n/**\n * PrizePool \u5956\u54C1\u6C60\u7EC4\u4EF6 Props\n */\nexport interface PrizePoolProps {\n /**\n * \u4E3B\u9898\u6A21\u5F0F\n * @optional\n */\n theme?: Theme\n\n /**\n * \u5956\u54C1\u5217\u8868(\u901A\u5E38\u662F\u5168\u90E8 8 \u4E2A\u5956\u54C1)\n */\n prizes: Prize[]\n\n /**\n * \u6807\u9898\u6587\u672C\n * @default \"Prize Pool\"\n */\n title?: string\n\n /**\n * \u4E2D\u5956\u4EBA\u540D\u5355\u6570\u636E\n * @optional\n */\n winningInfos?: WinningInfo[]\n\n /**\n * \u81EA\u5B9A\u4E49\u7C7B\u540D\n */\n className?: string\n}\n\n/** \u6D3B\u52A8\u673A\u5236\u6A21\u5F0F */\nexport type ChanceMechanismType = 'methods' | 'input'\n\n/** \u8F93\u5165\u6846\u914D\u7F6E\uFF08\u4EC5 mechanismType='input' \u65F6\u4F7F\u7528\uFF09 */\nexport interface ChanceInputConfig {\n /** \u8F93\u5165\u6846\u5360\u4F4D\u6587\u672C @default \"Enter your order number\" */\n placeholder?: string\n /** \u63D0\u4EA4\u6309\u94AE\u6587\u6848 @default \"Spin and Win\" */\n submitText?: string\n /** \u8F93\u5165\u503C\u63D0\u4EA4\u56DE\u8C03 */\n onSubmit?: (value: string) => void | Promise<void>\n /** \u662F\u5426\u6B63\u5728\u63D0\u4EA4 */\n isSubmitting?: boolean\n /** \u8F93\u5165\u6846\u7C7B\u578B @default \"text\" */\n inputType?: 'text' | 'email' | 'number'\n /** \u9A8C\u8BC1\u6B63\u5219 (\u53EF\u9009) */\n validationPattern?: string\n /** \u9A8C\u8BC1\u5931\u8D25\u63D0\u793A\u6587\u6848 */\n validationErrorText?: string\n /** \u8F93\u5165\u6846\u9ED8\u8BA4\u503C\uFF08\u5982\u767B\u5F55\u7528\u6237 email\uFF0C\u652F\u6301\u5F02\u6B65\u586B\u5145\uFF09 @optional */\n defaultValue?: string\n}\n\n/**\n * ChanceMethods \u83B7\u53D6\u673A\u4F1A\u7EC4\u4EF6 Props\n */\nexport interface ChanceMethodsProps {\n /**\n * \u4E3B\u9898\u6A21\u5F0F\n * @optional\n */\n theme?: Theme\n\n /**\n * \u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\u5217\u8868\n */\n methods: ChanceMethod[]\n\n /**\n * \u6807\u9898\u6587\u672C\n * @default \"Want more chances to win?\"\n */\n title?: string\n\n /**\n * \u526F\u6807\u9898(\u53EF\u9009)\n */\n subtitle?: string\n\n /**\n * \u5E95\u90E8\u63D0\u793A\u6587\u672C(\u53EF\u9009)\n */\n footerNote?: string\n\n /**\n * \u767B\u5F55\u7528\u6237\u6570\u636E\uFF08\u53EF\u9009\uFF09\n * @optional\n */\n userData?: UserData\n\n /**\n * \u6253\u5F00\u5206\u4EAB\u5F39\u7A97\u56DE\u8C03\uFF08\u53EF\u9009\uFF09\n * @optional\n */\n onOpenShareModal?: () => void\n\n /**\n * \u5FBD\u7AE0\u6587\u6848\n * @default \"Chance +1\"\n */\n chanceBadgeText?: string\n\n /**\n * \u5DF2\u5B8C\u6210\u72B6\u6001\u6587\u6848\n * @default \"Completed\"\n */\n completedText?: string\n\n /**\n * \u5DF2\u4F7F\u7528\u72B6\u6001\u6587\u6848\n * @default \"Used\"\n */\n usedText?: string\n\n /**\n * \u52A0\u8F7D\u4E2D\u6587\u6848\n * @default \"Loading...\"\n */\n loadingText?: string\n\n /**\n * \u81EA\u5B9A\u4E49\u7C7B\u540D\n */\n className?: string\n\n /** \u6D3B\u52A8\u673A\u5236\u6A21\u5F0F @default 'methods' */\n mechanismType?: ChanceMechanismType\n /** \u8F93\u5165\u6846\u914D\u7F6E\uFF08\u4EC5 mechanismType='input' \u65F6\u4F7F\u7528\uFF09 */\n inputConfig?: ChanceInputConfig\n}\n\n/**\n * WinnerModal \u4E2D\u5956\u5F39\u7A97\u7EC4\u4EF6 Props\n */\nexport interface WinnerModalProps extends CopyTextConfig, CouponConfig, PrizeTimeTextConfig {\n /**\n * \u662F\u5426\u663E\u793A\u5F39\u7A97\n */\n isOpen: boolean\n\n /**\n * \u4E2D\u5956\u5956\u54C1\u4FE1\u606F\n */\n prize: Prize | null\n\n /**\n * \u5F39\u7A97\u6807\u9898\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4 \"You Have Won\"\uFF09\n */\n title?: string\n\n /**\n * \u5956\u54C1\u6807\u9898\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4\u4F7F\u7528 prize.name\uFF09\n */\n prizeTitle?: string\n\n /**\n * \u5956\u54C1\u56FE\u7247 URL\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4\u4F7F\u7528 prize.image\uFF09\n */\n prizeImage?: string\n\n /**\n * \u5956\u54C1\u8BE6\u60C5\u63CF\u8FF0\uFF08\u53EF\u9009\uFF09\n */\n prizeDescription?: string\n\n /**\n * Learn More \u94FE\u63A5\uFF08\u53EF\u9009\uFF09\n */\n learnMoreUrl?: string\n\n /**\n * Learn More \u6309\u94AE\u6587\u672C\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4 \"Learn More\"\uFF09\n */\n learnMoreText?: string\n\n /**\n * \u590D\u5236\u7801\u70B9\u51FB\u56DE\u8C03\n */\n onCopyCode?: (code: string) => void\n\n /**\n * \u5173\u95ED\u5F39\u7A97\u56DE\u8C03\n */\n onClose: () => void\n\n /**\n * \u786E\u8BA4\u6309\u94AE\u6587\u672C\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4 \"Okay, Got It\"\uFF09\n */\n confirmText?: string\n\n /** \u786E\u8BA4\u6309\u94AE\u8DF3\u8F6C\u94FE\u63A5 @optional */\n confirmUrl?: string\n\n /**\n * \u786E\u8BA4\u6309\u94AE\u70B9\u51FB\u56DE\u8C03\uFF08\u53EF\u9009\uFF09\n */\n onConfirm?: () => void\n\n /**\n * \u81EA\u5B9A\u4E49\u7C7B\u540D\n */\n className?: string\n}\n\n// ============================================================================\n// \u9ED8\u8BA4\u914D\u7F6E\n// ============================================================================\n\n/**\n * \u9ED8\u8BA4\u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\uFF083\u79CD\uFF09\n * @note \u7236\u7EC4\u4EF6\u9700\u8981\u8986\u76D6 onClick \u56DE\u8C03\u4EE5\u5B9E\u73B0\u5177\u4F53\u4E1A\u52A1\u903B\u8F91\n */\nexport const DEFAULT_CHANCE_METHODS: ChanceMethod[] = [\n {\n methodKey: 'default-share',\n type: 'share',\n title: 'Share on your socials',\n description: 'Share this event on your social media',\n buttonText: 'Redeem now',\n onLoginRequired: () => {\n alert('Please log in to share and get a chance!')\n },\n onClick: () => {\n console.warn('ChanceMethod.onClick not implemented. Please provide a custom onClick handler.')\n },\n disabled: false,\n },\n {\n methodKey: 'default-points',\n type: 'points',\n title: 'Spend 100 points',\n description: 'Use your reward points to get a chance',\n buttonText: 'Redeem now',\n onLoginRequired: () => {\n alert('Please log in to share and get a chance!')\n },\n onClick: () => {\n console.warn('ChanceMethod.onClick not implemented. Please provide a custom onClick handler.')\n },\n disabled: false,\n },\n {\n methodKey: 'default-refer',\n type: 'refer',\n title: 'Refer a friend',\n description: 'Invite your friends to join',\n buttonText: 'Redeem now',\n onLoginRequired: () => {\n alert('Please log in to share and get a chance!')\n },\n onClick: () => {\n console.warn('ChanceMethod.onClick not implemented. Please provide a custom onClick handler.')\n },\n disabled: false,\n },\n]\n\n// ============================================================================\n// \u7C7B\u578B\u5B88\u536B\n// ============================================================================\n\n/**\n * \u68C0\u67E5\u662F\u5426\u4E3A\u6709\u6548\u7684 Prize \u5BF9\u8C61\n * @param value \u5F85\u68C0\u67E5\u7684\u503C\n * @returns \u662F\u5426\u4E3A\u6709\u6548\u7684 Prize\n */\nexport function isPrize(value: unknown): value is Prize {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'prizeKey' in value &&\n 'name' in value &&\n 'image' in value &&\n typeof (value as Prize).prizeKey === 'string' &&\n typeof (value as Prize).name === 'string' &&\n typeof (value as Prize).image === 'object'\n )\n}\n\n/**\n * \u68C0\u67E5\u662F\u5426\u4E3A\u6709\u6548\u7684 ChanceMethod \u5BF9\u8C61\n * @param value \u5F85\u68C0\u67E5\u7684\u503C\n * @returns \u662F\u5426\u4E3A\u6709\u6548\u7684 ChanceMethod\n */\nexport function isChanceMethod(value: unknown): value is ChanceMethod {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'methodKey' in value &&\n 'type' in value &&\n 'title' in value &&\n 'description' in value &&\n 'onClick' in value &&\n typeof (value as ChanceMethod).methodKey === 'string' &&\n typeof (value as ChanceMethod).type === 'string' &&\n typeof (value as ChanceMethod).title === 'string' &&\n typeof (value as ChanceMethod).description === 'string' &&\n typeof (value as ChanceMethod).onClick === 'function'\n )\n}\n\n/**\n * \u68C0\u67E5\u662F\u5426\u4E3A\u6709\u6548\u7684 WinningInfo \u5BF9\u8C61\n * @param value \u5F85\u68C0\u67E5\u7684\u503C\n * @returns \u662F\u5426\u4E3A\u6709\u6548\u7684 WinningInfo\n */\nexport function isWinningInfo(value: unknown): value is WinningInfo {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'winningKey' in value &&\n 'userName' in value &&\n 'prizeName' in value &&\n typeof (value as WinningInfo).winningKey === 'string' &&\n typeof (value as WinningInfo).userName === 'string' &&\n typeof (value as WinningInfo).prizeName === 'string'\n )\n}\n\n// ============================================================================\n// \u5BFC\u51FA\u7C7B\u578B\u522B\u540D\uFF08\u7528\u4E8E\u7B80\u5316\u4F7F\u7528\uFF09\n// ============================================================================\n\n/**\n * \u62BD\u5956\u56DE\u8C03\u51FD\u6570\u7C7B\u578B\n */\nexport type OnSpinEndCallback = (prize: Prize) => void\n\n/**\n * \u83B7\u53D6\u673A\u4F1A\u70B9\u51FB\u56DE\u8C03\u51FD\u6570\u7C7B\u578B\n */\nexport type OnChanceMethodClick = () => void\n"],
5
+ "mappings": "AAm1BO,MAAMA,EAAyC,CACpD,CACE,UAAW,gBACX,KAAM,QACN,MAAO,wBACP,YAAa,wCACb,WAAY,aACZ,gBAAiB,IAAM,CACrB,MAAM,0CAA0C,CAClD,EACA,QAAS,IAAM,CACb,QAAQ,KAAK,gFAAgF,CAC/F,EACA,SAAU,EACZ,EACA,CACE,UAAW,iBACX,KAAM,SACN,MAAO,mBACP,YAAa,yCACb,WAAY,aACZ,gBAAiB,IAAM,CACrB,MAAM,0CAA0C,CAClD,EACA,QAAS,IAAM,CACb,QAAQ,KAAK,gFAAgF,CAC/F,EACA,SAAU,EACZ,EACA,CACE,UAAW,gBACX,KAAM,QACN,MAAO,iBACP,YAAa,8BACb,WAAY,aACZ,gBAAiB,IAAM,CACrB,MAAM,0CAA0C,CAClD,EACA,QAAS,IAAM,CACb,QAAQ,KAAK,gFAAgF,CAC/F,EACA,SAAU,EACZ,CACF,EAWO,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_CHANCE_METHODS", "isPrize", "value", "isChanceMethod", "isWinningInfo"]
7
+ }
@@ -1,4 +1,4 @@
1
- "use client";import{jsx as r,jsxs as u}from"react/jsx-runtime";import*as b from"react";import{cva as z}from"class-variance-authority";import{Swiper as g,SwiperSlide as w}from"swiper/react";import{FreeMode as C,Mousewheel as B,Pagination as L}from"swiper/modules";import{useMediaQuery as R}from"react-responsive";import"swiper/css/pagination";import{cn as i}from"../../helpers/index.js";import{Heading as h,Text as V}from"../../index.js";import{withLayout as j}from"../../shared/Styles.js";const v=3;function A(d,t){const n=[];for(let o=0;o<d.length;o+=t)n.push(d.slice(o,o+t));return n}const H=z("rounded-box lg-desktop:h-[240px] desktop:px-6 bg-container-secondary-0 flex h-[200px] flex-col justify-start gap-[26px] p-4",{variants:{theme:{light:"",dark:""},rounded:{true:"rounded-card",false:""}},defaultVariants:{theme:"light",rounded:!1}}),x=b.forwardRef(({className:d,classNames:t={},data:n,onItemClick:o,...M},k)=>{const{title:l,subtitle:m,items:p,theme:f="light",rounded:y=!1,layout:E="grid"}=n,S=R({query:"(max-width: 767px)"}),N=b.useCallback((e,a)=>s=>{o?.(e,a,s)},[o]),c=(e,a)=>u("div",{className:i("media-endorsement-card text-info-primary",H({theme:f,rounded:y}),t.card),onClick:N(e,a),"aria-label":e.mediaName?`${e.mediaName} endorsement`:void 0,children:[r("div",{className:i("media-endorsement-card-icon rounded-full","lg-desktop::size-14 flex size-12 items-center justify-center overflow-hidden",t.cardIcon),children:r("img",{src:e.icon.url,alt:e.icon.alt||e.mediaName||"Media logo",className:"size-full object-contain",loading:"lazy"})}),r(h,{size:2,as:"h6",className:i("media-endorsement-card-quote line-clamp-4",t.cardQuote),children:e.text})]},a),I=()=>{const e=A(p,v);return r(g,{className:i("media-endorsement-mobile-swiper","w-full !overflow-visible pb-8",t.carousel),modules:[L],slidesPerView:1,spaceBetween:12,pagination:{clickable:!0,bulletClass:"media-endorsement-bullet",bulletActiveClass:"media-endorsement-bullet-active"},children:e.map((a,s)=>r(w,{className:"!h-auto",children:r("div",{className:"flex flex-col gap-3",children:a.map((T,D)=>{const P=s*v+D;return c(T,P)})})},s))})};return u("div",{ref:k,className:i("media-endorsement-root text-info-primary","w-full",d,t.root,{"aiui-dark":f==="dark"}),...M,children:[r("style",{children:`
1
+ "use client";import{jsx as r,jsxs as u}from"react/jsx-runtime";import*as b from"react";import{cva as C}from"class-variance-authority";import{Swiper as g,SwiperSlide as h}from"swiper/react";import{FreeMode as B,Mousewheel as L,Pagination as R}from"swiper/modules";import{useMediaQuery as V}from"react-responsive";import"swiper/css/pagination";import{cn as o}from"../../helpers/index.js";import{Heading as w,Text as z}from"../../index.js";import{withLayout as A}from"../../shared/Styles.js";const x=3;function H(d,t){const n=[];for(let i=0;i<d.length;i+=t)n.push(d.slice(i,i+t));return n}const _=C("rounded-box lg-desktop:h-[240px] desktop:px-6 bg-container-secondary-0 flex h-[200px] flex-col justify-start gap-[26px] p-4",{variants:{theme:{light:"",dark:""},rounded:{true:"rounded-card",false:""}},defaultVariants:{theme:"light",rounded:!1}}),v=b.forwardRef(({className:d,classNames:t={},data:n,onItemClick:i,...M},k)=>{const{title:l,subtitle:m,items:p,theme:f="light",rounded:y=!1,layout:E="grid"}=n,S=V({query:"(max-width: 767px)"}),N=b.useCallback((e,a)=>s=>{i?.(e,a,s)},[i]),c=(e,a)=>u("div",{className:o("media-endorsement-card text-info-primary",_({theme:f,rounded:y}),t.card),onClick:N(e,a),"aria-label":e.mediaName?`${e.mediaName} endorsement`:void 0,children:[r("div",{className:o("media-endorsement-card-icon rounded-full","lg-desktop::h-14 flex h-12 w-auto items-center overflow-hidden",t.cardIcon),children:r("img",{src:e.icon.url,alt:e.icon.alt||e.mediaName||"Media logo",className:"lg-desktop::h-12 h-[42px] w-auto object-contain",loading:"lazy"})}),r(w,{size:2,as:"h6",className:o("media-endorsement-card-quote line-clamp-4",t.cardQuote),children:e.text})]},a),I=()=>{const e=H(p,x);return r(g,{className:o("media-endorsement-mobile-swiper","w-full !overflow-visible pb-8",t.carousel),modules:[R],slidesPerView:1,spaceBetween:12,pagination:{clickable:!0,bulletClass:"media-endorsement-bullet",bulletActiveClass:"media-endorsement-bullet-active"},children:e.map((a,s)=>r(h,{className:"!h-auto",children:r("div",{className:"flex flex-col gap-3",children:a.map((T,D)=>{const P=s*x+D;return c(T,P)})})},s))})};return u("div",{ref:k,className:o("media-endorsement-root text-info-primary","w-full",d,t.root,{"aiui-dark":f==="dark"}),...M,children:[r("style",{children:`
2
2
  .media-endorsement-bullet {
3
3
  display: inline-block;
4
4
  width: 8px;
@@ -19,5 +19,5 @@
19
19
  right: 0;
20
20
  text-align: center;
21
21
  }
22
- `}),(l||m)&&u("div",{className:i("media-endorsement-header mb-6",t.header),children:[l&&r(h,{as:"h2",size:4,html:l,className:i("media-endorsement-title",t.title)}),m&&r(V,{as:"p",size:3,className:i("",t?.subtitle),html:m})]}),E==="carousel"?r(g,{className:i("media-endorsement-carousel","w-full !overflow-visible",t.carousel),modules:[C,B],freeMode:!0,mousewheel:{forceToAxis:!0},slidesPerView:"auto",spaceBetween:12,breakpoints:{768:{spaceBetween:16}},children:p.map((e,a)=>r(w,{className:"tablet:!w-[320px] laptop:!w-[360px] desktop:!w-[404px] !w-[280px]",children:c(e,a)},a))}):S?I():r("div",{className:i("media-endorsement-grid","laptop:grid-cols-2 laptop:gap-4 desktop:grid-cols-3 tablet:grid-cols-2 grid grid-cols-1 gap-3",t.grid),children:p.map((e,a)=>c(e,a))})]})});x.displayName="MediaEndorsement";var K=j(x);export{K as default};
22
+ `}),(l||m)&&u("div",{className:o("media-endorsement-header mb-6",t.header),children:[l&&r(w,{as:"h2",size:4,html:l,className:o("media-endorsement-title",t.title)}),m&&r(z,{as:"p",size:3,className:o("",t?.subtitle),html:m})]}),E==="carousel"?r(g,{className:o("media-endorsement-carousel","w-full !overflow-visible",t.carousel),modules:[B,L],freeMode:!0,mousewheel:{forceToAxis:!0},slidesPerView:"auto",spaceBetween:12,breakpoints:{768:{spaceBetween:16}},children:p.map((e,a)=>r(h,{className:"tablet:!w-[320px] laptop:!w-[360px] desktop:!w-[404px] !w-[280px]",children:c(e,a)},a))}):S?I():r("div",{className:o("media-endorsement-grid","laptop:grid-cols-2 laptop:gap-4 desktop:grid-cols-3 tablet:grid-cols-2 grid grid-cols-1 gap-3",t.grid),children:p.map((e,a)=>c(e,a))})]})});v.displayName="MediaEndorsement";var K=A(v);export{K as default};
23
23
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/biz-components/MediaEndorsement/index.tsx"],
4
- "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { cva } from 'class-variance-authority'\nimport { Swiper, SwiperSlide } from 'swiper/react'\nimport { FreeMode, Mousewheel, Pagination } from 'swiper/modules'\nimport { useMediaQuery } from 'react-responsive'\nimport 'swiper/css/pagination'\nimport { cn } from '../../helpers/index.js'\nimport type {\n MediaEndorsementProps,\n MediaEndorsementData,\n MediaEndorsementItem,\n MediaEndorsementSemanticName,\n} from './types.js'\nimport { Heading, Text } from '../../index.js'\nimport { withLayout } from '../../shared/Styles.js'\n\nconst MOBILE_ITEMS_PER_SLIDE = 3\n\n// Helper to chunk array into groups\nfunction chunkArray<T>(array: T[], size: number): T[][] {\n const result: T[][] = []\n for (let i = 0; i < array.length; i += size) {\n result.push(array.slice(i, i + size))\n }\n return result\n}\n\n/**\n * \u5361\u7247\u5BB9\u5668\u53D8\u4F53\n */\nconst cardVariants = cva(\n 'rounded-box lg-desktop:h-[240px] desktop:px-6 bg-container-secondary-0 flex h-[200px] flex-col justify-start gap-[26px] p-4',\n {\n variants: {\n theme: {\n light: '',\n dark: '',\n },\n rounded: {\n true: 'rounded-card',\n false: '',\n },\n },\n defaultVariants: {\n theme: 'light',\n rounded: false,\n },\n }\n)\n\n/**\n * MediaEndorsement - \u5A92\u4F53\u80CC\u4E66\n *\n * @description \u5A92\u4F53\u80CC\u4E66\u7EC4\u4EF6\u7684\u4F5C\u7528\u662F\u901A\u8FC7\u5C55\u793A\u7B2C\u4E09\u65B9\u5A92\u4F53\u7684\u8BC4\u4EF7\u6216\u62A5\u9053\uFF0C\u63D0\u5347\u54C1\u724C\u6216\u4EA7\u54C1\u7684\u53EF\u4FE1\u5EA6\u548C\u5F71\u54CD\u529B\n */\nconst MediaEndorsement = React.forwardRef<HTMLDivElement, MediaEndorsementProps>(\n ({ className, classNames = {}, data, onItemClick, ...props }, ref) => {\n const { title, subtitle, items, theme = 'light', rounded = false, layout = 'grid' } = data\n const isMobile = useMediaQuery({ query: '(max-width: 767px)' })\n\n const handleCardClick = React.useCallback(\n (item: MediaEndorsementItem, index: number) => (event: React.MouseEvent) => {\n onItemClick?.(item, index, event)\n },\n [onItemClick]\n )\n\n const renderCard = (item: MediaEndorsementItem, index: number) => (\n <div\n key={index}\n className={cn('media-endorsement-card text-info-primary', cardVariants({ theme, rounded }), classNames.card)}\n onClick={handleCardClick(item, index)}\n aria-label={item.mediaName ? `${item.mediaName} endorsement` : undefined}\n >\n {/* \u5A92\u4F53 Logo */}\n <div\n className={cn(\n 'media-endorsement-card-icon rounded-full',\n 'lg-desktop::size-14 flex size-12 items-center justify-center overflow-hidden',\n classNames.cardIcon\n )}\n >\n <img\n src={item.icon.url}\n alt={item.icon.alt || item.mediaName || 'Media logo'}\n className=\"size-full object-contain\"\n loading=\"lazy\"\n />\n </div>\n\n {/* \u5F15\u7528\u6587\u6848 */}\n <Heading size={2} as={'h6'} className={cn('media-endorsement-card-quote line-clamp-4', classNames.cardQuote)}>\n {item.text}\n </Heading>\n </div>\n )\n\n // Mobile swiper for grid layout\n const renderMobileGridSwiper = () => {\n const chunkedItems = chunkArray(items, MOBILE_ITEMS_PER_SLIDE)\n return (\n <Swiper\n className={cn('media-endorsement-mobile-swiper', 'w-full !overflow-visible pb-8', classNames.carousel)}\n modules={[Pagination]}\n slidesPerView={1}\n spaceBetween={12}\n pagination={{\n clickable: true,\n bulletClass: 'media-endorsement-bullet',\n bulletActiveClass: 'media-endorsement-bullet-active',\n }}\n >\n {chunkedItems.map((group, slideIndex) => (\n <SwiperSlide key={slideIndex} className=\"!h-auto\">\n <div className=\"flex flex-col gap-3\">\n {group.map((item, itemIndex) => {\n const globalIndex = slideIndex * MOBILE_ITEMS_PER_SLIDE + itemIndex\n return renderCard(item, globalIndex)\n })}\n </div>\n </SwiperSlide>\n ))}\n </Swiper>\n )\n }\n\n return (\n <div\n ref={ref}\n className={cn('media-endorsement-root text-info-primary', 'w-full', className, classNames.root, {\n 'aiui-dark': theme === 'dark',\n })}\n {...props}\n >\n <style>{`\n .media-endorsement-bullet {\n display: inline-block;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: #D9D9D9;\n margin: 0 4px;\n cursor: pointer;\n transition: background-color 0.3s ease;\n }\n .media-endorsement-bullet-active {\n background: var(--info-primary-color);\n }\n .media-endorsement-mobile-swiper .swiper-pagination {\n position: absolute;\n bottom: -28px;\n left: 0;\n right: 0;\n text-align: center;\n }\n `}</style>\n {/* \u6807\u9898\u533A\u57DF */}\n {(title || subtitle) && (\n <div className={cn('media-endorsement-header mb-6', classNames.header)}>\n {title && (\n <Heading as=\"h2\" size={4} html={title} className={cn('media-endorsement-title', classNames.title)} />\n )}\n {subtitle && <Text as=\"p\" size={3} className={cn('', classNames?.subtitle)} html={subtitle} />}\n </div>\n )}\n {layout === 'carousel' ? (\n <Swiper\n className={cn('media-endorsement-carousel', 'w-full !overflow-visible', classNames.carousel)}\n modules={[FreeMode, Mousewheel]}\n freeMode={true}\n mousewheel={{ forceToAxis: true }}\n slidesPerView=\"auto\"\n spaceBetween={12}\n breakpoints={{\n 768: { spaceBetween: 16 },\n }}\n >\n {items.map((item, index) => (\n <SwiperSlide key={index} className=\"tablet:!w-[320px] laptop:!w-[360px] desktop:!w-[404px] !w-[280px]\">\n {renderCard(item, index)}\n </SwiperSlide>\n ))}\n </Swiper>\n ) : isMobile ? (\n renderMobileGridSwiper()\n ) : (\n <div\n className={cn(\n 'media-endorsement-grid',\n 'laptop:grid-cols-2 laptop:gap-4 desktop:grid-cols-3 tablet:grid-cols-2 grid grid-cols-1 gap-3',\n classNames.grid\n )}\n >\n {items.map((item, index) => renderCard(item, index))}\n </div>\n )}\n </div>\n )\n }\n)\n\nMediaEndorsement.displayName = 'MediaEndorsement'\n\nexport default withLayout(MediaEndorsement)\nexport type { MediaEndorsementProps, MediaEndorsementData, MediaEndorsementItem, MediaEndorsementSemanticName }\n"],
5
- "mappings": "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",
6
- "names": ["jsx", "jsxs", "React", "cva", "Swiper", "SwiperSlide", "FreeMode", "Mousewheel", "Pagination", "useMediaQuery", "cn", "Heading", "Text", "withLayout", "MOBILE_ITEMS_PER_SLIDE", "chunkArray", "array", "size", "result", "i", "cardVariants", "MediaEndorsement", "className", "classNames", "data", "onItemClick", "props", "ref", "title", "subtitle", "items", "theme", "rounded", "layout", "isMobile", "handleCardClick", "item", "index", "event", "renderCard", "renderMobileGridSwiper", "chunkedItems", "group", "slideIndex", "itemIndex", "globalIndex", "MediaEndorsement_default"]
4
+ "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { cva } from 'class-variance-authority'\nimport { Swiper, SwiperSlide } from 'swiper/react'\nimport { FreeMode, Mousewheel, Pagination } from 'swiper/modules'\nimport { useMediaQuery } from 'react-responsive'\nimport 'swiper/css/pagination'\nimport { cn } from '../../helpers/index.js'\nimport type {\n MediaEndorsementProps,\n MediaEndorsementData,\n MediaEndorsementItem,\n MediaEndorsementSemanticName,\n} from './types.js'\nimport { Heading, Text } from '../../index.js'\nimport { withLayout } from '../../shared/Styles.js'\n\nconst MOBILE_ITEMS_PER_SLIDE = 3\n\n// Helper to chunk array into groups\nfunction chunkArray<T>(array: T[], size: number): T[][] {\n const result: T[][] = []\n for (let i = 0; i < array.length; i += size) {\n result.push(array.slice(i, i + size))\n }\n return result\n}\n\n/**\n * \u5361\u7247\u5BB9\u5668\u53D8\u4F53\n */\nconst cardVariants = cva(\n 'rounded-box lg-desktop:h-[240px] desktop:px-6 bg-container-secondary-0 flex h-[200px] flex-col justify-start gap-[26px] p-4',\n {\n variants: {\n theme: {\n light: '',\n dark: '',\n },\n rounded: {\n true: 'rounded-card',\n false: '',\n },\n },\n defaultVariants: {\n theme: 'light',\n rounded: false,\n },\n }\n)\n\n/**\n * MediaEndorsement - \u5A92\u4F53\u80CC\u4E66\n *\n * @description \u5A92\u4F53\u80CC\u4E66\u7EC4\u4EF6\u7684\u4F5C\u7528\u662F\u901A\u8FC7\u5C55\u793A\u7B2C\u4E09\u65B9\u5A92\u4F53\u7684\u8BC4\u4EF7\u6216\u62A5\u9053\uFF0C\u63D0\u5347\u54C1\u724C\u6216\u4EA7\u54C1\u7684\u53EF\u4FE1\u5EA6\u548C\u5F71\u54CD\u529B\n */\nconst MediaEndorsement = React.forwardRef<HTMLDivElement, MediaEndorsementProps>(\n ({ className, classNames = {}, data, onItemClick, ...props }, ref) => {\n const { title, subtitle, items, theme = 'light', rounded = false, layout = 'grid' } = data\n const isMobile = useMediaQuery({ query: '(max-width: 767px)' })\n\n const handleCardClick = React.useCallback(\n (item: MediaEndorsementItem, index: number) => (event: React.MouseEvent) => {\n onItemClick?.(item, index, event)\n },\n [onItemClick]\n )\n\n const renderCard = (item: MediaEndorsementItem, index: number) => (\n <div\n key={index}\n className={cn('media-endorsement-card text-info-primary', cardVariants({ theme, rounded }), classNames.card)}\n onClick={handleCardClick(item, index)}\n aria-label={item.mediaName ? `${item.mediaName} endorsement` : undefined}\n >\n {/* \u5A92\u4F53 Logo */}\n <div\n className={cn(\n 'media-endorsement-card-icon rounded-full',\n 'lg-desktop::h-14 flex h-12 w-auto items-center overflow-hidden',\n classNames.cardIcon\n )}\n >\n <img\n src={item.icon.url}\n alt={item.icon.alt || item.mediaName || 'Media logo'}\n className=\"lg-desktop::h-12 h-[42px] w-auto object-contain\"\n loading=\"lazy\"\n />\n </div>\n\n {/* \u5F15\u7528\u6587\u6848 */}\n <Heading size={2} as={'h6'} className={cn('media-endorsement-card-quote line-clamp-4', classNames.cardQuote)}>\n {item.text}\n </Heading>\n </div>\n )\n\n // Mobile swiper for grid layout\n const renderMobileGridSwiper = () => {\n const chunkedItems = chunkArray(items, MOBILE_ITEMS_PER_SLIDE)\n return (\n <Swiper\n className={cn('media-endorsement-mobile-swiper', 'w-full !overflow-visible pb-8', classNames.carousel)}\n modules={[Pagination]}\n slidesPerView={1}\n spaceBetween={12}\n pagination={{\n clickable: true,\n bulletClass: 'media-endorsement-bullet',\n bulletActiveClass: 'media-endorsement-bullet-active',\n }}\n >\n {chunkedItems.map((group, slideIndex) => (\n <SwiperSlide key={slideIndex} className=\"!h-auto\">\n <div className=\"flex flex-col gap-3\">\n {group.map((item, itemIndex) => {\n const globalIndex = slideIndex * MOBILE_ITEMS_PER_SLIDE + itemIndex\n return renderCard(item, globalIndex)\n })}\n </div>\n </SwiperSlide>\n ))}\n </Swiper>\n )\n }\n\n return (\n <div\n ref={ref}\n className={cn('media-endorsement-root text-info-primary', 'w-full', className, classNames.root, {\n 'aiui-dark': theme === 'dark',\n })}\n {...props}\n >\n <style>{`\n .media-endorsement-bullet {\n display: inline-block;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: #D9D9D9;\n margin: 0 4px;\n cursor: pointer;\n transition: background-color 0.3s ease;\n }\n .media-endorsement-bullet-active {\n background: var(--info-primary-color);\n }\n .media-endorsement-mobile-swiper .swiper-pagination {\n position: absolute;\n bottom: -28px;\n left: 0;\n right: 0;\n text-align: center;\n }\n `}</style>\n {/* \u6807\u9898\u533A\u57DF */}\n {(title || subtitle) && (\n <div className={cn('media-endorsement-header mb-6', classNames.header)}>\n {title && (\n <Heading as=\"h2\" size={4} html={title} className={cn('media-endorsement-title', classNames.title)} />\n )}\n {subtitle && <Text as=\"p\" size={3} className={cn('', classNames?.subtitle)} html={subtitle} />}\n </div>\n )}\n {layout === 'carousel' ? (\n <Swiper\n className={cn('media-endorsement-carousel', 'w-full !overflow-visible', classNames.carousel)}\n modules={[FreeMode, Mousewheel]}\n freeMode={true}\n mousewheel={{ forceToAxis: true }}\n slidesPerView=\"auto\"\n spaceBetween={12}\n breakpoints={{\n 768: { spaceBetween: 16 },\n }}\n >\n {items.map((item, index) => (\n <SwiperSlide key={index} className=\"tablet:!w-[320px] laptop:!w-[360px] desktop:!w-[404px] !w-[280px]\">\n {renderCard(item, index)}\n </SwiperSlide>\n ))}\n </Swiper>\n ) : isMobile ? (\n renderMobileGridSwiper()\n ) : (\n <div\n className={cn(\n 'media-endorsement-grid',\n 'laptop:grid-cols-2 laptop:gap-4 desktop:grid-cols-3 tablet:grid-cols-2 grid grid-cols-1 gap-3',\n classNames.grid\n )}\n >\n {items.map((item, index) => renderCard(item, index))}\n </div>\n )}\n </div>\n )\n }\n)\n\nMediaEndorsement.displayName = 'MediaEndorsement'\n\nexport default withLayout(MediaEndorsement)\nexport type { MediaEndorsementProps, MediaEndorsementData, MediaEndorsementItem, MediaEndorsementSemanticName }\n"],
5
+ "mappings": "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",
6
+ "names": ["jsx", "jsxs", "React", "cva", "Swiper", "SwiperSlide", "FreeMode", "Mousewheel", "Pagination", "useMediaQuery", "cn", "Heading", "Text", "withLayout", "MOBILE_ITEMS_PER_SLIDE", "chunkArray", "array", "size", "result", "cardVariants", "MediaEndorsement", "className", "classNames", "data", "onItemClick", "props", "ref", "title", "subtitle", "items", "theme", "rounded", "layout", "isMobile", "handleCardClick", "item", "index", "event", "renderCard", "renderMobileGridSwiper", "chunkedItems", "group", "slideIndex", "itemIndex", "globalIndex", "MediaEndorsement_default"]
7
7
  }
@@ -114,5 +114,5 @@ export interface MediaShelfComponent extends React.ForwardRefExoticComponent<Med
114
114
  /** 独立的 ProductCard 组件 */
115
115
  ProductCard: typeof ProductCard;
116
116
  }
117
- declare const MediaShelfWithProductCard: MediaShelfComponent;
118
- export default MediaShelfWithProductCard;
117
+ declare const MediaShelfWrapped: any;
118
+ export default MediaShelfWrapped;
@@ -1,2 +1,2 @@
1
- "use client";import{jsx as t,jsxs as m}from"react/jsx-runtime";import*as i from"react";import{cn as h}from"../../helpers/index.js";import{Text as z,Heading as A,Tabs as O,TabsList as $,TabsTrigger as I,TabsContent as W}from"../../components/index.js";import{Swiper as j,SwiperSlide as q}from"swiper/react";import{Navigation as Z}from"swiper/modules";import"swiper/css";import"swiper/css/navigation";import F from"./ProductCard.js";import{useExposure as _}from"../../hooks/useExposure.js";const G="shelf",J="media_shelf",K=({disabled:o})=>m("svg",{width:"56",height:"56",viewBox:"0 0 56 56",fill:"none",xmlns:"http://www.w3.org/2000/svg",className:"text-info-primary laptop:block lg-desktop:size-[56px] hidden size-[40px]",children:[t("path",{d:"M0 28C0 43.464 12.536 56 28 56C43.464 56 56 43.464 56 28C56 12.536 43.464 0 28 0C12.536 0 0 12.536 0 28Z",fill:"currentColor",fillOpacity:o?"0.2":"0.6"}),t("path",{d:"M31 22L25 28L31 34",stroke:"white",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})]}),Q=({disabled:o})=>m("svg",{width:"56",height:"56",viewBox:"0 0 56 56",fill:"none",xmlns:"http://www.w3.org/2000/svg",className:"text-info-primary laptop:block lg-desktop:size-[56px] hidden size-[40px]",children:[t("path",{d:"M0 28C0 12.536 12.536 0 28 0C43.464 0 56 12.536 56 28C56 43.464 43.464 56 28 56C12.536 56 0 43.464 0 28Z",fill:"currentColor",fillOpacity:o?"0.2":"0.6"}),t("path",{d:"M25 22L31 28L25 34",stroke:"white",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})]}),H=i.createContext(null),U=()=>{const o=i.useContext(H);if(!o)throw new Error("useMediaShelfContext must be used within an MediaShelfProvider");return o},E=i.forwardRef(({products:o,className:n},T)=>{const{copy:d,stockDisplayMode:x,stockThresholdValue:r,onLearnMore:M,onShopNow:S,onAddToCart:c,classNames:v,secondaryButtonText:B,primaryButtonText:P,secondaryButtonFun:k,primaryButtonFun:D,showOriginalPrice:L,showTags:N}=U(),f=i.useId().replace(/:/g,""),g=`swiper-button-next-custom-${f}`,b=`swiper-button-prev-custom-${f}`,[l,C]=i.useState({isBeginning:!0,isEnd:!1}),w=i.useRef(null),u=i.useCallback(()=>{const e=w.current;if(!e?.slides||e.slides.length===0)return;e.slides.forEach(a=>{a.style.height="auto"});const p=Array.from(e.slides).map(a=>a.scrollHeight),y=Math.max(...p);y>0&&e.slides.forEach(a=>{a.style.height=`${y}px`})},[]);return i.useEffect(()=>{const e=()=>{requestAnimationFrame(u)};return window.addEventListener("resize",e),()=>window.removeEventListener("resize",e)},[u]),o?.length===0?null:t("div",{ref:T,className:n,children:m("div",{className:"relative",children:[t(j,{modules:[Z],spaceBetween:16,slidesPerView:"auto",navigation:{nextEl:`.${g}`,prevEl:`.${b}`},onSwiper:e=>{w.current=e,C({isBeginning:e.isBeginning,isEnd:e.isEnd}),setTimeout(u,100)},onSlideChange:e=>{C({isBeginning:e.isBeginning,isEnd:e.isEnd})},className:"!overflow-visible",breakpoints:{0:{spaceBetween:12,slidesPerView:1.2},768:{spaceBetween:12,slidesPerView:o.length<=2?2:2.3},1024:{spaceBetween:16,slidesPerView:Math.min(3,o.length)}},children:o.map((e,p)=>t(q,{className:"tablet:!max-w-[50%] overflow-hidden",children:t(F,{product:e,className:"box-border w-full max-w-full",stockDisplayMode:x,stockThresholdValue:r,onLearnMore:M,onShopNow:S,onAddToCart:c,classNames:v,secondaryButtonText:B,primaryButtonText:P,secondaryButtonFun:k,primaryButtonFun:D,showOriginalPrice:L,copy:d,showTags:N})},e.shopify_id+"-"+e.sku||p))}),t("button",{className:h(`${b} tablet:block absolute left-4 top-1/2 z-10 hidden -translate-y-1/2`,{"tablet:hidden":o.length<=2,"laptop:hidden":o.length<=3}),"aria-label":d?.previousSlideLabel,disabled:l.isBeginning,children:t(K,{disabled:l.isBeginning})}),t("button",{className:h(`${g} tablet:block absolute right-4 top-1/2 z-10 hidden -translate-y-1/2`,{"tablet:hidden":o.length<=2,"laptop:hidden":o.length<=3}),"aria-label":d?.nextSlideLabel,disabled:l.isEnd,children:t(Q,{disabled:l.isEnd})})]})})});E.displayName="ProductsList";const R=i.forwardRef(({className:o,data:n,onLearnMore:T,onShopNow:d,onAddToCart:x,classNames:r,...M},S)=>{const c=i.useRef(null);_(c,{componentType:G,componentName:J,componentTitle:n.title,componentDescription:n.description}),i.useImperativeHandle(S,()=>c.current);const{theme:v="light",codeChannel:B,showMemberPrice:P=!0,showDiscount:k=!0,showTags:D=!0,stockDisplayMode:L,stockThresholdValue:N,showOriginalPrice:f=!0,secondaryButtonText:g,primaryButtonText:b,secondaryButtonFun:l,primaryButtonFun:C,isShowTab:w=!0,copy:u}=n,p={codeChannel:B,showMemberPrice:P,showDiscount:k,showTags:D,stockDisplayMode:L,stockThresholdValue:N,showOriginalPrice:f,onLearnMore:T,onShopNow:d,onAddToCart:x,classNames:r,secondaryButtonText:g,secondaryButtonFun:l,primaryButtonText:b,primaryButtonFun:C,copy:u||{}},y=n.productsTab&&n.productsTab.length>0,a=w&&y;return t(H.Provider,{value:p,children:m("div",{ref:c,className:h("w-full",{"aiui-dark":v==="dark"},o,r?.root),...M,children:[n.title&&t(A,{as:"h2",html:n.title,size:4,className:h("text-info-primary mb-4",r?.title)}),n.description&&t(z,{size:3,as:"p",html:n.description,className:h("text-info-primary mb-6",r?.description)}),m(O,{defaultValue:n.productsTab?.[0]?.id,className:"w-full",children:[a&&t($,{className:"mb-6",children:n.productsTab?.map(s=>t(I,{value:s.id,children:s.tab},"tab-"+s.id))}),a?n.productsTab?.map(s=>t(W,{value:s.id,children:t(E,{products:s.data})},"tab-content-"+s.id)):t(E,{products:n.productsCard})]})]})})});R.displayName="MediaShelf";const V=R;V.ProductCard=F;var se=V;export{se as default,U as useMediaShelfContext};
1
+ "use client";import{jsx as t,jsxs as m}from"react/jsx-runtime";import*as i from"react";import{cn as h}from"../../helpers/index.js";import{withLayout as z}from"../../shared/Styles.js";import{Text as A,Heading as O,Tabs as $,TabsList as I,TabsTrigger as W,TabsContent as j}from"../../components/index.js";import{Swiper as q,SwiperSlide as Z}from"swiper/react";import{Navigation as _}from"swiper/modules";import"swiper/css";import"swiper/css/navigation";import F from"./ProductCard.js";import{useExposure as G}from"../../hooks/useExposure.js";const J="shelf",K="media_shelf",Q=({disabled:o})=>m("svg",{width:"56",height:"56",viewBox:"0 0 56 56",fill:"none",xmlns:"http://www.w3.org/2000/svg",className:"text-info-primary laptop:block lg-desktop:size-[56px] hidden size-[40px]",children:[t("path",{d:"M0 28C0 43.464 12.536 56 28 56C43.464 56 56 43.464 56 28C56 12.536 43.464 0 28 0C12.536 0 0 12.536 0 28Z",fill:"currentColor",fillOpacity:o?"0.2":"0.6"}),t("path",{d:"M31 22L25 28L31 34",stroke:"white",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})]}),U=({disabled:o})=>m("svg",{width:"56",height:"56",viewBox:"0 0 56 56",fill:"none",xmlns:"http://www.w3.org/2000/svg",className:"text-info-primary laptop:block lg-desktop:size-[56px] hidden size-[40px]",children:[t("path",{d:"M0 28C0 12.536 12.536 0 28 0C43.464 0 56 12.536 56 28C56 43.464 43.464 56 28 56C12.536 56 0 43.464 0 28Z",fill:"currentColor",fillOpacity:o?"0.2":"0.6"}),t("path",{d:"M25 22L31 28L25 34",stroke:"white",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})]}),H=i.createContext(null),X=()=>{const o=i.useContext(H);if(!o)throw new Error("useMediaShelfContext must be used within an MediaShelfProvider");return o},E=i.forwardRef(({products:o,className:n},T)=>{const{copy:d,stockDisplayMode:x,stockThresholdValue:r,onLearnMore:M,onShopNow:S,onAddToCart:c,classNames:v,secondaryButtonText:B,primaryButtonText:P,secondaryButtonFun:k,primaryButtonFun:D,showOriginalPrice:L,showTags:N}=X(),f=i.useId().replace(/:/g,""),g=`swiper-button-next-custom-${f}`,b=`swiper-button-prev-custom-${f}`,[l,C]=i.useState({isBeginning:!0,isEnd:!1}),w=i.useRef(null),u=i.useCallback(()=>{const e=w.current;if(!e?.slides||e.slides.length===0)return;e.slides.forEach(a=>{a.style.height="auto"});const p=Array.from(e.slides).map(a=>a.scrollHeight),y=Math.max(...p);y>0&&e.slides.forEach(a=>{a.style.height=`${y}px`})},[]);return i.useEffect(()=>{const e=()=>{requestAnimationFrame(u)};return window.addEventListener("resize",e),()=>window.removeEventListener("resize",e)},[u]),o?.length===0?null:t("div",{ref:T,className:n,children:m("div",{className:"relative",children:[t(q,{modules:[_],spaceBetween:16,slidesPerView:"auto",navigation:{nextEl:`.${g}`,prevEl:`.${b}`},onSwiper:e=>{w.current=e,C({isBeginning:e.isBeginning,isEnd:e.isEnd}),setTimeout(u,100)},onSlideChange:e=>{C({isBeginning:e.isBeginning,isEnd:e.isEnd})},className:"!overflow-visible",breakpoints:{0:{spaceBetween:12,slidesPerView:1.2},768:{spaceBetween:12,slidesPerView:o.length<=2?2:2.3},1024:{spaceBetween:16,slidesPerView:Math.min(3,o.length)}},children:o.map((e,p)=>t(Z,{className:"tablet:!max-w-[50%] overflow-hidden",children:t(F,{product:e,className:"box-border w-full max-w-full",stockDisplayMode:x,stockThresholdValue:r,onLearnMore:M,onShopNow:S,onAddToCart:c,classNames:v,secondaryButtonText:B,primaryButtonText:P,secondaryButtonFun:k,primaryButtonFun:D,showOriginalPrice:L,copy:d,showTags:N})},e.shopify_id+"-"+e.sku||p))}),t("button",{className:h(`${b} tablet:block absolute left-4 top-1/2 z-10 hidden -translate-y-1/2`,{"tablet:hidden":o.length<=2,"laptop:hidden":o.length<=3}),"aria-label":d?.previousSlideLabel,disabled:l.isBeginning,children:t(Q,{disabled:l.isBeginning})}),t("button",{className:h(`${g} tablet:block absolute right-4 top-1/2 z-10 hidden -translate-y-1/2`,{"tablet:hidden":o.length<=2,"laptop:hidden":o.length<=3}),"aria-label":d?.nextSlideLabel,disabled:l.isEnd,children:t(U,{disabled:l.isEnd})})]})})});E.displayName="ProductsList";const R=i.forwardRef(({className:o,data:n,onLearnMore:T,onShopNow:d,onAddToCart:x,classNames:r,...M},S)=>{const c=i.useRef(null);G(c,{componentType:J,componentName:K,componentTitle:n.title,componentDescription:n.description}),i.useImperativeHandle(S,()=>c.current);const{theme:v="light",codeChannel:B,showMemberPrice:P=!0,showDiscount:k=!0,showTags:D=!0,stockDisplayMode:L,stockThresholdValue:N,showOriginalPrice:f=!0,secondaryButtonText:g,primaryButtonText:b,secondaryButtonFun:l,primaryButtonFun:C,isShowTab:w=!0,copy:u}=n,p={codeChannel:B,showMemberPrice:P,showDiscount:k,showTags:D,stockDisplayMode:L,stockThresholdValue:N,showOriginalPrice:f,onLearnMore:T,onShopNow:d,onAddToCart:x,classNames:r,secondaryButtonText:g,secondaryButtonFun:l,primaryButtonText:b,primaryButtonFun:C,copy:u||{}},y=n.productsTab&&n.productsTab.length>0,a=w&&y;return t(H.Provider,{value:p,children:m("div",{ref:c,className:h("w-full",{"aiui-dark":v==="dark"},o,r?.root),...M,children:[n.title&&t(O,{as:"h2",html:n.title,size:4,className:h("text-info-primary mb-4",r?.title)}),n.description&&t(A,{size:3,as:"p",html:n.description,className:h("text-info-primary mb-6",r?.description)}),m($,{defaultValue:n.productsTab?.[0]?.id,className:"w-full",children:[a&&t(I,{className:"mb-6",children:n.productsTab?.map(s=>t(W,{value:s.id,children:s.tab},"tab-"+s.id))}),a?n.productsTab?.map(s=>t(j,{value:s.id,children:t(E,{products:s.data})},"tab-content-"+s.id)):t(E,{products:n.productsCard})]})]})})});R.displayName="MediaShelf";const V=R;V.ProductCard=F;const Y=z(V);var de=Y;export{de as default,X as useMediaShelfContext};
2
2
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/biz-components/MediaShelf/index.tsx"],
4
- "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { cn } from '../../helpers/index.js'\nimport { Text, Heading, Tabs, TabsList, TabsTrigger, TabsContent } from '../../components/index.js'\n\nimport { Swiper, SwiperSlide } from 'swiper/react'\nimport { Navigation } from 'swiper/modules'\n\n// Import Swiper styles\nimport 'swiper/css'\nimport 'swiper/css/navigation'\nimport type {\n ButtonFunctionType,\n CopyConfig,\n ProductCardData,\n ProductTab,\n StockDisplayMode,\n MediaShelfSemanticName,\n} from './types.js'\nimport ProductCard from './ProductCard.js'\nimport { useExposure } from '../../hooks/useExposure.js'\n\nconst componentType = 'shelf'\nconst componentName = 'media_shelf'\n\nconst PrevIcon = ({ disabled }: { disabled: boolean }) => (\n <svg\n width=\"56\"\n height=\"56\"\n viewBox=\"0 0 56 56\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"text-info-primary laptop:block lg-desktop:size-[56px] hidden size-[40px]\"\n >\n <path\n d=\"M0 28C0 43.464 12.536 56 28 56C43.464 56 56 43.464 56 28C56 12.536 43.464 0 28 0C12.536 0 0 12.536 0 28Z\"\n fill=\"currentColor\"\n fillOpacity={disabled ? '0.2' : '0.6'}\n />\n <path d=\"M31 22L25 28L31 34\" stroke=\"white\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n)\n\nconst NextIcon = ({ disabled }: { disabled: boolean }) => (\n <svg\n width=\"56\"\n height=\"56\"\n viewBox=\"0 0 56 56\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"text-info-primary laptop:block lg-desktop:size-[56px] hidden size-[40px]\"\n >\n <path\n d=\"M0 28C0 12.536 12.536 0 28 0C43.464 0 56 12.536 56 28C56 43.464 43.464 56 28 56C12.536 56 0 43.464 0 28Z\"\n fill=\"currentColor\"\n fillOpacity={disabled ? '0.2' : '0.6'}\n />\n <path d=\"M25 22L31 28L25 34\" stroke=\"white\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n)\n\n/**\n * Code Channel \u914D\u7F6E - \u6298\u6263\u524D\u7F00\n */\nexport type CodeChannelConfig = string\n\n/**\n * MediaShelf Context \u914D\u7F6E\u63A5\u53E3\n */\nexport interface MediaShelfContextConfig {\n /** Code Channel \u914D\u7F6E - \u6298\u6263\u524D\u7F00 */\n codeChannel?: CodeChannelConfig\n /** \u662F\u5426\u5C55\u793A\u4F1A\u5458\u4EF7\u683C */\n showMemberPrice?: boolean\n /** \u662F\u5426\u5C55\u793A\u6298\u6263\u6807\u7B7E */\n showDiscount?: boolean\n /** \u662F\u5426\u5C55\u793A\u6807\u7B7E\u7CFB\u7EDF */\n showTags?: boolean\n /** \u5E93\u5B58\u5C55\u793A\u6A21\u5F0F */\n stockDisplayMode?: StockDisplayMode\n /** \u5E93\u5B58\u9608\u503C\uFF08\u5F53\u6A21\u5F0F\u4E3A below-quantity \u6216 below-percentage \u65F6\u4F7F\u7528\uFF09 */\n stockThresholdValue?: number\n /** \u662F\u5426\u5C55\u793A\u539F\u4EF7\uFF08\u5220\u9664\u7EBF\u4EF7\u683C\uFF09 */\n showOriginalPrice?: boolean\n /** \u7528\u6237\u72B6\u6001 */\n}\n\n/**\n * MediaShelf Context \u503C\u63A5\u53E3\n */\ninterface MediaShelfContextValue extends MediaShelfContextConfig {\n /** \u70B9\u51FB\u4E86\u89E3\u66F4\u591A\u56DE\u8C03 */\n onLearnMore?: (product: ProductCardData) => void\n /** \u70B9\u51FB\u7ACB\u5373\u8D2D\u4E70\u56DE\u8C03 */\n onShopNow?: (product: ProductCardData) => void\n /** \u70B9\u51FB\u52A0\u5165\u8D2D\u7269\u8F66\u56DE\u8C03 */\n onAddToCart?: (product: ProductCardData) => void\n /** \u8BED\u4E49\u5316\u7C7B\u540D */\n classNames?: Partial<Record<MediaShelfSemanticName, string>>\n /** \u4E86\u89E3\u66F4\u591A\u6309\u94AE\u6587\u672C */\n secondaryButtonText?: string\n secondaryButtonFun?: ButtonFunctionType\n /** \u7ACB\u5373\u8D2D\u4E70\u6309\u94AE\u6587\u672C */\n primaryButtonText?: string\n primaryButtonFun?: ButtonFunctionType\n /** \u6587\u6848\u914D\u7F6E */\n copy: CopyConfig\n}\n\n/**\n * MediaShelf Context\n */\nconst MediaShelfContext = React.createContext<MediaShelfContextValue | null>(null)\n\n/**\n * \u4F7F\u7528 MediaShelf Context \u7684 Hook\n */\nexport const useMediaShelfContext = () => {\n const context = React.useContext(MediaShelfContext)\n if (!context) {\n throw new Error('useMediaShelfContext must be used within an MediaShelfProvider')\n }\n return context\n}\n\n/**\n * MediaShelf \u4E1A\u52A1\u7EC4\u4EF6\u6570\u636E\u63A5\u53E3\n */\nexport interface MediaShelfData {\n theme?: 'light' | 'dark'\n /** \u7EC4\u4EF6\u6807\u9898 */\n title?: string\n /** \u7EC4\u4EF6\u63CF\u8FF0 */\n description?: string\n /** \u5206\u7EC4\u4EA7\u54C1Tab\u5217\u8868 */\n productsTab?: ProductTab[]\n /** \u662F\u5426\u663E\u793A Tab\uFF08\u9ED8\u8BA4\uFF1Atrue\uFF09 */\n isShowTab?: boolean\n /** \u4E86\u89E3\u66F4\u591A\u6309\u94AE\u6587\u672C */\n secondaryButtonText?: string\n secondaryButtonFun: ButtonFunctionType\n /** \u7ACB\u5373\u8D2D\u4E70\u6309\u94AE\u6587\u672C */\n primaryButtonText?: string\n primaryButtonFun: ButtonFunctionType\n /** Code Channel \u914D\u7F6E - \u6298\u6263\u524D\u7F00 */\n codeChannel?: CodeChannelConfig\n /** \u662F\u5426\u5C55\u793A\u4F1A\u5458\u4EF7\u683C */\n showMemberPrice?: boolean\n /** \u662F\u5426\u5C55\u793A\u6298\u6263\u6807\u7B7E */\n showDiscount?: boolean\n /** \u662F\u5426\u5C55\u793A\u6807\u7B7E\u7CFB\u7EDF */\n showTags?: boolean\n /** \u5E93\u5B58\u5C55\u793A\u6A21\u5F0F */\n stockDisplayMode?: StockDisplayMode\n /** \u5E93\u5B58\u9608\u503C\uFF08\u5F53\u6A21\u5F0F\u4E3A below-quantity \u6216 below-percentage \u65F6\u4F7F\u7528\uFF09 */\n stockThresholdValue?: number\n /**\n * \u5E93\u5B58\u6587\u672C\u6A21\u677F\uFF0C\u652F\u6301 {count} \u5360\u4F4D\u7B26\n */\n stockDisplayText?: string\n /** \u662F\u5426\u5C55\u793A\u539F\u4EF7\uFF08\u5220\u9664\u7EBF\u4EF7\u683C\uFF09 */\n showOriginalPrice?: boolean\n /** \u6587\u6848\u914D\u7F6E */\n copy?: CopyConfig\n /**\n * \u4EA7\u54C1\u5217\u8868\uFF08\u5F53\u4E0D\u4F7F\u7528 Tab \u5206\u7EC4\u65F6\u53EF\u76F4\u63A5\u4F20\u5165\u4EA7\u54C1\u5217\u8868\uFF09\n */\n productsCard: ProductCardData[]\n}\n\nexport interface MediaShelfProps extends React.HTMLAttributes<HTMLDivElement> {\n /** \u4E1A\u52A1\u6570\u636E */\n data: MediaShelfData\n /** \u70B9\u51FB\u4E86\u89E3\u66F4\u591A\u56DE\u8C03 */\n onLearnMore?: (product: ProductCardData) => void\n /** \u70B9\u51FB\u7ACB\u5373\u8D2D\u4E70\u56DE\u8C03 */\n onShopNow?: (product: ProductCardData) => void\n /** \u70B9\u51FB\u52A0\u5165\u8D2D\u7269\u8F66\u56DE\u8C03 */\n onAddToCart?: (product: ProductCardData) => void\n /** \u8BED\u4E49\u5316\u7C7B\u540D */\n classNames?: Partial<Record<MediaShelfSemanticName, string>>\n}\n\n/**\n * MediaShelf \u590D\u5408\u7EC4\u4EF6\u7C7B\u578B\u5B9A\u4E49\n */\nexport interface MediaShelfComponent extends React.ForwardRefExoticComponent<\n MediaShelfProps & React.RefAttributes<HTMLDivElement>\n> {\n /** \u72EC\u7ACB\u7684 ProductCard \u7EC4\u4EF6 */\n ProductCard: typeof ProductCard\n}\n\n/**\n * \u4EA7\u54C1\u5217\u8868\u7EC4\u4EF6 - \u4F7F\u7528 Swiper \u6A2A\u5411\u6ED1\u52A8\u5E03\u5C40\n */\nconst ProductsList = React.forwardRef<\n HTMLDivElement,\n {\n products: ProductCardData[]\n className?: string\n }\n>(({ products, className }, ref) => {\n const {\n copy,\n stockDisplayMode,\n stockThresholdValue,\n onLearnMore,\n onShopNow,\n onAddToCart,\n classNames,\n secondaryButtonText,\n primaryButtonText,\n secondaryButtonFun,\n primaryButtonFun,\n showOriginalPrice,\n showTags,\n } = useMediaShelfContext()\n // \u751F\u6210\u552F\u4E00 ID\uFF0C\u79FB\u9664\u7279\u6B8A\u5B57\u7B26\u4EE5\u786E\u4FDD\u53EF\u7528\u4E8E CSS \u9009\u62E9\u5668\n const id = React.useId().replace(/:/g, '')\n // \u9884\u5B9A\u4E49\u5BFC\u822A\u6309\u94AE\u9009\u62E9\u5668\uFF0C\u907F\u514D\u591A\u6B21\u62FC\u63A5\n const nextButtonClass = `swiper-button-next-custom-${id}`\n const prevButtonClass = `swiper-button-prev-custom-${id}`\n\n // Swiper \u5BFC\u822A\u72B6\u6001\n const [swiperState, setSwiperState] = React.useState({\n isBeginning: true,\n isEnd: false,\n })\n\n // Swiper \u5B9E\u4F8B\u5F15\u7528\n const swiperRef = React.useRef<any>(null)\n\n // \u8BA1\u7B97\u5E76\u8BBE\u7F6E\u6240\u6709 slide \u4E3A\u6700\u9AD8\u9AD8\u5EA6\n const equalizeSlideHeights = React.useCallback(() => {\n const swiper = swiperRef.current\n if (!swiper?.slides || swiper.slides.length === 0) return\n\n // \u5148\u91CD\u7F6E\u6240\u6709 slide \u9AD8\u5EA6\u4EE5\u83B7\u53D6\u771F\u5B9E\u5185\u5BB9\u9AD8\u5EA6\n swiper.slides.forEach((slide: HTMLElement) => {\n slide.style.height = 'auto'\n })\n\n // \u8BA1\u7B97\u6700\u5927\u9AD8\u5EA6\n // @ts-ignore\n const heights = Array.from(swiper.slides).map((slide: HTMLElement) => slide.scrollHeight)\n const maxHeight = Math.max(...heights)\n\n // \u8BBE\u7F6E\u6240\u6709 slide \u4E3A\u6700\u5927\u9AD8\u5EA6\n if (maxHeight > 0) {\n swiper.slides.forEach((slide: HTMLElement) => {\n slide.style.height = `${maxHeight}px`\n })\n }\n }, [])\n\n // \u76D1\u542C\u7A97\u53E3 resize \u91CD\u65B0\u8BA1\u7B97\u9AD8\u5EA6\n React.useEffect(() => {\n const handleResize = () => {\n // \u4F7F\u7528 requestAnimationFrame \u786E\u4FDD DOM \u66F4\u65B0\u5B8C\u6210\n requestAnimationFrame(equalizeSlideHeights)\n }\n\n window.addEventListener('resize', handleResize)\n return () => window.removeEventListener('resize', handleResize)\n }, [equalizeSlideHeights])\n\n if (products?.length === 0) {\n return null\n }\n\n return (\n <div ref={ref} className={className}>\n {/* Swiper \u6A2A\u5411\u6ED1\u52A8\u5E03\u5C40 */}\n <div className=\"relative\">\n <Swiper\n modules={[Navigation]}\n spaceBetween={16}\n slidesPerView=\"auto\"\n navigation={{\n nextEl: `.${nextButtonClass}`,\n prevEl: `.${prevButtonClass}`,\n }}\n onSwiper={swiper => {\n swiperRef.current = swiper\n setSwiperState({\n isBeginning: swiper.isBeginning,\n isEnd: swiper.isEnd,\n })\n // \u5EF6\u8FDF\u6267\u884C\u4EE5\u786E\u4FDD\u5185\u5BB9\u6E32\u67D3\u5B8C\u6210\n setTimeout(equalizeSlideHeights, 100)\n }}\n onSlideChange={swiper => {\n setSwiperState({\n isBeginning: swiper.isBeginning,\n isEnd: swiper.isEnd,\n })\n }}\n className=\"!overflow-visible\"\n breakpoints={{\n 0: {\n spaceBetween: 12,\n slidesPerView: 1.2,\n },\n 768: {\n spaceBetween: 12,\n slidesPerView: products.length <= 2 ? 2 : 2.3,\n },\n 1024: {\n spaceBetween: 16,\n slidesPerView: Math.min(3, products.length),\n },\n }}\n >\n {products.map((product, index) => (\n <SwiperSlide\n key={product.shopify_id + '-' + product.sku || index}\n className=\"tablet:!max-w-[50%] overflow-hidden\"\n >\n <ProductCard\n product={product}\n className=\"box-border w-full max-w-full\"\n stockDisplayMode={stockDisplayMode}\n stockThresholdValue={stockThresholdValue}\n onLearnMore={onLearnMore}\n onShopNow={onShopNow}\n onAddToCart={onAddToCart}\n classNames={classNames}\n secondaryButtonText={secondaryButtonText}\n primaryButtonText={primaryButtonText}\n secondaryButtonFun={secondaryButtonFun}\n primaryButtonFun={primaryButtonFun}\n showOriginalPrice={showOriginalPrice}\n copy={copy}\n showTags={showTags}\n />\n </SwiperSlide>\n ))}\n </Swiper>\n\n {/* \u81EA\u5B9A\u4E49\u5BFC\u822A\u6309\u94AE */}\n <button\n className={cn(`${prevButtonClass} tablet:block absolute left-4 top-1/2 z-10 hidden -translate-y-1/2`, {\n 'tablet:hidden': products.length <= 2,\n 'laptop:hidden': products.length <= 3,\n })}\n aria-label={copy?.previousSlideLabel}\n disabled={swiperState.isBeginning}\n >\n <PrevIcon disabled={swiperState.isBeginning} />\n </button>\n <button\n className={cn(`${nextButtonClass} tablet:block absolute right-4 top-1/2 z-10 hidden -translate-y-1/2`, {\n 'tablet:hidden': products.length <= 2,\n 'laptop:hidden': products.length <= 3,\n })}\n aria-label={copy?.nextSlideLabel}\n disabled={swiperState.isEnd}\n >\n <NextIcon disabled={swiperState.isEnd} />\n </button>\n </div>\n </div>\n )\n})\n\nProductsList.displayName = 'ProductsList'\n\n/**\n * MediaShelf - \u5A92\u4F53\u8D27\u67B6\n *\n * @description \u80FD\u591F\u5B9E\u65F6\u663E\u793A\u5546\u54C1\u5E93\u5B58\u4FE1\u606F\u548C\u4F1A\u5458\u4EF7\u7684\u8D27\u67B6\uFF0C\u652F\u6301\u54CD\u5E94\u5F0F\u5E03\u5C40\u548C\u591A\u79CD\u914D\u7F6E\u9009\u9879\n */\nconst MediaShelf = React.forwardRef<HTMLDivElement, MediaShelfProps>(\n ({ className, data, onLearnMore, onShopNow, onAddToCart, classNames, ...props }, ref) => {\n const boxRef = React.useRef<HTMLDivElement>(null)\n\n useExposure(boxRef, {\n componentType,\n componentName,\n componentTitle: data.title,\n componentDescription: data.description,\n })\n\n React.useImperativeHandle(ref, () => boxRef.current as HTMLDivElement)\n\n // \u4ECE data \u4E2D\u89E3\u6784\u914D\u7F6E\u9879\uFF0C\u5E76\u8BBE\u7F6E\u9ED8\u8BA4\u503C\n const {\n theme = 'light',\n codeChannel,\n showMemberPrice = true,\n showDiscount = true,\n showTags = true,\n stockDisplayMode,\n stockThresholdValue,\n showOriginalPrice = true,\n secondaryButtonText,\n primaryButtonText,\n secondaryButtonFun,\n primaryButtonFun,\n isShowTab = true,\n copy,\n } = data\n\n // \u6784\u5EFA copy \u914D\u7F6E\uFF0C\u4F7F\u7528\u4F20\u5165\u7684 copy \u914D\u7F6E\n const finalCopy: CopyConfig = copy || {}\n\n // \u6784\u5EFA Context \u503C\n const contextValue: MediaShelfContextValue = {\n codeChannel,\n showMemberPrice,\n showDiscount,\n showTags,\n stockDisplayMode,\n stockThresholdValue,\n showOriginalPrice,\n onLearnMore,\n onShopNow,\n onAddToCart,\n classNames,\n secondaryButtonText,\n secondaryButtonFun,\n primaryButtonText,\n primaryButtonFun,\n copy: finalCopy,\n }\n\n // \u83B7\u53D6\u8981\u663E\u793A\u7684\u4EA7\u54C1\u6570\u636E\n const hasTabData = data.productsTab && data.productsTab.length > 0\n const shouldShowTab = isShowTab && hasTabData\n\n return (\n <MediaShelfContext.Provider value={contextValue}>\n <div\n ref={boxRef}\n className={cn(\n 'w-full',\n {\n 'aiui-dark': theme === 'dark',\n },\n className,\n classNames?.root\n )}\n {...props}\n >\n {/* \u6807\u9898\u533A\u57DF */}\n {data.title && (\n <Heading as=\"h2\" html={data.title} size={4} className={cn('text-info-primary mb-4', classNames?.title)} />\n )}\n {data.description && (\n <Text\n size={3}\n as=\"p\"\n html={data.description}\n className={cn('text-info-primary mb-6', classNames?.description)}\n />\n )}\n\n {/* \u4EA7\u54C1\u5C55\u793A\u533A\u57DF */}\n\n <Tabs defaultValue={data.productsTab?.[0]?.id} className=\"w-full\">\n {shouldShowTab && (\n <TabsList className=\"mb-6\">\n {data.productsTab?.map(tab => (\n <TabsTrigger key={'tab-' + tab.id} value={tab.id}>\n {tab.tab}\n </TabsTrigger>\n ))}\n </TabsList>\n )}\n {shouldShowTab ? (\n data.productsTab?.map(tab => (\n <TabsContent key={'tab-content-' + tab.id} value={tab.id}>\n <ProductsList products={tab.data} />\n </TabsContent>\n ))\n ) : (\n <ProductsList products={data.productsCard} />\n )}\n </Tabs>\n </div>\n </MediaShelfContext.Provider>\n )\n }\n)\n\nMediaShelf.displayName = 'MediaShelf'\n\n// \u521B\u5EFA\u590D\u5408\u7EC4\u4EF6\nconst MediaShelfWithProductCard = MediaShelf as MediaShelfComponent\nMediaShelfWithProductCard.ProductCard = ProductCard\n\nexport default MediaShelfWithProductCard\n"],
5
- "mappings": "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",
6
- "names": ["jsx", "jsxs", "React", "cn", "Text", "Heading", "Tabs", "TabsList", "TabsTrigger", "TabsContent", "Swiper", "SwiperSlide", "Navigation", "ProductCard", "useExposure", "componentType", "componentName", "PrevIcon", "disabled", "NextIcon", "MediaShelfContext", "useMediaShelfContext", "context", "ProductsList", "products", "className", "ref", "copy", "stockDisplayMode", "stockThresholdValue", "onLearnMore", "onShopNow", "onAddToCart", "classNames", "secondaryButtonText", "primaryButtonText", "secondaryButtonFun", "primaryButtonFun", "showOriginalPrice", "showTags", "id", "nextButtonClass", "prevButtonClass", "swiperState", "setSwiperState", "swiperRef", "equalizeSlideHeights", "swiper", "slide", "heights", "maxHeight", "handleResize", "product", "index", "MediaShelf", "data", "props", "boxRef", "theme", "codeChannel", "showMemberPrice", "showDiscount", "isShowTab", "contextValue", "hasTabData", "shouldShowTab", "tab", "MediaShelfWithProductCard", "MediaShelf_default"]
4
+ "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { cn } from '../../helpers/index.js'\nimport { withLayout } from '../../shared/Styles.js'\nimport { Text, Heading, Tabs, TabsList, TabsTrigger, TabsContent } from '../../components/index.js'\n\nimport { Swiper, SwiperSlide } from 'swiper/react'\nimport { Navigation } from 'swiper/modules'\n\n// Import Swiper styles\nimport 'swiper/css'\nimport 'swiper/css/navigation'\nimport type {\n ButtonFunctionType,\n CopyConfig,\n ProductCardData,\n ProductTab,\n StockDisplayMode,\n MediaShelfSemanticName,\n} from './types.js'\nimport ProductCard from './ProductCard.js'\nimport { useExposure } from '../../hooks/useExposure.js'\n\nconst componentType = 'shelf'\nconst componentName = 'media_shelf'\n\nconst PrevIcon = ({ disabled }: { disabled: boolean }) => (\n <svg\n width=\"56\"\n height=\"56\"\n viewBox=\"0 0 56 56\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"text-info-primary laptop:block lg-desktop:size-[56px] hidden size-[40px]\"\n >\n <path\n d=\"M0 28C0 43.464 12.536 56 28 56C43.464 56 56 43.464 56 28C56 12.536 43.464 0 28 0C12.536 0 0 12.536 0 28Z\"\n fill=\"currentColor\"\n fillOpacity={disabled ? '0.2' : '0.6'}\n />\n <path d=\"M31 22L25 28L31 34\" stroke=\"white\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n)\n\nconst NextIcon = ({ disabled }: { disabled: boolean }) => (\n <svg\n width=\"56\"\n height=\"56\"\n viewBox=\"0 0 56 56\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"text-info-primary laptop:block lg-desktop:size-[56px] hidden size-[40px]\"\n >\n <path\n d=\"M0 28C0 12.536 12.536 0 28 0C43.464 0 56 12.536 56 28C56 43.464 43.464 56 28 56C12.536 56 0 43.464 0 28Z\"\n fill=\"currentColor\"\n fillOpacity={disabled ? '0.2' : '0.6'}\n />\n <path d=\"M25 22L31 28L25 34\" stroke=\"white\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n)\n\n/**\n * Code Channel \u914D\u7F6E - \u6298\u6263\u524D\u7F00\n */\nexport type CodeChannelConfig = string\n\n/**\n * MediaShelf Context \u914D\u7F6E\u63A5\u53E3\n */\nexport interface MediaShelfContextConfig {\n /** Code Channel \u914D\u7F6E - \u6298\u6263\u524D\u7F00 */\n codeChannel?: CodeChannelConfig\n /** \u662F\u5426\u5C55\u793A\u4F1A\u5458\u4EF7\u683C */\n showMemberPrice?: boolean\n /** \u662F\u5426\u5C55\u793A\u6298\u6263\u6807\u7B7E */\n showDiscount?: boolean\n /** \u662F\u5426\u5C55\u793A\u6807\u7B7E\u7CFB\u7EDF */\n showTags?: boolean\n /** \u5E93\u5B58\u5C55\u793A\u6A21\u5F0F */\n stockDisplayMode?: StockDisplayMode\n /** \u5E93\u5B58\u9608\u503C\uFF08\u5F53\u6A21\u5F0F\u4E3A below-quantity \u6216 below-percentage \u65F6\u4F7F\u7528\uFF09 */\n stockThresholdValue?: number\n /** \u662F\u5426\u5C55\u793A\u539F\u4EF7\uFF08\u5220\u9664\u7EBF\u4EF7\u683C\uFF09 */\n showOriginalPrice?: boolean\n /** \u7528\u6237\u72B6\u6001 */\n}\n\n/**\n * MediaShelf Context \u503C\u63A5\u53E3\n */\ninterface MediaShelfContextValue extends MediaShelfContextConfig {\n /** \u70B9\u51FB\u4E86\u89E3\u66F4\u591A\u56DE\u8C03 */\n onLearnMore?: (product: ProductCardData) => void\n /** \u70B9\u51FB\u7ACB\u5373\u8D2D\u4E70\u56DE\u8C03 */\n onShopNow?: (product: ProductCardData) => void\n /** \u70B9\u51FB\u52A0\u5165\u8D2D\u7269\u8F66\u56DE\u8C03 */\n onAddToCart?: (product: ProductCardData) => void\n /** \u8BED\u4E49\u5316\u7C7B\u540D */\n classNames?: Partial<Record<MediaShelfSemanticName, string>>\n /** \u4E86\u89E3\u66F4\u591A\u6309\u94AE\u6587\u672C */\n secondaryButtonText?: string\n secondaryButtonFun?: ButtonFunctionType\n /** \u7ACB\u5373\u8D2D\u4E70\u6309\u94AE\u6587\u672C */\n primaryButtonText?: string\n primaryButtonFun?: ButtonFunctionType\n /** \u6587\u6848\u914D\u7F6E */\n copy: CopyConfig\n}\n\n/**\n * MediaShelf Context\n */\nconst MediaShelfContext = React.createContext<MediaShelfContextValue | null>(null)\n\n/**\n * \u4F7F\u7528 MediaShelf Context \u7684 Hook\n */\nexport const useMediaShelfContext = () => {\n const context = React.useContext(MediaShelfContext)\n if (!context) {\n throw new Error('useMediaShelfContext must be used within an MediaShelfProvider')\n }\n return context\n}\n\n/**\n * MediaShelf \u4E1A\u52A1\u7EC4\u4EF6\u6570\u636E\u63A5\u53E3\n */\nexport interface MediaShelfData {\n theme?: 'light' | 'dark'\n /** \u7EC4\u4EF6\u6807\u9898 */\n title?: string\n /** \u7EC4\u4EF6\u63CF\u8FF0 */\n description?: string\n /** \u5206\u7EC4\u4EA7\u54C1Tab\u5217\u8868 */\n productsTab?: ProductTab[]\n /** \u662F\u5426\u663E\u793A Tab\uFF08\u9ED8\u8BA4\uFF1Atrue\uFF09 */\n isShowTab?: boolean\n /** \u4E86\u89E3\u66F4\u591A\u6309\u94AE\u6587\u672C */\n secondaryButtonText?: string\n secondaryButtonFun: ButtonFunctionType\n /** \u7ACB\u5373\u8D2D\u4E70\u6309\u94AE\u6587\u672C */\n primaryButtonText?: string\n primaryButtonFun: ButtonFunctionType\n /** Code Channel \u914D\u7F6E - \u6298\u6263\u524D\u7F00 */\n codeChannel?: CodeChannelConfig\n /** \u662F\u5426\u5C55\u793A\u4F1A\u5458\u4EF7\u683C */\n showMemberPrice?: boolean\n /** \u662F\u5426\u5C55\u793A\u6298\u6263\u6807\u7B7E */\n showDiscount?: boolean\n /** \u662F\u5426\u5C55\u793A\u6807\u7B7E\u7CFB\u7EDF */\n showTags?: boolean\n /** \u5E93\u5B58\u5C55\u793A\u6A21\u5F0F */\n stockDisplayMode?: StockDisplayMode\n /** \u5E93\u5B58\u9608\u503C\uFF08\u5F53\u6A21\u5F0F\u4E3A below-quantity \u6216 below-percentage \u65F6\u4F7F\u7528\uFF09 */\n stockThresholdValue?: number\n /**\n * \u5E93\u5B58\u6587\u672C\u6A21\u677F\uFF0C\u652F\u6301 {count} \u5360\u4F4D\u7B26\n */\n stockDisplayText?: string\n /** \u662F\u5426\u5C55\u793A\u539F\u4EF7\uFF08\u5220\u9664\u7EBF\u4EF7\u683C\uFF09 */\n showOriginalPrice?: boolean\n /** \u6587\u6848\u914D\u7F6E */\n copy?: CopyConfig\n /**\n * \u4EA7\u54C1\u5217\u8868\uFF08\u5F53\u4E0D\u4F7F\u7528 Tab \u5206\u7EC4\u65F6\u53EF\u76F4\u63A5\u4F20\u5165\u4EA7\u54C1\u5217\u8868\uFF09\n */\n productsCard: ProductCardData[]\n}\n\nexport interface MediaShelfProps extends React.HTMLAttributes<HTMLDivElement> {\n /** \u4E1A\u52A1\u6570\u636E */\n data: MediaShelfData\n /** \u70B9\u51FB\u4E86\u89E3\u66F4\u591A\u56DE\u8C03 */\n onLearnMore?: (product: ProductCardData) => void\n /** \u70B9\u51FB\u7ACB\u5373\u8D2D\u4E70\u56DE\u8C03 */\n onShopNow?: (product: ProductCardData) => void\n /** \u70B9\u51FB\u52A0\u5165\u8D2D\u7269\u8F66\u56DE\u8C03 */\n onAddToCart?: (product: ProductCardData) => void\n /** \u8BED\u4E49\u5316\u7C7B\u540D */\n classNames?: Partial<Record<MediaShelfSemanticName, string>>\n}\n\n/**\n * MediaShelf \u590D\u5408\u7EC4\u4EF6\u7C7B\u578B\u5B9A\u4E49\n */\nexport interface MediaShelfComponent extends React.ForwardRefExoticComponent<\n MediaShelfProps & React.RefAttributes<HTMLDivElement>\n> {\n /** \u72EC\u7ACB\u7684 ProductCard \u7EC4\u4EF6 */\n ProductCard: typeof ProductCard\n}\n\n/**\n * \u4EA7\u54C1\u5217\u8868\u7EC4\u4EF6 - \u4F7F\u7528 Swiper \u6A2A\u5411\u6ED1\u52A8\u5E03\u5C40\n */\nconst ProductsList = React.forwardRef<\n HTMLDivElement,\n {\n products: ProductCardData[]\n className?: string\n }\n>(({ products, className }, ref) => {\n const {\n copy,\n stockDisplayMode,\n stockThresholdValue,\n onLearnMore,\n onShopNow,\n onAddToCart,\n classNames,\n secondaryButtonText,\n primaryButtonText,\n secondaryButtonFun,\n primaryButtonFun,\n showOriginalPrice,\n showTags,\n } = useMediaShelfContext()\n // \u751F\u6210\u552F\u4E00 ID\uFF0C\u79FB\u9664\u7279\u6B8A\u5B57\u7B26\u4EE5\u786E\u4FDD\u53EF\u7528\u4E8E CSS \u9009\u62E9\u5668\n const id = React.useId().replace(/:/g, '')\n // \u9884\u5B9A\u4E49\u5BFC\u822A\u6309\u94AE\u9009\u62E9\u5668\uFF0C\u907F\u514D\u591A\u6B21\u62FC\u63A5\n const nextButtonClass = `swiper-button-next-custom-${id}`\n const prevButtonClass = `swiper-button-prev-custom-${id}`\n\n // Swiper \u5BFC\u822A\u72B6\u6001\n const [swiperState, setSwiperState] = React.useState({\n isBeginning: true,\n isEnd: false,\n })\n\n // Swiper \u5B9E\u4F8B\u5F15\u7528\n const swiperRef = React.useRef<any>(null)\n\n // \u8BA1\u7B97\u5E76\u8BBE\u7F6E\u6240\u6709 slide \u4E3A\u6700\u9AD8\u9AD8\u5EA6\n const equalizeSlideHeights = React.useCallback(() => {\n const swiper = swiperRef.current\n if (!swiper?.slides || swiper.slides.length === 0) return\n\n // \u5148\u91CD\u7F6E\u6240\u6709 slide \u9AD8\u5EA6\u4EE5\u83B7\u53D6\u771F\u5B9E\u5185\u5BB9\u9AD8\u5EA6\n swiper.slides.forEach((slide: HTMLElement) => {\n slide.style.height = 'auto'\n })\n\n // \u8BA1\u7B97\u6700\u5927\u9AD8\u5EA6\n // @ts-ignore\n const heights = Array.from(swiper.slides).map((slide: HTMLElement) => slide.scrollHeight)\n const maxHeight = Math.max(...heights)\n\n // \u8BBE\u7F6E\u6240\u6709 slide \u4E3A\u6700\u5927\u9AD8\u5EA6\n if (maxHeight > 0) {\n swiper.slides.forEach((slide: HTMLElement) => {\n slide.style.height = `${maxHeight}px`\n })\n }\n }, [])\n\n // \u76D1\u542C\u7A97\u53E3 resize \u91CD\u65B0\u8BA1\u7B97\u9AD8\u5EA6\n React.useEffect(() => {\n const handleResize = () => {\n // \u4F7F\u7528 requestAnimationFrame \u786E\u4FDD DOM \u66F4\u65B0\u5B8C\u6210\n requestAnimationFrame(equalizeSlideHeights)\n }\n\n window.addEventListener('resize', handleResize)\n return () => window.removeEventListener('resize', handleResize)\n }, [equalizeSlideHeights])\n\n if (products?.length === 0) {\n return null\n }\n\n return (\n <div ref={ref} className={className}>\n {/* Swiper \u6A2A\u5411\u6ED1\u52A8\u5E03\u5C40 */}\n <div className=\"relative\">\n <Swiper\n modules={[Navigation]}\n spaceBetween={16}\n slidesPerView=\"auto\"\n navigation={{\n nextEl: `.${nextButtonClass}`,\n prevEl: `.${prevButtonClass}`,\n }}\n onSwiper={swiper => {\n swiperRef.current = swiper\n setSwiperState({\n isBeginning: swiper.isBeginning,\n isEnd: swiper.isEnd,\n })\n // \u5EF6\u8FDF\u6267\u884C\u4EE5\u786E\u4FDD\u5185\u5BB9\u6E32\u67D3\u5B8C\u6210\n setTimeout(equalizeSlideHeights, 100)\n }}\n onSlideChange={swiper => {\n setSwiperState({\n isBeginning: swiper.isBeginning,\n isEnd: swiper.isEnd,\n })\n }}\n className=\"!overflow-visible\"\n breakpoints={{\n 0: {\n spaceBetween: 12,\n slidesPerView: 1.2,\n },\n 768: {\n spaceBetween: 12,\n slidesPerView: products.length <= 2 ? 2 : 2.3,\n },\n 1024: {\n spaceBetween: 16,\n slidesPerView: Math.min(3, products.length),\n },\n }}\n >\n {products.map((product, index) => (\n <SwiperSlide\n key={product.shopify_id + '-' + product.sku || index}\n className=\"tablet:!max-w-[50%] overflow-hidden\"\n >\n <ProductCard\n product={product}\n className=\"box-border w-full max-w-full\"\n stockDisplayMode={stockDisplayMode}\n stockThresholdValue={stockThresholdValue}\n onLearnMore={onLearnMore}\n onShopNow={onShopNow}\n onAddToCart={onAddToCart}\n classNames={classNames}\n secondaryButtonText={secondaryButtonText}\n primaryButtonText={primaryButtonText}\n secondaryButtonFun={secondaryButtonFun}\n primaryButtonFun={primaryButtonFun}\n showOriginalPrice={showOriginalPrice}\n copy={copy}\n showTags={showTags}\n />\n </SwiperSlide>\n ))}\n </Swiper>\n\n {/* \u81EA\u5B9A\u4E49\u5BFC\u822A\u6309\u94AE */}\n <button\n className={cn(`${prevButtonClass} tablet:block absolute left-4 top-1/2 z-10 hidden -translate-y-1/2`, {\n 'tablet:hidden': products.length <= 2,\n 'laptop:hidden': products.length <= 3,\n })}\n aria-label={copy?.previousSlideLabel}\n disabled={swiperState.isBeginning}\n >\n <PrevIcon disabled={swiperState.isBeginning} />\n </button>\n <button\n className={cn(`${nextButtonClass} tablet:block absolute right-4 top-1/2 z-10 hidden -translate-y-1/2`, {\n 'tablet:hidden': products.length <= 2,\n 'laptop:hidden': products.length <= 3,\n })}\n aria-label={copy?.nextSlideLabel}\n disabled={swiperState.isEnd}\n >\n <NextIcon disabled={swiperState.isEnd} />\n </button>\n </div>\n </div>\n )\n})\n\nProductsList.displayName = 'ProductsList'\n\n/**\n * MediaShelf - \u5A92\u4F53\u8D27\u67B6\n *\n * @description \u80FD\u591F\u5B9E\u65F6\u663E\u793A\u5546\u54C1\u5E93\u5B58\u4FE1\u606F\u548C\u4F1A\u5458\u4EF7\u7684\u8D27\u67B6\uFF0C\u652F\u6301\u54CD\u5E94\u5F0F\u5E03\u5C40\u548C\u591A\u79CD\u914D\u7F6E\u9009\u9879\n */\nconst MediaShelf = React.forwardRef<HTMLDivElement, MediaShelfProps>(\n ({ className, data, onLearnMore, onShopNow, onAddToCart, classNames, ...props }, ref) => {\n const boxRef = React.useRef<HTMLDivElement>(null)\n\n useExposure(boxRef, {\n componentType,\n componentName,\n componentTitle: data.title,\n componentDescription: data.description,\n })\n\n React.useImperativeHandle(ref, () => boxRef.current as HTMLDivElement)\n\n // \u4ECE data \u4E2D\u89E3\u6784\u914D\u7F6E\u9879\uFF0C\u5E76\u8BBE\u7F6E\u9ED8\u8BA4\u503C\n const {\n theme = 'light',\n codeChannel,\n showMemberPrice = true,\n showDiscount = true,\n showTags = true,\n stockDisplayMode,\n stockThresholdValue,\n showOriginalPrice = true,\n secondaryButtonText,\n primaryButtonText,\n secondaryButtonFun,\n primaryButtonFun,\n isShowTab = true,\n copy,\n } = data\n\n // \u6784\u5EFA copy \u914D\u7F6E\uFF0C\u4F7F\u7528\u4F20\u5165\u7684 copy \u914D\u7F6E\n const finalCopy: CopyConfig = copy || {}\n\n // \u6784\u5EFA Context \u503C\n const contextValue: MediaShelfContextValue = {\n codeChannel,\n showMemberPrice,\n showDiscount,\n showTags,\n stockDisplayMode,\n stockThresholdValue,\n showOriginalPrice,\n onLearnMore,\n onShopNow,\n onAddToCart,\n classNames,\n secondaryButtonText,\n secondaryButtonFun,\n primaryButtonText,\n primaryButtonFun,\n copy: finalCopy,\n }\n\n // \u83B7\u53D6\u8981\u663E\u793A\u7684\u4EA7\u54C1\u6570\u636E\n const hasTabData = data.productsTab && data.productsTab.length > 0\n const shouldShowTab = isShowTab && hasTabData\n\n return (\n <MediaShelfContext.Provider value={contextValue}>\n <div\n ref={boxRef}\n className={cn(\n 'w-full',\n {\n 'aiui-dark': theme === 'dark',\n },\n className,\n classNames?.root\n )}\n {...props}\n >\n {/* \u6807\u9898\u533A\u57DF */}\n {data.title && (\n <Heading as=\"h2\" html={data.title} size={4} className={cn('text-info-primary mb-4', classNames?.title)} />\n )}\n {data.description && (\n <Text\n size={3}\n as=\"p\"\n html={data.description}\n className={cn('text-info-primary mb-6', classNames?.description)}\n />\n )}\n\n {/* \u4EA7\u54C1\u5C55\u793A\u533A\u57DF */}\n\n <Tabs defaultValue={data.productsTab?.[0]?.id} className=\"w-full\">\n {shouldShowTab && (\n <TabsList className=\"mb-6\">\n {data.productsTab?.map(tab => (\n <TabsTrigger key={'tab-' + tab.id} value={tab.id}>\n {tab.tab}\n </TabsTrigger>\n ))}\n </TabsList>\n )}\n {shouldShowTab ? (\n data.productsTab?.map(tab => (\n <TabsContent key={'tab-content-' + tab.id} value={tab.id}>\n <ProductsList products={tab.data} />\n </TabsContent>\n ))\n ) : (\n <ProductsList products={data.productsCard} />\n )}\n </Tabs>\n </div>\n </MediaShelfContext.Provider>\n )\n }\n)\n\nMediaShelf.displayName = 'MediaShelf'\n\n// \u521B\u5EFA\u590D\u5408\u7EC4\u4EF6\nconst MediaShelfWithProductCard = MediaShelf as MediaShelfComponent\nMediaShelfWithProductCard.ProductCard = ProductCard\n\nconst MediaShelfWrapped = withLayout(MediaShelfWithProductCard)\n\nexport default MediaShelfWrapped\n"],
5
+ "mappings": "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",
6
+ "names": ["jsx", "jsxs", "React", "cn", "withLayout", "Text", "Heading", "Tabs", "TabsList", "TabsTrigger", "TabsContent", "Swiper", "SwiperSlide", "Navigation", "ProductCard", "useExposure", "componentType", "componentName", "PrevIcon", "disabled", "NextIcon", "MediaShelfContext", "useMediaShelfContext", "context", "ProductsList", "products", "className", "ref", "copy", "stockDisplayMode", "stockThresholdValue", "onLearnMore", "onShopNow", "onAddToCart", "classNames", "secondaryButtonText", "primaryButtonText", "secondaryButtonFun", "primaryButtonFun", "showOriginalPrice", "showTags", "id", "nextButtonClass", "prevButtonClass", "swiperState", "setSwiperState", "swiperRef", "equalizeSlideHeights", "swiper", "slide", "heights", "maxHeight", "handleResize", "product", "index", "MediaShelf", "data", "props", "boxRef", "theme", "codeChannel", "showMemberPrice", "showDiscount", "isShowTab", "contextValue", "hasTabData", "shouldShowTab", "tab", "MediaShelfWithProductCard", "MediaShelfWrapped", "MediaShelf_default"]
7
7
  }
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ import type { MediaDrawAreaProps } from './types.js';
3
+ export declare const MediaDrawArea: React.FC<MediaDrawAreaProps>;
4
+ export default MediaDrawArea;
@@ -0,0 +1,2 @@
1
+ "use client";import{jsx as t,jsxs as n}from"react/jsx-runtime";import"react";import{cn as r}from"../../helpers/index.js";import"./types.js";const i={tablet:"(min-width: 768px)",laptop:"(min-width: 1025px)",desktop:"(min-width: 1440px)",lgDesktop:"(min-width: 1920px)"};function b(e){return typeof e=="object"&&"default"in e}function f(e){return typeof e.src=="string"?e.src:e.src.default}const m=({media:e,className:a})=>{const s=e.alt||"Product Lottery";if(!b(e.src))return t("img",{src:e.src,alt:s,className:r("size-full object-contain",a),loading:"lazy"});const o=e.src;return n("picture",{children:[o.lgDesktop&&t("source",{media:i.lgDesktop,srcSet:o.lgDesktop}),o.desktop&&t("source",{media:i.desktop,srcSet:o.desktop}),o.laptop&&t("source",{media:i.laptop,srcSet:o.laptop}),o.tablet&&t("source",{media:i.tablet,srcSet:o.tablet}),t("img",{src:o.default,alt:s,className:r("size-full object-cover",a),loading:"lazy"})]})},g=({media:e,className:a})=>{const s=f(e);return t("video",{src:s,poster:e.poster,autoPlay:e.autoPlay??!0,muted:e.muted??!0,loop:e.loop??!0,playsInline:!0,className:r("size-full object-cover",a),"aria-label":e.alt||"Product Lottery Video"})},y={primary:r("bg-btn-primary text-btn-primary-foreground","shadow-lg"),secondary:r("bg-[#1D1D1F] text-white","shadow-lg hover:bg-[#1D1D1F]/90"),outline:r("border-2 border-white bg-transparent text-white","hover:bg-white/10")},p=({media:e,ctaButton:a,isDrawing:s=!1,isDisabled:o=!1,onClick:c,className:d})=>{const l=a?.text??"",u=a?.style||"primary";return n("div",{className:r("media-draw-area","size-full overflow-hidden",d),children:[t("div",{className:"absolute inset-0",children:e.type==="video"?t(g,{media:e}):t(m,{media:e})}),t("button",{type:"button",onClick:c,disabled:o||s,className:r("absolute inset-0 z-10 flex cursor-pointer items-end justify-center","tablet:pb-5 laptop:pb-6 desktop:pb-8 lg-desktop:pb-10 pb-4","disabled:cursor-not-allowed","focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/60 focus-visible:ring-offset-2"),"aria-label":s?"Drawing in progress...":l,"aria-busy":s,children:l&&n("span",{className:r("inline-flex items-center justify-center gap-2","rounded-btn px-6 py-2.5","text-sm font-semibold","laptop:px-8 laptop:py-3 laptop:text-base","desktop:px-10 desktop:py-3.5","transition-all duration-200","hover:scale-105 active:scale-95",y[u],s&&"pointer-events-none opacity-80",o&&"pointer-events-none opacity-50"),children:[s&&n("svg",{className:"size-4 animate-spin",viewBox:"0 0 24 24",fill:"none","aria-hidden":"true",children:[t("circle",{cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"3",strokeLinecap:"round",className:"opacity-25"}),t("path",{d:"M4 12a8 8 0 018-8",stroke:"currentColor",strokeWidth:"3",strokeLinecap:"round",className:"opacity-75"})]}),l]})})]})};p.displayName="MediaDrawArea";var M=p;export{p as MediaDrawArea,M as default};
2
+ //# sourceMappingURL=MediaDrawArea.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/biz-components/ProductLottery/MediaDrawArea.tsx"],
4
+ "sourcesContent": ["'use client'\n\nimport React from 'react'\nimport { cn } from '../../helpers/index.js'\nimport type { MediaDrawAreaProps, MediaConfig, ResponsiveMedia } from './types.js'\nimport { DEFAULT_CTA_BUTTON } from './types.js'\n\nconst BREAKPOINTS = {\n tablet: '(min-width: 768px)',\n laptop: '(min-width: 1025px)',\n desktop: '(min-width: 1440px)',\n lgDesktop: '(min-width: 1920px)',\n} as const\n\nfunction isResponsiveMedia(src: string | ResponsiveMedia): src is ResponsiveMedia {\n return typeof src === 'object' && 'default' in src\n}\n\nfunction getDefaultSrc(media: MediaConfig): string {\n if (typeof media.src === 'string') return media.src\n return media.src.default\n}\n\nconst ResponsiveImage: React.FC<{\n media: MediaConfig\n className?: string\n}> = ({ media, className }) => {\n const alt = media.alt || 'Product Lottery'\n\n if (!isResponsiveMedia(media.src)) {\n return <img src={media.src} alt={alt} className={cn('size-full object-contain', className)} loading=\"lazy\" />\n }\n\n const responsive = media.src\n\n return (\n <picture>\n {responsive.lgDesktop && <source media={BREAKPOINTS.lgDesktop} srcSet={responsive.lgDesktop} />}\n {responsive.desktop && <source media={BREAKPOINTS.desktop} srcSet={responsive.desktop} />}\n {responsive.laptop && <source media={BREAKPOINTS.laptop} srcSet={responsive.laptop} />}\n {responsive.tablet && <source media={BREAKPOINTS.tablet} srcSet={responsive.tablet} />}\n <img src={responsive.default} alt={alt} className={cn('size-full object-cover', className)} loading=\"lazy\" />\n </picture>\n )\n}\n\nconst VideoMedia: React.FC<{\n media: MediaConfig\n className?: string\n}> = ({ media, className }) => {\n const src = getDefaultSrc(media)\n\n return (\n <video\n src={src}\n poster={media.poster}\n autoPlay={media.autoPlay ?? true}\n muted={media.muted ?? true}\n loop={media.loop ?? true}\n playsInline\n className={cn('size-full object-cover', className)}\n aria-label={media.alt || 'Product Lottery Video'}\n />\n )\n}\n\nconst CTA_STYLE_MAP = {\n primary: cn('bg-btn-primary text-btn-primary-foreground', 'shadow-lg'),\n secondary: cn('bg-[#1D1D1F] text-white', 'shadow-lg hover:bg-[#1D1D1F]/90'),\n outline: cn('border-2 border-white bg-transparent text-white', 'hover:bg-white/10'),\n} as const\n\nexport const MediaDrawArea: React.FC<MediaDrawAreaProps> = ({\n media,\n ctaButton,\n isDrawing = false,\n isDisabled = false,\n onClick,\n className,\n}) => {\n const buttonText = ctaButton?.text ?? ''\n const buttonStyle = ctaButton?.style || 'primary'\n\n return (\n <div className={cn('media-draw-area', 'size-full overflow-hidden', className)}>\n {/* Media Layer */}\n <div className=\"absolute inset-0\">\n {media.type === 'video' ? <VideoMedia media={media} /> : <ResponsiveImage media={media} />}\n </div>\n\n {/* Clickable overlay \u2014 entire area triggers draw */}\n <button\n type=\"button\"\n onClick={onClick}\n disabled={isDisabled || isDrawing}\n className={cn(\n 'absolute inset-0 z-10 flex cursor-pointer items-end justify-center',\n 'tablet:pb-5 laptop:pb-6 desktop:pb-8 lg-desktop:pb-10 pb-4',\n 'disabled:cursor-not-allowed',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/60 focus-visible:ring-offset-2'\n )}\n aria-label={isDrawing ? 'Drawing in progress...' : buttonText}\n aria-busy={isDrawing}\n >\n {/* CTA Button visual \u2014 hidden when no text configured */}\n {buttonText && (\n <span\n className={cn(\n 'inline-flex items-center justify-center gap-2',\n 'rounded-btn px-6 py-2.5',\n 'text-sm font-semibold',\n 'laptop:px-8 laptop:py-3 laptop:text-base',\n 'desktop:px-10 desktop:py-3.5',\n 'transition-all duration-200',\n 'hover:scale-105 active:scale-95',\n CTA_STYLE_MAP[buttonStyle],\n isDrawing && 'pointer-events-none opacity-80',\n isDisabled && 'pointer-events-none opacity-50'\n )}\n >\n {isDrawing && (\n <svg className=\"size-4 animate-spin\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n className=\"opacity-25\"\n />\n <path\n d=\"M4 12a8 8 0 018-8\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n className=\"opacity-75\"\n />\n </svg>\n )}\n {buttonText}\n </span>\n )}\n </button>\n </div>\n )\n}\n\nMediaDrawArea.displayName = 'MediaDrawArea'\n\nexport default MediaDrawArea\n"],
5
+ "mappings": "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",
6
+ "names": ["jsx", "jsxs", "cn", "BREAKPOINTS", "isResponsiveMedia", "src", "getDefaultSrc", "media", "ResponsiveImage", "className", "alt", "responsive", "VideoMedia", "CTA_STYLE_MAP", "MediaDrawArea", "ctaButton", "isDrawing", "isDisabled", "onClick", "buttonText", "buttonStyle", "MediaDrawArea_default"]
7
+ }
@@ -0,0 +1,17 @@
1
+ import type { ProductLotteryProps, ProductLotteryHandle } from './types.js';
2
+ export declare const ProductLottery: import("react").ForwardRefExoticComponent<ProductLotteryProps & import("react").RefAttributes<ProductLotteryHandle>>;
3
+ declare const _default: any;
4
+ export default _default;
5
+ export { WinnerModal } from '../LotteryShared/WinnerModal.js';
6
+ export { RulesModal } from '../LotteryShared/RulesModal.js';
7
+ export { MyRewardsModal } from '../LotteryShared/MyRewardsModal.js';
8
+ export { ErrorModal } from '../LotteryShared/ErrorModal.js';
9
+ export { ShareModal } from '../LotteryShared/ShareModal.js';
10
+ export { BaseModal } from '../LotteryShared/BaseModal.js';
11
+ export type { ProductLotteryProps, ProductLotteryHandle, MediaConfig, CtaButtonConfig, ResponsiveMedia, MediaDrawAreaProps, } from './types.js';
12
+ export type { Prize, ChanceMethod, ChanceMethodStatus, WinningInfo, PrizePoolProps, ChanceMethodsProps, WinnerModalProps, WinnerModalConfig, UserData, ShareModalConfig, SocialPlatform, SharePlatformConfig, } from '../LotteryShared/types.js';
13
+ export type { RulesModalProps, RuleItem } from '../LotteryShared/RulesModal.js';
14
+ export type { MyRewardsModalProps, Reward, RewardStatus } from '../LotteryShared/MyRewardsModal.js';
15
+ export type { ErrorModalProps } from '../LotteryShared/ErrorModal.js';
16
+ export type { ShareModalProps } from '../LotteryShared/ShareModal.js';
17
+ export type { BaseModalProps } from '../LotteryShared/BaseModal.js';
@@ -0,0 +1,2 @@
1
+ "use client";import{jsx as e,jsxs as n}from"react/jsx-runtime";import{useState as t,useCallback as P,useImperativeHandle as Ie,forwardRef as Le}from"react";import{cn as i}from"../../helpers/index.js";import{DEFAULT_CHANCE_TITLE as Ae}from"./types.js";import{DEFAULT_CHANCE_METHODS as De}from"../LotteryShared/types.js";import{Grid as Oe,GridItem as F}from"../../components/grid.js";import{MediaDrawArea as je}from"./MediaDrawArea.js";import{PrizePool as Be}from"../LotteryShared/PrizePool.js";import{ChanceMethods as Ue}from"../LotteryShared/ChanceMethods.js";import{WinnerModal as He}from"../LotteryShared/WinnerModal.js";import{RulesModal as Ge}from"../LotteryShared/RulesModal.js";import{MyRewardsModal as Fe}from"../LotteryShared/MyRewardsModal.js";import{ErrorModal as _}from"../LotteryShared/ErrorModal.js";import{ShareModal as _e}from"../LotteryShared/ShareModal.js";import{withLayout as Ke}from"../../shared/Styles.js";const K=Le(({prizes:T,media:Y,theme:o,ctaButton:$,chanceMethods:k=De,chanceTitle:J=Ae,chanceSubtitle:Q,chanceFooterNote:V,chanceMethodsText:M,mechanismType:R,inputConfig:X,winningInfos:Z=[],prizesTitle:q,onDrawStart:v,onDrawEnd:C,onDrawError:I,winnerModalConfig:s,rulesModalConfig:ee={},myRewardsModalConfig:te={},errorModalConfig:p={},shareModalConfig:m={},userData:d,loginPromptText:Ye="Please log in to participate",loginButtonText:$e="Log In",noChancesText:oe="You have no chances left",onLoginRequired:c,onCopyCode:re,opportunitiesText:L=["Number of draws remaining today:"],className:se},ae)=>{const{rulesData:N,rulesText:A="Rules"}=ee,{rewardsData:S,myRewardsText:D="My Rewards",codeText:le="CODE:",copyText:ie="COPY",copiedText:ne="COPIED",prizeText:pe="Prize time:"}=te,de=M?.completedText,ce=M?.usedText,f=d?.isLoggedIn??!1,O=d?.availableChances||0,j=k.length>0||R==="input",B=f&&O<=0,[u,E]=t(!1),[z,U]=t(null),[me,x]=t(!1),[fe,h]=t(!1),[ue,y]=t(!1),[xe,w]=t(!1),[he,b]=t(!1),[ye,g]=t(!1),[we,H]=t(""),[be,ge]=t(),[Te,Me]=t(),[Pe,ve]=t(),[Ce,Ne]=t(),[Se,Ee]=t(),[a,ze]=t();Ie(ae,()=>({showError:({message:r,title:l,confirmText:W})=>{H(r),ge(l),Me(W),w(!0)},hideError:()=>{w(!1)},showNoWin:r=>{ve(r?.title),Ne(r?.message),Ee(r?.confirmText),b(!0)},hideNoWin:()=>{b(!1)},showWinner:(r,l)=>{U(r),ze(l),x(!0)},hideWinner:()=>{x(!1)},showRules:()=>{h(!0)},hideRules:()=>{h(!1)},showRewards:()=>{y(!0)},hideRewards:()=>{y(!1)},showShare:()=>{g(!0)},hideShare:()=>{g(!1)},hideAllModals:()=>{x(!1),h(!1),y(!1),w(!1),b(!1),g(!1)}}),[]);const G=P(async()=>{if(!u){if(!d?.isLoggedIn){c?.();return}if(!(d.availableChances<=0)){E(!0);try{let r;v&&(r=await v());const l=T.find(W=>W.prizeKey===r)||T[0];U(l),E(!1),C?C(l):setTimeout(()=>{l.prizeKey==="try-again"?b(!0):x(!0)},300)}catch(r){E(!1),H(r.message||"An error occurred"),w(!0),I?.(r)}}}},[u,T,v,C,I,d,c]),We=P(()=>{if(!f){c?.();return}G()},[G,f,c]),ke=P(()=>{x(!1)},[]),Re=P(()=>{b(!1)},[]);return n("div",{className:i("product-lottery-container","w-full",o==="dark"?"aiui-dark":"",se),children:[n("div",{role:"status","aria-live":"polite","aria-atomic":"true",className:"sr-only",children:[u&&"Drawing in progress...",z&&!u&&`Prize won: ${z.name}`]}),n(Oe,{className:i("product-lottery-main","tablet:mb-4 mb-3"),children:[e(F,{span:j?7:12,className:i("media-section","relative flex w-full flex-1 items-center justify-center overflow-hidden","rounded-box","laptop:min-h-[288px] min-h-[240px]","lg-desktop:aspect-w-[964] lg-desktop:aspect-h-[480]","desktop:aspect-w-[759] desktop:aspect-h-[384]","laptop:aspect-w-[516] laptop:aspect-h-[288]","l-tablet:col-span-12","l-tablet:mb-3",o==="dark"?"bg-[#1E2024]":"bg-[#EAEAEC]"),children:n("div",{className:i("size-full px-[16px] pt-[16px]","lg-desktop:pb-[32px] lg-desktop:px-[32px]","desktop:pt-[24px] desktop:px-[24px]","laptop:pt-[16px] laptop:px-[16px]","tablet:px-[24px]","l-tablet:absolute l-tablet:top-0 l-tablet:inset-x-0 l-tablet:z-10"),children:[n("div",{className:"relative z-10 mb-2 flex max-h-[24px] w-full flex-wrap items-center justify-between gap-3",children:[e("div",{children:n("p",{className:"text-info-primary font-[700]",children:[L?.[0],e("span",{className:"ml-1 text-[#FF6B35]",children:O}),L?.[1]||""]})}),n("div",{className:"flex items-center gap-4",children:[N&&e("button",{onClick:()=>{if(!f){c?.();return}h(!0)},className:"cursor-pointer touch-manipulation",type:"button",children:e("span",{className:"text-info-primary font-[700] underline",children:A})}),S&&e("button",{onClick:()=>{if(!f){c?.();return}y(!0)},className:"cursor-pointer touch-manipulation whitespace-nowrap",type:"button",children:e("span",{className:"text-info-primary font-[700] underline",children:D})})]})]}),e(je,{theme:o,media:Y,ctaButton:$,isDrawing:u,isDisabled:B,onClick:We}),B&&e("div",{className:i("rounded-box absolute inset-0 z-20 flex items-center justify-center bg-black/60 backdrop-blur-sm","px-6 text-center"),children:e("div",{className:"flex flex-col items-center gap-4",children:e("p",{className:"lg-desktop:text-[24px] text-[18px] font-semibold text-white",children:oe})})})]})}),j&&e(F,{span:5,className:i("info-section","rounded-box","relative flex flex-col overflow-hidden","lg-desktop:aspect-w-[684] lg-desktop:aspect-h-[480]","desktop:aspect-w-[536] desktop:aspect-h-[384]","laptop:aspect-w-[364] laptop:aspect-h-[288]","l-tablet:min-h-[280px] laptop:max-h-[320px]","w-full","l-tablet:col-span-12",o==="dark"?"bg-[#1E2024]":"bg-[#EAEAEC]"),children:e(Ue,{theme:o,userData:d,methods:k,title:J,subtitle:Q,footerNote:V,onOpenShareModal:()=>g(!0),chanceBadgeText:M?.chanceBadgeText,completedText:de,usedText:ce,loadingText:M?.loadingText,mechanismType:R,inputConfig:X})})]}),e("div",{className:i("product-lottery-footer","rounded-box","flex flex-col overflow-hidden",o==="dark"?"bg-[#1E2024]":"bg-[#EAEAEC]"),children:e(Be,{theme:o,prizes:T,title:q,winningInfos:Z})}),e(He,{isOpen:me,prize:z,title:a?.title||s?.title,prizeTitle:a?.prizeTitle||s?.prizeTitle,prizeImage:a?.prizeImage||s?.prizeImage,prizeDescription:a?.prizeDescription||s?.prizeDescription,learnMoreUrl:a?.learnMoreUrl||s?.learnMoreUrl,learnMoreText:a?.learnMoreText||s?.learnMoreText,couponCode:a?.couponCode||s?.couponCode,expiresAt:a?.expiresAt||s?.expiresAt,couponDiscount:a?.couponDiscount||s?.couponDiscount,couponUnit:a?.couponUnit||s?.couponUnit,confirmText:a?.confirmText||s?.confirmText,onClose:ke,theme:o}),N&&e(Ge,{title:A,isOpen:fe,onClose:()=>h(!1),rules:N,theme:o}),S&&e(Fe,{isOpen:ue,onClose:()=>y(!1),rewards:S,onCopyCode:re,codeText:le,copyText:ie,copiedText:ne,prizeText:pe,theme:o,title:D}),e(_,{isOpen:xe,onClose:()=>w(!1),title:be||p?.title,message:we||p?.message,confirmText:Te||p?.confirmText,theme:o}),e(_,{isOpen:he,onClose:Re,title:Pe||p?.title,message:Ce||p?.message,confirmText:Se||p?.confirmText,theme:o}),e(_e,{isOpen:ye,onClose:()=>g(!1),title:m?.title,subtitle:m?.subtitle,note:m?.note,platforms:m?.platforms,onShareSuccess:m?.onShareSuccess,theme:o})]})});K.displayName="ProductLottery";var nt=Ke(K);import{WinnerModal as ct}from"../LotteryShared/WinnerModal.js";import{RulesModal as ft}from"../LotteryShared/RulesModal.js";import{MyRewardsModal as xt}from"../LotteryShared/MyRewardsModal.js";import{ErrorModal as yt}from"../LotteryShared/ErrorModal.js";import{ShareModal as bt}from"../LotteryShared/ShareModal.js";import{BaseModal as Tt}from"../LotteryShared/BaseModal.js";export{Tt as BaseModal,yt as ErrorModal,xt as MyRewardsModal,K as ProductLottery,ft as RulesModal,bt as ShareModal,ct as WinnerModal,nt as default};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/biz-components/ProductLottery/index.tsx"],
4
+ "sourcesContent": ["'use client'\n\nimport { useState, useCallback, useImperativeHandle, forwardRef } from 'react'\nimport { cn } from '../../helpers/index.js'\nimport { DEFAULT_CHANCE_TITLE } from './types.js'\nimport { DEFAULT_CHANCE_METHODS } from '../LotteryShared/types.js'\nimport { Grid, GridItem } from '../../components/grid.js'\nimport { MediaDrawArea } from './MediaDrawArea.js'\nimport { PrizePool } from '../LotteryShared/PrizePool.js'\nimport { ChanceMethods } from '../LotteryShared/ChanceMethods.js'\nimport { WinnerModal } from '../LotteryShared/WinnerModal.js'\nimport { RulesModal } from '../LotteryShared/RulesModal.js'\nimport { MyRewardsModal } from '../LotteryShared/MyRewardsModal.js'\nimport { ErrorModal } from '../LotteryShared/ErrorModal.js'\nimport { ShareModal } from '../LotteryShared/ShareModal.js'\nimport { withLayout } from '../../shared/Styles.js'\n\nimport type { ProductLotteryProps, ProductLotteryHandle } from './types.js'\nimport type { Prize, WinnerModalConfig } from '../LotteryShared/types.js'\n\nexport const ProductLottery = forwardRef<ProductLotteryHandle, ProductLotteryProps>(\n (\n {\n prizes,\n media,\n theme,\n ctaButton,\n chanceMethods = DEFAULT_CHANCE_METHODS,\n chanceTitle = DEFAULT_CHANCE_TITLE,\n chanceSubtitle,\n chanceFooterNote,\n chanceMethodsText,\n mechanismType,\n inputConfig,\n winningInfos = [],\n prizesTitle,\n onDrawStart,\n onDrawEnd,\n onDrawError,\n winnerModalConfig,\n rulesModalConfig = {},\n myRewardsModalConfig = {},\n errorModalConfig = {},\n shareModalConfig = {},\n userData,\n loginPromptText = 'Please log in to participate',\n loginButtonText = 'Log In',\n noChancesText = 'You have no chances left',\n onLoginRequired,\n onCopyCode,\n opportunitiesText = ['Number of draws remaining today:'],\n className,\n },\n ref\n ) => {\n const { rulesData, rulesText = 'Rules' } = rulesModalConfig\n const {\n rewardsData,\n myRewardsText = 'My Rewards',\n codeText = 'CODE:',\n copyText = 'COPY',\n copiedText = 'COPIED',\n prizeText = 'Prize time:',\n } = myRewardsModalConfig\n const completedText = chanceMethodsText?.completedText\n const usedText = chanceMethodsText?.usedText\n const isLoggedIn = userData?.isLoggedIn ?? false\n const availableChances = userData?.availableChances || 0\n const hasRightPanel = chanceMethods.length > 0 || mechanismType === 'input'\n const showNoChancesOverlay = isLoggedIn && availableChances <= 0\n\n // State\n const [isDrawing, setIsDrawing] = useState(false)\n const [winningPrize, setWinningPrize] = useState<Prize | null>(null)\n const [showWinnerModal, setShowWinnerModal] = useState(false)\n const [showRulesModal, setShowRulesModal] = useState(false)\n const [showRewardsModal, setShowRewardsModal] = useState(false)\n const [showErrorModal, setShowErrorModal] = useState(false)\n const [showNoWinModal, setShowNoWinModal] = useState(false)\n const [showShareModal, setShowShareModal] = useState(false)\n const [errorMessage, setErrorMessage] = useState('')\n const [errorTitle, setErrorTitle] = useState<string | undefined>()\n const [errorConfirmText, setErrorConfirmText] = useState<string | undefined>()\n const [noWinTitle, setNoWinTitle] = useState<string | undefined>()\n const [noWinMessage, setNoWinMessage] = useState<string | undefined>()\n const [noWinConfirmText, setNoWinConfirmText] = useState<string | undefined>()\n const [externalWinnerConfig, setExternalWinnerConfig] = useState<Partial<WinnerModalConfig> | undefined>()\n\n useImperativeHandle(\n ref,\n () => ({\n showError: ({ message, title, confirmText }) => {\n setErrorMessage(message)\n setErrorTitle(title)\n setErrorConfirmText(confirmText)\n setShowErrorModal(true)\n },\n hideError: () => {\n setShowErrorModal(false)\n },\n showNoWin: config => {\n setNoWinTitle(config?.title)\n setNoWinMessage(config?.message)\n setNoWinConfirmText(config?.confirmText)\n setShowNoWinModal(true)\n },\n hideNoWin: () => {\n setShowNoWinModal(false)\n },\n showWinner: (prize, config) => {\n setWinningPrize(prize)\n setExternalWinnerConfig(config)\n setShowWinnerModal(true)\n },\n hideWinner: () => {\n setShowWinnerModal(false)\n },\n showRules: () => {\n setShowRulesModal(true)\n },\n hideRules: () => {\n setShowRulesModal(false)\n },\n showRewards: () => {\n setShowRewardsModal(true)\n },\n hideRewards: () => {\n setShowRewardsModal(false)\n },\n showShare: () => {\n setShowShareModal(true)\n },\n hideShare: () => {\n setShowShareModal(false)\n },\n hideAllModals: () => {\n setShowWinnerModal(false)\n setShowRulesModal(false)\n setShowRewardsModal(false)\n setShowErrorModal(false)\n setShowNoWinModal(false)\n setShowShareModal(false)\n },\n }),\n []\n )\n\n const handleDrawStart = useCallback(async () => {\n if (isDrawing) return\n\n if (!userData?.isLoggedIn) {\n onLoginRequired?.()\n return\n }\n\n if (userData.availableChances <= 0) {\n return\n }\n\n setIsDrawing(true)\n\n try {\n let prizeId: string | undefined\n\n if (onDrawStart) {\n prizeId = await onDrawStart()\n }\n\n const prize = prizes.find(p => p.prizeKey === prizeId) || prizes[0]\n setWinningPrize(prize)\n setIsDrawing(false)\n\n if (onDrawEnd) {\n onDrawEnd(prize)\n } else {\n setTimeout(() => {\n if (prize.prizeKey === 'try-again') {\n setShowNoWinModal(true)\n } else {\n setShowWinnerModal(true)\n }\n }, 300)\n }\n } catch (error) {\n setIsDrawing(false)\n setErrorMessage((error as Error).message || 'An error occurred')\n setShowErrorModal(true)\n onDrawError?.(error as Error)\n }\n }, [isDrawing, prizes, onDrawStart, onDrawEnd, onDrawError, userData, onLoginRequired])\n\n const handleDrawClick = useCallback(() => {\n if (!isLoggedIn) {\n onLoginRequired?.()\n return\n }\n void handleDrawStart()\n }, [handleDrawStart, isLoggedIn, onLoginRequired])\n\n const handleCloseWinnerModal = useCallback(() => {\n setShowWinnerModal(false)\n }, [])\n\n const handleCloseNoWinModal = useCallback(() => {\n setShowNoWinModal(false)\n }, [])\n\n return (\n <div className={cn('product-lottery-container', 'w-full', theme === 'dark' ? 'aiui-dark' : '', className)}>\n {/* ARIA Live Region */}\n <div role=\"status\" aria-live=\"polite\" aria-atomic=\"true\" className=\"sr-only\">\n {isDrawing && 'Drawing in progress...'}\n {winningPrize && !isDrawing && `Prize won: ${winningPrize.name}`}\n </div>\n\n {/* Main Content \u2014 Responsive Grid */}\n <Grid className={cn('product-lottery-main', 'tablet:mb-4 mb-3')}>\n {/* Left: Media Draw Area */}\n <GridItem\n span={hasRightPanel ? 7 : 12}\n className={cn(\n 'media-section',\n 'relative flex w-full flex-1 items-center justify-center overflow-hidden',\n 'rounded-box',\n 'laptop:min-h-[288px] min-h-[240px]',\n 'lg-desktop:aspect-w-[964] lg-desktop:aspect-h-[480]',\n 'desktop:aspect-w-[759] desktop:aspect-h-[384]',\n 'laptop:aspect-w-[516] laptop:aspect-h-[288]',\n 'l-tablet:col-span-12',\n 'l-tablet:mb-3',\n theme === 'dark' ? 'bg-[#1E2024]' : 'bg-[#EAEAEC]'\n )}\n >\n <div\n className={cn(\n 'size-full px-[16px] pt-[16px]',\n 'lg-desktop:pb-[32px] lg-desktop:px-[32px]',\n 'desktop:pt-[24px] desktop:px-[24px]',\n 'laptop:pt-[16px] laptop:px-[16px]',\n 'tablet:px-[24px]',\n 'l-tablet:absolute l-tablet:top-0 l-tablet:inset-x-0 l-tablet:z-10'\n )}\n >\n {/* Top bar: chances + rules/rewards links */}\n <div className=\"relative z-10 mb-2 flex max-h-[24px] w-full flex-wrap items-center justify-between gap-3\">\n <div>\n <p className=\"text-info-primary font-[700]\">\n {opportunitiesText?.[0]}\n <span className=\"ml-1 text-[#FF6B35]\">{availableChances}</span>\n {opportunitiesText?.[1] || ''}\n </p>\n </div>\n <div className=\"flex items-center gap-4\">\n {rulesData && (\n <button\n onClick={() => {\n if (!isLoggedIn) {\n onLoginRequired?.()\n return\n }\n setShowRulesModal(true)\n }}\n className=\"cursor-pointer touch-manipulation\"\n type=\"button\"\n >\n <span className=\"text-info-primary font-[700] underline\">{rulesText}</span>\n </button>\n )}\n {rewardsData && (\n <button\n onClick={() => {\n if (!isLoggedIn) {\n onLoginRequired?.()\n return\n }\n setShowRewardsModal(true)\n }}\n className=\"cursor-pointer touch-manipulation whitespace-nowrap\"\n type=\"button\"\n >\n <span className=\"text-info-primary font-[700] underline\">{myRewardsText}</span>\n </button>\n )}\n </div>\n </div>\n\n {/* Media Draw Area */}\n <MediaDrawArea\n theme={theme}\n media={media}\n ctaButton={ctaButton}\n isDrawing={isDrawing}\n isDisabled={showNoChancesOverlay}\n onClick={handleDrawClick}\n />\n\n {showNoChancesOverlay && (\n <div\n className={cn(\n 'rounded-box absolute inset-0 z-20 flex items-center justify-center bg-black/60 backdrop-blur-sm',\n 'px-6 text-center'\n )}\n >\n <div className=\"flex flex-col items-center gap-4\">\n <p className=\"lg-desktop:text-[24px] text-[18px] font-semibold text-white\">{noChancesText}</p>\n </div>\n </div>\n )}\n </div>\n </GridItem>\n\n {/* Right: Chance Methods */}\n {hasRightPanel && (\n <GridItem\n span={5}\n className={cn(\n 'info-section',\n 'rounded-box',\n 'relative flex flex-col overflow-hidden',\n 'lg-desktop:aspect-w-[684] lg-desktop:aspect-h-[480]',\n 'desktop:aspect-w-[536] desktop:aspect-h-[384]',\n 'laptop:aspect-w-[364] laptop:aspect-h-[288]',\n 'l-tablet:min-h-[280px] laptop:max-h-[320px]',\n 'w-full',\n 'l-tablet:col-span-12',\n theme === 'dark' ? 'bg-[#1E2024]' : 'bg-[#EAEAEC]'\n )}\n >\n <ChanceMethods\n theme={theme}\n userData={userData}\n methods={chanceMethods}\n title={chanceTitle}\n subtitle={chanceSubtitle}\n footerNote={chanceFooterNote}\n onOpenShareModal={() => setShowShareModal(true)}\n chanceBadgeText={chanceMethodsText?.chanceBadgeText}\n completedText={completedText}\n usedText={usedText}\n loadingText={chanceMethodsText?.loadingText}\n mechanismType={mechanismType}\n inputConfig={inputConfig}\n />\n </GridItem>\n )}\n </Grid>\n\n {/* Footer: Prize Pool */}\n <div\n className={cn(\n 'product-lottery-footer',\n 'rounded-box',\n 'flex flex-col overflow-hidden',\n theme === 'dark' ? 'bg-[#1E2024]' : 'bg-[#EAEAEC]'\n )}\n >\n <PrizePool theme={theme} prizes={prizes} title={prizesTitle} winningInfos={winningInfos} />\n </div>\n\n {/* Winner Modal */}\n <WinnerModal\n isOpen={showWinnerModal}\n prize={winningPrize}\n title={externalWinnerConfig?.title || winnerModalConfig?.title}\n prizeTitle={externalWinnerConfig?.prizeTitle || winnerModalConfig?.prizeTitle}\n prizeImage={externalWinnerConfig?.prizeImage || winnerModalConfig?.prizeImage}\n prizeDescription={externalWinnerConfig?.prizeDescription || winnerModalConfig?.prizeDescription}\n learnMoreUrl={externalWinnerConfig?.learnMoreUrl || winnerModalConfig?.learnMoreUrl}\n learnMoreText={externalWinnerConfig?.learnMoreText || winnerModalConfig?.learnMoreText}\n couponCode={externalWinnerConfig?.couponCode || winnerModalConfig?.couponCode}\n expiresAt={externalWinnerConfig?.expiresAt || winnerModalConfig?.expiresAt}\n couponDiscount={externalWinnerConfig?.couponDiscount || winnerModalConfig?.couponDiscount}\n couponUnit={externalWinnerConfig?.couponUnit || winnerModalConfig?.couponUnit}\n confirmText={externalWinnerConfig?.confirmText || winnerModalConfig?.confirmText}\n onClose={handleCloseWinnerModal}\n theme={theme}\n />\n\n {/* Rules Modal */}\n {rulesData && (\n <RulesModal\n title={rulesText}\n isOpen={showRulesModal}\n onClose={() => setShowRulesModal(false)}\n rules={rulesData}\n theme={theme}\n />\n )}\n\n {/* My Rewards Modal */}\n {rewardsData && (\n <MyRewardsModal\n isOpen={showRewardsModal}\n onClose={() => setShowRewardsModal(false)}\n rewards={rewardsData}\n onCopyCode={onCopyCode}\n codeText={codeText}\n copyText={copyText}\n copiedText={copiedText}\n prizeText={prizeText}\n theme={theme}\n title={myRewardsText}\n />\n )}\n\n {/* Error Modal */}\n <ErrorModal\n isOpen={showErrorModal}\n onClose={() => setShowErrorModal(false)}\n title={errorTitle || errorModalConfig?.title}\n message={errorMessage || errorModalConfig?.message}\n confirmText={errorConfirmText || errorModalConfig?.confirmText}\n theme={theme}\n />\n\n {/* No-Win Modal */}\n <ErrorModal\n isOpen={showNoWinModal}\n onClose={handleCloseNoWinModal}\n title={noWinTitle || errorModalConfig?.title}\n message={noWinMessage || errorModalConfig?.message}\n confirmText={noWinConfirmText || errorModalConfig?.confirmText}\n theme={theme}\n />\n\n {/* Share Modal */}\n <ShareModal\n isOpen={showShareModal}\n onClose={() => setShowShareModal(false)}\n title={shareModalConfig?.title}\n subtitle={shareModalConfig?.subtitle}\n note={shareModalConfig?.note}\n platforms={shareModalConfig?.platforms}\n onShareSuccess={shareModalConfig?.onShareSuccess}\n theme={theme}\n />\n </div>\n )\n }\n)\n\nProductLottery.displayName = 'ProductLottery'\n\nexport default withLayout(ProductLottery)\nexport { WinnerModal } from '../LotteryShared/WinnerModal.js'\nexport { RulesModal } from '../LotteryShared/RulesModal.js'\nexport { MyRewardsModal } from '../LotteryShared/MyRewardsModal.js'\nexport { ErrorModal } from '../LotteryShared/ErrorModal.js'\nexport { ShareModal } from '../LotteryShared/ShareModal.js'\nexport { BaseModal } from '../LotteryShared/BaseModal.js'\nexport type {\n ProductLotteryProps,\n ProductLotteryHandle,\n MediaConfig,\n CtaButtonConfig,\n ResponsiveMedia,\n MediaDrawAreaProps,\n} from './types.js'\nexport type {\n Prize,\n ChanceMethod,\n ChanceMethodStatus,\n WinningInfo,\n PrizePoolProps,\n ChanceMethodsProps,\n WinnerModalProps,\n WinnerModalConfig,\n UserData,\n ShareModalConfig,\n SocialPlatform,\n SharePlatformConfig,\n} from '../LotteryShared/types.js'\nexport type { RulesModalProps, RuleItem } from '../LotteryShared/RulesModal.js'\nexport type { MyRewardsModalProps, Reward, RewardStatus } from '../LotteryShared/MyRewardsModal.js'\nexport type { ErrorModalProps } from '../LotteryShared/ErrorModal.js'\nexport type { ShareModalProps } from '../LotteryShared/ShareModal.js'\nexport type { BaseModalProps } from '../LotteryShared/BaseModal.js'\n"],
5
+ "mappings": "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",
6
+ "names": ["jsx", "jsxs", "useState", "useCallback", "useImperativeHandle", "forwardRef", "cn", "DEFAULT_CHANCE_TITLE", "DEFAULT_CHANCE_METHODS", "Grid", "GridItem", "MediaDrawArea", "PrizePool", "ChanceMethods", "WinnerModal", "RulesModal", "MyRewardsModal", "ErrorModal", "ShareModal", "withLayout", "ProductLottery", "prizes", "media", "theme", "ctaButton", "chanceMethods", "chanceTitle", "chanceSubtitle", "chanceFooterNote", "chanceMethodsText", "mechanismType", "inputConfig", "winningInfos", "prizesTitle", "onDrawStart", "onDrawEnd", "onDrawError", "winnerModalConfig", "rulesModalConfig", "myRewardsModalConfig", "errorModalConfig", "shareModalConfig", "userData", "loginPromptText", "loginButtonText", "noChancesText", "onLoginRequired", "onCopyCode", "opportunitiesText", "className", "ref", "rulesData", "rulesText", "rewardsData", "myRewardsText", "codeText", "copyText", "copiedText", "prizeText", "completedText", "usedText", "isLoggedIn", "availableChances", "hasRightPanel", "showNoChancesOverlay", "isDrawing", "setIsDrawing", "winningPrize", "setWinningPrize", "showWinnerModal", "setShowWinnerModal", "showRulesModal", "setShowRulesModal", "showRewardsModal", "setShowRewardsModal", "showErrorModal", "setShowErrorModal", "showNoWinModal", "setShowNoWinModal", "showShareModal", "setShowShareModal", "errorMessage", "setErrorMessage", "errorTitle", "setErrorTitle", "errorConfirmText", "setErrorConfirmText", "noWinTitle", "setNoWinTitle", "noWinMessage", "setNoWinMessage", "noWinConfirmText", "setNoWinConfirmText", "externalWinnerConfig", "setExternalWinnerConfig", "message", "title", "confirmText", "config", "prize", "handleDrawStart", "prizeId", "p", "error", "handleDrawClick", "handleCloseWinnerModal", "handleCloseNoWinModal", "ProductLottery_default", "BaseModal"]
7
+ }