@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.
- package/dist/cjs/biz-components/ActiveShelf/index.d.ts +2 -2
- package/dist/cjs/biz-components/ActiveShelf/index.js +1 -1
- package/dist/cjs/biz-components/ActiveShelf/index.js.map +3 -3
- package/dist/cjs/biz-components/EventSchedule/index.d.ts +2 -7
- package/dist/cjs/biz-components/EventSchedule/index.js +1 -1
- package/dist/cjs/biz-components/EventSchedule/index.js.map +3 -3
- package/dist/cjs/biz-components/FeaturedBlogPosts/index.d.ts +1 -6
- package/dist/cjs/biz-components/FeaturedBlogPosts/index.js +1 -1
- package/dist/cjs/biz-components/FeaturedBlogPosts/index.js.map +3 -3
- package/dist/cjs/biz-components/HeroBanner/HeroBanner.js +1 -1
- package/dist/cjs/biz-components/HeroBanner/HeroBanner.js.map +2 -2
- package/dist/cjs/biz-components/ImageOverlayShelf/index.d.ts +2 -2
- package/dist/cjs/biz-components/ImageOverlayShelf/index.js +1 -1
- package/dist/cjs/biz-components/ImageOverlayShelf/index.js.map +3 -3
- package/dist/cjs/biz-components/LotteryShared/BaseModal.d.ts +61 -0
- package/dist/cjs/biz-components/LotteryShared/BaseModal.js +2 -0
- package/dist/cjs/biz-components/LotteryShared/BaseModal.js.map +7 -0
- package/dist/cjs/biz-components/LotteryShared/ChanceMethods.d.ts +25 -0
- package/dist/cjs/biz-components/LotteryShared/ChanceMethods.js +2 -0
- package/dist/cjs/biz-components/LotteryShared/ChanceMethods.js.map +7 -0
- package/dist/cjs/biz-components/LotteryShared/ErrorModal.d.ts +47 -0
- package/dist/cjs/biz-components/LotteryShared/ErrorModal.js +2 -0
- package/dist/cjs/biz-components/LotteryShared/ErrorModal.js.map +7 -0
- package/dist/cjs/biz-components/LotteryShared/MyRewardsModal.d.ts +101 -0
- package/dist/cjs/biz-components/LotteryShared/MyRewardsModal.js +2 -0
- package/dist/cjs/biz-components/LotteryShared/MyRewardsModal.js.map +7 -0
- package/dist/cjs/biz-components/LotteryShared/PrizePool.d.ts +29 -0
- package/dist/cjs/biz-components/LotteryShared/PrizePool.js +2 -0
- package/dist/cjs/biz-components/LotteryShared/PrizePool.js.map +7 -0
- package/dist/cjs/biz-components/LotteryShared/RulesModal.d.ts +56 -0
- package/dist/cjs/biz-components/LotteryShared/RulesModal.js +2 -0
- package/dist/cjs/biz-components/LotteryShared/RulesModal.js.map +7 -0
- package/dist/cjs/biz-components/LotteryShared/ShareModal.d.ts +79 -0
- package/dist/cjs/biz-components/LotteryShared/ShareModal.js +2 -0
- package/dist/cjs/biz-components/LotteryShared/ShareModal.js.map +7 -0
- package/dist/cjs/biz-components/LotteryShared/WinnerModal.d.ts +27 -0
- package/dist/cjs/biz-components/LotteryShared/WinnerModal.js +2 -0
- package/dist/cjs/biz-components/LotteryShared/WinnerModal.js.map +7 -0
- package/dist/cjs/biz-components/LotteryShared/index.d.ts +23 -0
- package/dist/cjs/biz-components/LotteryShared/index.js +2 -0
- package/dist/cjs/biz-components/LotteryShared/index.js.map +7 -0
- package/dist/cjs/biz-components/LotteryShared/types.d.ts +760 -0
- package/dist/cjs/biz-components/LotteryShared/types.js +2 -0
- package/dist/cjs/biz-components/LotteryShared/types.js.map +7 -0
- package/dist/cjs/biz-components/MediaEndorsement/index.js +2 -2
- package/dist/cjs/biz-components/MediaEndorsement/index.js.map +2 -2
- package/dist/cjs/biz-components/MediaShelf/index.d.ts +2 -2
- package/dist/cjs/biz-components/MediaShelf/index.js +1 -1
- package/dist/cjs/biz-components/MediaShelf/index.js.map +3 -3
- package/dist/cjs/biz-components/ProductLottery/MediaDrawArea.d.ts +4 -0
- package/dist/cjs/biz-components/ProductLottery/MediaDrawArea.js +2 -0
- package/dist/cjs/biz-components/ProductLottery/MediaDrawArea.js.map +7 -0
- package/dist/cjs/biz-components/ProductLottery/index.d.ts +17 -0
- package/dist/cjs/biz-components/ProductLottery/index.js +2 -0
- package/dist/cjs/biz-components/ProductLottery/index.js.map +7 -0
- package/dist/cjs/biz-components/ProductLottery/types.d.ts +363 -0
- package/dist/cjs/biz-components/ProductLottery/types.js +2 -0
- package/dist/cjs/biz-components/ProductLottery/types.js.map +7 -0
- package/dist/cjs/biz-components/Specs/index.js +1 -1
- package/dist/cjs/biz-components/Specs/index.js.map +3 -3
- package/dist/cjs/biz-components/WheelLottery/index.d.ts +11 -11
- package/dist/cjs/biz-components/WheelLottery/index.js +1 -1
- package/dist/cjs/biz-components/WheelLottery/index.js.map +3 -3
- package/dist/cjs/biz-components/WheelLottery/types.d.ts +17 -723
- package/dist/cjs/biz-components/WheelLottery/types.js +1 -1
- package/dist/cjs/biz-components/WheelLottery/types.js.map +3 -3
- package/dist/cjs/biz-components/index.d.ts +2 -0
- package/dist/cjs/biz-components/index.js +1 -1
- package/dist/cjs/biz-components/index.js.map +3 -3
- package/dist/esm/biz-components/ActiveShelf/index.d.ts +2 -2
- package/dist/esm/biz-components/ActiveShelf/index.js +1 -1
- package/dist/esm/biz-components/ActiveShelf/index.js.map +3 -3
- package/dist/esm/biz-components/EventSchedule/index.d.ts +2 -7
- package/dist/esm/biz-components/EventSchedule/index.js +1 -1
- package/dist/esm/biz-components/EventSchedule/index.js.map +3 -3
- package/dist/esm/biz-components/FeaturedBlogPosts/index.d.ts +1 -6
- package/dist/esm/biz-components/FeaturedBlogPosts/index.js +1 -1
- package/dist/esm/biz-components/FeaturedBlogPosts/index.js.map +3 -3
- package/dist/esm/biz-components/HeroBanner/HeroBanner.js +1 -1
- package/dist/esm/biz-components/HeroBanner/HeroBanner.js.map +2 -2
- package/dist/esm/biz-components/ImageOverlayShelf/index.d.ts +2 -2
- package/dist/esm/biz-components/ImageOverlayShelf/index.js +1 -1
- package/dist/esm/biz-components/ImageOverlayShelf/index.js.map +3 -3
- package/dist/esm/biz-components/LotteryShared/BaseModal.d.ts +61 -0
- package/dist/esm/biz-components/LotteryShared/BaseModal.js +2 -0
- package/dist/esm/biz-components/LotteryShared/BaseModal.js.map +7 -0
- package/dist/esm/biz-components/LotteryShared/ChanceMethods.d.ts +25 -0
- package/dist/esm/biz-components/LotteryShared/ChanceMethods.js +2 -0
- package/dist/esm/biz-components/LotteryShared/ChanceMethods.js.map +7 -0
- package/dist/esm/biz-components/LotteryShared/ErrorModal.d.ts +47 -0
- package/dist/esm/biz-components/LotteryShared/ErrorModal.js +2 -0
- package/dist/esm/biz-components/LotteryShared/ErrorModal.js.map +7 -0
- package/dist/esm/biz-components/LotteryShared/MyRewardsModal.d.ts +101 -0
- package/dist/esm/biz-components/LotteryShared/MyRewardsModal.js +2 -0
- package/dist/esm/biz-components/LotteryShared/MyRewardsModal.js.map +7 -0
- package/dist/esm/biz-components/LotteryShared/PrizePool.d.ts +29 -0
- package/dist/esm/biz-components/LotteryShared/PrizePool.js +2 -0
- package/dist/esm/biz-components/LotteryShared/PrizePool.js.map +7 -0
- package/dist/esm/biz-components/LotteryShared/RulesModal.d.ts +56 -0
- package/dist/esm/biz-components/LotteryShared/RulesModal.js +2 -0
- package/dist/esm/biz-components/LotteryShared/RulesModal.js.map +7 -0
- package/dist/esm/biz-components/LotteryShared/ShareModal.d.ts +79 -0
- package/dist/esm/biz-components/LotteryShared/ShareModal.js +2 -0
- package/dist/esm/biz-components/LotteryShared/ShareModal.js.map +7 -0
- package/dist/esm/biz-components/LotteryShared/WinnerModal.d.ts +27 -0
- package/dist/esm/biz-components/LotteryShared/WinnerModal.js +2 -0
- package/dist/esm/biz-components/LotteryShared/WinnerModal.js.map +7 -0
- package/dist/esm/biz-components/LotteryShared/index.d.ts +23 -0
- package/dist/esm/biz-components/LotteryShared/index.js +2 -0
- package/dist/esm/biz-components/LotteryShared/index.js.map +7 -0
- package/dist/esm/biz-components/LotteryShared/types.d.ts +760 -0
- package/dist/esm/biz-components/LotteryShared/types.js +2 -0
- package/dist/esm/biz-components/LotteryShared/types.js.map +7 -0
- package/dist/esm/biz-components/MediaEndorsement/index.js +2 -2
- package/dist/esm/biz-components/MediaEndorsement/index.js.map +3 -3
- package/dist/esm/biz-components/MediaShelf/index.d.ts +2 -2
- package/dist/esm/biz-components/MediaShelf/index.js +1 -1
- package/dist/esm/biz-components/MediaShelf/index.js.map +3 -3
- package/dist/esm/biz-components/ProductLottery/MediaDrawArea.d.ts +4 -0
- package/dist/esm/biz-components/ProductLottery/MediaDrawArea.js +2 -0
- package/dist/esm/biz-components/ProductLottery/MediaDrawArea.js.map +7 -0
- package/dist/esm/biz-components/ProductLottery/index.d.ts +17 -0
- package/dist/esm/biz-components/ProductLottery/index.js +2 -0
- package/dist/esm/biz-components/ProductLottery/index.js.map +7 -0
- package/dist/esm/biz-components/ProductLottery/types.d.ts +363 -0
- package/dist/esm/biz-components/ProductLottery/types.js +2 -0
- package/dist/esm/biz-components/ProductLottery/types.js.map +7 -0
- package/dist/esm/biz-components/Specs/index.js +1 -1
- package/dist/esm/biz-components/Specs/index.js.map +3 -3
- package/dist/esm/biz-components/WheelLottery/index.d.ts +11 -11
- package/dist/esm/biz-components/WheelLottery/index.js +1 -1
- package/dist/esm/biz-components/WheelLottery/index.js.map +3 -3
- package/dist/esm/biz-components/WheelLottery/types.d.ts +17 -723
- package/dist/esm/biz-components/WheelLottery/types.js +1 -1
- package/dist/esm/biz-components/WheelLottery/types.js.map +3 -3
- package/dist/esm/biz-components/index.d.ts +2 -0
- package/dist/esm/biz-components/index.js +1 -1
- package/dist/esm/biz-components/index.js.map +2 -2
- package/package.json +1 -1
- 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
|
|
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:
|
|
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::
|
|
5
|
-
"mappings": "aAsEM,OAcI,OAAAA,EAdJ,QAAAC,MAAA,oBApEN,UAAYC,MAAW,QACvB,OAAS,OAAAC,MAAW,2BACpB,OAAS,UAAAC,EAAQ,eAAAC,MAAmB,eACpC,OAAS,YAAAC,EAAU,cAAAC,EAAY,cAAAC,MAAkB,iBACjD,OAAS,iBAAAC,MAAqB,mBAC9B,MAAO,wBACP,OAAS,MAAAC,MAAU,yBAOnB,OAAS,WAAAC,EAAS,QAAAC,MAAY,iBAC9B,OAAS,cAAAC,MAAkB,yBAE3B,MAAMC,EAAyB,EAG/B,SAASC,EAAcC,EAAYC,EAAqB,CACtD,MAAMC,EAAgB,CAAC,EACvB,
|
|
6
|
-
"names": ["jsx", "jsxs", "React", "cva", "Swiper", "SwiperSlide", "FreeMode", "Mousewheel", "Pagination", "useMediaQuery", "cn", "Heading", "Text", "withLayout", "MOBILE_ITEMS_PER_SLIDE", "chunkArray", "array", "size", "result", "
|
|
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
|
|
118
|
-
export default
|
|
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{
|
|
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": "
|
|
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,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": "aA8BW,cAAAA,EAMP,QAAAC,MANO,oBA5BX,MAAkB,QAClB,OAAS,MAAAC,MAAU,yBAEnB,MAAmC,aAEnC,MAAMC,EAAc,CAClB,OAAQ,qBACR,OAAQ,sBACR,QAAS,sBACT,UAAW,qBACb,EAEA,SAASC,EAAkBC,EAAuD,CAChF,OAAO,OAAOA,GAAQ,UAAY,YAAaA,CACjD,CAEA,SAASC,EAAcC,EAA4B,CACjD,OAAI,OAAOA,EAAM,KAAQ,SAAiBA,EAAM,IACzCA,EAAM,IAAI,OACnB,CAEA,MAAMC,EAGD,CAAC,CAAE,MAAAD,EAAO,UAAAE,CAAU,IAAM,CAC7B,MAAMC,EAAMH,EAAM,KAAO,kBAEzB,GAAI,CAACH,EAAkBG,EAAM,GAAG,EAC9B,OAAOP,EAAC,OAAI,IAAKO,EAAM,IAAK,IAAKG,EAAK,UAAWR,EAAG,2BAA4BO,CAAS,EAAG,QAAQ,OAAO,EAG7G,MAAME,EAAaJ,EAAM,IAEzB,OACEN,EAAC,WACE,UAAAU,EAAW,WAAaX,EAAC,UAAO,MAAOG,EAAY,UAAW,OAAQQ,EAAW,UAAW,EAC5FA,EAAW,SAAWX,EAAC,UAAO,MAAOG,EAAY,QAAS,OAAQQ,EAAW,QAAS,EACtFA,EAAW,QAAUX,EAAC,UAAO,MAAOG,EAAY,OAAQ,OAAQQ,EAAW,OAAQ,EACnFA,EAAW,QAAUX,EAAC,UAAO,MAAOG,EAAY,OAAQ,OAAQQ,EAAW,OAAQ,EACpFX,EAAC,OAAI,IAAKW,EAAW,QAAS,IAAKD,EAAK,UAAWR,EAAG,yBAA0BO,CAAS,EAAG,QAAQ,OAAO,GAC7G,CAEJ,EAEMG,EAGD,CAAC,CAAE,MAAAL,EAAO,UAAAE,CAAU,IAAM,CAC7B,MAAMJ,EAAMC,EAAcC,CAAK,EAE/B,OACEP,EAAC,SACC,IAAKK,EACL,OAAQE,EAAM,OACd,SAAUA,EAAM,UAAY,GAC5B,MAAOA,EAAM,OAAS,GACtB,KAAMA,EAAM,MAAQ,GACpB,YAAW,GACX,UAAWL,EAAG,yBAA0BO,CAAS,EACjD,aAAYF,EAAM,KAAO,wBAC3B,CAEJ,EAEMM,EAAgB,CACpB,QAASX,EAAG,6CAA8C,WAAW,EACrE,UAAWA,EAAG,0BAA2B,iCAAiC,EAC1E,QAASA,EAAG,kDAAmD,mBAAmB,CACpF,EAEaY,EAA8C,CAAC,CAC1D,MAAAP,EACA,UAAAQ,EACA,UAAAC,EAAY,GACZ,WAAAC,EAAa,GACb,QAAAC,EACA,UAAAT,CACF,IAAM,CACJ,MAAMU,EAAaJ,GAAW,MAAQ,GAChCK,EAAcL,GAAW,OAAS,UAExC,OACEd,EAAC,OAAI,UAAWC,EAAG,kBAAmB,4BAA6BO,CAAS,EAE1E,UAAAT,EAAC,OAAI,UAAU,mBACZ,SAAAO,EAAM,OAAS,QAAUP,EAACY,EAAA,CAAW,MAAOL,EAAO,EAAKP,EAACQ,EAAA,CAAgB,MAAOD,EAAO,EAC1F,EAGAP,EAAC,UACC,KAAK,SACL,QAASkB,EACT,SAAUD,GAAcD,EACxB,UAAWd,EACT,qEACA,6DACA,8BACA,yGACF,EACA,aAAYc,EAAY,yBAA2BG,EACnD,YAAWH,EAGV,SAAAG,GACClB,EAAC,QACC,UAAWC,EACT,gDACA,0BACA,wBACA,2CACA,+BACA,8BACA,kCACAW,EAAcO,CAAW,EACzBJ,GAAa,iCACbC,GAAc,gCAChB,EAEC,UAAAD,GACCf,EAAC,OAAI,UAAU,sBAAsB,QAAQ,YAAY,KAAK,OAAO,cAAY,OAC/E,UAAAD,EAAC,UACC,GAAG,KACH,GAAG,KACH,EAAE,KACF,OAAO,eACP,YAAY,IACZ,cAAc,QACd,UAAU,aACZ,EACAA,EAAC,QACC,EAAE,oBACF,OAAO,eACP,YAAY,IACZ,cAAc,QACd,UAAU,aACZ,GACF,EAEDmB,GACH,EAEJ,GACF,CAEJ,EAEAL,EAAc,YAAc,gBAE5B,IAAOO,EAAQP",
|
|
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
|
+
}
|