@anker-in/headless-ui 1.1.90 → 1.1.91

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/cjs/biz-components/LotteryShared/BaseModal.js +1 -1
  2. package/dist/cjs/biz-components/LotteryShared/BaseModal.js.map +2 -2
  3. package/dist/cjs/biz-components/LotteryShared/ChanceMethods.js +1 -1
  4. package/dist/cjs/biz-components/LotteryShared/ChanceMethods.js.map +2 -2
  5. package/dist/cjs/biz-components/LotteryShared/ErrorModal.d.ts +15 -0
  6. package/dist/cjs/biz-components/LotteryShared/ErrorModal.js +1 -1
  7. package/dist/cjs/biz-components/LotteryShared/ErrorModal.js.map +3 -3
  8. package/dist/cjs/biz-components/LotteryShared/MyRewardsModal.js +1 -1
  9. package/dist/cjs/biz-components/LotteryShared/MyRewardsModal.js.map +3 -3
  10. package/dist/cjs/biz-components/LotteryShared/WinnerModal.d.ts +1 -1
  11. package/dist/cjs/biz-components/LotteryShared/WinnerModal.js +1 -1
  12. package/dist/cjs/biz-components/LotteryShared/WinnerModal.js.map +3 -3
  13. package/dist/cjs/biz-components/LotteryShared/types.d.ts +42 -0
  14. package/dist/cjs/biz-components/LotteryShared/types.js +1 -1
  15. package/dist/cjs/biz-components/LotteryShared/types.js.map +2 -2
  16. package/dist/cjs/biz-components/ProductLottery/index.js +1 -1
  17. package/dist/cjs/biz-components/ProductLottery/index.js.map +3 -3
  18. package/dist/cjs/biz-components/ProductLottery/types.d.ts +113 -4
  19. package/dist/cjs/biz-components/ProductLottery/types.js +1 -1
  20. package/dist/cjs/biz-components/ProductLottery/types.js.map +2 -2
  21. package/dist/esm/biz-components/LotteryShared/BaseModal.js +1 -1
  22. package/dist/esm/biz-components/LotteryShared/BaseModal.js.map +2 -2
  23. package/dist/esm/biz-components/LotteryShared/ChanceMethods.js +1 -1
  24. package/dist/esm/biz-components/LotteryShared/ChanceMethods.js.map +2 -2
  25. package/dist/esm/biz-components/LotteryShared/ErrorModal.d.ts +15 -0
  26. package/dist/esm/biz-components/LotteryShared/ErrorModal.js +1 -1
  27. package/dist/esm/biz-components/LotteryShared/ErrorModal.js.map +3 -3
  28. package/dist/esm/biz-components/LotteryShared/MyRewardsModal.js +1 -1
  29. package/dist/esm/biz-components/LotteryShared/MyRewardsModal.js.map +3 -3
  30. package/dist/esm/biz-components/LotteryShared/WinnerModal.d.ts +1 -1
  31. package/dist/esm/biz-components/LotteryShared/WinnerModal.js +1 -1
  32. package/dist/esm/biz-components/LotteryShared/WinnerModal.js.map +3 -3
  33. package/dist/esm/biz-components/LotteryShared/types.d.ts +42 -0
  34. package/dist/esm/biz-components/LotteryShared/types.js.map +2 -2
  35. package/dist/esm/biz-components/ProductLottery/index.js +1 -1
  36. package/dist/esm/biz-components/ProductLottery/index.js.map +3 -3
  37. package/dist/esm/biz-components/ProductLottery/types.d.ts +113 -4
  38. package/dist/esm/biz-components/ProductLottery/types.js +1 -1
  39. package/dist/esm/biz-components/ProductLottery/types.js.map +2 -2
  40. package/package.json +1 -1
  41. package/style.css +30 -0
@@ -82,6 +82,40 @@ export interface CtaButtonConfig {
82
82
  */
83
83
  style?: 'primary' | 'secondary' | 'outline';
84
84
  }
85
+ /**
86
+ * 错误弹窗配置(ErrorConfig)
87
+ *
88
+ * 对齐 CMS `error` group 字段结构。
89
+ *
90
+ * CMS 字段映射:
91
+ * - `title` → 弹窗标题
92
+ * - `defaultMessage` → 默认错误内容文案
93
+ * - `confirmButton` → 确认按钮文案
94
+ * - `exchangeFailedTitle` → 兑换失败弹窗标题
95
+ * - `exchangeFailedMessage` → 兑换失败弹窗内容
96
+ */
97
+ export interface ErrorConfig {
98
+ title?: string;
99
+ defaultMessage?: string;
100
+ confirmButton?: string;
101
+ exchangeFailedTitle?: string;
102
+ exchangeFailedMessage?: string;
103
+ }
104
+ /**
105
+ * 未中奖弹窗配置(TryAgainConfig)
106
+ *
107
+ * 对齐 CMS `tryAgain` group 字段结构。
108
+ *
109
+ * CMS 字段映射:
110
+ * - `title` → 弹窗标题
111
+ * - `message` → 内容文案
112
+ * - `confirmText` → 确认按钮文案
113
+ */
114
+ export interface TryAgainConfig {
115
+ title?: string;
116
+ message?: string;
117
+ confirmText?: string;
118
+ }
85
119
  /**
86
120
  * ProductLottery 组件命令式控制接口
87
121
  *
@@ -239,6 +273,12 @@ export interface ProductLotteryProps {
239
273
  theme?: Theme;
240
274
  /** CTA 按钮配置 */
241
275
  ctaButton?: CtaButtonConfig;
276
+ /**
277
+ * 抽奖活动类型(CMS: `dealsType`)
278
+ * 用于标识抽奖活动的唯一类型,如:`ipc-2614`
279
+ * @optional
280
+ */
281
+ dealsType?: string;
242
282
  /**
243
283
  * 获取机会方式数组
244
284
  * @optional
@@ -250,8 +290,32 @@ export interface ProductLotteryProps {
250
290
  * @optional
251
291
  */
252
292
  mechanismType?: ChanceMechanismType;
293
+ /**
294
+ * 输入框占位文本(CMS: `inputPlaceholder`)
295
+ * @default "Enter your order number"
296
+ * @optional
297
+ */
298
+ inputPlaceholder?: string;
299
+ /**
300
+ * 提交按钮文案(CMS: `inputSubmitText`)
301
+ * @default "Spin and Win"
302
+ * @optional
303
+ */
304
+ inputSubmitText?: string;
305
+ /**
306
+ * 输入框类型(CMS: `inputType`)
307
+ * @default "text"
308
+ * @optional
309
+ */
310
+ inputType?: 'text' | 'email' | 'number';
311
+ /**
312
+ * 输入格式错误提示文案(CMS: `inputValidationErrorText`)
313
+ * @optional
314
+ */
315
+ inputValidationErrorText?: string;
253
316
  /**
254
317
  * 输入框配置(当 mechanismType 为 'input' 时使用)
318
+ * @deprecated Use flat input fields (`inputPlaceholder`, `inputSubmitText`, `inputType`, `inputValidationErrorText`) instead (CMS field names)
255
319
  * @optional
256
320
  */
257
321
  inputConfig?: ChanceInputConfig;
@@ -273,10 +337,21 @@ export interface ProductLotteryProps {
273
337
  loadingText?: string;
274
338
  };
275
339
  /**
276
- * 中奖信息数组,用于底部滚动条展示
340
+ * 中奖弹窗配置(CMS: `winningInfos` group — 主名称)
341
+ *
342
+ * CMS 中 `winningInfos` 是中奖弹窗配置 group,字段:
343
+ * `title`、`confirmButton`、`confirmUrl`、`learnMoreUrl`、`learnMoreText`。
344
+ */
345
+ winningInfos?: WinnerModalConfig;
346
+ /**
347
+ * 底部滚动条中奖人名单数据
348
+ *
349
+ * 原 `winningInfos: WinningInfo[]` 重命名为 `winnerTickerData` 以避免
350
+ * 与 CMS `winningInfos` group 命名冲突。
351
+ *
277
352
  * @default []
278
353
  */
279
- winningInfos?: WinningInfo[];
354
+ winnerTickerData?: WinningInfo[];
280
355
  /**
281
356
  * 中奖滚动 Ticker 文案模板,支持 {{name}} 和 {{prize}} 变量
282
357
  * @default "{{name}} just won {{prize}}!"
@@ -308,14 +383,46 @@ export interface ProductLotteryProps {
308
383
  actionButtonConfig?: ActionButtonConfig;
309
384
  /** 我的奖励弹窗配置 */
310
385
  myRewardsModalConfig?: MyRewardsModalConfig;
311
- /** 错误弹窗配置 */
386
+ /**
387
+ * 错误弹窗配置(CMS: `error` group — 主名称)
388
+ *
389
+ * 字段:`title`、`defaultMessage`、`confirmButton`、
390
+ * `exchangeFailedTitle`、`exchangeFailedMessage`。
391
+ */
392
+ error?: ErrorConfig;
393
+ /**
394
+ * 未中奖弹窗配置(CMS: `tryAgain` group)
395
+ *
396
+ * 字段:`title`、`message`、`confirmText`。
397
+ */
398
+ tryAgain?: TryAgainConfig;
399
+ /**
400
+ * 错误弹窗配置(旧版)
401
+ * @deprecated Use `error` instead (CMS field name)
402
+ */
312
403
  errorModalConfig?: ErrorModalConfig;
313
404
  /** 分享弹窗配置 */
314
405
  shareModalConfig?: ShareModalConfig;
406
+ /**
407
+ * 未登录时的提示文案(CMS: `loginPrompt`)
408
+ * @default "Please log in to participate in the lottery"
409
+ */
410
+ loginPrompt?: string;
411
+ /**
412
+ * 次数不足时的提示文案(CMS: `noChances`)
413
+ * @default "You have no chances left. Get more chances below!"
414
+ */
415
+ noChances?: string;
416
+ /**
417
+ * 机会进度前缀文案(CMS: `opportunitiesPrefix`)
418
+ * @default "Number of draws remaining today: "
419
+ */
420
+ opportunitiesPrefix?: string;
315
421
  /** 用户数据 */
316
422
  userData?: UserData;
317
423
  /**
318
424
  * 未登录时的提示文案
425
+ * @deprecated Use `loginPrompt` instead (CMS field name)
319
426
  * @default "Please log in to participate"
320
427
  */
321
428
  loginPromptText?: string;
@@ -326,6 +433,7 @@ export interface ProductLotteryProps {
326
433
  loginButtonText?: string;
327
434
  /**
328
435
  * 次数不足时的提示文案
436
+ * @deprecated Use `noChances` instead (CMS field name)
329
437
  * @default "You have no chances left"
330
438
  */
331
439
  noChancesText?: string;
@@ -336,7 +444,8 @@ export interface ProductLotteryProps {
336
444
  /** 复制优惠码回调 */
337
445
  onCopyCode?: (code: string) => void;
338
446
  /**
339
- * 机会进度文案
447
+ * 机会进度文案数组(旧版,首元素为前缀,次元素为后缀)
448
+ * @deprecated Use `opportunitiesPrefix` instead (CMS field name)
340
449
  * @default ["Number of draws remaining today:"]
341
450
  */
342
451
  opportunitiesText?: string[];
@@ -1,2 +1,2 @@
1
- "use strict";var t=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var s=Object.prototype.hasOwnProperty;var g=(o,e)=>{for(var n in e)t(o,n,{get:e[n],enumerable:!0})},l=(o,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of d(e))!s.call(o,i)&&i!==n&&t(o,i,{get:()=>e[i],enumerable:!(r=a(e,i))||r.enumerable});return o};var c=o=>l(t({},"__esModule",{value:!0}),o);var f={};g(f,{DEFAULT_CHANCE_TITLE:()=>C,DEFAULT_CTA_BUTTON:()=>h});module.exports=c(f);const h={text:"",style:"primary"},C="Want more chances to win?";
1
+ "use strict";var t=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var d=(i,e)=>{for(var n in e)t(i,n,{get:e[n],enumerable:!0})},l=(i,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of s(e))!g.call(i,o)&&o!==n&&t(i,o,{get:()=>e[o],enumerable:!(r=a(e,o))||r.enumerable});return i};var c=i=>l(t({},"__esModule",{value:!0}),i);var C={};d(C,{DEFAULT_CHANCE_TITLE:()=>p,DEFAULT_CTA_BUTTON:()=>f});module.exports=c(C);const f={text:"",style:"primary"},p="Want more chances to win?";
2
2
  //# sourceMappingURL=types.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/biz-components/ProductLottery/types.ts"],
4
- "sourcesContent": ["/**\n * ProductLottery - \u4EA7\u54C1\u62BD\u5956\u7EC4\u4EF6\u7C7B\u578B\u5B9A\u4E49\n *\n * \u57FA\u4E8E\u5A92\u4F53\u5C55\u793A\uFF08\u56FE\u7247/\u89C6\u9891\uFF09\u7684\u62BD\u5956\u7EC4\u4EF6\uFF0C\u70B9\u51FB CTA \u6309\u94AE\u89E6\u53D1\u62BD\u5956\u3002\n * \u5171\u4EAB\u7C7B\u578B\u6765\u81EA LotteryShared/types.ts\u3002\n *\n * @module ProductLotteryTypes\n * @date 2026-04-07\n */\n\nimport type {\n Prize,\n WinnerModalConfig,\n ShareModalConfig,\n ChanceMethod,\n WinningInfo,\n RulesModalConfig,\n ActionButtonConfig,\n MyRewardsModalConfig,\n ErrorModalConfig,\n UserData,\n ChanceMechanismType,\n ChanceInputConfig,\n} from '../LotteryShared/types.js'\n\nimport type { Theme, Media } from '../../types/props.js'\n\n// Re-export shared types for convenience\nexport type { Theme, Media }\n\n// ============================================================================\n// \u5A92\u4F53\u914D\u7F6E\u7C7B\u578B\n// ============================================================================\n\n/**\n * \u5A92\u4F53\u914D\u7F6E\uFF08MediaConfig\uFF09\n *\n * \u7CBE\u786E\u5BF9\u9F50 CMS block \u5B57\u6BB5\u7ED3\u6784\uFF0C\u76F4\u63A5\u6620\u5C04\u65E0\u9700\u989D\u5916\u8F6C\u6362\u3002\n *\n * @example\n * ```tsx\n * // \u56FE\u7247\u6A21\u5F0F\uFF08\u54CD\u5E94\u5F0F\uFF09\n * const imageMedia: MediaConfig = {\n * type: 'image',\n * image: { url: '/img/banner-sm.jpg', alt: 'Banner', thumbnailURL: '' },\n * imageTablet: { url: '/img/banner-md.jpg', alt: 'Banner', thumbnailURL: '' },\n * imageLaptop: { url: '/img/banner-lg.jpg', alt: 'Banner', thumbnailURL: '' },\n * imageDesktop: { url: '/img/banner-xl.jpg', alt: 'Banner', thumbnailURL: '' },\n * imageLgDesktop: { url: '/img/banner-xxl.jpg', alt: 'Banner', thumbnailURL: '' },\n * }\n *\n * // \u89C6\u9891\u6A21\u5F0F\n * const videoMedia: MediaConfig = {\n * type: 'video',\n * video: {\n * url: 'https://cdn.example.com/promo.mp4',\n * alt: 'Product Lottery Video',\n * thumbnailURL: 'https://cdn.example.com/poster.jpg',\n * mimeType: 'video/mp4',\n * },\n * }\n * ```\n */\nexport interface MediaConfig {\n /** \u5A92\u4F53\u7C7B\u578B */\n type: 'image' | 'video'\n\n // \u2014\u2014 \u56FE\u7247\u5B57\u6BB5\uFF08type === 'image' \u65F6\u4F7F\u7528\uFF09\u2014\u2014\n\n /** \u9ED8\u8BA4/\u79FB\u52A8\u7AEF\u56FE\u7247\uFF08<768px\uFF09 */\n image?: Media\n /** \u5E73\u677F\u7AEF\u56FE\u7247\uFF08\u2265768px\uFF09 */\n imageTablet?: Media\n /** \u5C0F\u684C\u9762\u56FE\u7247\uFF08\u22651025px\uFF09 */\n imageLaptop?: Media\n /** \u5927\u684C\u9762\u56FE\u7247\uFF08\u22651440px\uFF09 */\n imageDesktop?: Media\n /** \u8D85\u5927\u5C4F\u56FE\u7247\uFF08\u22651920px\uFF09 */\n imageLgDesktop?: Media\n\n // \u2014\u2014 \u89C6\u9891\u5B57\u6BB5\uFF08type === 'video' \u65F6\u4F7F\u7528\uFF09\u2014\u2014\n\n /** \u89C6\u9891\u5A92\u4F53\uFF08mimeType: 'video/mp4'\uFF0CthumbnailURL \u4F5C\u5C01\u9762\u56FE\uFF09 */\n video?: Media\n}\n\n// ============================================================================\n// CTA \u6309\u94AE\u914D\u7F6E\n// ============================================================================\n\n/**\n * CTA \u6309\u94AE\u914D\u7F6E\uFF08CtaButtonConfig\uFF09\n *\n * \u914D\u7F6E\u8986\u76D6\u5728\u5A92\u4F53\u533A\u57DF\u4E0A\u7684\u884C\u52A8\u53F7\u53EC\u6309\u94AE\u3002\n *\n * @example\n * ```tsx\n * const ctaButton: CtaButtonConfig = {\n * text: 'Join the Draw',\n * style: 'primary',\n * }\n * ```\n */\nexport interface CtaButtonConfig {\n /**\n * \u6309\u94AE\u6587\u6848\n * @default \"Join the Draw\"\n * @optional\n */\n text?: string\n\n /**\n * \u6309\u94AE\u6837\u5F0F\n * @default \"primary\"\n * @optional\n */\n style?: 'primary' | 'secondary' | 'outline'\n}\n\n// ============================================================================\n// Imperative Handle \u63A5\u53E3\n// ============================================================================\n\n/**\n * ProductLottery \u7EC4\u4EF6\u547D\u4EE4\u5F0F\u63A7\u5236\u63A5\u53E3\n *\n * \u901A\u8FC7 ref \u66B4\u9732\u7ED9\u7236\u7EC4\u4EF6\uFF0C\u7528\u4E8E\u5916\u90E8\u63A7\u5236\u5F39\u7A97\u7B49\u72B6\u6001\u3002\n * \u4E0E WheelLotteryHandle \u4FDD\u6301\u4E00\u81F4\u7684\u5F39\u7A97\u63A7\u5236\u65B9\u6CD5\u3002\n *\n * @example\n * ```tsx\n * const lotteryRef = useRef<ProductLotteryHandle>(null)\n *\n * <ProductLottery ref={lotteryRef} prizes={prizes} media={media} />\n *\n * // \u5916\u90E8\u89E6\u53D1\u9519\u8BEF\u5F39\u7A97\n * lotteryRef.current?.showError({\n * title: 'Network Error',\n * message: 'Failed to connect to server',\n * confirmText: 'Retry'\n * })\n *\n * // \u663E\u793A\u89C4\u5219\u5F39\u7A97\n * lotteryRef.current?.showRules()\n *\n * // \u5173\u95ED\u6240\u6709\u5F39\u7A97\n * lotteryRef.current?.hideAllModals()\n * ```\n */\nexport interface ProductLotteryHandle {\n /** \u663E\u793A\u9519\u8BEF\u5F39\u7A97 */\n showError: (config: { message: string; title?: string; confirmText?: string }) => void\n\n /** \u9690\u85CF\u9519\u8BEF\u5F39\u7A97 */\n hideError: () => void\n\n /** \u663E\u793A\u672A\u4E2D\u5956\u5F39\u7A97 */\n showNoWin: (config?: { title?: string; message?: string; confirmText?: string }) => void\n\n /** \u9690\u85CF\u672A\u4E2D\u5956\u5F39\u7A97 */\n hideNoWin: () => void\n\n /** \u663E\u793A\u4E2D\u5956\u5F39\u7A97 */\n showWinner: (prize: Prize, config?: Partial<WinnerModalConfig>) => void\n\n /** \u9690\u85CF\u4E2D\u5956\u5F39\u7A97 */\n hideWinner: () => void\n\n /** \u663E\u793A\u89C4\u5219\u5F39\u7A97 */\n showRules: () => void\n\n /** \u9690\u85CF\u89C4\u5219\u5F39\u7A97 */\n hideRules: () => void\n\n /** \u663E\u793A\u6211\u7684\u5956\u52B1\u5F39\u7A97 */\n showRewards: () => void\n\n /** \u9690\u85CF\u6211\u7684\u5956\u52B1\u5F39\u7A97 */\n hideRewards: () => void\n\n /** \u663E\u793A\u5206\u4EAB\u5F39\u7A97 */\n showShare: (config?: Partial<ShareModalConfig>) => void\n\n /** \u9690\u85CF\u5206\u4EAB\u5F39\u7A97 */\n hideShare: () => void\n\n /** \u5173\u95ED\u6240\u6709\u5F39\u7A97 */\n hideAllModals: () => void\n}\n\n// ============================================================================\n// MediaDrawArea \u5B50\u7EC4\u4EF6 Props\n// ============================================================================\n\n/**\n * MediaDrawArea \u5B50\u7EC4\u4EF6 Props\n *\n * \u5A92\u4F53\u62BD\u5956\u533A\u57DF\uFF0C\u5C55\u793A\u56FE\u7247/\u89C6\u9891\u5E76\u53E0\u52A0 CTA \u6309\u94AE\u3002\n */\nexport interface MediaDrawAreaProps {\n /** \u4E3B\u9898\u6A21\u5F0F */\n theme?: Theme\n\n /** \u5A92\u4F53\u914D\u7F6E\uFF08\u5FC5\u9700\uFF09 */\n media: MediaConfig\n\n /** CTA \u6309\u9492\u914D\u7F6E */\n ctaButton?: CtaButtonConfig\n\n /**\n * \u89C6\u9891\u81EA\u52A8\u64AD\u653E\uFF08\u4EC5 mimeType='video/mp4' \u65F6\u6709\u6548\uFF09\n * @default true\n */\n videoAutoPlay?: boolean\n\n /**\n * \u89C6\u9891\u9759\u97F3\uFF08\u4EC5 mimeType='video/mp4' \u65F6\u6709\u6548\uFF09\n * @default true\n */\n videoMuted?: boolean\n\n /**\n * \u89C6\u9891\u5FAA\u73AF\uFF08\u4EC5 mimeType='video/mp4' \u65F6\u6709\u6548\uFF09\n * @default true\n */\n videoLoop?: boolean\n\n /** \u662F\u5426\u6B63\u5728\u62BD\u5956\u4E2D */\n isDrawing?: boolean\n\n /** \u662F\u5426\u7981\u7528\uFF08\u672A\u767B\u5F55\u6216\u65E0\u6B21\u6570\uFF09 */\n isDisabled?: boolean\n\n /** \u70B9\u51FB\u62BD\u5956\u56DE\u8C03 */\n onClick: () => void\n\n /** \u81EA\u5B9A\u4E49\u7C7B\u540D */\n className?: string\n\n /** \u70B9\u51FB\u8FFD\u8E2A\uFF1Adata-headless-type-name \u5C5E\u6027\u503C\uFF0C\u683C\u5F0F `{clickType}#{componentName}` */\n ctaTrackTypeName?: string\n\n /** \u70B9\u51FB\u8FFD\u8E2A\uFF1Adata-headless-title-desc-button \u5C5E\u6027\u503C\uFF0C\u683C\u5F0F `{title}#{desc}#{buttonName}` */\n ctaTrackTitleDescButton?: string\n}\n\n// ============================================================================\n// \u4E3B\u7EC4\u4EF6 Props\n// ============================================================================\n\n/**\n * ProductLottery \u7EC4\u4EF6 Props\n *\n * \u57FA\u4E8E\u5A92\u4F53\u5C55\u793A\u7684\u4EA7\u54C1\u62BD\u5956\u7EC4\u4EF6\u3002\u5DE6\u4FA7\u4E3A\u53EF\u70B9\u51FB\u7684\u5A92\u4F53\u533A\u57DF\uFF08\u56FE\u7247/\u89C6\u9891\uFF09\uFF0C\n * \u53F3\u4FA7\u4E3A\u83B7\u53D6\u673A\u4F1A\u533A\u57DF\uFF0C\u5E95\u90E8\u4E3A\u5956\u54C1\u6C60\u3002\n *\n * @example\n * ```tsx\n * <ProductLottery\n * prizes={prizes}\n * media={{ type: 'image', src: '/banner.jpg', alt: 'Lottery' }}\n * ctaButton={{ text: 'Draw Now' }}\n * onDrawStart={async () => {\n * const result = await fetch('/api/lottery')\n * const data = await result.json()\n * return data.prizeId\n * }}\n * onDrawEnd={(prize) => console.log('Won:', prize.name)}\n * />\n * ```\n */\nexport interface ProductLotteryProps {\n // ========== \u5FC5\u9700 Props ==========\n\n /**\n * 8 \u4E2A\u5956\u54C1\u6570\u7EC4\uFF08\u5FC5\u9700\uFF09\n * @minLength 8\n * @maxLength 8\n */\n prizes: Prize[]\n\n /**\n * \u5A92\u4F53\u914D\u7F6E\uFF08\u5FC5\u9700\uFF09\n * \u914D\u7F6E\u5DE6\u4FA7\u62BD\u5956\u533A\u57DF\u5C55\u793A\u7684\u56FE\u7247\u6216\u89C6\u9891\uFF0C\u65E0\u9700 type/src \u5305\u88C5\u5C42\n */\n media: MediaConfig\n\n /**\n * \u89C6\u9891\u81EA\u52A8\u64AD\u653E\uFF08\u5F53 media.mimeType === 'video/mp4' \u65F6\u751F\u6548\uFF09\n * @default true\n * @optional\n */\n videoAutoPlay?: boolean\n\n /**\n * \u89C6\u9891\u9759\u97F3\uFF08\u5F53 media.mimeType === 'video/mp4' \u65F6\u751F\u6548\uFF09\n * @default true\n * @optional\n */\n videoMuted?: boolean\n\n /**\n * \u89C6\u9891\u5FAA\u73AF\uFF08\u5F53 media.mimeType === 'video/mp4' \u65F6\u751F\u6548\uFF09\n * @default true\n * @optional\n */\n videoLoop?: boolean\n\n // ========== \u4E3B\u9898\u548C\u6837\u5F0F ==========\n\n /** \u4E3B\u9898\u6A21\u5F0F */\n theme?: Theme\n\n /** CTA \u6309\u94AE\u914D\u7F6E */\n ctaButton?: CtaButtonConfig\n\n // ========== \u83B7\u53D6\u673A\u4F1A\u533A\u57DF Props ==========\n\n /**\n * \u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\u6570\u7EC4\n * @optional\n */\n chanceMethods?: ChanceMethod[]\n\n /**\n * \u83B7\u53D6\u673A\u4F1A\u533A\u57DF\u673A\u5236\u7C7B\u578B\n * @default \"methods\"\n * @optional\n */\n mechanismType?: ChanceMechanismType\n\n /**\n * \u8F93\u5165\u6846\u914D\u7F6E\uFF08\u5F53 mechanismType \u4E3A 'input' \u65F6\u4F7F\u7528\uFF09\n * @optional\n */\n inputConfig?: ChanceInputConfig\n\n /**\n * \u83B7\u53D6\u673A\u4F1A\u533A\u57DF\u6807\u9898\n * @default \"Want more chances to win?\"\n * @optional\n */\n chanceTitle?: string\n\n /** \u83B7\u53D6\u673A\u4F1A\u533A\u57DF\u526F\u6807\u9898 */\n chanceSubtitle?: string\n\n /** \u83B7\u53D6\u673A\u4F1A\u533A\u57DF\u5E95\u90E8\u63D0\u793A */\n chanceFooterNote?: string\n\n /** \u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\u6587\u6848\u914D\u7F6E */\n chanceMethodsText?: {\n chanceBadgeText?: string\n completedText?: string\n usedText?: string\n loadingText?: string\n }\n\n // ========== \u4E2D\u5956\u4FE1\u606F Props ==========\n\n /**\n * \u4E2D\u5956\u4FE1\u606F\u6570\u7EC4\uFF0C\u7528\u4E8E\u5E95\u90E8\u6EDA\u52A8\u6761\u5C55\u793A\n * @default []\n */\n winningInfos?: WinningInfo[]\n\n /**\n * \u4E2D\u5956\u6EDA\u52A8 Ticker \u6587\u6848\u6A21\u677F\uFF0C\u652F\u6301 {{name}} \u548C {{prize}} \u53D8\u91CF\n * @default \"{{name}} just won {{prize}}!\"\n * @optional\n */\n winnerNameTemplate?: string\n\n /** \u5956\u54C1\u6C60\u5C55\u793A\u533A\u57DF\u6807\u9898 */\n prizesTitle?: string\n\n // ========== \u56DE\u8C03\u51FD\u6570 Props ==========\n\n /**\n * \u62BD\u5956\u5F00\u59CB\u65F6\u7684\u56DE\u8C03\uFF0C\u8FD4\u56DE Promise \u4EE5\u652F\u6301\u5F02\u6B65\u63A5\u53E3\u8C03\u7528\n * @returns Promise<string> - \u4E2D\u5956\u5956\u54C1\u7684 prizeKey\n */\n onDrawStart?: () => Promise<string>\n\n /**\n * \u62BD\u5956\u7ED3\u675F\u65F6\u7684\u56DE\u8C03\uFF0C\u4F20\u9012\u4E2D\u5956\u5956\u54C1\n * @param prize \u4E2D\u5956\u5956\u54C1\u5BF9\u8C61\n */\n onDrawEnd?: (prize: Prize) => void\n\n /**\n * \u62BD\u5956\u9519\u8BEF\u65F6\u7684\u56DE\u8C03\n * @param error \u9519\u8BEF\u4FE1\u606F\n */\n onDrawError?: (error: Error) => void\n\n // ========== \u5F39\u7A97\u914D\u7F6E Props ==========\n\n /** \u4E2D\u5956\u5F39\u7A97\u914D\u7F6E */\n winnerModalConfig?: WinnerModalConfig\n\n /** \u89C4\u5219\u5F39\u7A97\u914D\u7F6E */\n rulesModalConfig?: RulesModalConfig\n\n /** \u9876\u680F\u53F3\u4FA7\u8DF3\u8F6C\u6309\u94AE\u914D\u7F6E\uFF1B\u672A\u914D\u7F6E text \u6216 url \u65F6\u4E0D\u5C55\u793A */\n actionButtonConfig?: ActionButtonConfig\n\n /** \u6211\u7684\u5956\u52B1\u5F39\u7A97\u914D\u7F6E */\n myRewardsModalConfig?: MyRewardsModalConfig\n\n /** \u9519\u8BEF\u5F39\u7A97\u914D\u7F6E */\n errorModalConfig?: ErrorModalConfig\n\n /** \u5206\u4EAB\u5F39\u7A97\u914D\u7F6E */\n shareModalConfig?: ShareModalConfig\n\n // ========== \u7528\u6237\u76F8\u5173 Props ==========\n\n /** \u7528\u6237\u6570\u636E */\n userData?: UserData\n\n /**\n * \u672A\u767B\u5F55\u65F6\u7684\u63D0\u793A\u6587\u6848\n * @default \"Please log in to participate\"\n */\n loginPromptText?: string\n\n /**\n * \u767B\u5F55\u6309\u94AE\u6587\u6848\n * @default \"Log In\"\n */\n loginButtonText?: string\n\n /**\n * \u6B21\u6570\u4E0D\u8DB3\u65F6\u7684\u63D0\u793A\u6587\u6848\n * @default \"You have no chances left\"\n */\n noChancesText?: string\n\n /**\n * \u672A\u767B\u5F55\u65F6\u70B9\u51FB\u62BD\u5956\u7684\u56DE\u8C03\n */\n onLoginRequired?: () => void\n\n // ========== \u5176\u4ED6\u914D\u7F6E ==========\n\n /** \u590D\u5236\u4F18\u60E0\u7801\u56DE\u8C03 */\n onCopyCode?: (code: string) => void\n\n /**\n * \u673A\u4F1A\u8FDB\u5EA6\u6587\u6848\n * @default [\"Number of draws remaining today:\"]\n */\n opportunitiesText?: string[]\n\n /** \u81EA\u5B9A\u4E49 CSS \u7C7B\u540D */\n className?: string\n}\n\n// ============================================================================\n// \u9ED8\u8BA4\u914D\u7F6E\n// ============================================================================\n\n/** \u9ED8\u8BA4 CTA \u6309\u94AE\u914D\u7F6E */\nexport const DEFAULT_CTA_BUTTON: CtaButtonConfig = {\n text: '',\n style: 'primary',\n}\n\n/** \u9ED8\u8BA4\u83B7\u53D6\u673A\u4F1A\u533A\u57DF\u6807\u9898 */\nexport const DEFAULT_CHANCE_TITLE = 'Want more chances to win?'\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,0BAAAE,EAAA,uBAAAC,IAAA,eAAAC,EAAAJ,GAgdO,MAAMG,EAAsC,CACjD,KAAM,GACN,MAAO,SACT,EAGaD,EAAuB",
4
+ "sourcesContent": ["/**\n * ProductLottery - \u4EA7\u54C1\u62BD\u5956\u7EC4\u4EF6\u7C7B\u578B\u5B9A\u4E49\n *\n * \u57FA\u4E8E\u5A92\u4F53\u5C55\u793A\uFF08\u56FE\u7247/\u89C6\u9891\uFF09\u7684\u62BD\u5956\u7EC4\u4EF6\uFF0C\u70B9\u51FB CTA \u6309\u94AE\u89E6\u53D1\u62BD\u5956\u3002\n * \u5171\u4EAB\u7C7B\u578B\u6765\u81EA LotteryShared/types.ts\u3002\n *\n * @module ProductLotteryTypes\n * @date 2026-04-07\n */\n\nimport type {\n Prize,\n WinnerModalConfig,\n ShareModalConfig,\n ChanceMethod,\n WinningInfo,\n RulesModalConfig,\n ActionButtonConfig,\n MyRewardsModalConfig,\n ErrorModalConfig,\n UserData,\n ChanceMechanismType,\n ChanceInputConfig,\n} from '../LotteryShared/types.js'\n\nimport type { Theme, Media } from '../../types/props.js'\n\n// Re-export shared types for convenience\nexport type { Theme, Media }\n\n// ============================================================================\n// \u5A92\u4F53\u914D\u7F6E\u7C7B\u578B\n// ============================================================================\n\n/**\n * \u5A92\u4F53\u914D\u7F6E\uFF08MediaConfig\uFF09\n *\n * \u7CBE\u786E\u5BF9\u9F50 CMS block \u5B57\u6BB5\u7ED3\u6784\uFF0C\u76F4\u63A5\u6620\u5C04\u65E0\u9700\u989D\u5916\u8F6C\u6362\u3002\n *\n * @example\n * ```tsx\n * // \u56FE\u7247\u6A21\u5F0F\uFF08\u54CD\u5E94\u5F0F\uFF09\n * const imageMedia: MediaConfig = {\n * type: 'image',\n * image: { url: '/img/banner-sm.jpg', alt: 'Banner', thumbnailURL: '' },\n * imageTablet: { url: '/img/banner-md.jpg', alt: 'Banner', thumbnailURL: '' },\n * imageLaptop: { url: '/img/banner-lg.jpg', alt: 'Banner', thumbnailURL: '' },\n * imageDesktop: { url: '/img/banner-xl.jpg', alt: 'Banner', thumbnailURL: '' },\n * imageLgDesktop: { url: '/img/banner-xxl.jpg', alt: 'Banner', thumbnailURL: '' },\n * }\n *\n * // \u89C6\u9891\u6A21\u5F0F\n * const videoMedia: MediaConfig = {\n * type: 'video',\n * video: {\n * url: 'https://cdn.example.com/promo.mp4',\n * alt: 'Product Lottery Video',\n * thumbnailURL: 'https://cdn.example.com/poster.jpg',\n * mimeType: 'video/mp4',\n * },\n * }\n * ```\n */\nexport interface MediaConfig {\n /** \u5A92\u4F53\u7C7B\u578B */\n type: 'image' | 'video'\n\n // \u2014\u2014 \u56FE\u7247\u5B57\u6BB5\uFF08type === 'image' \u65F6\u4F7F\u7528\uFF09\u2014\u2014\n\n /** \u9ED8\u8BA4/\u79FB\u52A8\u7AEF\u56FE\u7247\uFF08<768px\uFF09 */\n image?: Media\n /** \u5E73\u677F\u7AEF\u56FE\u7247\uFF08\u2265768px\uFF09 */\n imageTablet?: Media\n /** \u5C0F\u684C\u9762\u56FE\u7247\uFF08\u22651025px\uFF09 */\n imageLaptop?: Media\n /** \u5927\u684C\u9762\u56FE\u7247\uFF08\u22651440px\uFF09 */\n imageDesktop?: Media\n /** \u8D85\u5927\u5C4F\u56FE\u7247\uFF08\u22651920px\uFF09 */\n imageLgDesktop?: Media\n\n // \u2014\u2014 \u89C6\u9891\u5B57\u6BB5\uFF08type === 'video' \u65F6\u4F7F\u7528\uFF09\u2014\u2014\n\n /** \u89C6\u9891\u5A92\u4F53\uFF08mimeType: 'video/mp4'\uFF0CthumbnailURL \u4F5C\u5C01\u9762\u56FE\uFF09 */\n video?: Media\n}\n\n// ============================================================================\n// CTA \u6309\u94AE\u914D\u7F6E\n// ============================================================================\n\n/**\n * CTA \u6309\u94AE\u914D\u7F6E\uFF08CtaButtonConfig\uFF09\n *\n * \u914D\u7F6E\u8986\u76D6\u5728\u5A92\u4F53\u533A\u57DF\u4E0A\u7684\u884C\u52A8\u53F7\u53EC\u6309\u94AE\u3002\n *\n * @example\n * ```tsx\n * const ctaButton: CtaButtonConfig = {\n * text: 'Join the Draw',\n * style: 'primary',\n * }\n * ```\n */\nexport interface CtaButtonConfig {\n /**\n * \u6309\u94AE\u6587\u6848\n * @default \"Join the Draw\"\n * @optional\n */\n text?: string\n\n /**\n * \u6309\u94AE\u6837\u5F0F\n * @default \"primary\"\n * @optional\n */\n style?: 'primary' | 'secondary' | 'outline'\n}\n\n// ============================================================================\n// \u9519\u8BEF\u5F39\u7A97\u914D\u7F6E\uFF08CMS error group\uFF09\n// ============================================================================\n\n/**\n * \u9519\u8BEF\u5F39\u7A97\u914D\u7F6E\uFF08ErrorConfig\uFF09\n *\n * \u5BF9\u9F50 CMS `error` group \u5B57\u6BB5\u7ED3\u6784\u3002\n *\n * CMS \u5B57\u6BB5\u6620\u5C04:\n * - `title` \u2192 \u5F39\u7A97\u6807\u9898\n * - `defaultMessage` \u2192 \u9ED8\u8BA4\u9519\u8BEF\u5185\u5BB9\u6587\u6848\n * - `confirmButton` \u2192 \u786E\u8BA4\u6309\u94AE\u6587\u6848\n * - `exchangeFailedTitle` \u2192 \u5151\u6362\u5931\u8D25\u5F39\u7A97\u6807\u9898\n * - `exchangeFailedMessage` \u2192 \u5151\u6362\u5931\u8D25\u5F39\u7A97\u5185\u5BB9\n */\nexport interface ErrorConfig {\n title?: string\n defaultMessage?: string\n confirmButton?: string\n exchangeFailedTitle?: string\n exchangeFailedMessage?: string\n}\n\n// ============================================================================\n// \u672A\u4E2D\u5956\u5F39\u7A97\u914D\u7F6E\uFF08CMS tryAgain group\uFF09\n// ============================================================================\n\n/**\n * \u672A\u4E2D\u5956\u5F39\u7A97\u914D\u7F6E\uFF08TryAgainConfig\uFF09\n *\n * \u5BF9\u9F50 CMS `tryAgain` group \u5B57\u6BB5\u7ED3\u6784\u3002\n *\n * CMS \u5B57\u6BB5\u6620\u5C04:\n * - `title` \u2192 \u5F39\u7A97\u6807\u9898\n * - `message` \u2192 \u5185\u5BB9\u6587\u6848\n * - `confirmText` \u2192 \u786E\u8BA4\u6309\u94AE\u6587\u6848\n */\nexport interface TryAgainConfig {\n title?: string\n message?: string\n confirmText?: string\n}\n\n// ============================================================================\n// Imperative Handle \u63A5\u53E3\n// ============================================================================\n\n/**\n * ProductLottery \u7EC4\u4EF6\u547D\u4EE4\u5F0F\u63A7\u5236\u63A5\u53E3\n *\n * \u901A\u8FC7 ref \u66B4\u9732\u7ED9\u7236\u7EC4\u4EF6\uFF0C\u7528\u4E8E\u5916\u90E8\u63A7\u5236\u5F39\u7A97\u7B49\u72B6\u6001\u3002\n * \u4E0E WheelLotteryHandle \u4FDD\u6301\u4E00\u81F4\u7684\u5F39\u7A97\u63A7\u5236\u65B9\u6CD5\u3002\n *\n * @example\n * ```tsx\n * const lotteryRef = useRef<ProductLotteryHandle>(null)\n *\n * <ProductLottery ref={lotteryRef} prizes={prizes} media={media} />\n *\n * // \u5916\u90E8\u89E6\u53D1\u9519\u8BEF\u5F39\u7A97\n * lotteryRef.current?.showError({\n * title: 'Network Error',\n * message: 'Failed to connect to server',\n * confirmText: 'Retry'\n * })\n *\n * // \u663E\u793A\u89C4\u5219\u5F39\u7A97\n * lotteryRef.current?.showRules()\n *\n * // \u5173\u95ED\u6240\u6709\u5F39\u7A97\n * lotteryRef.current?.hideAllModals()\n * ```\n */\nexport interface ProductLotteryHandle {\n /** \u663E\u793A\u9519\u8BEF\u5F39\u7A97 */\n showError: (config: { message: string; title?: string; confirmText?: string }) => void\n\n /** \u9690\u85CF\u9519\u8BEF\u5F39\u7A97 */\n hideError: () => void\n\n /** \u663E\u793A\u672A\u4E2D\u5956\u5F39\u7A97 */\n showNoWin: (config?: { title?: string; message?: string; confirmText?: string }) => void\n\n /** \u9690\u85CF\u672A\u4E2D\u5956\u5F39\u7A97 */\n hideNoWin: () => void\n\n /** \u663E\u793A\u4E2D\u5956\u5F39\u7A97 */\n showWinner: (prize: Prize, config?: Partial<WinnerModalConfig>) => void\n\n /** \u9690\u85CF\u4E2D\u5956\u5F39\u7A97 */\n hideWinner: () => void\n\n /** \u663E\u793A\u89C4\u5219\u5F39\u7A97 */\n showRules: () => void\n\n /** \u9690\u85CF\u89C4\u5219\u5F39\u7A97 */\n hideRules: () => void\n\n /** \u663E\u793A\u6211\u7684\u5956\u52B1\u5F39\u7A97 */\n showRewards: () => void\n\n /** \u9690\u85CF\u6211\u7684\u5956\u52B1\u5F39\u7A97 */\n hideRewards: () => void\n\n /** \u663E\u793A\u5206\u4EAB\u5F39\u7A97 */\n showShare: (config?: Partial<ShareModalConfig>) => void\n\n /** \u9690\u85CF\u5206\u4EAB\u5F39\u7A97 */\n hideShare: () => void\n\n /** \u5173\u95ED\u6240\u6709\u5F39\u7A97 */\n hideAllModals: () => void\n}\n\n// ============================================================================\n// MediaDrawArea \u5B50\u7EC4\u4EF6 Props\n// ============================================================================\n\n/**\n * MediaDrawArea \u5B50\u7EC4\u4EF6 Props\n *\n * \u5A92\u4F53\u62BD\u5956\u533A\u57DF\uFF0C\u5C55\u793A\u56FE\u7247/\u89C6\u9891\u5E76\u53E0\u52A0 CTA \u6309\u94AE\u3002\n */\nexport interface MediaDrawAreaProps {\n /** \u4E3B\u9898\u6A21\u5F0F */\n theme?: Theme\n\n /** \u5A92\u4F53\u914D\u7F6E\uFF08\u5FC5\u9700\uFF09 */\n media: MediaConfig\n\n /** CTA \u6309\u9492\u914D\u7F6E */\n ctaButton?: CtaButtonConfig\n\n /**\n * \u89C6\u9891\u81EA\u52A8\u64AD\u653E\uFF08\u4EC5 mimeType='video/mp4' \u65F6\u6709\u6548\uFF09\n * @default true\n */\n videoAutoPlay?: boolean\n\n /**\n * \u89C6\u9891\u9759\u97F3\uFF08\u4EC5 mimeType='video/mp4' \u65F6\u6709\u6548\uFF09\n * @default true\n */\n videoMuted?: boolean\n\n /**\n * \u89C6\u9891\u5FAA\u73AF\uFF08\u4EC5 mimeType='video/mp4' \u65F6\u6709\u6548\uFF09\n * @default true\n */\n videoLoop?: boolean\n\n /** \u662F\u5426\u6B63\u5728\u62BD\u5956\u4E2D */\n isDrawing?: boolean\n\n /** \u662F\u5426\u7981\u7528\uFF08\u672A\u767B\u5F55\u6216\u65E0\u6B21\u6570\uFF09 */\n isDisabled?: boolean\n\n /** \u70B9\u51FB\u62BD\u5956\u56DE\u8C03 */\n onClick: () => void\n\n /** \u81EA\u5B9A\u4E49\u7C7B\u540D */\n className?: string\n\n /** \u70B9\u51FB\u8FFD\u8E2A\uFF1Adata-headless-type-name \u5C5E\u6027\u503C\uFF0C\u683C\u5F0F `{clickType}#{componentName}` */\n ctaTrackTypeName?: string\n\n /** \u70B9\u51FB\u8FFD\u8E2A\uFF1Adata-headless-title-desc-button \u5C5E\u6027\u503C\uFF0C\u683C\u5F0F `{title}#{desc}#{buttonName}` */\n ctaTrackTitleDescButton?: string\n}\n\n// ============================================================================\n// \u4E3B\u7EC4\u4EF6 Props\n// ============================================================================\n\n/**\n * ProductLottery \u7EC4\u4EF6 Props\n *\n * \u57FA\u4E8E\u5A92\u4F53\u5C55\u793A\u7684\u4EA7\u54C1\u62BD\u5956\u7EC4\u4EF6\u3002\u5DE6\u4FA7\u4E3A\u53EF\u70B9\u51FB\u7684\u5A92\u4F53\u533A\u57DF\uFF08\u56FE\u7247/\u89C6\u9891\uFF09\uFF0C\n * \u53F3\u4FA7\u4E3A\u83B7\u53D6\u673A\u4F1A\u533A\u57DF\uFF0C\u5E95\u90E8\u4E3A\u5956\u54C1\u6C60\u3002\n *\n * @example\n * ```tsx\n * <ProductLottery\n * prizes={prizes}\n * media={{ type: 'image', src: '/banner.jpg', alt: 'Lottery' }}\n * ctaButton={{ text: 'Draw Now' }}\n * onDrawStart={async () => {\n * const result = await fetch('/api/lottery')\n * const data = await result.json()\n * return data.prizeId\n * }}\n * onDrawEnd={(prize) => console.log('Won:', prize.name)}\n * />\n * ```\n */\nexport interface ProductLotteryProps {\n // ========== \u5FC5\u9700 Props ==========\n\n /**\n * 8 \u4E2A\u5956\u54C1\u6570\u7EC4\uFF08\u5FC5\u9700\uFF09\n * @minLength 8\n * @maxLength 8\n */\n prizes: Prize[]\n\n /**\n * \u5A92\u4F53\u914D\u7F6E\uFF08\u5FC5\u9700\uFF09\n * \u914D\u7F6E\u5DE6\u4FA7\u62BD\u5956\u533A\u57DF\u5C55\u793A\u7684\u56FE\u7247\u6216\u89C6\u9891\uFF0C\u65E0\u9700 type/src \u5305\u88C5\u5C42\n */\n media: MediaConfig\n\n /**\n * \u89C6\u9891\u81EA\u52A8\u64AD\u653E\uFF08\u5F53 media.mimeType === 'video/mp4' \u65F6\u751F\u6548\uFF09\n * @default true\n * @optional\n */\n videoAutoPlay?: boolean\n\n /**\n * \u89C6\u9891\u9759\u97F3\uFF08\u5F53 media.mimeType === 'video/mp4' \u65F6\u751F\u6548\uFF09\n * @default true\n * @optional\n */\n videoMuted?: boolean\n\n /**\n * \u89C6\u9891\u5FAA\u73AF\uFF08\u5F53 media.mimeType === 'video/mp4' \u65F6\u751F\u6548\uFF09\n * @default true\n * @optional\n */\n videoLoop?: boolean\n\n // ========== \u4E3B\u9898\u548C\u6837\u5F0F ==========\n\n /** \u4E3B\u9898\u6A21\u5F0F */\n theme?: Theme\n\n /** CTA \u6309\u94AE\u914D\u7F6E */\n ctaButton?: CtaButtonConfig\n\n // ========== CMS \u9876\u5C42\u5B57\u6BB5 ==========\n\n /**\n * \u62BD\u5956\u6D3B\u52A8\u7C7B\u578B\uFF08CMS: `dealsType`\uFF09\n * \u7528\u4E8E\u6807\u8BC6\u62BD\u5956\u6D3B\u52A8\u7684\u552F\u4E00\u7C7B\u578B\uFF0C\u5982\uFF1A`ipc-2614`\n * @optional\n */\n dealsType?: string\n\n // ========== \u83B7\u53D6\u673A\u4F1A\u533A\u57DF Props ==========\n\n /**\n * \u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\u6570\u7EC4\n * @optional\n */\n chanceMethods?: ChanceMethod[]\n\n /**\n * \u83B7\u53D6\u673A\u4F1A\u533A\u57DF\u673A\u5236\u7C7B\u578B\n * @default \"methods\"\n * @optional\n */\n mechanismType?: ChanceMechanismType\n\n // \u2500\u2500 CMS flat input fields\uFF08mechanismType='input' \u65F6\u4F7F\u7528\uFF09\u2500\u2500\n\n /**\n * \u8F93\u5165\u6846\u5360\u4F4D\u6587\u672C\uFF08CMS: `inputPlaceholder`\uFF09\n * @default \"Enter your order number\"\n * @optional\n */\n inputPlaceholder?: string\n\n /**\n * \u63D0\u4EA4\u6309\u94AE\u6587\u6848\uFF08CMS: `inputSubmitText`\uFF09\n * @default \"Spin and Win\"\n * @optional\n */\n inputSubmitText?: string\n\n /**\n * \u8F93\u5165\u6846\u7C7B\u578B\uFF08CMS: `inputType`\uFF09\n * @default \"text\"\n * @optional\n */\n inputType?: 'text' | 'email' | 'number'\n\n /**\n * \u8F93\u5165\u683C\u5F0F\u9519\u8BEF\u63D0\u793A\u6587\u6848\uFF08CMS: `inputValidationErrorText`\uFF09\n * @optional\n */\n inputValidationErrorText?: string\n\n /**\n * \u8F93\u5165\u6846\u914D\u7F6E\uFF08\u5F53 mechanismType \u4E3A 'input' \u65F6\u4F7F\u7528\uFF09\n * @deprecated Use flat input fields (`inputPlaceholder`, `inputSubmitText`, `inputType`, `inputValidationErrorText`) instead (CMS field names)\n * @optional\n */\n inputConfig?: ChanceInputConfig\n\n /**\n * \u83B7\u53D6\u673A\u4F1A\u533A\u57DF\u6807\u9898\n * @default \"Want more chances to win?\"\n * @optional\n */\n chanceTitle?: string\n\n /** \u83B7\u53D6\u673A\u4F1A\u533A\u57DF\u526F\u6807\u9898 */\n chanceSubtitle?: string\n\n /** \u83B7\u53D6\u673A\u4F1A\u533A\u57DF\u5E95\u90E8\u63D0\u793A */\n chanceFooterNote?: string\n\n /** \u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\u6587\u6848\u914D\u7F6E */\n chanceMethodsText?: {\n chanceBadgeText?: string\n completedText?: string\n usedText?: string\n loadingText?: string\n }\n\n // ========== \u4E2D\u5956\u4FE1\u606F Props ==========\n\n /**\n * \u4E2D\u5956\u5F39\u7A97\u914D\u7F6E\uFF08CMS: `winningInfos` group \u2014 \u4E3B\u540D\u79F0\uFF09\n *\n * CMS \u4E2D `winningInfos` \u662F\u4E2D\u5956\u5F39\u7A97\u914D\u7F6E group\uFF0C\u5B57\u6BB5\uFF1A\n * `title`\u3001`confirmButton`\u3001`confirmUrl`\u3001`learnMoreUrl`\u3001`learnMoreText`\u3002\n */\n winningInfos?: WinnerModalConfig\n\n /**\n * \u5E95\u90E8\u6EDA\u52A8\u6761\u4E2D\u5956\u4EBA\u540D\u5355\u6570\u636E\n *\n * \u539F `winningInfos: WinningInfo[]` \u91CD\u547D\u540D\u4E3A `winnerTickerData` \u4EE5\u907F\u514D\n * \u4E0E CMS `winningInfos` group \u547D\u540D\u51B2\u7A81\u3002\n *\n * @default []\n */\n winnerTickerData?: WinningInfo[]\n\n /**\n * \u4E2D\u5956\u6EDA\u52A8 Ticker \u6587\u6848\u6A21\u677F\uFF0C\u652F\u6301 {{name}} \u548C {{prize}} \u53D8\u91CF\n * @default \"{{name}} just won {{prize}}!\"\n * @optional\n */\n winnerNameTemplate?: string\n\n /** \u5956\u54C1\u6C60\u5C55\u793A\u533A\u57DF\u6807\u9898 */\n prizesTitle?: string\n\n // ========== \u56DE\u8C03\u51FD\u6570 Props ==========\n\n /**\n * \u62BD\u5956\u5F00\u59CB\u65F6\u7684\u56DE\u8C03\uFF0C\u8FD4\u56DE Promise \u4EE5\u652F\u6301\u5F02\u6B65\u63A5\u53E3\u8C03\u7528\n * @returns Promise<string> - \u4E2D\u5956\u5956\u54C1\u7684 prizeKey\n */\n onDrawStart?: () => Promise<string>\n\n /**\n * \u62BD\u5956\u7ED3\u675F\u65F6\u7684\u56DE\u8C03\uFF0C\u4F20\u9012\u4E2D\u5956\u5956\u54C1\n * @param prize \u4E2D\u5956\u5956\u54C1\u5BF9\u8C61\n */\n onDrawEnd?: (prize: Prize) => void\n\n /**\n * \u62BD\u5956\u9519\u8BEF\u65F6\u7684\u56DE\u8C03\n * @param error \u9519\u8BEF\u4FE1\u606F\n */\n onDrawError?: (error: Error) => void\n\n // ========== \u5F39\u7A97\u914D\u7F6E Props ==========\n\n /** \u4E2D\u5956\u5F39\u7A97\u914D\u7F6E */\n winnerModalConfig?: WinnerModalConfig\n\n /** \u89C4\u5219\u5F39\u7A97\u914D\u7F6E */\n rulesModalConfig?: RulesModalConfig\n\n /** \u9876\u680F\u53F3\u4FA7\u8DF3\u8F6C\u6309\u94AE\u914D\u7F6E\uFF1B\u672A\u914D\u7F6E text \u6216 url \u65F6\u4E0D\u5C55\u793A */\n actionButtonConfig?: ActionButtonConfig\n\n /** \u6211\u7684\u5956\u52B1\u5F39\u7A97\u914D\u7F6E */\n myRewardsModalConfig?: MyRewardsModalConfig\n\n /**\n * \u9519\u8BEF\u5F39\u7A97\u914D\u7F6E\uFF08CMS: `error` group \u2014 \u4E3B\u540D\u79F0\uFF09\n *\n * \u5B57\u6BB5\uFF1A`title`\u3001`defaultMessage`\u3001`confirmButton`\u3001\n * `exchangeFailedTitle`\u3001`exchangeFailedMessage`\u3002\n */\n error?: ErrorConfig\n\n /**\n * \u672A\u4E2D\u5956\u5F39\u7A97\u914D\u7F6E\uFF08CMS: `tryAgain` group\uFF09\n *\n * \u5B57\u6BB5\uFF1A`title`\u3001`message`\u3001`confirmText`\u3002\n */\n tryAgain?: TryAgainConfig\n\n /**\n * \u9519\u8BEF\u5F39\u7A97\u914D\u7F6E\uFF08\u65E7\u7248\uFF09\n * @deprecated Use `error` instead (CMS field name)\n */\n errorModalConfig?: ErrorModalConfig\n\n /** \u5206\u4EAB\u5F39\u7A97\u914D\u7F6E */\n shareModalConfig?: ShareModalConfig\n\n // ========== CMS \u5E73\u94FA\u6587\u6848\u5B57\u6BB5\uFF08\u4E3B\u540D\u79F0\uFF09==========\n\n /**\n * \u672A\u767B\u5F55\u65F6\u7684\u63D0\u793A\u6587\u6848\uFF08CMS: `loginPrompt`\uFF09\n * @default \"Please log in to participate in the lottery\"\n */\n loginPrompt?: string\n\n /**\n * \u6B21\u6570\u4E0D\u8DB3\u65F6\u7684\u63D0\u793A\u6587\u6848\uFF08CMS: `noChances`\uFF09\n * @default \"You have no chances left. Get more chances below!\"\n */\n noChances?: string\n\n /**\n * \u673A\u4F1A\u8FDB\u5EA6\u524D\u7F00\u6587\u6848\uFF08CMS: `opportunitiesPrefix`\uFF09\n * @default \"Number of draws remaining today: \"\n */\n opportunitiesPrefix?: string\n\n // ========== \u7528\u6237\u76F8\u5173 Props ==========\n\n /** \u7528\u6237\u6570\u636E */\n userData?: UserData\n\n /**\n * \u672A\u767B\u5F55\u65F6\u7684\u63D0\u793A\u6587\u6848\n * @deprecated Use `loginPrompt` instead (CMS field name)\n * @default \"Please log in to participate\"\n */\n loginPromptText?: string\n\n /**\n * \u767B\u5F55\u6309\u94AE\u6587\u6848\n * @default \"Log In\"\n */\n loginButtonText?: string\n\n /**\n * \u6B21\u6570\u4E0D\u8DB3\u65F6\u7684\u63D0\u793A\u6587\u6848\n * @deprecated Use `noChances` instead (CMS field name)\n * @default \"You have no chances left\"\n */\n noChancesText?: string\n\n /**\n * \u672A\u767B\u5F55\u65F6\u70B9\u51FB\u62BD\u5956\u7684\u56DE\u8C03\n */\n onLoginRequired?: () => void\n\n // ========== \u5176\u4ED6\u914D\u7F6E ==========\n\n /** \u590D\u5236\u4F18\u60E0\u7801\u56DE\u8C03 */\n onCopyCode?: (code: string) => void\n\n /**\n * \u673A\u4F1A\u8FDB\u5EA6\u6587\u6848\u6570\u7EC4\uFF08\u65E7\u7248\uFF0C\u9996\u5143\u7D20\u4E3A\u524D\u7F00\uFF0C\u6B21\u5143\u7D20\u4E3A\u540E\u7F00\uFF09\n * @deprecated Use `opportunitiesPrefix` instead (CMS field name)\n * @default [\"Number of draws remaining today:\"]\n */\n opportunitiesText?: string[]\n\n /** \u81EA\u5B9A\u4E49 CSS \u7C7B\u540D */\n className?: string\n}\n\n// ============================================================================\n// \u9ED8\u8BA4\u914D\u7F6E\n// ============================================================================\n\n/** \u9ED8\u8BA4 CTA \u6309\u94AE\u914D\u7F6E */\nexport const DEFAULT_CTA_BUTTON: CtaButtonConfig = {\n text: '',\n style: 'primary',\n}\n\n/** \u9ED8\u8BA4\u83B7\u53D6\u673A\u4F1A\u533A\u57DF\u6807\u9898 */\nexport const DEFAULT_CHANCE_TITLE = 'Want more chances to win?'\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,0BAAAE,EAAA,uBAAAC,IAAA,eAAAC,EAAAJ,GAwlBO,MAAMG,EAAsC,CACjD,KAAM,GACN,MAAO,SACT,EAGaD,EAAuB",
6
6
  "names": ["types_exports", "__export", "DEFAULT_CHANCE_TITLE", "DEFAULT_CTA_BUTTON", "__toCommonJS"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use client";import{jsx as e,jsxs as i}from"react/jsx-runtime";import"react";import*as t from"@radix-ui/react-dialog";import{Heading as k}from"../../components/index.js";import{cn as o}from"../../helpers/index.js";const y=({isOpen:r,onClose:d,children:c,maxWidth:p="max-w-[358px] laptop:max-w-[480px]",background:m="bg-white",showCloseButton:g=!0,className:u,title:a,description:x,ariaLabelledBy:s,theme:f="light"})=>{const n=s||void 0,l=`${s||"base-modal"}-description`,b=a||"Dialog",v=x||a||"Dialog content";return e(t.Root,{open:r,onOpenChange:h=>!h&&d(),children:i(t.Portal,{children:[e(t.Overlay,{className:o("fixed inset-0 z-[100]","bg-black/40","data-[state=open]:animate-in data-[state=closed]:animate-out","data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",f==="dark"?"aiui-dark":"")}),i(t.Content,{className:o("fixed left-1/2 top-1/2 z-[110]","-translate-x-1/2 -translate-y-1/2","md-tablet:max-w-[90%] w-full shadow-2xl","rounded-box",p,m,"data-[state=open]:animate-in data-[state=closed]:animate-out","data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0","data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95","duration-300",u),"aria-labelledby":n,"aria-describedby":l,"aria-modal":"true",children:[e(t.Title,{id:n,className:"sr-only",children:b}),e(t.Description,{id:l,className:"sr-only",children:v}),i("div",{className:o("modal-close","flex items-center justify-between","laptop:p-4 px-2 pb-1 pt-2"),children:[a&&e(k,{size:2,className:"tracking-[-0.32px]",children:a}),g&&e(t.Close,{asChild:!0,children:e("button",{className:o("relative z-10 shrink-0 cursor-pointer","flex items-center justify-center","laptop:size-[24px] size-[20px]","desktop:size-[28px]",!a&&"ml-auto"),"aria-label":"\u5173\u95ED\u5F39\u7A97",children:i("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:"size-full",children:[e("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})})]}),c]})]})})};var N=y;export{y as BaseModal,N as default};
1
+ "use client";import{jsx as e,jsxs as i}from"react/jsx-runtime";import"react";import*as t from"@radix-ui/react-dialog";import{Heading as k}from"../../components/index.js";import{cn as o}from"../../helpers/index.js";const y=({isOpen:r,onClose:d,children:c,maxWidth:p="max-w-[358px] laptop:max-w-[480px]",background:m="bg-white",showCloseButton:g=!0,className:x,title:a,description:u,ariaLabelledBy:s,theme:f="light"})=>{const n=s||void 0,l=`${s||"base-modal"}-description`,b=a||"Dialog",v=u||a||"Dialog content";return e(t.Root,{open:r,onOpenChange:h=>!h&&d(),children:i(t.Portal,{children:[e(t.Overlay,{className:o("fixed inset-0 z-[200]","bg-black/40","data-[state=open]:animate-in data-[state=closed]:animate-out","data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",f==="dark"?"aiui-dark":"")}),i(t.Content,{className:o("fixed left-1/2 top-1/2 z-[210]","-translate-x-1/2 -translate-y-1/2","md-tablet:max-w-[90%] w-[calc(100%-32px)] shadow-2xl","rounded-box",p,m,"data-[state=open]:animate-in data-[state=closed]:animate-out","data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0","data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95","duration-300",x),"aria-labelledby":n,"aria-describedby":l,"aria-modal":"true",children:[e(t.Title,{id:n,className:"sr-only",children:b}),e(t.Description,{id:l,className:"sr-only",children:v}),i("div",{className:o("modal-close","flex items-center justify-between","laptop:p-4 px-2 pb-1 pt-2"),children:[a&&e(k,{size:2,className:"tracking-[-0.32px]",children:a}),g&&e(t.Close,{asChild:!0,children:e("button",{className:o("relative z-10 shrink-0 cursor-pointer","flex items-center justify-center","laptop:size-[24px] size-[20px]","desktop:size-[28px]",!a&&"ml-auto"),"aria-label":"\u5173\u95ED\u5F39\u7A97",children:i("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:"size-full",children:[e("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})})]}),c]})]})})};var N=y;export{y as BaseModal,N as default};
2
2
  //# sourceMappingURL=BaseModal.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/biz-components/LotteryShared/BaseModal.tsx"],
4
- "sourcesContent": ["/**\n * BaseModal - \u901A\u7528\u5F39\u7A97\u57FA\u7840\u7EC4\u4EF6\n *\n * \u57FA\u4E8E Radix UI Dialog \u5B9E\u73B0\u7684\u7EDF\u4E00\u5F39\u7A97\u7EC4\u4EF6\uFF0C\u63D0\u4F9B\u906E\u7F69\u5C42\u3001\u5173\u95ED\u6309\u94AE\u7B49\u529F\u80FD\n *\n * @module BaseModal\n * @date 2026-01-29\n */\n\n'use client'\n\nimport React from 'react'\nimport * as DialogPrimitive from '@radix-ui/react-dialog'\nimport { Heading } from '../../components/index.js'\nimport { cn } from '../../helpers/index.js'\n\nexport interface BaseModalProps {\n /**\n * \u662F\u5426\u663E\u793A\u5F39\u7A97\n */\n isOpen: boolean\n\n /**\n * \u5173\u95ED\u5F39\u7A97\u56DE\u8C03\n */\n onClose: () => void\n\n /**\n * \u5F39\u7A97\u5185\u5BB9\n */\n children: React.ReactNode\n\n /**\n * \u5F39\u7A97\u6700\u5927\u5BBD\u5EA6\u7C7B\u540D\n * @default 'max-w-[358px] laptop:max-w-[480px]'\n */\n maxWidth?: string\n\n /**\n * \u5F39\u7A97\u80CC\u666F\u6E10\u53D8\n * @default 'bg-white'\n */\n background?: string\n\n /**\n * \u662F\u5426\u663E\u793A\u5173\u95ED\u6309\u94AE\n * @default true\n */\n showCloseButton?: boolean\n\n /**\n * \u81EA\u5B9A\u4E49\u7C7B\u540D\n */\n className?: string\n\n /**\n * title \u5F39\u7A97\u6807\u9898\n */\n title?: string\n\n description?: string\n\n /**\n * ARIA \u6807\u7B7E\n */\n ariaLabelledBy?: string\n\n /**\n * \u4E3B\u9898\u6A21\u5F0F\n * @default 'light'\n */\n theme?: 'light' | 'dark'\n}\n\n/**\n * BaseModal \u901A\u7528\u5F39\u7A97\u7EC4\u4EF6\uFF08\u57FA\u4E8E Radix UI Dialog\uFF09\n */\nexport const BaseModal: React.FC<BaseModalProps> = ({\n isOpen,\n onClose,\n children,\n maxWidth = 'max-w-[358px] laptop:max-w-[480px]',\n background = 'bg-white',\n showCloseButton = true,\n className,\n title,\n description,\n ariaLabelledBy,\n theme = 'light',\n}) => {\n const titleId = ariaLabelledBy || undefined\n const descriptionId = `${ariaLabelledBy || 'base-modal'}-description`\n const resolvedTitle = title || 'Dialog'\n const resolvedDescription = description || title || 'Dialog content'\n\n return (\n <DialogPrimitive.Root open={isOpen} onOpenChange={open => !open && onClose()}>\n <DialogPrimitive.Portal>\n {/* \u906E\u7F69\u5C42 */}\n <DialogPrimitive.Overlay\n className={cn(\n 'fixed inset-0 z-[100]',\n 'bg-black/40',\n // Radix UI \u52A8\u753B\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n theme === 'dark' ? 'aiui-dark' : ''\n )}\n />\n\n {/* \u5F39\u7A97\u5185\u5BB9 */}\n <DialogPrimitive.Content\n className={cn(\n 'fixed left-1/2 top-1/2 z-[110]',\n '-translate-x-1/2 -translate-y-1/2',\n 'md-tablet:max-w-[90%] w-full shadow-2xl',\n 'rounded-box',\n maxWidth,\n background,\n // Radix UI \u52A8\u753B\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n 'data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',\n 'duration-300',\n className\n )}\n aria-labelledby={titleId}\n aria-describedby={descriptionId}\n aria-modal=\"true\"\n >\n <DialogPrimitive.Title id={titleId} className=\"sr-only\">\n {resolvedTitle}\n </DialogPrimitive.Title>\n\n <DialogPrimitive.Description id={descriptionId} className=\"sr-only\">\n {resolvedDescription}\n </DialogPrimitive.Description>\n\n {/* \u6807\u9898\u548C\u5173\u95ED\u6309\u94AE\u680F */}\n <div className={cn('modal-close', 'flex items-center justify-between', 'laptop:p-4 px-2 pb-1 pt-2')}>\n {title && (\n <Heading size={2} className=\"tracking-[-0.32px]\">\n {title}\n </Heading>\n )}\n {showCloseButton && (\n <DialogPrimitive.Close asChild>\n <button\n className={cn(\n 'relative z-10 shrink-0 cursor-pointer',\n 'flex items-center justify-center',\n 'laptop:size-[24px] size-[20px]',\n 'desktop:size-[28px]',\n // \u79FB\u9664 title \u65F6\u81EA\u52A8\u5C45\u53F3\n !title && 'ml-auto'\n )}\n aria-label=\"\u5173\u95ED\u5F39\u7A97\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"size-full\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </DialogPrimitive.Close>\n )}\n </div>\n\n {/* \u5F39\u7A97\u5185\u5BB9 */}\n {children}\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n </DialogPrimitive.Root>\n )\n}\n\nexport default BaseModal\n"],
5
- "mappings": "aAmGQ,cAAAA,EA2DU,QAAAC,MA3DV,oBAxFR,MAAkB,QAClB,UAAYC,MAAqB,yBACjC,OAAS,WAAAC,MAAe,4BACxB,OAAS,MAAAC,MAAU,yBA+DZ,MAAMC,EAAsC,CAAC,CAClD,OAAAC,EACA,QAAAC,EACA,SAAAC,EACA,SAAAC,EAAW,qCACX,WAAAC,EAAa,WACb,gBAAAC,EAAkB,GAClB,UAAAC,EACA,MAAAC,EACA,YAAAC,EACA,eAAAC,EACA,MAAAC,EAAQ,OACV,IAAM,CACJ,MAAMC,EAAUF,GAAkB,OAC5BG,EAAgB,GAAGH,GAAkB,YAAY,eACjDI,EAAgBN,GAAS,SACzBO,EAAsBN,GAAeD,GAAS,iBAEpD,OACEb,EAACE,EAAgB,KAAhB,CAAqB,KAAMI,EAAQ,aAAce,GAAQ,CAACA,GAAQd,EAAQ,EACzE,SAAAN,EAACC,EAAgB,OAAhB,CAEC,UAAAF,EAACE,EAAgB,QAAhB,CACC,UAAWE,EACT,wBACA,cAEA,+DACA,6DACAY,IAAU,OAAS,YAAc,EACnC,EACF,EAGAf,EAACC,EAAgB,QAAhB,CACC,UAAWE,EACT,iCACA,oCACA,0CACA,cACAK,EACAC,EAEA,+DACA,6DACA,+DACA,eACAE,CACF,EACA,kBAAiBK,EACjB,mBAAkBC,EAClB,aAAW,OAEX,UAAAlB,EAACE,EAAgB,MAAhB,CAAsB,GAAIe,EAAS,UAAU,UAC3C,SAAAE,EACH,EAEAnB,EAACE,EAAgB,YAAhB,CAA4B,GAAIgB,EAAe,UAAU,UACvD,SAAAE,EACH,EAGAnB,EAAC,OAAI,UAAWG,EAAG,cAAe,oCAAqC,2BAA2B,EAC/F,UAAAS,GACCb,EAACG,EAAA,CAAQ,KAAM,EAAG,UAAU,qBACzB,SAAAU,EACH,EAEDF,GACCX,EAACE,EAAgB,MAAhB,CAAsB,QAAO,GAC5B,SAAAF,EAAC,UACC,UAAWI,EACT,wCACA,mCACA,iCACA,sBAEA,CAACS,GAAS,SACZ,EACA,aAAW,2BAEX,SAAAZ,EAAC,OACC,QAAQ,YACR,KAAK,OACL,OAAO,eACP,YAAY,IACZ,cAAc,QACd,eAAe,QACf,UAAU,YAEV,UAAAD,EAAC,QAAK,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,EACpCA,EAAC,QAAK,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GACtC,EACF,EACF,GAEJ,EAGCQ,GACH,GACF,EACF,CAEJ,EAEA,IAAOc,EAAQjB",
4
+ "sourcesContent": ["/**\n * BaseModal - \u901A\u7528\u5F39\u7A97\u57FA\u7840\u7EC4\u4EF6\n *\n * \u57FA\u4E8E Radix UI Dialog \u5B9E\u73B0\u7684\u7EDF\u4E00\u5F39\u7A97\u7EC4\u4EF6\uFF0C\u63D0\u4F9B\u906E\u7F69\u5C42\u3001\u5173\u95ED\u6309\u94AE\u7B49\u529F\u80FD\n *\n * @module BaseModal\n * @date 2026-01-29\n */\n\n'use client'\n\nimport React from 'react'\nimport * as DialogPrimitive from '@radix-ui/react-dialog'\nimport { Heading } from '../../components/index.js'\nimport { cn } from '../../helpers/index.js'\n\nexport interface BaseModalProps {\n /**\n * \u662F\u5426\u663E\u793A\u5F39\u7A97\n */\n isOpen: boolean\n\n /**\n * \u5173\u95ED\u5F39\u7A97\u56DE\u8C03\n */\n onClose: () => void\n\n /**\n * \u5F39\u7A97\u5185\u5BB9\n */\n children: React.ReactNode\n\n /**\n * \u5F39\u7A97\u6700\u5927\u5BBD\u5EA6\u7C7B\u540D\n * @default 'max-w-[358px] laptop:max-w-[480px]'\n */\n maxWidth?: string\n\n /**\n * \u5F39\u7A97\u80CC\u666F\u6E10\u53D8\n * @default 'bg-white'\n */\n background?: string\n\n /**\n * \u662F\u5426\u663E\u793A\u5173\u95ED\u6309\u94AE\n * @default true\n */\n showCloseButton?: boolean\n\n /**\n * \u81EA\u5B9A\u4E49\u7C7B\u540D\n */\n className?: string\n\n /**\n * title \u5F39\u7A97\u6807\u9898\n */\n title?: string\n\n description?: string\n\n /**\n * ARIA \u6807\u7B7E\n */\n ariaLabelledBy?: string\n\n /**\n * \u4E3B\u9898\u6A21\u5F0F\n * @default 'light'\n */\n theme?: 'light' | 'dark'\n}\n\n/**\n * BaseModal \u901A\u7528\u5F39\u7A97\u7EC4\u4EF6\uFF08\u57FA\u4E8E Radix UI Dialog\uFF09\n */\nexport const BaseModal: React.FC<BaseModalProps> = ({\n isOpen,\n onClose,\n children,\n maxWidth = 'max-w-[358px] laptop:max-w-[480px]',\n background = 'bg-white',\n showCloseButton = true,\n className,\n title,\n description,\n ariaLabelledBy,\n theme = 'light',\n}) => {\n const titleId = ariaLabelledBy || undefined\n const descriptionId = `${ariaLabelledBy || 'base-modal'}-description`\n const resolvedTitle = title || 'Dialog'\n const resolvedDescription = description || title || 'Dialog content'\n\n return (\n <DialogPrimitive.Root open={isOpen} onOpenChange={open => !open && onClose()}>\n <DialogPrimitive.Portal>\n {/* \u906E\u7F69\u5C42 */}\n <DialogPrimitive.Overlay\n className={cn(\n 'fixed inset-0 z-[200]',\n 'bg-black/40',\n // Radix UI \u52A8\u753B\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n theme === 'dark' ? 'aiui-dark' : ''\n )}\n />\n\n {/* \u5F39\u7A97\u5185\u5BB9 */}\n <DialogPrimitive.Content\n className={cn(\n 'fixed left-1/2 top-1/2 z-[210]',\n '-translate-x-1/2 -translate-y-1/2',\n 'md-tablet:max-w-[90%] w-[calc(100%-32px)] shadow-2xl',\n 'rounded-box',\n maxWidth,\n background,\n // Radix UI \u52A8\u753B\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n 'data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',\n 'duration-300',\n className\n )}\n aria-labelledby={titleId}\n aria-describedby={descriptionId}\n aria-modal=\"true\"\n >\n <DialogPrimitive.Title id={titleId} className=\"sr-only\">\n {resolvedTitle}\n </DialogPrimitive.Title>\n\n <DialogPrimitive.Description id={descriptionId} className=\"sr-only\">\n {resolvedDescription}\n </DialogPrimitive.Description>\n\n {/* \u6807\u9898\u548C\u5173\u95ED\u6309\u94AE\u680F */}\n <div className={cn('modal-close', 'flex items-center justify-between', 'laptop:p-4 px-2 pb-1 pt-2')}>\n {title && (\n <Heading size={2} className=\"tracking-[-0.32px]\">\n {title}\n </Heading>\n )}\n {showCloseButton && (\n <DialogPrimitive.Close asChild>\n <button\n className={cn(\n 'relative z-10 shrink-0 cursor-pointer',\n 'flex items-center justify-center',\n 'laptop:size-[24px] size-[20px]',\n 'desktop:size-[28px]',\n // \u79FB\u9664 title \u65F6\u81EA\u52A8\u5C45\u53F3\n !title && 'ml-auto'\n )}\n aria-label=\"\u5173\u95ED\u5F39\u7A97\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"size-full\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </DialogPrimitive.Close>\n )}\n </div>\n\n {/* \u5F39\u7A97\u5185\u5BB9 */}\n {children}\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n </DialogPrimitive.Root>\n )\n}\n\nexport default BaseModal\n"],
5
+ "mappings": "aAmGQ,cAAAA,EA2DU,QAAAC,MA3DV,oBAxFR,MAAkB,QAClB,UAAYC,MAAqB,yBACjC,OAAS,WAAAC,MAAe,4BACxB,OAAS,MAAAC,MAAU,yBA+DZ,MAAMC,EAAsC,CAAC,CAClD,OAAAC,EACA,QAAAC,EACA,SAAAC,EACA,SAAAC,EAAW,qCACX,WAAAC,EAAa,WACb,gBAAAC,EAAkB,GAClB,UAAAC,EACA,MAAAC,EACA,YAAAC,EACA,eAAAC,EACA,MAAAC,EAAQ,OACV,IAAM,CACJ,MAAMC,EAAUF,GAAkB,OAC5BG,EAAgB,GAAGH,GAAkB,YAAY,eACjDI,EAAgBN,GAAS,SACzBO,EAAsBN,GAAeD,GAAS,iBAEpD,OACEb,EAACE,EAAgB,KAAhB,CAAqB,KAAMI,EAAQ,aAAce,GAAQ,CAACA,GAAQd,EAAQ,EACzE,SAAAN,EAACC,EAAgB,OAAhB,CAEC,UAAAF,EAACE,EAAgB,QAAhB,CACC,UAAWE,EACT,wBACA,cAEA,+DACA,6DACAY,IAAU,OAAS,YAAc,EACnC,EACF,EAGAf,EAACC,EAAgB,QAAhB,CACC,UAAWE,EACT,iCACA,oCACA,uDACA,cACAK,EACAC,EAEA,+DACA,6DACA,+DACA,eACAE,CACF,EACA,kBAAiBK,EACjB,mBAAkBC,EAClB,aAAW,OAEX,UAAAlB,EAACE,EAAgB,MAAhB,CAAsB,GAAIe,EAAS,UAAU,UAC3C,SAAAE,EACH,EAEAnB,EAACE,EAAgB,YAAhB,CAA4B,GAAIgB,EAAe,UAAU,UACvD,SAAAE,EACH,EAGAnB,EAAC,OAAI,UAAWG,EAAG,cAAe,oCAAqC,2BAA2B,EAC/F,UAAAS,GACCb,EAACG,EAAA,CAAQ,KAAM,EAAG,UAAU,qBACzB,SAAAU,EACH,EAEDF,GACCX,EAACE,EAAgB,MAAhB,CAAsB,QAAO,GAC5B,SAAAF,EAAC,UACC,UAAWI,EACT,wCACA,mCACA,iCACA,sBAEA,CAACS,GAAS,SACZ,EACA,aAAW,2BAEX,SAAAZ,EAAC,OACC,QAAQ,YACR,KAAK,OACL,OAAO,eACP,YAAY,IACZ,cAAc,QACd,eAAe,QACf,UAAU,YAEV,UAAAD,EAAC,QAAK,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,EACpCA,EAAC,QAAK,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GACtC,EACF,EACF,GAEJ,EAGCQ,GACH,GACF,EACF,CAEJ,EAEA,IAAOc,EAAQjB",
6
6
  "names": ["jsx", "jsxs", "DialogPrimitive", "Heading", "cn", "BaseModal", "isOpen", "onClose", "children", "maxWidth", "background", "showCloseButton", "className", "title", "description", "ariaLabelledBy", "theme", "titleId", "descriptionId", "resolvedTitle", "resolvedDescription", "open", "BaseModal_default"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use client";import{jsx as a,jsxs as l}from"react/jsx-runtime";import g from"react";import{cn as s}from"../../helpers/index.js";import{Button as C,Checkbox as A,Heading as T,Text as M}from"../../components/index.js";const D=({theme:t,methods:e,title:x="Want more chances to win?",subtitle:r,footerNote:d,className:o,userData:h,onOpenShareModal:n,chanceBadgeText:c="Chance +1",completedText:m="Completed",usedText:p="Used",loadingText:u="Loading...",mechanismType:w="methods",inputConfig:k,isAgreementChecked:v,onAgreementCheckedChange:f,agreementErrorText:N})=>w==="input"&&k?l("div",{className:s("chance-methods-container","flex flex-col overflow-y-auto","p-[16px]","desktop:px-[24px] desktop:pt-[24px]","lg-desktop:px-[32px]","gap-[16px]","lg-desktop:gap-[16px]",t==="dark"?"aiui-dark":"",o),children:[l("div",{className:"chance-methods-header flex flex-col gap-[4px]",children:[a(T,{size:2,className:s("chance-methods-title","text-info-primary tracking-[-0.32px]"),children:x}),r&&a("p",{className:s("chance-methods-subtitle","text-[14px] font-semibold leading-[1.4]","lg-desktop:text-[18px] desktop:text-[16px]",t==="dark"?"text-[#8A8D92]":"text-[#4A4C56]"),children:r})]}),a(S,{theme:t,inputConfig:k,isAgreementChecked:v,onAgreementCheckedChange:f,agreementErrorText:N}),d&&a("p",{className:s("chance-methods-footer","font-semibold","text-[14px] leading-[1.4] ","desktop:pt-[24px] pt-[16px]",t==="dark"?"text-[#75787F]":"text-[#767880]"),children:d})]}):!e||e.length===0?null:l("div",{className:s("chance-methods-container","flex flex-col overflow-y-auto","p-[16px]","desktop:px-[24px] desktop:pt-[24px]","lg-desktop:px-[32px]","gap-[16px]","lg-desktop:gap-[16px]",t==="dark"?"aiui-dark":"",o),children:[l("div",{className:"chance-methods-header flex flex-col gap-[4px]",children:[a(T,{size:2,className:s("chance-methods-title","text-info-primary tracking-[-0.32px]"),children:x}),r&&a("p",{className:s("chance-methods-subtitle","text-[14px] font-semibold leading-[1.4]","lg-desktop:text-[18px] desktop:text-[16px]",t==="dark"?"text-[#8A8D92]":"text-[#4A4C56]"),children:r})]}),a("div",{className:"chance-methods-list flex grow flex-col gap-[16px]",children:e.map(b=>a(E,{method:b,userData:h,onOpenShareModal:n,chanceBadgeText:c,completedText:m,usedText:p,loadingText:u},b.methodKey))}),d&&a("p",{className:s("chance-methods-footer","font-semibold","text-[14px] leading-[1.4] ","desktop:pt-[24px] pt-[16px]",t==="dark"?"text-[#75787F]":"text-[#767880]"),children:d})]}),S=({theme:t,inputConfig:e,isAgreementChecked:x,onAgreementCheckedChange:r,agreementErrorText:d})=>{const[o,h]=g.useState(e.defaultValue||""),[n,c]=g.useState(""),[m,p]=g.useState(""),[u,w]=g.useState(!1),k=!!e.agreementNotice,v=x??u,f=!e.isSubmitting&&!!o.trim(),N=e.validationPattern??(e.inputType==="email"?"^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$":void 0);g.useEffect(()=>{e.defaultValue&&!o&&h(e.defaultValue)},[e.defaultValue]),g.useEffect(()=>{d&&p(d)},[d]);const b=async()=>{if(f){if(k&&!v){p(e.agreementWarningText||"Please agree to the terms before continuing");return}if(N&&!new RegExp(N).test(o.trim())){c(e.validationErrorText||"Invalid input");return}c(""),p("");try{await e.onSubmit?.(o.trim())}catch(i){console.error("[ChanceInputMode] onSubmit error:",i)}}};return l("div",{className:"chance-input-mode flex grow flex-col gap-[16px]",children:[a("input",{type:e.inputType||"text",value:o,onChange:i=>{h(i.target.value),c("")},placeholder:e.placeholder||"Enter your order number",disabled:e.isSubmitting||e.disabled,autoComplete:e.disableAutofill?"new-password":void 0,name:e.disableAutofill?"lottery-input":void 0,readOnly:e.disabled,className:s("rounded-btn laptop:h-[54px] laptop:px-[16px] h-[44px] w-full border bg-transparent px-[12px]","lg-desktop:text-[16px] text-[14px] leading-[1.4]","outline-none transition-colors","border-[#D1D5DB] placeholder:text-[#9CA3AF]",n?"border-red-500":"",t==="dark"?"text-white":"text-[#1E2024]"),onKeyDown:i=>{i.key==="Enter"&&f&&b()}}),a(C,{size:"lg",variant:t==="dark"?"primary":"secondary",onClick:b,disabled:!f,className:"w-fit","data-headless-type-name":e.submitTrackTypeName,"data-headless-title-desc-button":e.submitTrackTitleDescButton,children:e.isSubmitting?"Loading...":e.submitText||"Spin and Win"}),n&&a("p",{className:"text-[12px] text-red-500",children:n}),m&&a("p",{className:"text-[12px] text-red-500",children:m}),k&&l("label",{className:"flex items-start gap-[8px] pt-[4px]",children:[a(A,{checked:v,onCheckedChange:i=>{const y=!!i;r?.(y),w(y),y&&p("")},className:"mt-[2px] shrink-0 border-white/60 data-[state=checked]:border-white data-[state=checked]:bg-white data-[state=checked]:text-[#1D1D1F]"}),a(M,{html:e.agreementNotice,className:s("text-[14px] font-[700] leading-[1.4]","[&_a]:underline [&_a]:underline-offset-2",t==="dark"?"text-white/95 [&_a]:text-white [&_a]:hover:text-white/80":"text-[#1E2024] [&_a]:text-[#1E2024] [&_a]:hover:text-[#1E2024]/80")})]})]})},E=({method:t,userData:e,onOpenShareModal:x,chanceBadgeText:r,completedText:d,usedText:o,loadingText:h})=>{const n=t.status||"pending",c=t.loading||!1,m=t.disabled||n==="completed"||n==="used"||c,p=()=>{if(!e?.isLoggedIn){t.onLoginRequired?.();return}t.openShareModal&&x&&x(),t.onClick()},u={pending:c?h:t?.buttonText||"Redeem now",completed:d,used:o};return l("div",{className:s("chance-method-item","flex flex-col items-start gap-[8px]","tablet:flex-row tablet:items-center tablet:gap-4","transition-all",{"opacity-60":m}),children:[l("div",{className:s("chance-method-info","flex flex-1 flex-col gap-[4px]","min-w-0"),children:[l("div",{className:"flex flex-wrap items-center gap-[4px]",children:[a("p",{className:s("chance-method-title","text-info-primary","text-[14px] font-[700] leading-[1.4] ","lg-desktop:text-[18px] desktop:text-[16px]"),children:t.title}),a("span",{className:s("chance-badge","text-[14px] leading-[1.4] ","lg-desktop:text-[18px] desktop:text-[16px]","font-[700]","shrink-0",{"text-[#ff6b35]":n==="pending","text-[#4caf50]":n==="completed","text-[#75787F]":n==="used"}),children:r})]}),a("p",{className:s("chance-method-description","text-info-primary","text-[14px] leading-[1.4] ","lg-desktop:text-[18px] desktop:text-[16px]","font-[700]"),children:t.description})]}),a("div",{className:"chance-method-action shrink-0",children:a(C,{onClick:p,disabled:m,className:s("chance-button","lg-desktop:min-w-[162px] min-w-[132px]",{"bg-[#4caf50]":n==="completed","bg-[#75787F]":n==="used"}),children:u[n]})})]})};var P=D;export{D as ChanceMethods,P as default};
1
+ "use client";import{jsx as a,jsxs as c}from"react/jsx-runtime";import g from"react";import{cn as s}from"../../helpers/index.js";import{Button as C,Checkbox as T,Heading as D,Text as A}from"../../components/index.js";const M=({theme:t,methods:e,title:x="Want more chances to win?",subtitle:r,footerNote:d,className:o,userData:h,onOpenShareModal:n,chanceBadgeText:l="Chance +1",completedText:m="Completed",usedText:p="Used",loadingText:u="Loading...",mechanismType:w="methods",inputConfig:k,isAgreementChecked:v,onAgreementCheckedChange:f,agreementErrorText:N})=>w==="input"&&k?c("div",{className:s("chance-methods-container","flex flex-col overflow-y-auto","p-[16px]","desktop:px-[24px] desktop:pt-[24px]","lg-desktop:px-[32px]","gap-[16px]","lg-desktop:gap-[16px]",t==="dark"?"aiui-dark":"",o),children:[c("div",{className:"chance-methods-header flex flex-col gap-[4px]",children:[a(D,{size:2,className:s("chance-methods-title","text-info-primary tracking-[-0.32px]"),children:x}),r&&a("p",{className:s("chance-methods-subtitle","text-[14px] font-semibold leading-[1.4]","lg-desktop:text-[18px] desktop:text-[16px]",t==="dark"?"text-[#8A8D92]":"text-[#4A4C56]"),children:r})]}),a(S,{theme:t,inputConfig:k,isAgreementChecked:v,onAgreementCheckedChange:f,agreementErrorText:N}),d&&a("p",{className:s("chance-methods-footer","font-semibold","text-[14px] leading-[1.4] ","desktop:pt-[24px] pt-[16px]",t==="dark"?"text-[#75787F]":"text-[#767880]"),children:d})]}):!e||e.length===0?null:c("div",{className:s("chance-methods-container","flex flex-col overflow-y-auto","p-[16px]","desktop:px-[24px] desktop:pt-[24px]","lg-desktop:px-[32px]","gap-[16px]","lg-desktop:gap-[16px]",t==="dark"?"aiui-dark":"",o),children:[c("div",{className:"chance-methods-header flex flex-col gap-[4px]",children:[a(D,{size:2,className:s("chance-methods-title","text-info-primary tracking-[-0.32px]"),children:x}),r&&a("p",{className:s("chance-methods-subtitle","text-[14px] font-semibold leading-[1.4]","lg-desktop:text-[18px] desktop:text-[16px]",t==="dark"?"text-[#8A8D92]":"text-[#4A4C56]"),children:r})]}),a("div",{className:"chance-methods-list flex grow flex-col gap-[16px]",children:e.map(b=>a(E,{method:b,userData:h,onOpenShareModal:n,chanceBadgeText:l,completedText:m,usedText:p,loadingText:u},b.methodKey))}),d&&a("p",{className:s("chance-methods-footer","font-semibold","text-[14px] leading-[1.4] ","desktop:pt-[24px] pt-[16px]",t==="dark"?"text-[#75787F]":"text-[#767880]"),children:d})]}),S=({theme:t,inputConfig:e,isAgreementChecked:x,onAgreementCheckedChange:r,agreementErrorText:d})=>{const[o,h]=g.useState(e.defaultValue||""),[n,l]=g.useState(""),[m,p]=g.useState(""),[u,w]=g.useState(!1),k=!!e.agreementNotice,v=x??u,f=!e.isSubmitting&&!!o.trim(),N=e.validationPattern??(e.inputType==="email"?"^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$":void 0);g.useEffect(()=>{e.defaultValue&&!o&&h(e.defaultValue)},[e.defaultValue]),g.useEffect(()=>{d&&p(d)},[d]);const b=async()=>{if(f){if(k&&!v){p(e.agreementWarningText||"Please agree to the terms before continuing");return}if(N&&!new RegExp(N).test(o.trim())){l(e.validationErrorText||"Invalid input");return}l(""),p("");try{await e.onSubmit?.(o.trim())}catch(i){console.error("[ChanceInputMode] onSubmit error:",i)}}};return c("div",{className:"chance-input-mode flex grow flex-col gap-[16px]",children:[a("input",{type:e.inputType||"text",value:o,onChange:i=>{h(i.target.value),l("")},placeholder:e.placeholder||"Enter your order number",disabled:e.isSubmitting||e.disabled,autoComplete:e.disableAutofill?"new-password":void 0,name:e.disableAutofill?"lottery-input":void 0,readOnly:e.disabled,className:s("rounded-btn laptop:h-[54px] laptop:px-[16px] h-[44px] w-full border bg-transparent px-[12px]","lg-desktop:text-[16px] text-[14px] leading-[1.4]","outline-none transition-colors focus:ring-0 focus-visible:outline-none focus-visible:ring-0","border-[#D1D5DB] placeholder:text-[#9CA3AF]",n?"border-red-500":"",t==="dark"?"text-white":"text-[#1E2024]"),onKeyDown:i=>{i.key==="Enter"&&f&&b()}}),a(C,{size:"lg",variant:t==="dark"?"primary":"secondary",onClick:b,disabled:!f,className:"w-fit","data-headless-type-name":e.submitTrackTypeName,"data-headless-title-desc-button":e.submitTrackTitleDescButton,children:e.isSubmitting?"Loading...":e.submitText||"Spin and Win"}),n&&a("p",{className:"text-[12px] text-red-500",children:n}),m&&a("p",{className:"text-[12px] text-red-500",children:m}),k&&c("label",{className:"flex items-start gap-[8px] pt-[4px]",children:[a(T,{checked:v,onCheckedChange:i=>{const y=!!i;r?.(y),w(y),y&&p("")},className:s("mt-[2px] shrink-0",t==="dark"?"border-white/60 data-[state=checked]:border-white data-[state=checked]:bg-white data-[state=checked]:text-[#1D1D1F]":"border-[#1D1D1F]/40 data-[state=checked]:border-[#1D1D1F] data-[state=checked]:bg-[#1D1D1F] data-[state=checked]:text-white")}),a(A,{html:e.agreementNotice,className:s("text-[14px] font-[700] leading-[1.4]","[&_a]:underline [&_a]:underline-offset-2",t==="dark"?"text-white/95 [&_a]:text-white [&_a]:hover:text-white/80":"text-[#1E2024] [&_a]:text-[#1E2024] [&_a]:hover:text-[#1E2024]/80")})]})]})},E=({method:t,userData:e,onOpenShareModal:x,chanceBadgeText:r,completedText:d,usedText:o,loadingText:h})=>{const n=t.status||"pending",l=t.loading||!1,m=t.disabled||n==="completed"||n==="used"||l,p=()=>{if(!e?.isLoggedIn){t.onLoginRequired?.();return}t.openShareModal&&x&&x(),t.onClick()},u={pending:l?h:t?.buttonText||"Redeem now",completed:d,used:o};return c("div",{className:s("chance-method-item","flex flex-col items-start gap-[8px]","tablet:flex-row tablet:items-center tablet:gap-4","transition-all",{"opacity-60":m}),children:[c("div",{className:s("chance-method-info","flex flex-1 flex-col gap-[4px]","min-w-0"),children:[c("div",{className:"flex flex-wrap items-center gap-[4px]",children:[a("p",{className:s("chance-method-title","text-info-primary","text-[14px] font-[700] leading-[1.4] ","lg-desktop:text-[18px] desktop:text-[16px]"),children:t.title}),a("span",{className:s("chance-badge","text-[14px] leading-[1.4] ","lg-desktop:text-[18px] desktop:text-[16px]","font-[700]","shrink-0",{"text-[#ff6b35]":n==="pending","text-[#4caf50]":n==="completed","text-[#75787F]":n==="used"}),children:r})]}),a("p",{className:s("chance-method-description","text-info-primary","text-[14px] leading-[1.4] ","lg-desktop:text-[18px] desktop:text-[16px]","font-[700]"),children:t.description})]}),a("div",{className:"chance-method-action shrink-0",children:a(C,{onClick:p,disabled:m,className:s("chance-button","lg-desktop:min-w-[162px] min-w-[132px]",{"bg-[#4caf50]":n==="completed","bg-[#75787F]":n==="used"}),children:u[n]})})]})};var P=M;export{M as ChanceMethods,P as default};
2
2
  //# sourceMappingURL=ChanceMethods.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/biz-components/LotteryShared/ChanceMethods.tsx"],
4
- "sourcesContent": ["/**\n * ChanceMethods - \u83B7\u53D6\u62BD\u5956\u673A\u4F1A\u65B9\u5F0F\u7EC4\u4EF6\n *\n * \u5C55\u793A\u7528\u6237\u83B7\u53D6\u989D\u5916\u62BD\u5956\u673A\u4F1A\u7684\u591A\u79CD\u65B9\u5F0F(\u5982\u5206\u4EAB\u3001\u79EF\u5206\u5151\u6362\u3001\u63A8\u8350\u7B49)\u3002\n * \u57FA\u4E8E Figma \u8BBE\u8BA1\u7A3F\u5B9E\u73B0\u54CD\u5E94\u5F0F\u5E03\u5C40\u3002\n *\n * Figma \u8BBE\u8BA1\u7A3F: https://www.figma.com/design/DhWsPamqTM76eMHS0aIQqw\n * \u8BBE\u8BA1\u8282\u70B9: 498:6185 (Chance Methods section)\n *\n * @module ChanceMethods\n * @date 2025-12-17\n */\n\n'use client'\n\nimport React from 'react'\nimport { cn } from '../../helpers/index.js'\nimport type { ChanceInputConfig, ChanceMethod, ChanceMethodsProps, UserData } from './types.js'\nimport { Button, Checkbox, Heading, Text } from '../../components/index.js'\n\n// ============================================================================\n// ChanceMethods \u7EC4\u4EF6\n// ============================================================================\n\n/**\n * ChanceMethods - \u83B7\u53D6\u62BD\u5956\u673A\u4F1A\u65B9\u5F0F\u7EC4\u4EF6\n *\n * \u7279\u6027:\n * - \u5C55\u793A\u591A\u79CD\u83B7\u53D6\u673A\u4F1A\u7684\u65B9\u5F0F(\u5206\u4EAB\u3001\u79EF\u5206\u3001\u63A8\u8350\u7B49)\n * - \u6BCF\u79CD\u65B9\u5F0F\u663E\u793A\u6807\u9898\u3001\u63CF\u8FF0\u3001Chance +1 \u5FBD\u7AE0\u548C\u884C\u52A8\u6309\u94AE\n * - \u652F\u6301\u7981\u7528\u72B6\u6001\n * - \u54CD\u5E94\u5F0F\u5E03\u5C40\n */\nexport const ChanceMethods: React.FC<ChanceMethodsProps> = ({\n theme,\n methods,\n title = 'Want more chances to win?',\n subtitle,\n footerNote,\n className,\n userData,\n onOpenShareModal,\n chanceBadgeText = 'Chance +1',\n completedText = 'Completed',\n usedText = 'Used',\n loadingText = 'Loading...',\n mechanismType = 'methods',\n inputConfig,\n isAgreementChecked,\n onAgreementCheckedChange,\n agreementErrorText,\n}) => {\n // \u8F93\u5165\u6846\u6A21\u5F0F\n if (mechanismType === 'input' && inputConfig) {\n return (\n <div\n className={cn(\n 'chance-methods-container',\n 'flex flex-col overflow-y-auto',\n 'p-[16px]',\n 'desktop:px-[24px] desktop:pt-[24px]',\n 'lg-desktop:px-[32px]',\n 'gap-[16px]',\n 'lg-desktop:gap-[16px]',\n theme === 'dark' ? 'aiui-dark' : '',\n className\n )}\n >\n {/* \u6807\u9898\u533A\u57DF */}\n <div className=\"chance-methods-header flex flex-col gap-[4px]\">\n <Heading size={2} className={cn('chance-methods-title', 'text-info-primary tracking-[-0.32px]')}>\n {title}\n </Heading>\n\n {subtitle && (\n <p\n className={cn(\n 'chance-methods-subtitle',\n 'text-[14px] font-semibold leading-[1.4]',\n 'lg-desktop:text-[18px] desktop:text-[16px]',\n theme === 'dark' ? 'text-[#8A8D92]' : 'text-[#4A4C56]'\n )}\n >\n {subtitle}\n </p>\n )}\n </div>\n\n {/* \u8F93\u5165\u6846 + \u63D0\u4EA4\u6309\u94AE */}\n <ChanceInputMode\n theme={theme}\n inputConfig={inputConfig}\n isAgreementChecked={isAgreementChecked}\n onAgreementCheckedChange={onAgreementCheckedChange}\n agreementErrorText={agreementErrorText}\n />\n\n {/* \u5E95\u90E8\u63D0\u793A */}\n {footerNote && (\n <p\n className={cn(\n 'chance-methods-footer',\n 'font-semibold',\n 'text-[14px] leading-[1.4] ',\n 'desktop:pt-[24px] pt-[16px]',\n theme === 'dark' ? 'text-[#75787F]' : 'text-[#767880]'\n )}\n >\n {footerNote}\n </p>\n )}\n </div>\n )\n }\n\n // \u9632\u5FA1\u6027\u7F16\u7A0B:\u5904\u7406 undefined \u6216\u7A7A\u6570\u7EC4\n if (!methods || methods.length === 0) {\n return null\n }\n\n return (\n <div\n className={cn(\n 'chance-methods-container',\n 'flex flex-col overflow-y-auto',\n 'p-[16px]',\n 'desktop:px-[24px] desktop:pt-[24px]',\n 'lg-desktop:px-[32px]',\n 'gap-[16px]', // \u9ED8\u8BA4\u95F4\u8DDD\n 'lg-desktop:gap-[16px]', // lg-desktop: Figma \u8BBE\u8BA1\u7A3F\u95F4\u8DDD\n theme === 'dark' ? 'aiui-dark' : '',\n className\n )}\n >\n {/* \u6807\u9898\u533A\u57DF */}\n <div className=\"chance-methods-header flex flex-col gap-[4px]\">\n <Heading size={2} className={cn('chance-methods-title', 'text-info-primary tracking-[-0.32px]')}>\n {title}\n </Heading>\n\n {subtitle && (\n <p\n className={cn(\n 'chance-methods-subtitle',\n 'text-[14px] font-semibold leading-[1.4]',\n 'lg-desktop:text-[18px] desktop:text-[16px]',\n theme === 'dark' ? 'text-[#8A8D92]' : 'text-[#4A4C56]'\n )}\n >\n {subtitle}\n </p>\n )}\n </div>\n\n {/* \u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\u5217\u8868 */}\n <div className=\"chance-methods-list flex grow flex-col gap-[16px]\">\n {methods.map(method => (\n <ChanceMethodItem\n key={method.methodKey}\n method={method}\n userData={userData}\n onOpenShareModal={onOpenShareModal}\n chanceBadgeText={chanceBadgeText}\n completedText={completedText}\n usedText={usedText}\n loadingText={loadingText}\n />\n ))}\n </div>\n\n {/* \u5E95\u90E8\u63D0\u793A */}\n {footerNote && (\n <p\n className={cn(\n 'chance-methods-footer',\n 'font-semibold',\n 'text-[14px] leading-[1.4] ',\n 'desktop:pt-[24px] pt-[16px]',\n theme === 'dark' ? 'text-[#75787F]' : 'text-[#767880]'\n )}\n >\n {footerNote}\n </p>\n )}\n </div>\n )\n}\n\n// ============================================================================\n// ChanceInputMode \u5B50\u7EC4\u4EF6 - \u8F93\u5165\u6846\u6A21\u5F0F\n// ============================================================================\n\ninterface ChanceInputModeProps {\n theme?: 'light' | 'dark'\n inputConfig: ChanceInputConfig\n isAgreementChecked?: boolean\n onAgreementCheckedChange?: (checked: boolean) => void\n agreementErrorText?: string\n}\n\nconst ChanceInputMode: React.FC<ChanceInputModeProps> = ({\n theme,\n inputConfig,\n isAgreementChecked: controlledAgreementChecked,\n onAgreementCheckedChange,\n agreementErrorText,\n}) => {\n const [value, setValue] = React.useState(inputConfig.defaultValue || '')\n const [error, setError] = React.useState('')\n const [agreementError, setAgreementError] = React.useState('')\n const [internalAgreementChecked, setInternalAgreementChecked] = React.useState(false)\n\n const hasAgreementNotice = Boolean(inputConfig.agreementNotice)\n const isAgreementChecked = controlledAgreementChecked ?? internalAgreementChecked\n\n // Single source of truth for submit eligibility \u2014 shared by button, Enter key, and handleSubmit\n const canSubmit = !inputConfig.isSubmitting && Boolean(value.trim())\n\n const resolvedValidationPattern =\n inputConfig.validationPattern ?? (inputConfig.inputType === 'email' ? '^[^\\\\s@]+@[^\\\\s@]+\\\\.[^\\\\s@]+$' : undefined)\n\n React.useEffect(() => {\n if (inputConfig.defaultValue && !value) {\n setValue(inputConfig.defaultValue)\n }\n }, [inputConfig.defaultValue])\n\n React.useEffect(() => {\n if (agreementErrorText) {\n setAgreementError(agreementErrorText)\n }\n }, [agreementErrorText])\n\n const handleSubmit = async () => {\n if (!canSubmit) return\n\n if (hasAgreementNotice && !isAgreementChecked) {\n setAgreementError(inputConfig.agreementWarningText || 'Please agree to the terms before continuing')\n return\n }\n\n if (resolvedValidationPattern) {\n const regex = new RegExp(resolvedValidationPattern)\n if (!regex.test(value.trim())) {\n setError(inputConfig.validationErrorText || 'Invalid input')\n return\n }\n }\n setError('')\n setAgreementError('')\n try {\n await inputConfig.onSubmit?.(value.trim())\n } catch (error) {\n // \u9519\u8BEF\u5F39\u7A97\u7531\u7236\u7EC4\u4EF6 (showError / onDrawError) \u5904\u7406\uFF0C\u6B64\u5904\u4EC5\u9632\u6B62 unhandled rejection\n console.error('[ChanceInputMode] onSubmit error:', error)\n }\n }\n\n return (\n <div className=\"chance-input-mode flex grow flex-col gap-[16px]\">\n <input\n type={inputConfig.inputType || 'text'}\n value={value}\n onChange={e => {\n setValue(e.target.value)\n setError('')\n }}\n placeholder={inputConfig.placeholder || 'Enter your order number'}\n disabled={inputConfig.isSubmitting || inputConfig.disabled}\n autoComplete={inputConfig.disableAutofill ? 'new-password' : undefined}\n name={inputConfig.disableAutofill ? 'lottery-input' : undefined}\n readOnly={inputConfig.disabled}\n className={cn(\n 'rounded-btn laptop:h-[54px] laptop:px-[16px] h-[44px] w-full border bg-transparent px-[12px]',\n 'lg-desktop:text-[16px] text-[14px] leading-[1.4]',\n 'outline-none transition-colors',\n 'border-[#D1D5DB] placeholder:text-[#9CA3AF]',\n error ? 'border-red-500' : '',\n theme === 'dark' ? 'text-white' : 'text-[#1E2024]'\n )}\n onKeyDown={e => {\n if (e.key === 'Enter' && canSubmit) handleSubmit()\n }}\n />\n <Button\n size=\"lg\"\n variant={theme === 'dark' ? 'primary' : 'secondary'}\n onClick={handleSubmit}\n disabled={!canSubmit}\n className=\"w-fit\"\n data-headless-type-name={inputConfig.submitTrackTypeName}\n data-headless-title-desc-button={inputConfig.submitTrackTitleDescButton}\n >\n {inputConfig.isSubmitting ? 'Loading...' : inputConfig.submitText || 'Spin and Win'}\n </Button>\n {error && <p className=\"text-[12px] text-red-500\">{error}</p>}\n {agreementError && <p className=\"text-[12px] text-red-500\">{agreementError}</p>}\n\n {hasAgreementNotice && (\n <label className=\"flex items-start gap-[8px] pt-[4px]\">\n <Checkbox\n checked={isAgreementChecked}\n onCheckedChange={checked => {\n const nextChecked = Boolean(checked)\n onAgreementCheckedChange?.(nextChecked)\n setInternalAgreementChecked(nextChecked)\n if (nextChecked) {\n setAgreementError('')\n }\n }}\n className=\"mt-[2px] shrink-0 border-white/60 data-[state=checked]:border-white data-[state=checked]:bg-white data-[state=checked]:text-[#1D1D1F]\"\n />\n <Text\n html={inputConfig.agreementNotice}\n className={cn(\n 'text-[14px] font-[700] leading-[1.4]',\n '[&_a]:underline [&_a]:underline-offset-2',\n theme === 'dark'\n ? 'text-white/95 [&_a]:text-white [&_a]:hover:text-white/80'\n : 'text-[#1E2024] [&_a]:text-[#1E2024] [&_a]:hover:text-[#1E2024]/80'\n )}\n />\n </label>\n )}\n </div>\n )\n}\n\n// ChanceMethodItem \u5B50\u7EC4\u4EF6 - \u5355\u4E2A\u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\u5361\u7247\n// ============================================================================\n\ninterface ChanceMethodItemProps {\n method: ChanceMethod\n userData?: UserData\n onOpenShareModal?: () => void\n chanceBadgeText: string\n completedText: string\n usedText: string\n loadingText: string\n}\n\n/**\n * ChanceMethodItem - \u5355\u4E2A\u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\u5361\u7247\n *\n * \u5C55\u793A\u65B9\u5F0F\u540D\u79F0\u3001\u63CF\u8FF0\u3001Chance +1 \u5FBD\u7AE0\u548C\u884C\u52A8\u6309\u94AE\u3002\n * \u652F\u6301\u4E09\u79CD\u72B6\u6001\uFF1Apending\uFF08\u672A\u5B8C\u6210\uFF09\u3001completed\uFF08\u5DF2\u5B8C\u6210\uFF09\u3001used\uFF08\u5DF2\u4F7F\u7528\uFF09\n */\nconst ChanceMethodItem: React.FC<ChanceMethodItemProps> = ({\n method,\n userData,\n onOpenShareModal,\n chanceBadgeText,\n completedText,\n usedText,\n loadingText,\n}) => {\n const status = method.status || 'pending'\n const isLoading = method.loading || false\n const isDisabledOrCompleted = method.disabled || status === 'completed' || status === 'used' || isLoading\n\n // \u5904\u7406\u6309\u94AE\u70B9\u51FB\n const handleClick = () => {\n // \u68C0\u67E5\u767B\u5F55\u72B6\u6001\n if (!userData?.isLoggedIn) {\n // \u672A\u767B\u5F55\u65F6\uFF0C\u53EA\u8C03\u7528\u767B\u5F55\u56DE\u8C03\uFF0C\u4E0D\u6253\u5F00\u5206\u4EAB\u5F39\u7A97\n method.onLoginRequired?.()\n return\n }\n\n // \u5DF2\u767B\u5F55\u65F6\uFF0C\u6267\u884C\u6B63\u5E38\u903B\u8F91\n // \u5982\u679C\u914D\u7F6E\u4E86 openShareModal\uFF0C\u5219\u6253\u5F00\u5206\u4EAB\u5F39\u7A97\n if (method.openShareModal && onOpenShareModal) {\n onOpenShareModal()\n }\n // \u6267\u884C\u539F\u6709\u7684 onClick \u56DE\u8C03\n method.onClick()\n }\n\n // \u72B6\u6001\u6587\u672C\u6620\u5C04\n const statusTextMap = {\n pending: isLoading ? loadingText : method?.buttonText || 'Redeem now',\n completed: completedText,\n used: usedText,\n }\n\n return (\n <div\n className={cn(\n 'chance-method-item',\n 'flex flex-col items-start gap-[8px]',\n 'tablet:flex-row tablet:items-center tablet:gap-4',\n 'transition-all',\n {\n 'opacity-60': isDisabledOrCompleted,\n }\n )}\n >\n {/* \u5DE6\u4FA7:\u65B9\u5F0F\u4FE1\u606F */}\n <div\n className={cn(\n 'chance-method-info',\n 'flex flex-1 flex-col gap-[4px]',\n 'min-w-0' // \u786E\u4FDD\u6587\u672C\u53EF\u4EE5\u88AB\u622A\u65AD\n )}\n >\n {/* \u6807\u9898 + Chance +1 \u5FBD\u7AE0 */}\n <div className=\"flex flex-wrap items-center gap-[4px]\">\n <p\n className={cn(\n 'chance-method-title',\n 'text-info-primary',\n 'text-[14px] font-[700] leading-[1.4] ',\n 'lg-desktop:text-[18px] desktop:text-[16px]'\n )}\n >\n {method.title}\n </p>\n\n <span\n className={cn(\n 'chance-badge',\n 'text-[14px] leading-[1.4] ',\n 'lg-desktop:text-[18px] desktop:text-[16px]',\n 'font-[700]',\n 'shrink-0',\n {\n 'text-[#ff6b35]': status === 'pending',\n 'text-[#4caf50]': status === 'completed',\n 'text-[#75787F]': status === 'used',\n }\n )}\n >\n {chanceBadgeText}\n </span>\n </div>\n\n {/* \u63CF\u8FF0\u6587\u672C */}\n <p\n className={cn(\n 'chance-method-description',\n 'text-info-primary',\n 'text-[14px] leading-[1.4] ',\n 'lg-desktop:text-[18px] desktop:text-[16px]',\n 'font-[700]'\n )}\n >\n {method.description}\n </p>\n </div>\n\n {/* \u53F3\u4FA7:\u884C\u52A8\u6309\u94AE */}\n <div className=\"chance-method-action shrink-0\">\n <Button\n onClick={handleClick}\n disabled={isDisabledOrCompleted}\n className={cn('chance-button', 'lg-desktop:min-w-[162px] min-w-[132px]', {\n 'bg-[#4caf50]': status === 'completed',\n 'bg-[#75787F]': status === 'used',\n })}\n >\n {statusTextMap[status]}\n </Button>\n </div>\n </div>\n )\n}\n\n// ============================================================================\n// \u9ED8\u8BA4\u5BFC\u51FA\n// ============================================================================\n\nexport default ChanceMethods\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * ChanceMethods - \u83B7\u53D6\u62BD\u5956\u673A\u4F1A\u65B9\u5F0F\u7EC4\u4EF6\n *\n * \u5C55\u793A\u7528\u6237\u83B7\u53D6\u989D\u5916\u62BD\u5956\u673A\u4F1A\u7684\u591A\u79CD\u65B9\u5F0F(\u5982\u5206\u4EAB\u3001\u79EF\u5206\u5151\u6362\u3001\u63A8\u8350\u7B49)\u3002\n * \u57FA\u4E8E Figma \u8BBE\u8BA1\u7A3F\u5B9E\u73B0\u54CD\u5E94\u5F0F\u5E03\u5C40\u3002\n *\n * Figma \u8BBE\u8BA1\u7A3F: https://www.figma.com/design/DhWsPamqTM76eMHS0aIQqw\n * \u8BBE\u8BA1\u8282\u70B9: 498:6185 (Chance Methods section)\n *\n * @module ChanceMethods\n * @date 2025-12-17\n */\n\n'use client'\n\nimport React from 'react'\nimport { cn } from '../../helpers/index.js'\nimport type { ChanceInputConfig, ChanceMethod, ChanceMethodsProps, UserData } from './types.js'\nimport { Button, Checkbox, Heading, Text } from '../../components/index.js'\n\n// ============================================================================\n// ChanceMethods \u7EC4\u4EF6\n// ============================================================================\n\n/**\n * ChanceMethods - \u83B7\u53D6\u62BD\u5956\u673A\u4F1A\u65B9\u5F0F\u7EC4\u4EF6\n *\n * \u7279\u6027:\n * - \u5C55\u793A\u591A\u79CD\u83B7\u53D6\u673A\u4F1A\u7684\u65B9\u5F0F(\u5206\u4EAB\u3001\u79EF\u5206\u3001\u63A8\u8350\u7B49)\n * - \u6BCF\u79CD\u65B9\u5F0F\u663E\u793A\u6807\u9898\u3001\u63CF\u8FF0\u3001Chance +1 \u5FBD\u7AE0\u548C\u884C\u52A8\u6309\u94AE\n * - \u652F\u6301\u7981\u7528\u72B6\u6001\n * - \u54CD\u5E94\u5F0F\u5E03\u5C40\n */\nexport const ChanceMethods: React.FC<ChanceMethodsProps> = ({\n theme,\n methods,\n title = 'Want more chances to win?',\n subtitle,\n footerNote,\n className,\n userData,\n onOpenShareModal,\n chanceBadgeText = 'Chance +1',\n completedText = 'Completed',\n usedText = 'Used',\n loadingText = 'Loading...',\n mechanismType = 'methods',\n inputConfig,\n isAgreementChecked,\n onAgreementCheckedChange,\n agreementErrorText,\n}) => {\n // \u8F93\u5165\u6846\u6A21\u5F0F\n if (mechanismType === 'input' && inputConfig) {\n return (\n <div\n className={cn(\n 'chance-methods-container',\n 'flex flex-col overflow-y-auto',\n 'p-[16px]',\n 'desktop:px-[24px] desktop:pt-[24px]',\n 'lg-desktop:px-[32px]',\n 'gap-[16px]',\n 'lg-desktop:gap-[16px]',\n theme === 'dark' ? 'aiui-dark' : '',\n className\n )}\n >\n {/* \u6807\u9898\u533A\u57DF */}\n <div className=\"chance-methods-header flex flex-col gap-[4px]\">\n <Heading size={2} className={cn('chance-methods-title', 'text-info-primary tracking-[-0.32px]')}>\n {title}\n </Heading>\n\n {subtitle && (\n <p\n className={cn(\n 'chance-methods-subtitle',\n 'text-[14px] font-semibold leading-[1.4]',\n 'lg-desktop:text-[18px] desktop:text-[16px]',\n theme === 'dark' ? 'text-[#8A8D92]' : 'text-[#4A4C56]'\n )}\n >\n {subtitle}\n </p>\n )}\n </div>\n\n {/* \u8F93\u5165\u6846 + \u63D0\u4EA4\u6309\u94AE */}\n <ChanceInputMode\n theme={theme}\n inputConfig={inputConfig}\n isAgreementChecked={isAgreementChecked}\n onAgreementCheckedChange={onAgreementCheckedChange}\n agreementErrorText={agreementErrorText}\n />\n\n {/* \u5E95\u90E8\u63D0\u793A */}\n {footerNote && (\n <p\n className={cn(\n 'chance-methods-footer',\n 'font-semibold',\n 'text-[14px] leading-[1.4] ',\n 'desktop:pt-[24px] pt-[16px]',\n theme === 'dark' ? 'text-[#75787F]' : 'text-[#767880]'\n )}\n >\n {footerNote}\n </p>\n )}\n </div>\n )\n }\n\n // \u9632\u5FA1\u6027\u7F16\u7A0B:\u5904\u7406 undefined \u6216\u7A7A\u6570\u7EC4\n if (!methods || methods.length === 0) {\n return null\n }\n\n return (\n <div\n className={cn(\n 'chance-methods-container',\n 'flex flex-col overflow-y-auto',\n 'p-[16px]',\n 'desktop:px-[24px] desktop:pt-[24px]',\n 'lg-desktop:px-[32px]',\n 'gap-[16px]', // \u9ED8\u8BA4\u95F4\u8DDD\n 'lg-desktop:gap-[16px]', // lg-desktop: Figma \u8BBE\u8BA1\u7A3F\u95F4\u8DDD\n theme === 'dark' ? 'aiui-dark' : '',\n className\n )}\n >\n {/* \u6807\u9898\u533A\u57DF */}\n <div className=\"chance-methods-header flex flex-col gap-[4px]\">\n <Heading size={2} className={cn('chance-methods-title', 'text-info-primary tracking-[-0.32px]')}>\n {title}\n </Heading>\n\n {subtitle && (\n <p\n className={cn(\n 'chance-methods-subtitle',\n 'text-[14px] font-semibold leading-[1.4]',\n 'lg-desktop:text-[18px] desktop:text-[16px]',\n theme === 'dark' ? 'text-[#8A8D92]' : 'text-[#4A4C56]'\n )}\n >\n {subtitle}\n </p>\n )}\n </div>\n\n {/* \u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\u5217\u8868 */}\n <div className=\"chance-methods-list flex grow flex-col gap-[16px]\">\n {methods.map(method => (\n <ChanceMethodItem\n key={method.methodKey}\n method={method}\n userData={userData}\n onOpenShareModal={onOpenShareModal}\n chanceBadgeText={chanceBadgeText}\n completedText={completedText}\n usedText={usedText}\n loadingText={loadingText}\n />\n ))}\n </div>\n\n {/* \u5E95\u90E8\u63D0\u793A */}\n {footerNote && (\n <p\n className={cn(\n 'chance-methods-footer',\n 'font-semibold',\n 'text-[14px] leading-[1.4] ',\n 'desktop:pt-[24px] pt-[16px]',\n theme === 'dark' ? 'text-[#75787F]' : 'text-[#767880]'\n )}\n >\n {footerNote}\n </p>\n )}\n </div>\n )\n}\n\n// ============================================================================\n// ChanceInputMode \u5B50\u7EC4\u4EF6 - \u8F93\u5165\u6846\u6A21\u5F0F\n// ============================================================================\n\ninterface ChanceInputModeProps {\n theme?: 'light' | 'dark'\n inputConfig: ChanceInputConfig\n isAgreementChecked?: boolean\n onAgreementCheckedChange?: (checked: boolean) => void\n agreementErrorText?: string\n}\n\nconst ChanceInputMode: React.FC<ChanceInputModeProps> = ({\n theme,\n inputConfig,\n isAgreementChecked: controlledAgreementChecked,\n onAgreementCheckedChange,\n agreementErrorText,\n}) => {\n const [value, setValue] = React.useState(inputConfig.defaultValue || '')\n const [error, setError] = React.useState('')\n const [agreementError, setAgreementError] = React.useState('')\n const [internalAgreementChecked, setInternalAgreementChecked] = React.useState(false)\n\n const hasAgreementNotice = Boolean(inputConfig.agreementNotice)\n const isAgreementChecked = controlledAgreementChecked ?? internalAgreementChecked\n\n // Single source of truth for submit eligibility \u2014 shared by button, Enter key, and handleSubmit\n const canSubmit = !inputConfig.isSubmitting && Boolean(value.trim())\n\n const resolvedValidationPattern =\n inputConfig.validationPattern ?? (inputConfig.inputType === 'email' ? '^[^\\\\s@]+@[^\\\\s@]+\\\\.[^\\\\s@]+$' : undefined)\n\n React.useEffect(() => {\n if (inputConfig.defaultValue && !value) {\n setValue(inputConfig.defaultValue)\n }\n }, [inputConfig.defaultValue])\n\n React.useEffect(() => {\n if (agreementErrorText) {\n setAgreementError(agreementErrorText)\n }\n }, [agreementErrorText])\n\n const handleSubmit = async () => {\n if (!canSubmit) return\n\n if (hasAgreementNotice && !isAgreementChecked) {\n setAgreementError(inputConfig.agreementWarningText || 'Please agree to the terms before continuing')\n return\n }\n\n if (resolvedValidationPattern) {\n const regex = new RegExp(resolvedValidationPattern)\n if (!regex.test(value.trim())) {\n setError(inputConfig.validationErrorText || 'Invalid input')\n return\n }\n }\n setError('')\n setAgreementError('')\n try {\n await inputConfig.onSubmit?.(value.trim())\n } catch (error) {\n // \u9519\u8BEF\u5F39\u7A97\u7531\u7236\u7EC4\u4EF6 (showError / onDrawError) \u5904\u7406\uFF0C\u6B64\u5904\u4EC5\u9632\u6B62 unhandled rejection\n console.error('[ChanceInputMode] onSubmit error:', error)\n }\n }\n\n return (\n <div className=\"chance-input-mode flex grow flex-col gap-[16px]\">\n <input\n type={inputConfig.inputType || 'text'}\n value={value}\n onChange={e => {\n setValue(e.target.value)\n setError('')\n }}\n placeholder={inputConfig.placeholder || 'Enter your order number'}\n disabled={inputConfig.isSubmitting || inputConfig.disabled}\n autoComplete={inputConfig.disableAutofill ? 'new-password' : undefined}\n name={inputConfig.disableAutofill ? 'lottery-input' : undefined}\n readOnly={inputConfig.disabled}\n className={cn(\n 'rounded-btn laptop:h-[54px] laptop:px-[16px] h-[44px] w-full border bg-transparent px-[12px]',\n 'lg-desktop:text-[16px] text-[14px] leading-[1.4]',\n 'outline-none transition-colors focus:ring-0 focus-visible:outline-none focus-visible:ring-0',\n 'border-[#D1D5DB] placeholder:text-[#9CA3AF]',\n error ? 'border-red-500' : '',\n theme === 'dark' ? 'text-white' : 'text-[#1E2024]'\n )}\n onKeyDown={e => {\n if (e.key === 'Enter' && canSubmit) handleSubmit()\n }}\n />\n <Button\n size=\"lg\"\n variant={theme === 'dark' ? 'primary' : 'secondary'}\n onClick={handleSubmit}\n disabled={!canSubmit}\n className=\"w-fit\"\n data-headless-type-name={inputConfig.submitTrackTypeName}\n data-headless-title-desc-button={inputConfig.submitTrackTitleDescButton}\n >\n {inputConfig.isSubmitting ? 'Loading...' : inputConfig.submitText || 'Spin and Win'}\n </Button>\n {error && <p className=\"text-[12px] text-red-500\">{error}</p>}\n {agreementError && <p className=\"text-[12px] text-red-500\">{agreementError}</p>}\n\n {hasAgreementNotice && (\n <label className=\"flex items-start gap-[8px] pt-[4px]\">\n <Checkbox\n checked={isAgreementChecked}\n onCheckedChange={checked => {\n const nextChecked = Boolean(checked)\n onAgreementCheckedChange?.(nextChecked)\n setInternalAgreementChecked(nextChecked)\n if (nextChecked) {\n setAgreementError('')\n }\n }}\n className={cn(\n 'mt-[2px] shrink-0',\n theme === 'dark'\n ? 'border-white/60 data-[state=checked]:border-white data-[state=checked]:bg-white data-[state=checked]:text-[#1D1D1F]'\n : 'border-[#1D1D1F]/40 data-[state=checked]:border-[#1D1D1F] data-[state=checked]:bg-[#1D1D1F] data-[state=checked]:text-white'\n )}\n />\n <Text\n html={inputConfig.agreementNotice}\n className={cn(\n 'text-[14px] font-[700] leading-[1.4]',\n '[&_a]:underline [&_a]:underline-offset-2',\n theme === 'dark'\n ? 'text-white/95 [&_a]:text-white [&_a]:hover:text-white/80'\n : 'text-[#1E2024] [&_a]:text-[#1E2024] [&_a]:hover:text-[#1E2024]/80'\n )}\n />\n </label>\n )}\n </div>\n )\n}\n\n// ChanceMethodItem \u5B50\u7EC4\u4EF6 - \u5355\u4E2A\u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\u5361\u7247\n// ============================================================================\n\ninterface ChanceMethodItemProps {\n method: ChanceMethod\n userData?: UserData\n onOpenShareModal?: () => void\n chanceBadgeText: string\n completedText: string\n usedText: string\n loadingText: string\n}\n\n/**\n * ChanceMethodItem - \u5355\u4E2A\u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\u5361\u7247\n *\n * \u5C55\u793A\u65B9\u5F0F\u540D\u79F0\u3001\u63CF\u8FF0\u3001Chance +1 \u5FBD\u7AE0\u548C\u884C\u52A8\u6309\u94AE\u3002\n * \u652F\u6301\u4E09\u79CD\u72B6\u6001\uFF1Apending\uFF08\u672A\u5B8C\u6210\uFF09\u3001completed\uFF08\u5DF2\u5B8C\u6210\uFF09\u3001used\uFF08\u5DF2\u4F7F\u7528\uFF09\n */\nconst ChanceMethodItem: React.FC<ChanceMethodItemProps> = ({\n method,\n userData,\n onOpenShareModal,\n chanceBadgeText,\n completedText,\n usedText,\n loadingText,\n}) => {\n const status = method.status || 'pending'\n const isLoading = method.loading || false\n const isDisabledOrCompleted = method.disabled || status === 'completed' || status === 'used' || isLoading\n\n // \u5904\u7406\u6309\u94AE\u70B9\u51FB\n const handleClick = () => {\n // \u68C0\u67E5\u767B\u5F55\u72B6\u6001\n if (!userData?.isLoggedIn) {\n // \u672A\u767B\u5F55\u65F6\uFF0C\u53EA\u8C03\u7528\u767B\u5F55\u56DE\u8C03\uFF0C\u4E0D\u6253\u5F00\u5206\u4EAB\u5F39\u7A97\n method.onLoginRequired?.()\n return\n }\n\n // \u5DF2\u767B\u5F55\u65F6\uFF0C\u6267\u884C\u6B63\u5E38\u903B\u8F91\n // \u5982\u679C\u914D\u7F6E\u4E86 openShareModal\uFF0C\u5219\u6253\u5F00\u5206\u4EAB\u5F39\u7A97\n if (method.openShareModal && onOpenShareModal) {\n onOpenShareModal()\n }\n // \u6267\u884C\u539F\u6709\u7684 onClick \u56DE\u8C03\n method.onClick()\n }\n\n // \u72B6\u6001\u6587\u672C\u6620\u5C04\n const statusTextMap = {\n pending: isLoading ? loadingText : method?.buttonText || 'Redeem now',\n completed: completedText,\n used: usedText,\n }\n\n return (\n <div\n className={cn(\n 'chance-method-item',\n 'flex flex-col items-start gap-[8px]',\n 'tablet:flex-row tablet:items-center tablet:gap-4',\n 'transition-all',\n {\n 'opacity-60': isDisabledOrCompleted,\n }\n )}\n >\n {/* \u5DE6\u4FA7:\u65B9\u5F0F\u4FE1\u606F */}\n <div\n className={cn(\n 'chance-method-info',\n 'flex flex-1 flex-col gap-[4px]',\n 'min-w-0' // \u786E\u4FDD\u6587\u672C\u53EF\u4EE5\u88AB\u622A\u65AD\n )}\n >\n {/* \u6807\u9898 + Chance +1 \u5FBD\u7AE0 */}\n <div className=\"flex flex-wrap items-center gap-[4px]\">\n <p\n className={cn(\n 'chance-method-title',\n 'text-info-primary',\n 'text-[14px] font-[700] leading-[1.4] ',\n 'lg-desktop:text-[18px] desktop:text-[16px]'\n )}\n >\n {method.title}\n </p>\n\n <span\n className={cn(\n 'chance-badge',\n 'text-[14px] leading-[1.4] ',\n 'lg-desktop:text-[18px] desktop:text-[16px]',\n 'font-[700]',\n 'shrink-0',\n {\n 'text-[#ff6b35]': status === 'pending',\n 'text-[#4caf50]': status === 'completed',\n 'text-[#75787F]': status === 'used',\n }\n )}\n >\n {chanceBadgeText}\n </span>\n </div>\n\n {/* \u63CF\u8FF0\u6587\u672C */}\n <p\n className={cn(\n 'chance-method-description',\n 'text-info-primary',\n 'text-[14px] leading-[1.4] ',\n 'lg-desktop:text-[18px] desktop:text-[16px]',\n 'font-[700]'\n )}\n >\n {method.description}\n </p>\n </div>\n\n {/* \u53F3\u4FA7:\u884C\u52A8\u6309\u94AE */}\n <div className=\"chance-method-action shrink-0\">\n <Button\n onClick={handleClick}\n disabled={isDisabledOrCompleted}\n className={cn('chance-button', 'lg-desktop:min-w-[162px] min-w-[132px]', {\n 'bg-[#4caf50]': status === 'completed',\n 'bg-[#75787F]': status === 'used',\n })}\n >\n {statusTextMap[status]}\n </Button>\n </div>\n </div>\n )\n}\n\n// ============================================================================\n// \u9ED8\u8BA4\u5BFC\u51FA\n// ============================================================================\n\nexport default ChanceMethods\n"],
5
+ "mappings": "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",
6
6
  "names": ["jsx", "jsxs", "React", "cn", "Button", "Checkbox", "Heading", "Text", "ChanceMethods", "theme", "methods", "title", "subtitle", "footerNote", "className", "userData", "onOpenShareModal", "chanceBadgeText", "completedText", "usedText", "loadingText", "mechanismType", "inputConfig", "isAgreementChecked", "onAgreementCheckedChange", "agreementErrorText", "ChanceInputMode", "method", "ChanceMethodItem", "controlledAgreementChecked", "value", "setValue", "error", "setError", "agreementError", "setAgreementError", "internalAgreementChecked", "setInternalAgreementChecked", "hasAgreementNotice", "canSubmit", "resolvedValidationPattern", "handleSubmit", "e", "checked", "nextChecked", "status", "isLoading", "isDisabledOrCompleted", "handleClick", "statusTextMap", "ChanceMethods_default"]
7
7
  }
@@ -39,6 +39,21 @@ export interface ErrorModalProps {
39
39
  * @default 'light'
40
40
  */
41
41
  theme?: 'light' | 'dark';
42
+ /**
43
+ * 兑换失败时显示的弹窗标题(来自 CMS error.exchangeFailedTitle)
44
+ * 仅当 isExchangeFailed 为 true 时生效
45
+ */
46
+ exchangeFailedTitle?: string;
47
+ /**
48
+ * 兑换失败时显示的错误消息(来自 CMS error.exchangeFailedMessage)
49
+ * 仅当 isExchangeFailed 为 true 时生效
50
+ */
51
+ exchangeFailedMessage?: string;
52
+ /**
53
+ * 是否处于兑换失败状态
54
+ * @default false
55
+ */
56
+ isExchangeFailed?: boolean;
42
57
  }
43
58
  /**
44
59
  * ErrorModal 错误提示弹窗组件
@@ -1,2 +1,2 @@
1
- "use client";import{jsx as C,jsxs as e}from"react/jsx-runtime";import"react";import{BaseModal as p}from"./BaseModal.js";import{Heading as d,Button as n}from"../../components/index.js";const m=({isOpen:a,onClose:t,title:l="Sorry, You Didn't Win This Time",message:i,confirmText:r="OK, I get",className:o,theme:s="light"})=>C(p,{isOpen:a,onClose:t,maxWidth:"max-w-[326px] laptop:max-w-[420px]",background:"bg-white",className:`${o||""}`,ariaLabelledBy:"error-modal-title",theme:s,children:e("div",{className:"laptop:px-8 laptop:pb-8 px-6 pb-6",children:[C("div",{className:"mb-6 flex justify-center",children:C("div",{className:"flex size-[80px] items-center justify-center rounded-full",children:e("svg",{xmlns:"http://www.w3.org/2000/svg",width:"80",height:"80",viewBox:"0 0 80 80",fill:"none",children:[C("path",{d:"M63.5691 63.5727C68.2304 58.9107 71.4047 52.9713 72.6905 46.5054C73.9764 40.0395 73.316 33.3374 70.793 27.2468C68.27 21.1562 63.9975 15.9505 58.516 12.2879C53.0344 8.6254 46.5899 6.67053 39.9974 6.67053C33.4049 6.67053 26.9604 8.6254 21.4788 12.2879C15.9973 15.9505 11.7249 21.1562 9.20182 27.2468C6.67878 33.3374 6.01843 40.0395 7.30427 46.5054C8.59011 52.9713 11.7644 58.9107 16.4257 63.5727C19.5211 66.6684 23.1959 69.1241 27.2404 70.7995C31.2848 72.4749 35.6197 73.3372 39.9974 73.3372C44.3751 73.3372 48.71 72.4749 52.7545 70.7995C56.7989 69.1241 60.4737 66.6684 63.5691 63.5727Z",fill:"#FFCC66"}),C("path",{d:"M57.3792 11.5137C61.4604 17.8614 63.2668 25.4062 62.503 32.914C61.7393 40.4218 58.4505 47.4482 53.1746 52.8441C47.8988 58.24 40.9481 61.6859 33.4594 62.6183C25.9706 63.5507 18.3872 61.9144 11.9492 57.977C14.6587 62.1912 18.2833 65.7405 22.5534 68.3609C26.8236 70.9813 31.6296 72.6054 36.6139 73.1125C41.5983 73.6195 46.6329 72.9965 51.3433 71.2897C56.0537 69.5829 60.3187 66.8363 63.8213 63.254C67.3239 59.6717 69.974 55.346 71.5744 50.5984C73.1749 45.8508 73.6845 40.8035 73.0655 35.8318C72.4465 30.8601 70.7147 26.0919 67.9989 21.8817C65.2832 17.6715 61.6533 14.1277 57.3792 11.5137Z",fill:"#FFC450"}),C("path",{opacity:"0.4",d:"M11.204 43.58C11.1862 37.1148 13.1937 30.8063 16.9446 25.5404C20.6955 20.2745 26.0015 16.3156 32.1175 14.2196C38.2336 12.1235 44.8525 11.9956 51.045 13.8538C57.2374 15.712 62.6924 19.4629 66.644 24.58C64.5168 20.9213 61.6618 17.7377 58.2555 15.226C54.8493 12.7143 50.964 10.9279 46.84 9.97716C42.716 9.02646 38.4408 8.93165 34.2787 9.69861C30.1166 10.4656 26.156 12.078 22.6418 14.4362C19.1275 16.7944 16.1342 19.8484 13.8469 23.4092C11.5596 26.9701 10.027 30.9622 9.34361 35.1388C8.66026 39.3155 8.84077 43.5879 9.87398 47.692C10.9072 51.7962 12.7711 55.6448 15.3506 59C12.6353 54.3146 11.2049 48.9954 11.204 43.58Z",fill:"white"}),C("path",{d:"M40 58.1469C43.3333 58.1469 46 53.5802 46 47.9436C46 42.3069 43.3067 37.7402 40 37.7402C36.6933 37.7402 34 42.3102 34 47.9436C34 53.5769 36.6667 58.1469 40 58.1469Z",fill:"#333333"}),C("path",{d:"M45.0763 53.4168C40.6863 51.0035 37.113 52.3735 35.043 53.7502C36.1296 56.4168 37.943 58.1635 39.9963 58.1635C42.1363 58.1535 43.9996 56.2635 45.0763 53.4168Z",fill:"#F84D4F"}),C("path",{d:"M29.6913 33.373L20.918 38.9564L21.1413 67.4864C23.7747 69.2998 26.6568 70.7224 29.698 71.7097L29.6913 33.373ZM50.3313 33.373L59.0913 38.9564L58.8746 67.4864C56.2413 69.2998 53.3591 70.7224 50.318 71.7097L50.3313 33.373Z",fill:"#21D2C5"}),C("path",{d:"M22.0217 39.9506C21.7281 39.9495 21.4421 39.8572 21.2032 39.6864C20.9643 39.5156 20.7844 39.2748 20.6884 38.9973C20.5918 38.7187 20.5848 38.4168 20.6684 38.134C20.7531 37.8525 20.9218 37.6037 21.1517 37.4206L25.9617 33.6673L21.0017 30.754C20.7618 30.6135 20.5684 30.4055 20.4459 30.1559C20.3233 29.9063 20.2769 29.6261 20.3124 29.3503C20.3479 29.0745 20.4639 28.8153 20.6457 28.6049C20.8276 28.3946 21.0673 28.2424 21.3351 28.1673C21.6986 28.0738 22.0844 28.1277 22.4084 28.3173L29.1817 32.294C29.3803 32.4109 29.5474 32.5745 29.6684 32.7706C29.7911 32.9687 29.8632 33.1939 29.8784 33.4265C29.8935 33.659 29.8511 33.8917 29.7551 34.104C29.6613 34.3147 29.517 34.499 29.3351 34.6406L22.8851 39.6673C22.6373 39.856 22.3332 39.9558 22.0217 39.9506ZM57.9817 39.9506C57.6662 39.9515 57.3596 39.8458 57.1117 39.6506L50.6684 34.6306C50.4845 34.4879 50.3381 34.3025 50.2417 34.0906C50.0963 33.7713 50.0751 33.4092 50.1824 33.0751C50.2896 32.7411 50.5176 32.459 50.8217 32.284L57.5817 28.304C57.7426 28.1992 57.9228 28.1278 58.1118 28.094C58.3007 28.0602 58.4946 28.0648 58.6817 28.1073C58.869 28.1498 59.0451 28.2316 59.1984 28.3473C59.3536 28.4595 59.4841 28.6025 59.5817 28.7673C59.6787 28.9331 59.741 29.1168 59.7651 29.3073C59.7895 29.4977 59.7749 29.691 59.7222 29.8755C59.6695 30.0601 59.5797 30.2319 59.4584 30.3806C59.3341 30.5324 59.1783 30.6552 59.0017 30.7406L54.0417 33.6673L58.8484 37.414C59.0217 37.5492 59.161 37.7229 59.2554 37.9214C59.3497 38.1199 59.3965 38.3376 59.3919 38.5573C59.3874 38.777 59.3317 38.9927 59.2293 39.1871C59.1268 39.3815 58.9804 39.5494 58.8017 39.6773C58.5626 39.8488 58.2761 39.942 57.9817 39.944V39.9506Z",fill:"#333333"})]})})}),C(d,{size:2,id:"error-modal-title",className:"text-center tracking-[-0.32px] text-[#1D1D1F]",children:l}),C("p",{className:"laptop:text-[16px] mb-6 text-wrap break-words text-center text-[14px] font-[700] text-[#1D1D1F]",children:i}),C(n,{onClick:t,className:"w-full",children:r})]})});var g=m;export{m as ErrorModal,g as default};
1
+ "use client";import{jsx as C,jsxs as i}from"react/jsx-runtime";import"react";import{BaseModal as c}from"./BaseModal.js";import{Heading as f,Button as g}from"../../components/index.js";const h=({isOpen:o,onClose:t,title:r="Sorry, You Didn't Win This Time",message:s,confirmText:p="OK, I get",className:d,theme:n="light",exchangeFailedTitle:e,exchangeFailedMessage:a,isExchangeFailed:l=!1})=>{const m=l&&e?e:r,x=l&&a?a:s;return C(c,{isOpen:o,onClose:t,maxWidth:"max-w-[326px] laptop:max-w-[420px]",background:"bg-white",className:`${d||""}`,ariaLabelledBy:"error-modal-title",theme:n,children:i("div",{className:"laptop:px-8 laptop:pb-8 px-6 pb-6",children:[C("div",{className:"mb-6 flex justify-center",children:C("div",{className:"flex size-[80px] items-center justify-center rounded-full",children:i("svg",{xmlns:"http://www.w3.org/2000/svg",width:"80",height:"80",viewBox:"0 0 80 80",fill:"none",children:[C("path",{d:"M63.5691 63.5727C68.2304 58.9107 71.4047 52.9713 72.6905 46.5054C73.9764 40.0395 73.316 33.3374 70.793 27.2468C68.27 21.1562 63.9975 15.9505 58.516 12.2879C53.0344 8.6254 46.5899 6.67053 39.9974 6.67053C33.4049 6.67053 26.9604 8.6254 21.4788 12.2879C15.9973 15.9505 11.7249 21.1562 9.20182 27.2468C6.67878 33.3374 6.01843 40.0395 7.30427 46.5054C8.59011 52.9713 11.7644 58.9107 16.4257 63.5727C19.5211 66.6684 23.1959 69.1241 27.2404 70.7995C31.2848 72.4749 35.6197 73.3372 39.9974 73.3372C44.3751 73.3372 48.71 72.4749 52.7545 70.7995C56.7989 69.1241 60.4737 66.6684 63.5691 63.5727Z",fill:"#FFCC66"}),C("path",{d:"M57.3792 11.5137C61.4604 17.8614 63.2668 25.4062 62.503 32.914C61.7393 40.4218 58.4505 47.4482 53.1746 52.8441C47.8988 58.24 40.9481 61.6859 33.4594 62.6183C25.9706 63.5507 18.3872 61.9144 11.9492 57.977C14.6587 62.1912 18.2833 65.7405 22.5534 68.3609C26.8236 70.9813 31.6296 72.6054 36.6139 73.1125C41.5983 73.6195 46.6329 72.9965 51.3433 71.2897C56.0537 69.5829 60.3187 66.8363 63.8213 63.254C67.3239 59.6717 69.974 55.346 71.5744 50.5984C73.1749 45.8508 73.6845 40.8035 73.0655 35.8318C72.4465 30.8601 70.7147 26.0919 67.9989 21.8817C65.2832 17.6715 61.6533 14.1277 57.3792 11.5137Z",fill:"#FFC450"}),C("path",{opacity:"0.4",d:"M11.204 43.58C11.1862 37.1148 13.1937 30.8063 16.9446 25.5404C20.6955 20.2745 26.0015 16.3156 32.1175 14.2196C38.2336 12.1235 44.8525 11.9956 51.045 13.8538C57.2374 15.712 62.6924 19.4629 66.644 24.58C64.5168 20.9213 61.6618 17.7377 58.2555 15.226C54.8493 12.7143 50.964 10.9279 46.84 9.97716C42.716 9.02646 38.4408 8.93165 34.2787 9.69861C30.1166 10.4656 26.156 12.078 22.6418 14.4362C19.1275 16.7944 16.1342 19.8484 13.8469 23.4092C11.5596 26.9701 10.027 30.9622 9.34361 35.1388C8.66026 39.3155 8.84077 43.5879 9.87398 47.692C10.9072 51.7962 12.7711 55.6448 15.3506 59C12.6353 54.3146 11.2049 48.9954 11.204 43.58Z",fill:"white"}),C("path",{d:"M40 58.1469C43.3333 58.1469 46 53.5802 46 47.9436C46 42.3069 43.3067 37.7402 40 37.7402C36.6933 37.7402 34 42.3102 34 47.9436C34 53.5769 36.6667 58.1469 40 58.1469Z",fill:"#333333"}),C("path",{d:"M45.0763 53.4168C40.6863 51.0035 37.113 52.3735 35.043 53.7502C36.1296 56.4168 37.943 58.1635 39.9963 58.1635C42.1363 58.1535 43.9996 56.2635 45.0763 53.4168Z",fill:"#F84D4F"}),C("path",{d:"M29.6913 33.373L20.918 38.9564L21.1413 67.4864C23.7747 69.2998 26.6568 70.7224 29.698 71.7097L29.6913 33.373ZM50.3313 33.373L59.0913 38.9564L58.8746 67.4864C56.2413 69.2998 53.3591 70.7224 50.318 71.7097L50.3313 33.373Z",fill:"#21D2C5"}),C("path",{d:"M22.0217 39.9506C21.7281 39.9495 21.4421 39.8572 21.2032 39.6864C20.9643 39.5156 20.7844 39.2748 20.6884 38.9973C20.5918 38.7187 20.5848 38.4168 20.6684 38.134C20.7531 37.8525 20.9218 37.6037 21.1517 37.4206L25.9617 33.6673L21.0017 30.754C20.7618 30.6135 20.5684 30.4055 20.4459 30.1559C20.3233 29.9063 20.2769 29.6261 20.3124 29.3503C20.3479 29.0745 20.4639 28.8153 20.6457 28.6049C20.8276 28.3946 21.0673 28.2424 21.3351 28.1673C21.6986 28.0738 22.0844 28.1277 22.4084 28.3173L29.1817 32.294C29.3803 32.4109 29.5474 32.5745 29.6684 32.7706C29.7911 32.9687 29.8632 33.1939 29.8784 33.4265C29.8935 33.659 29.8511 33.8917 29.7551 34.104C29.6613 34.3147 29.517 34.499 29.3351 34.6406L22.8851 39.6673C22.6373 39.856 22.3332 39.9558 22.0217 39.9506ZM57.9817 39.9506C57.6662 39.9515 57.3596 39.8458 57.1117 39.6506L50.6684 34.6306C50.4845 34.4879 50.3381 34.3025 50.2417 34.0906C50.0963 33.7713 50.0751 33.4092 50.1824 33.0751C50.2896 32.7411 50.5176 32.459 50.8217 32.284L57.5817 28.304C57.7426 28.1992 57.9228 28.1278 58.1118 28.094C58.3007 28.0602 58.4946 28.0648 58.6817 28.1073C58.869 28.1498 59.0451 28.2316 59.1984 28.3473C59.3536 28.4595 59.4841 28.6025 59.5817 28.7673C59.6787 28.9331 59.741 29.1168 59.7651 29.3073C59.7895 29.4977 59.7749 29.691 59.7222 29.8755C59.6695 30.0601 59.5797 30.2319 59.4584 30.3806C59.3341 30.5324 59.1783 30.6552 59.0017 30.7406L54.0417 33.6673L58.8484 37.414C59.0217 37.5492 59.161 37.7229 59.2554 37.9214C59.3497 38.1199 59.3965 38.3376 59.3919 38.5573C59.3874 38.777 59.3317 38.9927 59.2293 39.1871C59.1268 39.3815 58.9804 39.5494 58.8017 39.6773C58.5626 39.8488 58.2761 39.942 57.9817 39.944V39.9506Z",fill:"#333333"})]})})}),C(f,{size:2,id:"error-modal-title",className:"text-center tracking-[-0.32px] text-[#1D1D1F]",children:m}),C("p",{className:"laptop:text-[16px] mb-6 text-wrap break-words text-center text-[14px] font-[700] text-[#1D1D1F]",children:x}),C(g,{onClick:t,className:"w-full",children:p})]})})};var v=h;export{h as ErrorModal,v as default};
2
2
  //# sourceMappingURL=ErrorModal.js.map