@tbox.cn/app-module-promotion 0.2.0 → 0.9.3

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 (67) hide show
  1. package/AGENTS.md +16 -0
  2. package/README.md +90 -11
  3. package/dist/chunk-P7IEEV37.js +1347 -0
  4. package/dist/chunk-QOTX4XDS.js +1745 -0
  5. package/dist/client/index.d.ts +21 -3
  6. package/dist/client/index.js +4 -2
  7. package/dist/index.d.ts +4 -3
  8. package/dist/index.js +16 -4
  9. package/dist/promotion-CMKJ4DB3.css +2135 -0
  10. package/dist/promotion-activity-header-pea-v2-4CCHFCCM.jpg +0 -0
  11. package/dist/promotion-coupon-header-pea-v1-4CCHFCCM.jpg +0 -0
  12. package/dist/server/index.d.ts +2481 -41
  13. package/dist/server/index.js +13 -3
  14. package/package.json +28 -15
  15. package/skills/promotion/SKILL.md +137 -0
  16. package/skills/promotion/references/claim-loop.md +18 -0
  17. package/src/client/assets/promotion-activity-header-pea-v2.jpg +0 -0
  18. package/src/client/assets/promotion-coupon-header-pea-v1.jpg +0 -0
  19. package/src/client/assets.d.ts +5 -0
  20. package/src/client/cards/index.ts +10 -0
  21. package/src/client/cards/promotion-activity-category-list/index.tsx +34 -0
  22. package/src/client/cards/promotion-activity-detail/index.tsx +84 -0
  23. package/src/client/cards/promotion-activity-list/index.tsx +58 -0
  24. package/src/client/cards/promotion-best-deal/index.tsx +18 -0
  25. package/src/client/cards/promotion-entitlement-list/index.tsx +163 -0
  26. package/src/client/cards/promotion-offer-detail/index.tsx +116 -0
  27. package/src/client/cards/promotion-offer-list/index.tsx +285 -0
  28. package/src/client/cards/view.ts +72 -0
  29. package/src/client/components/CouponQrCode.tsx +48 -0
  30. package/src/client/components/CouponSheet.tsx +124 -0
  31. package/src/client/components/ImageWithFallback.tsx +39 -0
  32. package/src/client/index.ts +23 -4
  33. package/src/client/styles/promotion.css +2135 -0
  34. package/src/client/types/css.d.ts +2 -0
  35. package/src/client/utils/sanitize-activity-html.ts +48 -0
  36. package/src/client/utils/scroll-card-bottom.ts +40 -0
  37. package/src/server/actions.ts +217 -0
  38. package/src/server/cards/index.ts +19 -0
  39. package/src/server/cards/promotion-activity-category-list/meta.ts +13 -0
  40. package/src/server/cards/promotion-activity-detail/meta.ts +29 -0
  41. package/src/server/cards/promotion-activity-list/meta.ts +13 -0
  42. package/src/server/cards/promotion-best-deal/meta.ts +20 -0
  43. package/src/server/cards/promotion-entitlement-list/meta.ts +17 -0
  44. package/src/server/cards/promotion-entitlement-list/samples.ts +51 -0
  45. package/src/server/cards/promotion-offer-detail/meta.ts +25 -0
  46. package/src/server/cards/promotion-offer-list/meta.ts +20 -0
  47. package/src/server/cards/promotion-offer-list/samples.ts +154 -0
  48. package/src/server/handler.ts +378 -16
  49. package/src/server/index.ts +117 -22
  50. package/src/server/navigation.ts +23 -0
  51. package/src/server/ports.ts +56 -0
  52. package/src/server/service.ts +243 -24
  53. package/src/server/tools.ts +789 -0
  54. package/tbox.module.json +126 -0
  55. package/tests/cards-render.test.tsx +656 -0
  56. package/tests/ports-resolve.test.ts +96 -0
  57. package/tests/pretool-coupons.test.ts +63 -0
  58. package/tests/promotion.test.ts +976 -0
  59. package/tests/samples.test.ts +42 -0
  60. package/tests/view.test.ts +61 -0
  61. package/tsup.config.ts +9 -1
  62. package/dist/chunk-AD6OLHSM.js +0 -86
  63. package/dist/chunk-LQGF6337.js +0 -32
  64. package/src/client/cards/coupon/index.tsx +0 -12
  65. package/src/server/cards/coupon/meta.ts +0 -23
  66. package/tbox.component.json +0 -20
  67. package/tests/service.test.ts +0 -31
@@ -0,0 +1,2135 @@
1
+ .promotion-card {
2
+ /* 域色板(mall-vis 营销域):价格红/票根红/CTA 蓝与营销橙渐变/成功绿;对照 docs/mall/visual.md */
3
+ --promo-mint: #169e5a;
4
+ --promo-mint-dark: #128356;
5
+ --promo-mint-soft: #eaf8f1;
6
+ --promo-coral: #e42f46;
7
+ --promo-coral-soft: #fff1f3;
8
+ --promo-cyan: #2368ec;
9
+ --promo-cyan-soft: #eaf3ff;
10
+ --promo-primary: #2368ec;
11
+ --promo-ticket: #ee3347;
12
+ --promo-cta-orange: linear-gradient(135deg, #ff8c33 0%, #ff6f1f 100%);
13
+ --promo-activity-gradient: linear-gradient(135deg, #06459d 0%, #0874d8 100%);
14
+ --promo-ink: #0b0f17;
15
+ --promo-muted: #535b6c;
16
+ --promo-line: #e1e5ec;
17
+ position: relative;
18
+ box-sizing: border-box;
19
+ overflow: hidden;
20
+ width: 100%;
21
+ background: #fff;
22
+ color: var(--promo-ink);
23
+ font-size: 28px;
24
+ letter-spacing: 0;
25
+ }
26
+
27
+ .promotion-sheet__qrcode {
28
+ display: block;
29
+ width: min(70%, 240px);
30
+ height: auto;
31
+ aspect-ratio: 1;
32
+ margin: 20px auto 24px;
33
+ image-rendering: pixelated;
34
+ }
35
+
36
+ .promotion-sheet__qrcode--disabled {
37
+ opacity: 0.85;
38
+ }
39
+
40
+ .promotion-sheet__barcode {
41
+ display: block;
42
+ width: min(70%, 320px);
43
+ height: auto;
44
+ min-height: 52px;
45
+ margin: 28px auto 20px;
46
+ }
47
+
48
+ .promotion-sheet__barcode--disabled {
49
+ opacity: 0.85;
50
+ }
51
+ .promotion-card * {
52
+ box-sizing: border-box;
53
+ letter-spacing: 0;
54
+ }
55
+ .promotion-card button {
56
+ font: inherit;
57
+ }
58
+ .promotion-card h3,
59
+ .promotion-card p {
60
+ margin: 0;
61
+ }
62
+ .promotion-card__header {
63
+ display: flex;
64
+ align-items: center;
65
+ gap: 20px;
66
+ min-width: 0;
67
+ padding: 28px 32px 24px;
68
+ }
69
+ .promotion-card__header--compact {
70
+ padding-bottom: 20px;
71
+ }
72
+ .promotion-card__header > div {
73
+ flex: 1;
74
+ min-width: 0;
75
+ }
76
+ /* mark 方块四色编码(demo 活动分类图标族:绿/青/红/金) */
77
+ .promotion-card__mark {
78
+ display: grid;
79
+ place-items: center;
80
+ flex: 0 0 76px;
81
+ width: 76px;
82
+ height: 76px;
83
+ border: 1px solid rgba(8, 119, 95, 0.18);
84
+ border-radius: 20px;
85
+ background: #dff6ed;
86
+ color: #08775f;
87
+ box-shadow: 0 10px 28px rgba(8, 119, 95, 0.08);
88
+ }
89
+ .promotion-card__mark svg {
90
+ width: 40px;
91
+ height: 40px;
92
+ }
93
+ .promotion-card__mark--cyan {
94
+ border-color: rgba(13, 115, 132, 0.18);
95
+ background: #e1f5f7;
96
+ color: #0d7384;
97
+ }
98
+ .promotion-card__mark--coral {
99
+ border-color: rgba(180, 67, 51, 0.18);
100
+ background: #ffebe7;
101
+ color: #b44333;
102
+ }
103
+ .promotion-card__mark--violet {
104
+ border-color: rgba(155, 104, 20, 0.22);
105
+ background: #fff0cb;
106
+ color: #9b6814;
107
+ }
108
+ .promotion-card__eyebrow {
109
+ display: block;
110
+ margin-bottom: 4px;
111
+ color: var(--promo-primary);
112
+ font-size: 20px;
113
+ font-weight: 700;
114
+ line-height: 28px;
115
+ }
116
+ .promotion-card h3 {
117
+ overflow-wrap: anywhere;
118
+ font-size: 34px;
119
+ font-weight: 740;
120
+ line-height: 44px;
121
+ }
122
+ .promotion-card__header p {
123
+ margin-top: 4px;
124
+ overflow: hidden;
125
+ color: var(--promo-muted);
126
+ font-size: 22px;
127
+ line-height: 32px;
128
+ text-overflow: ellipsis;
129
+ white-space: nowrap;
130
+ }
131
+ .promotion-card__count {
132
+ flex: none;
133
+ padding: 10px 16px;
134
+ border: 1px solid rgba(83, 91, 108, 0.13);
135
+ border-radius: 999px;
136
+ background: #f0f3f8;
137
+ color: var(--promo-muted);
138
+ font-size: 20px;
139
+ }
140
+ .promotion-card__footer {
141
+ display: flex;
142
+ align-items: center;
143
+ gap: 10px;
144
+ padding: 18px 32px 22px;
145
+ border-top: 1px solid var(--promo-line);
146
+ color: var(--promo-muted);
147
+ font-size: 20px;
148
+ line-height: 30px;
149
+ }
150
+ .promotion-card__footer--accent {
151
+ color: var(--promo-cyan);
152
+ }
153
+ .promotion-card__empty {
154
+ display: flex;
155
+ align-items: center;
156
+ justify-content: center;
157
+ gap: 16px;
158
+ min-height: 188px;
159
+ padding: 40px;
160
+ color: var(--promo-muted);
161
+ font-size: 24px;
162
+ }
163
+ .promotion-image--fallback {
164
+ display: grid;
165
+ place-items: center;
166
+ /* 中性灰而非彩色:兜底图是「这里本该有张图」的说明,带上色相反而比真图更抢眼 */
167
+ background: #f1f2f4;
168
+ color: rgba(11, 15, 23, 0.26);
169
+ }
170
+ .promotion-status {
171
+ display: inline-flex;
172
+ align-items: center;
173
+ gap: 6px;
174
+ flex: none;
175
+ padding: 8px 14px;
176
+ border-radius: 999px;
177
+ font-size: 18px;
178
+ font-style: normal;
179
+ font-weight: 700;
180
+ white-space: nowrap;
181
+ }
182
+ .promotion-status--available {
183
+ background: var(--promo-mint-soft);
184
+ color: var(--promo-mint-dark);
185
+ }
186
+ .promotion-status--requires_action {
187
+ background: var(--promo-coral-soft);
188
+ color: #a43d25;
189
+ }
190
+ .promotion-status--unavailable,
191
+ .promotion-status--unknown {
192
+ background: #f0f3f2;
193
+ color: var(--promo-muted);
194
+ }
195
+ .promotion-list__hero {
196
+ position: relative;
197
+ height: 184px;
198
+ overflow: hidden;
199
+ background: #eef2f8;
200
+ }
201
+ .promotion-list__hero-image {
202
+ width: 100%;
203
+ height: 100%;
204
+ object-fit: cover;
205
+ }
206
+ .promotion-list__glass {
207
+ position: absolute;
208
+ right: 24px;
209
+ bottom: 20px;
210
+ left: 24px;
211
+ display: grid;
212
+ gap: 2px;
213
+ padding: 16px 20px;
214
+ border: 1px solid rgba(255, 255, 255, 0.68);
215
+ border-radius: 14px;
216
+ background: rgba(255, 255, 255, 0.78);
217
+ box-shadow: 0 16px 40px rgba(21, 45, 88, 0.15);
218
+ backdrop-filter: blur(12px);
219
+ }
220
+ .promotion-list__glass span {
221
+ color: var(--promo-mint-dark);
222
+ font-size: 18px;
223
+ font-weight: 700;
224
+ }
225
+ .promotion-list__glass strong {
226
+ font-size: 28px;
227
+ line-height: 36px;
228
+ }
229
+ .promotion-list__items {
230
+ padding: 0 32px 8px;
231
+ }
232
+ .promotion-list__items > button,
233
+ .promotion-list__items > article {
234
+ display: grid;
235
+ grid-template-columns: 104px minmax(0, 1fr) auto 24px;
236
+ align-items: center;
237
+ gap: 18px;
238
+ width: 100%;
239
+ min-height: 132px;
240
+ padding: 16px 0;
241
+ border: 0;
242
+ border-top: 1px solid var(--promo-line);
243
+ background: transparent;
244
+ color: inherit;
245
+ text-align: left;
246
+ }
247
+ .promotion-list__items > :first-child {
248
+ border-top: 0;
249
+ }
250
+ .promotion-list__items > button {
251
+ cursor: pointer;
252
+ }
253
+ .promotion-list__items > button:focus-visible {
254
+ border-radius: 10px;
255
+ outline: 2px solid var(--promo-primary);
256
+ outline-offset: 1px;
257
+ }
258
+ .promotion-list__items > button:disabled {
259
+ cursor: not-allowed;
260
+ opacity: 0.55;
261
+ }
262
+ .promotion-list__visual {
263
+ position: relative;
264
+ width: 104px;
265
+ height: 96px;
266
+ }
267
+ .promotion-list__thumb {
268
+ width: 104px;
269
+ height: 96px;
270
+ border-radius: 14px;
271
+ object-fit: cover;
272
+ }
273
+ .promotion-list__visual em {
274
+ position: absolute;
275
+ right: 6px;
276
+ bottom: 6px;
277
+ max-width: 94px;
278
+ overflow: hidden;
279
+ padding: 4px 8px;
280
+ border: 1px solid rgba(255, 255, 255, 0.7);
281
+ border-radius: 8px;
282
+ background: rgba(255, 255, 255, 0.82);
283
+ color: var(--promo-coral);
284
+ font-size: 18px;
285
+ font-style: normal;
286
+ font-weight: 800;
287
+ text-overflow: ellipsis;
288
+ white-space: nowrap;
289
+ backdrop-filter: blur(7px);
290
+ }
291
+ .promotion-list__copy {
292
+ display: grid;
293
+ min-width: 0;
294
+ gap: 4px;
295
+ }
296
+ .promotion-list__copy small {
297
+ color: var(--promo-mint-dark);
298
+ font-size: 18px;
299
+ font-weight: 700;
300
+ }
301
+ .promotion-list__copy strong,
302
+ .promotion-list__copy span {
303
+ overflow: hidden;
304
+ text-overflow: ellipsis;
305
+ white-space: nowrap;
306
+ }
307
+ .promotion-list__copy strong {
308
+ font-size: 26px;
309
+ line-height: 36px;
310
+ }
311
+ .promotion-list__copy span {
312
+ color: var(--promo-muted);
313
+ font-size: 20px;
314
+ }
315
+ .promotion-list__items > button > svg {
316
+ color: #82918c;
317
+ }.promotion-detail__hero {
318
+ position: relative;
319
+ height: 252px;
320
+ overflow: hidden;
321
+ background: #eef2f8;
322
+ }
323
+ .promotion-detail__image {
324
+ width: 100%;
325
+ height: 100%;
326
+ object-fit: cover;
327
+ }
328
+ .promotion-detail__hero-label {
329
+ position: absolute;
330
+ top: 20px;
331
+ left: 24px;
332
+ padding: 8px 14px;
333
+ border: 1px solid rgba(255, 255, 255, 0.55);
334
+ border-radius: 999px;
335
+ background: rgba(6, 42, 101, 0.66);
336
+ color: #fff;
337
+ font-size: 18px;
338
+ font-weight: 700;
339
+ backdrop-filter: blur(8px);
340
+ }
341
+ .promotion-detail__glass {
342
+ position: absolute;
343
+ right: 24px;
344
+ bottom: 20px;
345
+ left: 24px;
346
+ display: grid;
347
+ grid-template-columns: minmax(0, 1fr) auto;
348
+ align-items: end;
349
+ gap: 2px 20px;
350
+ padding: 16px 20px;
351
+ border: 1px solid rgba(255, 255, 255, 0.62);
352
+ border-radius: 14px;
353
+ background: rgba(255, 255, 255, 0.82);
354
+ box-shadow: 0 16px 44px rgba(21, 45, 88, 0.16);
355
+ backdrop-filter: blur(12px);
356
+ }
357
+ .promotion-detail__glass small,
358
+ .promotion-detail__glass em {
359
+ overflow: hidden;
360
+ text-overflow: ellipsis;
361
+ white-space: nowrap;
362
+ }
363
+ .promotion-detail__glass small {
364
+ color: var(--promo-mint-dark);
365
+ font-size: 18px;
366
+ font-weight: 700;
367
+ }
368
+ .promotion-detail__glass strong {
369
+ grid-row: 1/3;
370
+ grid-column: 2;
371
+ color: var(--promo-coral);
372
+ font-size: 44px;
373
+ line-height: 48px;
374
+ font-variant-numeric: tabular-nums;
375
+ }
376
+ .promotion-detail__glass em {
377
+ color: var(--promo-muted);
378
+ font-size: 20px;
379
+ font-style: normal;
380
+ }
381
+ .promotion-detail__body {
382
+ padding: 26px 32px 30px;
383
+ }
384
+ .promotion-detail__status {
385
+ display: flex;
386
+ align-items: center;
387
+ justify-content: space-between;
388
+ gap: 16px;
389
+ }
390
+ .promotion-detail__status small {
391
+ display: flex;
392
+ align-items: center;
393
+ gap: 8px;
394
+ color: var(--promo-muted);
395
+ font-size: 18px;
396
+ }
397
+ .promotion-detail__status small svg {
398
+ width: 24px;
399
+ height: 24px;
400
+ }
401
+ .promotion-detail__body > h3 {
402
+ margin-top: 16px;
403
+ font-size: 36px;
404
+ }
405
+ .promotion-detail__body > p {
406
+ margin-top: 8px;
407
+ color: var(--promo-muted);
408
+ font-size: 22px;
409
+ line-height: 34px;
410
+ }
411
+ .promotion-detail__notice-strip {
412
+ display: grid;
413
+ gap: 10px;
414
+ margin-top: 16px;
415
+ padding: 16px 18px;
416
+ border-radius: 14px;
417
+ background: #fff8ef;
418
+ }
419
+ .promotion-detail__notice-strip span {
420
+ display: grid;
421
+ grid-template-columns: 92px minmax(0, 1fr);
422
+ align-items: baseline;
423
+ gap: 16px;
424
+ color: #171717;
425
+ font-size: 21px;
426
+ line-height: 30px;
427
+ }
428
+ .promotion-detail__notice-strip b {
429
+ width: auto;
430
+ text-align: left;
431
+ color: #b38a3e;
432
+ font-size: 22px;
433
+ }
434
+ .promotion-detail__notice-strip span + span b {
435
+ color: #ef7654;
436
+ }
437
+ .promotion-detail__usage-rule {
438
+ margin-top: 24px;
439
+ color: var(--promo-muted);
440
+ font-size: 20px;
441
+ line-height: 32px;
442
+ }
443
+ .promotion-detail__usage-rule > strong {
444
+ display: block;
445
+ margin-bottom: 8px;
446
+ color: #171717;
447
+ font-size: 23px;
448
+ }
449
+ .promotion-detail__usage-rule p,
450
+ .promotion-detail__usage-rule div {
451
+ margin: 0;
452
+ }
453
+ .promotion-detail__rules {
454
+ display: grid;
455
+ gap: 12px;
456
+ margin-top: 22px;
457
+ }
458
+ .promotion-detail__rules > span {
459
+ display: grid;
460
+ grid-template-columns: 28px minmax(0, 1fr);
461
+ gap: 0 12px;
462
+ align-items: start;
463
+ }
464
+ .promotion-detail__rules svg {
465
+ grid-row: 1/3;
466
+ margin-top: 4px;
467
+ color: var(--promo-mint);
468
+ }
469
+ .promotion-detail__rules b {
470
+ font-size: 22px;
471
+ }
472
+ .promotion-detail__rules small {
473
+ color: var(--promo-muted);
474
+ font-size: 20px;
475
+ line-height: 30px;
476
+ }
477
+ .promotion-detail__bundle {
478
+ display: grid;
479
+ gap: 10px;
480
+ margin-top: 22px;
481
+ }
482
+ .promotion-detail__bundle > span {
483
+ display: grid;
484
+ grid-template-columns: 36px minmax(0, 1fr) auto;
485
+ gap: 12px;
486
+ align-items: center;
487
+ padding: 14px 16px;
488
+ border: 1px solid var(--promo-line);
489
+ border-radius: 12px;
490
+ background: #f8faf9;
491
+ }
492
+ .promotion-detail__bundle svg {
493
+ color: var(--promo-coral);
494
+ }
495
+ .promotion-detail__bundle b {
496
+ font-size: 22px;
497
+ }
498
+ .promotion-detail__bundle small {
499
+ color: var(--promo-muted);
500
+ }
501
+ .promotion-detail__facts {
502
+ display: grid;
503
+ grid-template-columns: 112px minmax(0, 1fr);
504
+ gap: 0;
505
+ margin: 20px 0 0;
506
+ border: 1px solid var(--promo-line);
507
+ border-radius: 14px;
508
+ background: #f8faf9;
509
+ overflow: hidden;
510
+ }
511
+ .promotion-detail__facts dt,
512
+ .promotion-detail__facts dd {
513
+ margin: 0;
514
+ padding: 14px 18px;
515
+ border-top: 1px solid var(--promo-line);
516
+ font-size: 20px;
517
+ }
518
+ .promotion-detail__facts > div {
519
+ display: contents;
520
+ }
521
+ .promotion-detail__facts > :nth-child(-n + 2) {
522
+ border-top: 0;
523
+ }
524
+ .promotion-detail__facts dt {
525
+ color: var(--promo-muted);
526
+ }
527
+ .promotion-detail__facts dd {
528
+ font-weight: 650;
529
+ text-align: right;
530
+ }
531
+ .promotion-detail__notice {
532
+ display: flex;
533
+ align-items: flex-start;
534
+ gap: 12px;
535
+ margin-top: 20px;
536
+ padding: 16px 18px;
537
+ border: 1px solid rgba(228, 47, 70, 0.12);
538
+ border-radius: 12px;
539
+ background: var(--promo-coral-soft);
540
+ color: #744333;
541
+ font-size: 20px;
542
+ line-height: 30px;
543
+ }
544
+ .promotion-detail__notice svg {
545
+ flex: none;
546
+ width: 28px;
547
+ height: 28px;
548
+ margin-top: 2px;
549
+ }
550
+
551
+ .promotion-detail__stores {
552
+ display: grid;
553
+ gap: 6px;
554
+ margin-top: 12px;
555
+ padding: 10px 12px;
556
+ border: 1px solid var(--promotion-line, #e5e7eb);
557
+ border-radius: 8px;
558
+ background: var(--promotion-surface-muted, #f8fafc);
559
+ }
560
+
561
+ .promotion-detail__stores strong {
562
+ color: var(--promotion-ink, #17202a);
563
+ font-size: 12px;
564
+ }
565
+
566
+ .promotion-detail__stores span {
567
+ display: flex;
568
+ gap: 5px;
569
+ color: var(--promotion-muted, #667085);
570
+ font-size: 12px;
571
+ }
572
+ .promotion-button {
573
+ display: flex;
574
+ align-items: center;
575
+ justify-content: center;
576
+ gap: 12px;
577
+ width: 100%;
578
+ height: 76px;
579
+ margin-top: 22px;
580
+ border: 0;
581
+ border-radius: 14px;
582
+ font-size: 24px;
583
+ font-weight: 740;
584
+ cursor: pointer;
585
+ }
586
+ .promotion-button:disabled {
587
+ cursor: not-allowed;
588
+ opacity: 0.5;
589
+ }
590
+ /* 票根钮(demo OfferDealRow action):底 #ee3347 + clip-path 斜切 + 楷体文字。
591
+ ⚠️ 紧凑位专用(ItemActionsRow chip / 行内条)——基座 .promotion-button width:100% 是占满紧凑容器,
592
+ 全宽主 CTA 位用 --confirm 蓝轨(斜切+楷体在全宽位视觉失衡)。
593
+ (demo 用 skewX±9deg 双层反斜切;本处 chip label 是裸文本节点无包裹元素可反斜切,改 clip-path 等效实现、文字保持正直;demo 票根无发光影) */
594
+ .promotion-button--primary {
595
+ background: var(--promo-ticket);
596
+ color: #fff;
597
+ clip-path: polygon(12px 0, 100% 0, calc(100% - 12px) 100%, 0 100%);
598
+ font-family: 'Kaiti SC', STKaiti, KaiTi, serif;
599
+ font-weight: 900;
600
+ letter-spacing: 1px;
601
+ }
602
+ /* 确认类主操作:CTA 蓝轨 */
603
+ .promotion-button--confirm {
604
+ background: var(--promo-primary);
605
+ color: #fff;
606
+ box-shadow: 0 14px 30px rgba(35, 104, 236, 0.2);
607
+ }
608
+ .promotion-guide__summary {
609
+ display: flex;
610
+ align-items: center;
611
+ justify-content: space-between;
612
+ gap: 16px;
613
+ margin: 0 32px;
614
+ padding: 16px 20px;
615
+ border: 1px solid rgba(35, 104, 236, 0.13);
616
+ border-radius: 14px;
617
+ background: var(--promo-cyan-soft);
618
+ color: var(--promo-cyan);
619
+ font-size: 20px;
620
+ }
621
+ .promotion-guide__summary span {
622
+ display: flex;
623
+ align-items: center;
624
+ gap: 8px;
625
+ }
626
+ .promotion-guide__summary svg {
627
+ width: 26px;
628
+ }
629
+ .promotion-guide ol {
630
+ display: grid;
631
+ gap: 16px;
632
+ margin: 24px 32px;
633
+ padding: 0;
634
+ list-style: none;
635
+ }
636
+ .promotion-guide li {
637
+ display: grid;
638
+ grid-template-columns: 48px minmax(0, 1fr);
639
+ gap: 16px;
640
+ }
641
+ .promotion-guide li > b {
642
+ display: grid;
643
+ place-items: center;
644
+ width: 48px;
645
+ height: 48px;
646
+ border-radius: 50%;
647
+ background: var(--promo-mint);
648
+ color: #fff;
649
+ font-size: 20px;
650
+ }
651
+ .promotion-guide li > span {
652
+ display: grid;
653
+ gap: 4px;
654
+ padding-top: 4px;
655
+ }
656
+ .promotion-guide li strong {
657
+ font-size: 22px;
658
+ }
659
+ .promotion-guide li small {
660
+ color: var(--promo-muted);
661
+ font-size: 20px;
662
+ line-height: 30px;
663
+ }
664
+ .promotion-guide__requirements {
665
+ display: flex;
666
+ flex-wrap: wrap;
667
+ gap: 10px;
668
+ margin: 0 32px 22px;
669
+ }
670
+ .promotion-guide__requirements span {
671
+ display: flex;
672
+ align-items: center;
673
+ gap: 6px;
674
+ padding: 8px 14px;
675
+ border-radius: 10px;
676
+ background: var(--promo-mint-soft);
677
+ color: var(--promo-mint-dark);
678
+ font-size: 18px;
679
+ }
680
+ .promotion-guide__requirements svg {
681
+ width: 22px;
682
+ }
683
+ .promotion-guide > .promotion-detail__notice {
684
+ margin-right: 32px;
685
+ margin-left: 32px;
686
+ }
687
+ .promotion-recommendation {
688
+ padding-bottom: 30px;
689
+ }
690
+ .promotion-recommendation__main {
691
+ display: grid;
692
+ grid-template-columns: 140px minmax(0, 1fr) auto;
693
+ align-items: center;
694
+ gap: 20px;
695
+ margin: 0 32px;
696
+ padding: 18px;
697
+ border: 1px solid rgba(35, 104, 236, 0.16);
698
+ border-radius: 16px;
699
+ background: #f5fbf8;
700
+ }
701
+ .promotion-recommendation__image {
702
+ width: 140px;
703
+ height: 124px;
704
+ border-radius: 14px;
705
+ object-fit: cover;
706
+ }
707
+ .promotion-recommendation__main > div {
708
+ display: grid;
709
+ min-width: 0;
710
+ gap: 6px;
711
+ }
712
+ .promotion-recommendation__main strong,
713
+ .promotion-recommendation__main small {
714
+ overflow: hidden;
715
+ text-overflow: ellipsis;
716
+ white-space: nowrap;
717
+ }
718
+ .promotion-recommendation__main strong {
719
+ font-size: 26px;
720
+ }
721
+ .promotion-recommendation__main small {
722
+ color: var(--promo-muted);
723
+ font-size: 20px;
724
+ }
725
+ .promotion-recommendation__main em {
726
+ color: var(--promo-coral);
727
+ font-size: 36px;
728
+ font-style: normal;
729
+ font-weight: 800;
730
+ font-variant-numeric: tabular-nums;
731
+ }
732
+ .promotion-recommendation__reason,
733
+ .promotion-deal__notice {
734
+ display: flex;
735
+ align-items: flex-start;
736
+ gap: 14px;
737
+ margin: 20px 32px 0;
738
+ padding: 16px 18px;
739
+ border-radius: 14px;
740
+ background: var(--promo-coral-soft);
741
+ color: #744333;
742
+ font-size: 20px;
743
+ }
744
+ .promotion-recommendation__reason > span,
745
+ .promotion-deal__notice > span {
746
+ display: grid;
747
+ gap: 2px;
748
+ }
749
+ .promotion-recommendation__reason svg,
750
+ .promotion-deal__notice svg {
751
+ flex: none;
752
+ color: var(--promo-coral);
753
+ }
754
+ .promotion-recommendation__alternatives {
755
+ margin: 16px 32px 0;
756
+ color: var(--promo-muted);
757
+ font-size: 18px;
758
+ }
759
+ .promotion-recommendation > .promotion-button,
760
+ .promotion-deal > .promotion-button {
761
+ width: calc(100% - 64px);
762
+ margin-right: 32px;
763
+ margin-left: 32px;
764
+ }
765
+ .promotion-deal {
766
+ padding-bottom: 30px;
767
+ }
768
+ .promotion-deal__hero {
769
+ display: flex;
770
+ align-items: center;
771
+ justify-content: space-between;
772
+ gap: 20px;
773
+ margin: 0 32px;
774
+ padding: 22px 24px;
775
+ border-radius: 16px;
776
+ background: linear-gradient(135deg, var(--promo-mint-soft), var(--promo-coral-soft));
777
+ }
778
+ .promotion-deal__hero > span {
779
+ display: grid;
780
+ }
781
+ .promotion-deal__hero small {
782
+ color: var(--promo-muted);
783
+ font-size: 18px;
784
+ }
785
+ .promotion-deal__hero strong {
786
+ color: var(--promo-coral);
787
+ font-size: 44px;
788
+ font-variant-numeric: tabular-nums;
789
+ }
790
+ .promotion-deal__hero em {
791
+ padding: 10px 16px;
792
+ border-radius: 999px;
793
+ background: #fff;
794
+ color: var(--promo-coral);
795
+ font-size: 20px;
796
+ font-style: normal;
797
+ font-weight: 750;
798
+ box-shadow: 0 8px 24px rgba(69, 69, 69, 0.08);
799
+ }
800
+ .promotion-deal__metrics {
801
+ display: grid;
802
+ grid-template-columns: repeat(3, minmax(0, 1fr));
803
+ gap: 12px;
804
+ margin: 18px 32px 0;
805
+ }
806
+ .promotion-deal__metrics span {
807
+ display: grid;
808
+ gap: 4px;
809
+ min-width: 0;
810
+ padding: 16px 12px;
811
+ border: 1px solid var(--promo-line);
812
+ border-radius: 12px;
813
+ background: #f9fbfa;
814
+ text-align: center;
815
+ }
816
+ .promotion-deal__metrics small {
817
+ color: var(--promo-muted);
818
+ font-size: 18px;
819
+ }
820
+ .promotion-deal__metrics strong {
821
+ overflow: hidden;
822
+ color: var(--promo-mint-dark);
823
+ font-size: 26px;
824
+ text-overflow: ellipsis;
825
+ }.promotion-list__more {
826
+ padding: 8px 32px 18px;
827
+ color: var(--promo-muted);
828
+ font-size: 18px;
829
+ text-align: center;
830
+ }
831
+ .promotion-list__toggle {
832
+ display: inline-flex;
833
+ align-items: center;
834
+ gap: 6px;
835
+ width: 100%;
836
+ justify-content: center;
837
+ margin-top: 4px;
838
+ padding: 14px 24px 16px;
839
+ border: 0;
840
+ border-top: 1px solid rgba(188, 205, 191, 0.42);
841
+ background: linear-gradient(105deg, #fffaf0 0%, #f9f5e9 46%, #eaf6f3 100%);
842
+ color: #0b0f17;
843
+ font: inherit;
844
+ font-size: 17px;
845
+ font-weight: 650;
846
+ cursor: pointer;
847
+ }
848
+ .promotion-list__toggle:hover { filter: brightness(0.94); }
849
+ .promotion-list__toggle:focus-visible { outline: 3px solid #0b0f17; outline-offset: -3px; }
850
+ .promotion-list__toggle svg { transition: transform 160ms ease; }
851
+ .promotion-list__toggle svg[data-rotated='true'] { transform: rotate(180deg); }
852
+ /* 滚动定位落在卡片底部留白之后,并避开宿主底部固定操作区。 */
853
+ .promotion-list__bottom-anchor {
854
+ height: 0;
855
+ flex: none;
856
+ scroll-margin-bottom: max(96px, calc(var(--tbox-chat-bottom-height, 0px) + 24px));
857
+ }
858
+ .promotion-activity {
859
+ --activity-gold: #b8862e;
860
+ --activity-gold-soft: #fff6df;
861
+ --activity-coral: #e75c47;
862
+ overflow: hidden;
863
+ background: #fff;
864
+ }
865
+ /* 活动卡头:固定品牌图只承载集合标题,真实活动封面留在条目与详情。 */
866
+ .promotion-activity__header {
867
+ position: relative;
868
+ display: flex;
869
+ align-items: center;
870
+ min-height: 174px;
871
+ overflow: hidden;
872
+ padding: 24px 28px 20px;
873
+ background: var(--promo-activity-gradient);
874
+ }
875
+ .promotion-activity__header--pea {
876
+ background: #f9f1e2;
877
+ }
878
+ .promotion-activity__header-art {
879
+ position: absolute;
880
+ inset: 0;
881
+ width: 100%;
882
+ height: 100%;
883
+ object-fit: cover;
884
+ object-position: center;
885
+ pointer-events: none;
886
+ }
887
+ .promotion-activity__header-copy {
888
+ position: relative;
889
+ z-index: 1;
890
+ width: 52%;
891
+ min-width: 0;
892
+ }
893
+ .promotion-activity__header-title-row {
894
+ display: flex;
895
+ align-items: center;
896
+ gap: 10px;
897
+ color: #2f3a22;
898
+ }
899
+ .promotion-activity__header-title-row svg {
900
+ flex: none;
901
+ width: 30px;
902
+ height: 30px;
903
+ color: #4f7b37;
904
+ }
905
+ .promotion-activity__header--pea h3 {
906
+ color: #2f3a22;
907
+ font-size: 32px;
908
+ line-height: 42px;
909
+ }
910
+ .promotion-activity__header--pea p {
911
+ margin-top: 8px;
912
+ color: #626b5c;
913
+ font-size: 22px;
914
+ line-height: 32px;
915
+ }
916
+ .promotion-activity__header-mark {
917
+ display: grid;
918
+ flex: 0 0 68px;
919
+ width: 68px;
920
+ height: 68px;
921
+ place-items: center;
922
+ border: 0;
923
+ border-radius: 18px;
924
+ color: var(--activity-gold);
925
+ background: #fff;
926
+ box-shadow: 0 12px 28px rgba(142, 100, 24, 0.12);
927
+ }
928
+ .promotion-activity__header-mark svg { width: 36px; height: 36px; }
929
+ .promotion-activity__header:not(.promotion-activity__header--pea) .promotion-card__eyebrow { color: #cfe5ff; font-size: 18px; line-height: 24px; }
930
+ .promotion-activity__header:not(.promotion-activity__header--pea) h3 { font-size: 30px; line-height: 38px; color: #fff; }
931
+ .promotion-activity__header:not(.promotion-activity__header--pea) p { margin-top: 4px; font-size: 20px; line-height: 28px; color: rgba(255, 255, 255, 0.84); }
932
+ .promotion-activity__categories {
933
+ display: grid;
934
+ grid-template-columns: repeat(2, minmax(0, 1fr));
935
+ gap: 14px;
936
+ padding: 0 28px 28px;
937
+ }
938
+ .promotion-activity__categories > button,
939
+ .promotion-activity__categories > article {
940
+ display: grid;
941
+ grid-template-columns: 54px minmax(0, 1fr) 18px;
942
+ align-items: center;
943
+ gap: 12px;
944
+ min-height: 92px;
945
+ padding: 14px 16px;
946
+ border: 1px solid #e5ece9;
947
+ border-radius: 14px;
948
+ color: #15372f;
949
+ background: rgba(255, 255, 255, 0.92);
950
+ box-shadow: 0 10px 26px rgba(23, 74, 61, 0.08);
951
+ text-align: left;
952
+ cursor: pointer;
953
+ transition: border-color 180ms ease, box-shadow 180ms ease, background 180ms ease;
954
+ }
955
+ .promotion-activity__categories > button:hover { border-color: #aadbd0; background: #f8fffc; box-shadow: 0 14px 32px rgba(15, 115, 91, 0.12); }
956
+ .promotion-activity button:focus-visible { outline: 3px solid #0b8b70; outline-offset: 3px; }
957
+ .promotion-activity__category-icon { display: grid; width: 54px; height: 54px; place-items: center; border-radius: 16px; color: #08775f; background: #dff6ed; }
958
+ .promotion-activity__category-icon--1 { color: #9b6814; background: #fff0cb; }
959
+ .promotion-activity__category-icon--2 { color: #b44333; background: #ffebe7; }
960
+ .promotion-activity__category-icon--3 { color: #0d7384; background: #e1f5f7; }
961
+ .promotion-activity__category-icon svg { width: 30px; height: 30px; }
962
+ .promotion-activity__categories > * > span:nth-child(2) { display: grid; min-width: 0; gap: 2px; }
963
+ .promotion-activity__categories strong { overflow: hidden; font-size: 23px; line-height: 30px; text-overflow: ellipsis; white-space: nowrap; }
964
+ .promotion-activity__categories small { color: #687a74; font-size: 18px; line-height: 24px; }
965
+ .promotion-activity__cover-shade { position: absolute; inset: 0; background: linear-gradient(90deg, rgba(12, 39, 32, 0.82), rgba(12, 39, 32, 0.3) 68%, transparent); }
966
+ .promotion-activity__list { display: grid; padding: 4px 28px 10px; }
967
+ .promotion-activity__list > button,
968
+ .promotion-activity__list > article {
969
+ display: grid;
970
+ grid-template-columns: 142px minmax(0, 1fr);
971
+ align-items: center;
972
+ gap: 18px;
973
+ width: 100%;
974
+ min-height: 142px;
975
+ padding: 18px 0;
976
+ border: 0;
977
+ border-top: 1px solid #e6ecea;
978
+ color: inherit;
979
+ background: transparent;
980
+ text-align: left;
981
+ cursor: pointer;
982
+ touch-action: manipulation;
983
+ transition: background-color 180ms ease;
984
+ }
985
+ .promotion-activity__list > button:first-child,
986
+ .promotion-activity__list > article:first-child { border-top: 0; }
987
+ .promotion-activity__list > button:hover:not(:disabled) { background: #f5f8ff; }
988
+ .promotion-activity__list > button:focus-visible { outline: 3px solid #0b8b70; outline-offset: -3px; }
989
+ .promotion-activity__list > button:disabled { cursor: default; }
990
+ .promotion-activity__list > button.is-muted { opacity: 0.68; }
991
+ .promotion-activity__visual { position: relative; width: 142px; height: 106px; }
992
+ .promotion-activity__thumb { width: 142px; height: 106px; border-radius: 14px; object-fit: cover; box-shadow: 0 10px 24px rgba(22, 62, 51, 0.14); }
993
+ .promotion-activity__visual .promotion-activity__status { position: absolute; right: 8px; bottom: 8px; }
994
+ .promotion-activity__copy { display: grid; min-width: 0; gap: 5px; }
995
+ .promotion-activity__copy small { display: flex; align-items: center; gap: 5px; color: var(--activity-gold); font-size: 18px; font-weight: 750; line-height: 24px; }
996
+ .promotion-activity__copy strong { display: -webkit-box; overflow: hidden; font-size: 24px; line-height: 31px; -webkit-box-orient: vertical; -webkit-line-clamp: 2; }
997
+ .promotion-activity__copy span { display: flex; align-items: center; gap: 6px; color: #60726c; font-size: 19px; line-height: 25px; }
998
+ .promotion-activity__copy em { color: var(--activity-coral); font-size: 18px; font-style: normal; font-weight: 750; line-height: 24px; }
999
+ .promotion-activity__status { display: inline-flex; align-items: center; padding: 7px 12px; border: 1px solid rgba(10, 133, 103, 0.16); border-radius: 999px; color: #08745f; background: rgba(235, 250, 244, 0.92); font-size: 18px; font-weight: 750; line-height: 24px; white-space: nowrap; backdrop-filter: blur(12px); }
1000
+ .promotion-activity__status--full,
1001
+ .promotion-activity__status--ended { border-color: rgba(80, 91, 87, 0.12); color: #687570; background: rgba(245, 247, 246, 0.94); }
1002
+ .promotion-activity__status--upcoming { border-color: rgba(184, 134, 46, 0.18); color: #92600e; background: rgba(255, 246, 223, 0.94); }
1003
+ .promotion-activity__footer { display: flex; align-items: center; justify-content: center; gap: 8px; padding: 16px 28px 20px; border-top: 1px solid #e7eeeb; color: #6c7c77; font-size: 18px; line-height: 24px; }
1004
+ .promotion-activity__cover { position: relative; height: 248px; background: #dfeee9; }
1005
+ .promotion-activity__cover-image { width: 100%; height: 100%; object-fit: cover; }
1006
+ .promotion-activity__cover-meta { position: absolute; top: 20px; right: 22px; left: 22px; display: flex; align-items: center; justify-content: space-between; }
1007
+ .promotion-activity__cover-meta > span { display: flex; align-items: center; gap: 7px; padding: 8px 13px; border: 1px solid rgba(255, 255, 255, 0.58); border-radius: 999px; color: #fff5d6; background: rgba(18, 48, 40, 0.56); font-size: 18px; font-weight: 750; backdrop-filter: blur(14px); }
1008
+ .promotion-activity__detail-body { padding: 22px 28px 28px; }
1009
+ .promotion-activity__detail-body > small { color: var(--activity-gold); font-size: 18px; font-weight: 750; line-height: 24px; }
1010
+ .promotion-activity__detail-body h3 { margin: 6px 0 4px; font-size: 32px; line-height: 41px; }
1011
+ .promotion-activity__detail-body > p { color: #62736d; font-size: 21px; line-height: 29px; }
1012
+ .promotion-activity__spotlight { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; margin-top: 20px; }
1013
+ .promotion-activity__spotlight > span { display: grid; grid-template-columns: 36px minmax(0, 1fr); column-gap: 8px; padding: 15px 16px; border: 1px solid #e1ebe7; border-radius: 14px; background: #f8fbfa; }
1014
+ .promotion-activity__spotlight svg { grid-row: 1 / 3; align-self: center; width: 32px; height: 32px; color: #0b8b70; }
1015
+ .promotion-activity__spotlight small { color: #71817c; font-size: 17px; line-height: 22px; }
1016
+ .promotion-activity__spotlight strong { overflow: hidden; color: #213b34; font-size: 20px; line-height: 26px; text-overflow: ellipsis; white-space: nowrap; }
1017
+ .promotion-activity__venue { display: flex; align-items: center; gap: 11px; margin-top: 12px; padding: 14px 16px; border: 1px solid #e7ecea; border-radius: 14px; }
1018
+ .promotion-activity__venue > svg { width: 32px; height: 32px; color: var(--activity-coral); }
1019
+ .promotion-activity__venue span { display: grid; }
1020
+ .promotion-activity__venue small { color: #71817c; font-size: 17px; line-height: 22px; }
1021
+ .promotion-activity__venue strong { font-size: 21px; line-height: 27px; }
1022
+ .promotion-activity__benefit { display: flex; align-items: center; gap: 12px; margin-top: 12px; padding: 14px 16px; border: 1px solid rgba(184, 134, 46, 0.2); border-radius: 14px; color: #805616; background: var(--activity-gold-soft); }
1023
+ .promotion-activity__benefit > svg { flex: none; width: 34px; height: 34px; }
1024
+ .promotion-activity__benefit span { display: grid; font-size: 18px; line-height: 24px; }
1025
+ .promotion-activity__benefit b { font-size: 21px; line-height: 27px; }
1026
+ .promotion-activity__detail-notice { display: flex; align-items: center; gap: 10px; margin-top: 12px; padding: 13px 15px; border: 1px solid #e4e9e7; border-radius: 12px; color: #596d66; background: #f4f7f6; font-size: 18px; line-height: 25px; }
1027
+ .promotion-activity__detail-notice > svg { flex: none; width: 24px; height: 24px; color: #7b8e87; }
1028
+ /* 活动报名 CTA:营销橙渐变(demo MallActivityCards __action) */
1029
+ .promotion-activity__register { display: flex; align-items: center; justify-content: center; gap: 10px; width: 100%; min-height: 84px; margin-top: 18px; border: 0; border-radius: 999px; color: #fff; background: var(--promo-cta-orange); box-shadow: 0 6px 14px rgba(255, 111, 31, 0.2); font: inherit; font-size: 22px; font-weight: 760; line-height: 28px; cursor: pointer; touch-action: manipulation; }
1030
+ .promotion-activity__register:hover:not(:disabled) { opacity: 0.8; }
1031
+ .promotion-activity__register:focus-visible { outline: 3px solid #ff6f1f; outline-offset: 3px; }
1032
+ .promotion-activity__register:disabled { cursor: default; opacity: 0.5; background: #e3e7ee; box-shadow: none; }
1033
+ .promotion-activity__register svg { flex: none; width: 27px; height: 27px; }
1034
+ .promotion-activity__actions { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; margin-top: 20px; }
1035
+ .promotion-activity__actions--single { grid-template-columns: 1fr; }
1036
+ .promotion-activity__actions .promotion-button { display: flex; align-items: center; justify-content: center; gap: 8px; min-height: 84px; margin: 0; border-radius: 14px; font-size: 22px; line-height: 28px; }
1037
+ .promotion-activity__actions .promotion-button svg { width: 26px; height: 26px; }
1038
+ .promotion-button--secondary { border: 1px solid #cfe0f7; color: #2368ec; background: #f2f7ff; }
1039
+ .promotion-activity__session-summary { display: grid; grid-template-columns: 54px minmax(0, 1fr) auto; align-items: center; gap: 12px; margin: 0 28px 18px; padding: 15px 17px; border: 1px solid rgba(184, 134, 46, 0.2); border-radius: 14px; background: linear-gradient(105deg, #fff9eb, #fff4d8); }
1040
+ .promotion-activity__session-summary > svg { width: 38px; height: 38px; color: var(--activity-gold); }
1041
+ .promotion-activity__session-summary span { display: grid; }
1042
+ .promotion-activity__session-summary small { color: #806b43; font-size: 17px; line-height: 22px; }
1043
+ .promotion-activity__session-summary strong { color: #5c451c; font-size: 23px; line-height: 29px; }
1044
+ .promotion-activity__session-summary em { color: #9a6813; font-size: 18px; font-style: normal; font-weight: 750; }
1045
+ .promotion-activity__sessions { display: grid; gap: 12px; padding: 0 28px 18px; }
1046
+ .promotion-activity__sessions article { display: grid; grid-template-columns: 50px minmax(0, 1fr) auto auto; align-items: center; gap: 14px; min-height: 92px; padding: 14px 16px; border: 1px solid #e0eae6; border-radius: 14px; box-shadow: 0 8px 22px rgba(31, 77, 65, 0.06); }
1047
+ .promotion-activity__sessions article > b { display: grid; width: 50px; height: 50px; place-items: center; border-radius: 14px; color: #08735d; background: #e5f7f1; font-size: 20px; }
1048
+ .promotion-activity__sessions article > span { display: grid; gap: 1px; }
1049
+ .promotion-activity__sessions article > span:nth-child(3) { display: flex; align-items: center; gap: 5px; color: #61736d; font-size: 18px; white-space: nowrap; }
1050
+ .promotion-activity__sessions strong { font-size: 22px; line-height: 28px; }
1051
+ .promotion-activity__sessions small { color: #71817c; font-size: 18px; line-height: 24px; }
1052
+ .promotion-activity__sessions em { padding: 6px 10px; border-radius: 999px; color: #08735d; background: #e7f8f2; font-size: 17px; font-style: normal; font-weight: 750; }
1053
+ .promotion-activity__sessions .is-full { opacity: 0.68; }
1054
+ .promotion-activity__empty-state { display: flex; align-items: center; justify-content: center; gap: 14px; min-height: 106px; border: 1px dashed #cadbd5; border-radius: 14px; color: #667973; background: #f8fbfa; }
1055
+ .promotion-activity__empty-state svg { width: 38px; height: 38px; }
1056
+ .promotion-activity__empty-state span { display: grid; }
1057
+ .promotion-activity__empty-state strong { font-size: 22px; }
1058
+ .promotion-activity__empty-state small { font-size: 18px; }
1059
+ .promotion-activity__readonly { display: flex; align-items: center; gap: 8px; margin: 0 28px 24px; padding: 13px 15px; border-radius: 12px; color: #596d66; background: #f2f7f5; font-size: 18px; line-height: 25px; }
1060
+ .promotion-activity__readonly svg { flex: none; width: 24px; height: 24px; color: #0b8a6f; }
1061
+ .promotion-activity__guide-banner { display: flex; align-items: center; gap: 14px; margin: 0 28px 20px; padding: 16px 18px; border: 1px solid rgba(184, 134, 46, 0.18); border-radius: 14px; color: #78531a; background: linear-gradient(105deg, #fff9ed, #fff3d6); }
1062
+ .promotion-activity__guide-banner > svg { width: 38px; height: 38px; }
1063
+ .promotion-activity__guide-banner span { display: grid; }
1064
+ .promotion-activity__guide-banner small { font-size: 17px; font-weight: 800; line-height: 22px; }
1065
+ .promotion-activity__guide-banner strong { font-size: 22px; line-height: 28px; }
1066
+ .promotion-activity__steps { display: grid; gap: 0; margin: 0; padding: 0 28px 18px; list-style: none; }
1067
+ .promotion-activity__steps li { position: relative; display: grid; grid-template-columns: 48px minmax(0, 1fr); gap: 14px; min-height: 82px; align-items: start; }
1068
+ .promotion-activity__steps li:not(:last-child):after { position: absolute; top: 48px; bottom: 4px; left: 23px; width: 2px; background: #cbe6de; content: ""; }
1069
+ .promotion-activity__steps li > b { z-index: 1; display: grid; width: 48px; height: 48px; place-items: center; border-radius: 50%; color: #fff; background: linear-gradient(145deg, #0e9a79, #08745f); font-size: 20px; box-shadow: 0 7px 18px rgba(8, 116, 95, 0.18); }
1070
+ .promotion-activity__steps li > span { display: grid; gap: 3px; padding-top: 3px; }
1071
+ .promotion-activity__steps strong { font-size: 23px; line-height: 29px; }
1072
+ .promotion-activity__steps small { color: #687a74; font-size: 19px; line-height: 26px; }
1073
+ .promotion-activity__requirements { margin: 0 28px 18px; padding: 15px 17px; border: 1px solid #dfebe7; border-radius: 14px; background: #f8fbfa; }
1074
+ .promotion-activity__requirements > b { display: block; margin-bottom: 9px; color: #29473e; font-size: 20px; }
1075
+ .promotion-activity__requirements > div { display: flex; flex-wrap: wrap; gap: 8px; }
1076
+ .promotion-activity__requirements span { display: flex; align-items: center; gap: 5px; padding: 6px 10px; border-radius: 999px; color: #08745f; background: #e6f7f1; font-size: 18px; }
1077
+ .promotion-activity__requirements svg { width: 20px; height: 20px; }
1078
+ @media (prefers-reduced-motion: reduce) {
1079
+ .promotion-activity__categories > button { transition: none; }
1080
+ }
1081
+ @media (max-width: 380px) {
1082
+ .promotion-card__header {
1083
+ padding-right: 26px;
1084
+ padding-left: 26px;
1085
+ }
1086
+ .promotion-list__items {
1087
+ padding-right: 26px;
1088
+ padding-left: 26px;
1089
+ }
1090
+ .promotion-list__items > button,
1091
+ .promotion-list__items > article {
1092
+ grid-template-columns: 92px minmax(0, 1fr) auto 20px;
1093
+ gap: 14px;
1094
+ }
1095
+ .promotion-list__visual,
1096
+ .promotion-list__thumb {
1097
+ width: 92px;
1098
+ }
1099
+ .promotion-detail__body {
1100
+ padding-right: 26px;
1101
+ padding-left: 26px;
1102
+ }
1103
+ .promotion-card h3 {
1104
+ font-size: 32px;
1105
+ }
1106
+ .promotion-card__count {
1107
+ display: none;
1108
+ }
1109
+ }
1110
+ @media (min-width: 760px) {
1111
+ .promotion-card {
1112
+ font-size: 28px;
1113
+ }
1114
+ .promotion-list__items > button:hover {
1115
+ background: #f5f8ff;
1116
+ }
1117
+ .promotion-card__header {
1118
+ padding-top: 30px;
1119
+ }
1120
+ .promotion-detail__hero {
1121
+ height: 276px;
1122
+ }
1123
+ }
1124
+
1125
+ /* tbox transport integration: renderer-owned read actions keep the legacy row silhouette. */
1126
+ .promotion-item-actions {
1127
+ display: contents;
1128
+ }
1129
+ .promotion-chip {
1130
+ display: inline-flex;
1131
+ width: auto;
1132
+ min-width: 104px;
1133
+ height: 40px;
1134
+ align-items: center;
1135
+ justify-content: center;
1136
+ padding: 0 14px;
1137
+ border: 1px solid #d9e0ea;
1138
+ border-radius: 999px;
1139
+ color: var(--promo-primary);
1140
+ background: #f4f8ff;
1141
+ font: inherit;
1142
+ font-size: 14px;
1143
+ font-weight: 700;
1144
+ line-height: 1;
1145
+ transition: border-color 160ms ease, color 160ms ease, background-color 160ms ease;
1146
+ cursor: pointer;
1147
+ }
1148
+ .promotion-chip:hover:not(:disabled) {
1149
+ border-color: var(--promo-primary);
1150
+ color: #fff;
1151
+ background: var(--promo-primary);
1152
+ box-shadow: 0 6px 16px rgba(35, 104, 236, 0.18);
1153
+ }
1154
+ .promotion-chip::after { content: '→'; margin-left: 8px; font-size: 16px; line-height: 1; }
1155
+ .promotion-chip:focus-visible {
1156
+ outline: 3px solid rgba(255, 111, 31, 0.22);
1157
+ outline-offset: 2px;
1158
+ }
1159
+ .promotion-chip:disabled {
1160
+ cursor: not-allowed;
1161
+ opacity: 0.45;
1162
+ }.promotion-activity__category-action {
1163
+ grid-column: 1 / -1;
1164
+ }
1165
+
1166
+ /* ===== MasterGo coupon journey: scoped to coupon list/detail/owned/claim states. ===== */
1167
+ .promotion-detail__claim-status { margin: 10px 0 0; color: #9a4b12; font-size: 13px; line-height: 20px; }
1168
+ .promotion-coupon-row__tags { display: flex; gap: 5px; margin-top: 4px; overflow: hidden; }
1169
+ .promotion-coupon-row__tags em { padding: 2px 7px; border-radius: 4px; font-size: 11px; font-style: normal; line-height: 18px; white-space: nowrap; }
1170
+ .promotion-coupon-row__tag--rank { padding: 3px 8px !important; border-radius: 3px 3px 10px 3px !important; color: #fff !important; background: #e8471c !important; font-size: 12px !important; font-weight: 800; }
1171
+ .promotion-coupon-row__tag--category { color: #9a6b1b; background: #fff8e9; font-weight: 650; }
1172
+ .promotion-coupon-row__tag--meta { color: rgba(11, 15, 23, 0.55); background: #f3f4f6; }
1173
+ .promotion-sheet__copy { display: inline-flex; align-items: center; gap: 5px; margin: 12px 0; padding: 7px 12px; border: 1px solid #e8b37c; border-radius: 6px; color: #9a4b12; background: #fff7ed; font-size: 20px; }
1174
+ .promotion-sheet__code { display: flex; align-items: center; gap: 12px; margin: 22px 32px 0; padding: 22px 24px; border-radius: 20px; background: #fff; }
1175
+ .promotion-sheet__code > span { flex: none; color: rgba(11, 15, 23, 0.86); font-size: 24px; font-weight: 700; }
1176
+ .promotion-sheet__code > strong { min-width: 0; overflow-wrap: anywhere; color: rgba(11, 15, 23, 0.9); font-size: 28px; font-weight: 650; letter-spacing: 1px; }
1177
+ .promotion-sheet__code--disabled > strong { color: #999; text-decoration: line-through; }
1178
+ .promotion-coupon-row--disabled { opacity: 0.72; }
1179
+ .promotion-sheet__code .promotion-sheet__copy { flex: none; margin: 0 0 0 auto; min-height: 48px; padding: 7px 20px; border: 0; border-radius: 999px; color: #fff; background: #c8a45e; font-size: 22px; }
1180
+ .promotion-sheet__stores { margin: 16px 32px 0; padding: 8px 24px; border-radius: 20px; background: #fff; }
1181
+ .promotion-sheet__store { display: flex; align-items: center; gap: 16px; padding: 18px 0; color: #493d36; font-size: 24px; }
1182
+ .promotion-sheet__store + .promotion-sheet__store { border-top: 1px solid #ecedf1; }
1183
+ .promotion-sheet__store img { width: 64px; height: 64px; border-radius: 12px; object-fit: cover; }
1184
+ .promotion-sheet__store > span { display: flex; min-width: 0; flex-direction: column; gap: 4px; }
1185
+ .promotion-sheet__store strong { color: rgba(11, 15, 23, 0.9); font-size: 26px; font-weight: 650; }
1186
+ .promotion-sheet__store small { overflow: hidden; color: rgba(11, 15, 23, 0.55); font-size: 22px; line-height: 32px; text-overflow: ellipsis; white-space: nowrap; }
1187
+ .promotion-sheet__navigate { display: inline-flex; flex: 0 0 auto; align-items: center; gap: 4px; margin-left: auto; border: 0; border-radius: 8px; padding: 8px 10px; background: #fff1eb; color: #d4512d; font-size: 22px; cursor: pointer; }
1188
+ .promotion-list--coupon,
1189
+ .promotion-entitlements,
1190
+ .promotion-detail--coupon {
1191
+ /* 外框由宿主 .tbox-card 统一负责,券域只重排内部层级。 */
1192
+ background: #fff;
1193
+ }
1194
+ .promotion-list--coupon .promotion-card__header,
1195
+ .promotion-entitlements .promotion-card__header {
1196
+ gap: 16px;
1197
+ padding: 24px 28px 18px;
1198
+ border-bottom: 1px solid #f0f1f4;
1199
+ }
1200
+ .promotion-list--coupon .promotion-card__mark,
1201
+ .promotion-entitlements .promotion-card__mark {
1202
+ flex-basis: 58px;
1203
+ width: 58px;
1204
+ height: 58px;
1205
+ border: 0;
1206
+ border-radius: 16px;
1207
+ background: var(--promo-coral-soft);
1208
+ color: var(--promo-ticket);
1209
+ box-shadow: none;
1210
+ }
1211
+ .promotion-list--coupon .promotion-card__mark svg,
1212
+ .promotion-entitlements .promotion-card__mark svg {
1213
+ width: 32px;
1214
+ height: 32px;
1215
+ }
1216
+ .promotion-list--coupon .promotion-card__eyebrow,
1217
+ .promotion-entitlements .promotion-card__eyebrow {
1218
+ margin: 0;
1219
+ color: rgba(11, 15, 23, 0.62);
1220
+ font-size: 18px;
1221
+ line-height: 24px;
1222
+ }
1223
+ .promotion-list--coupon .promotion-card__header h3,
1224
+ .promotion-entitlements .promotion-card__header h3 {
1225
+ font-size: 30px;
1226
+ font-weight: 700;
1227
+ line-height: 38px;
1228
+ }
1229
+ .promotion-list--coupon .promotion-card__header p,
1230
+ .promotion-entitlements .promotion-card__header p {
1231
+ margin-top: 0;
1232
+ font-size: 18px;
1233
+ line-height: 26px;
1234
+ }
1235
+ .promotion-list--coupon .promotion-card__count,
1236
+ .promotion-entitlements .promotion-card__count {
1237
+ padding: 7px 12px;
1238
+ border: 0;
1239
+ background: #f5f6f8;
1240
+ font-size: 17px;
1241
+ }
1242
+ .promotion-list--coupon .promotion-list__items {
1243
+ padding: 0 28px 8px;
1244
+ overflow: hidden;
1245
+ transition: max-height 320ms ease;
1246
+ }
1247
+ .promotion-list--coupon .promotion-list__items--expanded { transition: none; }
1248
+ .promotion-list--coupon .promotion-list__items > article {
1249
+ grid-template-columns: 112px minmax(0, 1fr) auto auto;
1250
+ gap: 14px;
1251
+ min-height: 154px;
1252
+ padding: 18px 0;
1253
+ border-color: #f0f1f4;
1254
+ }
1255
+ .promotion-list--coupon .promotion-list__visual,
1256
+ .promotion-list--coupon .promotion-list__thumb {
1257
+ width: 112px;
1258
+ height: 112px;
1259
+ border-radius: 12px;
1260
+ }
1261
+ .promotion-list--coupon .promotion-list__thumb {
1262
+ box-shadow: inset 0 0 0 1px rgba(11, 15, 23, 0.04);
1263
+ }
1264
+ .promotion-list--coupon .promotion-list__visual > em {
1265
+ display: none;
1266
+ }
1267
+ .promotion-list--coupon .promotion-list__copy {
1268
+ position: relative;
1269
+ gap: 3px;
1270
+ align-self: stretch;
1271
+ align-content: center;
1272
+ }
1273
+ .promotion-list--coupon .promotion-list__copy > small:first-child {
1274
+ color: rgba(11, 15, 23, 0.62);
1275
+ font-size: 16px;
1276
+ line-height: 22px;
1277
+ }
1278
+ .promotion-list--coupon .promotion-list__copy > strong {
1279
+ display: -webkit-box;
1280
+ overflow: hidden;
1281
+ color: rgba(11, 15, 23, 0.88);
1282
+ font-size: 23px;
1283
+ line-height: 30px;
1284
+ white-space: normal;
1285
+ -webkit-box-orient: vertical;
1286
+ -webkit-line-clamp: 2;
1287
+ }
1288
+ .promotion-list--coupon .promotion-list__copy > span:not(.promotion-coupon-row__benefit) {
1289
+ color: rgba(11, 15, 23, 0.62);
1290
+ font-size: 17px;
1291
+ line-height: 23px;
1292
+ }
1293
+ .promotion-coupon-row__benefit {
1294
+ display: flex !important;
1295
+ align-items: baseline;
1296
+ gap: 10px;
1297
+ min-width: 0;
1298
+ width: max-content;
1299
+ max-width: 100%;
1300
+ margin-top: 4px;
1301
+ padding: 6px 10px;
1302
+ border-radius: 7px;
1303
+ background: var(--promo-coral-soft);
1304
+ }
1305
+ .promotion-coupon-row__benefit b {
1306
+ overflow: hidden;
1307
+ color: var(--promo-coral);
1308
+ font-size: 22px;
1309
+ font-weight: 800;
1310
+ line-height: 28px;
1311
+ text-overflow: ellipsis;
1312
+ white-space: nowrap;
1313
+ }
1314
+ .promotion-coupon-row__benefit small {
1315
+ overflow: hidden;
1316
+ color: #a94357 !important;
1317
+ font-size: 14px !important;
1318
+ line-height: 20px !important;
1319
+ text-overflow: ellipsis;
1320
+ white-space: nowrap;
1321
+ }.promotion-list--coupon .promotion-status {
1322
+ padding: 5px 9px;
1323
+ border-radius: 6px;
1324
+ background: #fff5f1;
1325
+ color: #9f3d24;
1326
+ font-size: 15px;
1327
+ }
1328
+ .promotion-list--coupon .promotion-status--unavailable,
1329
+ .promotion-list--coupon .promotion-status--unknown {
1330
+ background: #f4f5f7;
1331
+ color: #5f6671;
1332
+ }
1333
+ .promotion-chip--coupon {
1334
+ min-width: 96px;
1335
+ height: 64px;
1336
+ padding: 0 15px;
1337
+ border: 0;
1338
+ /* 米金实心胶囊:动作与价格分色——橙红只留给价格,按钮不与它争夺注意力 */
1339
+ border-radius: 999px;
1340
+ background: linear-gradient(160deg, #c3ad78 0%, #a89058 100%);
1341
+ color: #fff;
1342
+ box-shadow: none;
1343
+ font-size: 24px;
1344
+ font-weight: 700;
1345
+ letter-spacing: 1px;
1346
+ }
1347
+ .promotion-chip--coupon::after {
1348
+ display: none;
1349
+ }
1350
+ .promotion-chip--coupon:hover:not(:disabled) {
1351
+ border: 0;
1352
+ background: linear-gradient(160deg, #b39d68 0%, #967f4a 100%);
1353
+ color: #fff;
1354
+ box-shadow: none;
1355
+ }
1356
+ .promotion-chip--coupon:focus-visible {
1357
+ outline: none;
1358
+ box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 6px #5f101d;
1359
+ }.promotion-list--coupon .promotion-card__footer,
1360
+ .promotion-entitlements .promotion-card__footer {
1361
+ justify-content: center;
1362
+ padding: 14px 28px 18px;
1363
+ color: rgba(11, 15, 23, 0.62);
1364
+ font-size: 16px;
1365
+ line-height: 24px;
1366
+ }
1367
+ .promotion-detail--coupon .promotion-detail__hero {
1368
+ height: 214px;
1369
+ margin: 18px 20px 0;
1370
+ border-radius: 16px;
1371
+ background: #f5f6f8;
1372
+ }
1373
+ .promotion-detail--coupon .promotion-detail__hero-label {
1374
+ top: 14px;
1375
+ left: 14px;
1376
+ border: 0;
1377
+ border-radius: 7px;
1378
+ background: rgba(200, 32, 54, 0.94);
1379
+ font-size: 16px;
1380
+ }
1381
+ .promotion-detail--coupon .promotion-detail__glass {
1382
+ right: 14px;
1383
+ bottom: 14px;
1384
+ left: 14px;
1385
+ padding: 13px 16px;
1386
+ border: 0;
1387
+ border-radius: 10px;
1388
+ background: rgba(255, 241, 243, 0.94);
1389
+ box-shadow: none;
1390
+ backdrop-filter: blur(8px);
1391
+ }
1392
+ .promotion-detail--coupon .promotion-detail__glass small {
1393
+ color: #9f3d24;
1394
+ font-size: 16px;
1395
+ }
1396
+ .promotion-detail--coupon .promotion-detail__glass strong {
1397
+ color: var(--promo-coral);
1398
+ font-size: 36px;
1399
+ line-height: 42px;
1400
+ }
1401
+ .promotion-detail--coupon .promotion-detail__glass em {
1402
+ color: rgba(11, 15, 23, 0.62);
1403
+ font-size: 17px;
1404
+ }
1405
+ .promotion-detail--coupon .promotion-detail__body {
1406
+ padding: 22px 28px 28px;
1407
+ }
1408
+ .promotion-detail--coupon .promotion-detail__body > h3 {
1409
+ margin-top: 13px;
1410
+ font-size: 30px;
1411
+ line-height: 39px;
1412
+ }
1413
+ .promotion-detail--coupon .promotion-detail__body > p {
1414
+ margin-top: 5px;
1415
+ font-size: 19px;
1416
+ line-height: 29px;
1417
+ }
1418
+ .promotion-detail--coupon .promotion-detail__facts {
1419
+ border-color: #eceef2;
1420
+ background: #fafafb;
1421
+ }
1422
+ .promotion-detail--coupon .promotion-detail__notice {
1423
+ border: 0;
1424
+ background: var(--promo-coral-soft);
1425
+ color: #8a4a3d;
1426
+ }
1427
+ /* 全宽主 CTA:不做票根斜切——斜切是紧凑 chip 的语言(见 .promotion-button--primary 注释),
1428
+ 拉到全宽后两端的斜边会读成渲染错位;且 clip-path 会把 border-radius 一并切掉。 */
1429
+ .promotion-coupon-main-action {
1430
+ display: flex;
1431
+ align-items: center;
1432
+ justify-content: center;
1433
+ width: 100%;
1434
+ min-height: 76px;
1435
+ margin-top: 18px;
1436
+ border: 0;
1437
+ border-radius: 12px;
1438
+ background: #d9273d;
1439
+ color: #fff;
1440
+ font: inherit;
1441
+ font-size: 22px;
1442
+ font-weight: 800;
1443
+ cursor: pointer;
1444
+ }
1445
+ .promotion-coupon-main-action--pending {
1446
+ position: relative;
1447
+ overflow: hidden;
1448
+ cursor: wait;
1449
+ }
1450
+ .promotion-coupon-main-action--pending::after {
1451
+ position: absolute;
1452
+ inset: 0;
1453
+ width: 38%;
1454
+ background: rgba(255, 255, 255, 0.18);
1455
+ content: '';
1456
+ transform: translateX(-140%) skewX(-18deg);
1457
+ animation: promotion-claim-progress 1.1s ease-in-out infinite;
1458
+ }
1459
+ @keyframes promotion-claim-progress {
1460
+ 0% { transform: translateX(-140%) skewX(-18deg); }
1461
+ 100% { transform: translateX(360%) skewX(-18deg); }
1462
+ }
1463
+ .promotion-coupon-main-action:hover:not(:disabled) {
1464
+ background: #c82036;
1465
+ }
1466
+ .promotion-coupon-main-action:focus-visible {
1467
+ outline: none;
1468
+ box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 6px #5f101d;
1469
+ }
1470
+ .promotion-coupon-main-action:disabled {
1471
+ cursor: not-allowed;
1472
+ opacity: 0.5;
1473
+ }
1474
+ @media (max-width: 520px) {
1475
+ .promotion-list--coupon .promotion-list__items > .promotion-coupon-row {
1476
+ grid-template-rows: auto;
1477
+ }
1478
+ .promotion-coupon-row .promotion-chip--coupon {
1479
+ grid-column: 3;
1480
+ grid-row: 1;
1481
+ align-self: center;
1482
+ justify-self: end;
1483
+ min-width: 96px;
1484
+ height: 64px;
1485
+ padding: 0 15px;
1486
+ font-size: 24px;
1487
+ }
1488
+ }
1489
+
1490
+ /* ===== promotion-bumpin(碰出惊喜活动卡,detail/banner 双模式;mall-vis 营销域) =====
1491
+ * 结构:深蓝渐变头(cover/占位徽章 + 标题 + 副题 + 时段徽章)→ 进度(轨道 + 橙渐变 fill)→
1492
+ * 奖励池(浅灰内嵌块 + 白底条目)→ 活动规则(HTML 富文本块)。banner 模式无 prizes/rules 自然收敛。
1493
+ * 值为 750/2x 源码 px(折半渲染);域变量沿用 .promotion-card 色板。 */
1494
+ .promotion-bumpin__header {
1495
+ display: flex;
1496
+ align-items: center;
1497
+ gap: 20px;
1498
+ padding: 28px;
1499
+ background: var(--promo-activity-gradient);
1500
+ }
1501
+ .promotion-bumpin__cover {
1502
+ flex: 0 0 auto;
1503
+ width: 116px;
1504
+ height: 116px;
1505
+ border-radius: 20px;
1506
+ object-fit: cover;
1507
+ box-shadow: 0 8px 22px rgba(2, 18, 55, 0.32);
1508
+ }
1509
+ .promotion-bumpin__cover-placeholder {
1510
+ display: grid;
1511
+ flex: 0 0 auto;
1512
+ width: 116px;
1513
+ height: 116px;
1514
+ place-items: center;
1515
+ border-radius: 20px;
1516
+ color: #fff;
1517
+ background: rgba(255, 255, 255, 0.16);
1518
+ }
1519
+ .promotion-bumpin__header-copy {
1520
+ display: grid;
1521
+ gap: 6px;
1522
+ min-width: 0;
1523
+ }
1524
+ .promotion-bumpin__title {
1525
+ display: flex;
1526
+ align-items: center;
1527
+ gap: 8px;
1528
+ overflow-wrap: anywhere;
1529
+ color: #fff;
1530
+ font-size: 30px;
1531
+ font-weight: 700;
1532
+ line-height: 40px;
1533
+ }
1534
+ .promotion-bumpin__title svg {
1535
+ flex: 0 0 auto;
1536
+ }
1537
+ .promotion-bumpin__subtitle {
1538
+ color: rgba(255, 255, 255, 0.84);
1539
+ font-size: 22px;
1540
+ line-height: 30px;
1541
+ }
1542
+ .promotion-bumpin__period {
1543
+ justify-self: start;
1544
+ padding: 4px 14px;
1545
+ border-radius: 999px;
1546
+ background: rgba(255, 255, 255, 0.16);
1547
+ color: #fff;
1548
+ font-size: 18px;
1549
+ line-height: 26px;
1550
+ }
1551
+ .promotion-bumpin__progress {
1552
+ display: grid;
1553
+ gap: 10px;
1554
+ padding: 24px 28px 0;
1555
+ }
1556
+ .promotion-bumpin__progress-bar {
1557
+ height: 14px;
1558
+ border-radius: 999px;
1559
+ background: var(--promo-line);
1560
+ overflow: hidden;
1561
+ }
1562
+ .promotion-bumpin__progress-fill {
1563
+ height: 100%;
1564
+ border-radius: 999px;
1565
+ background: var(--promo-cta-orange);
1566
+ transition: width 0.28s ease;
1567
+ }
1568
+ .promotion-bumpin__progress-text {
1569
+ color: var(--promo-muted);
1570
+ font-size: 20px;
1571
+ line-height: 28px;
1572
+ }
1573
+ .promotion-bumpin__prizes {
1574
+ margin: 24px 28px 0;
1575
+ border: 2px solid var(--promo-line);
1576
+ border-radius: 24px;
1577
+ background: #f5f7fa;
1578
+ overflow: hidden;
1579
+ }
1580
+ .promotion-bumpin__prizes-header {
1581
+ display: flex;
1582
+ align-items: center;
1583
+ gap: 8px;
1584
+ padding: 16px 20px;
1585
+ color: #b06b2e;
1586
+ font-size: 22px;
1587
+ font-weight: 700;
1588
+ line-height: 30px;
1589
+ border-bottom: 2px solid var(--promo-line);
1590
+ }
1591
+ .promotion-bumpin__prizes-list {
1592
+ display: grid;
1593
+ margin: 0;
1594
+ padding: 0;
1595
+ list-style: none;
1596
+ }
1597
+ .promotion-bumpin__prize-item {
1598
+ display: flex;
1599
+ align-items: center;
1600
+ gap: 16px;
1601
+ padding: 16px 20px;
1602
+ background: #fff;
1603
+ border-bottom: 2px solid var(--promo-line);
1604
+ }
1605
+ .promotion-bumpin__prize-item:last-child {
1606
+ border-bottom: 0;
1607
+ }
1608
+ .promotion-bumpin__prize-logo {
1609
+ flex: 0 0 auto;
1610
+ width: 72px;
1611
+ height: 72px;
1612
+ border-radius: 16px;
1613
+ object-fit: cover;
1614
+ }
1615
+ .promotion-bumpin__prize-logo-placeholder {
1616
+ flex: 0 0 auto;
1617
+ width: 72px;
1618
+ height: 72px;
1619
+ border-radius: 16px;
1620
+ background: var(--promo-mint-soft);
1621
+ }
1622
+ .promotion-bumpin__prize-copy {
1623
+ display: grid;
1624
+ gap: 4px;
1625
+ min-width: 0;
1626
+ }
1627
+ .promotion-bumpin__prize-copy strong {
1628
+ overflow: hidden;
1629
+ color: var(--promo-ink);
1630
+ font-size: 24px;
1631
+ font-weight: 650;
1632
+ line-height: 32px;
1633
+ text-overflow: ellipsis;
1634
+ white-space: nowrap;
1635
+ }
1636
+ .promotion-bumpin__prize-copy small {
1637
+ overflow: hidden;
1638
+ color: var(--promo-muted);
1639
+ font-size: 20px;
1640
+ line-height: 28px;
1641
+ text-overflow: ellipsis;
1642
+ white-space: nowrap;
1643
+ }
1644
+
1645
+ /* 折叠/展开按钮 */
1646
+ .promotion-bumpin__prizes-toggle {
1647
+ display: flex;
1648
+ align-items: center;
1649
+ justify-content: center;
1650
+ gap: 6px;
1651
+ width: 100%;
1652
+ padding: 16px 20px;
1653
+ border: none;
1654
+ background: none;
1655
+ font-size: 20px;
1656
+ font-weight: 600;
1657
+ color: var(--promo-muted);
1658
+ cursor: pointer;
1659
+ border-top: 2px solid var(--promo-line);
1660
+ }
1661
+ .promotion-bumpin__prizes-toggle:active {
1662
+ opacity: 0.7;
1663
+ }
1664
+
1665
+ .promotion-bumpin__rules {
1666
+ margin: 24px 28px 28px;
1667
+ border-radius: 20px;
1668
+ background: #f5f7fa;
1669
+ overflow: hidden;
1670
+ }
1671
+ .promotion-bumpin__rules-header {
1672
+ padding: 14px 20px 0;
1673
+ color: var(--promo-muted);
1674
+ font-size: 20px;
1675
+ font-weight: 700;
1676
+ line-height: 28px;
1677
+ }
1678
+ .promotion-bumpin__rules-content {
1679
+ padding: 10px 20px 16px;
1680
+ color: var(--promo-muted);
1681
+ font-size: 20px;
1682
+ line-height: 32px;
1683
+ word-break: break-word;
1684
+ }
1685
+ .promotion-bumpin__rules-content img {
1686
+ max-width: 100%;
1687
+ }
1688
+
1689
+ /* ===== 券行(超值好券形态)=====
1690
+ 米金作动作与标记、橙红只给价格:一屏五六行券,价格是唯一需要被瞬间比较的量,
1691
+ 把它独占最强色,其余(按钮、类目、榜位)退到同一支米金里,视线才有落点。 */
1692
+ .promotion-list--coupon .promotion-list__items > .promotion-coupon-row {
1693
+ position: relative;
1694
+ display: grid;
1695
+ grid-template-columns: 112px minmax(0, 1fr) auto;
1696
+ gap: 0 16px;
1697
+ align-items: center;
1698
+ padding: 18px 0;
1699
+ overflow: hidden;
1700
+ /* 整行是唯一可交互控件(领/抢只是视觉承诺),可点性得由行自己交代 */
1701
+ cursor: pointer;
1702
+ }
1703
+ .promotion-coupon-row__thumb {
1704
+ display: block;
1705
+ width: 112px;
1706
+ height: 112px;
1707
+ border-radius: 12px;
1708
+ box-shadow: inset 0 0 0 1px rgba(11, 15, 23, 0.04);
1709
+ object-fit: cover;
1710
+ flex-shrink: 0;
1711
+ }
1712
+ .promotion-coupon-row__thumb.promotion-image--fallback {
1713
+ display: grid;
1714
+ place-items: center;
1715
+ }
1716
+ .promotion-coupon-row__main {
1717
+ position: relative;
1718
+ display: flex;
1719
+ min-width: 0;
1720
+ flex-direction: column;
1721
+ gap: 5px;
1722
+ align-self: stretch;
1723
+ justify-content: center;
1724
+ padding-right: 4px;
1725
+ }
1726
+ .promotion-coupon-row__title {
1727
+ display: -webkit-box;
1728
+ overflow: hidden;
1729
+ color: rgba(11, 15, 23, 0.9);
1730
+ font-size: 23px;
1731
+ font-weight: 750;
1732
+ line-height: 30px;
1733
+ -webkit-box-orient: vertical;
1734
+ -webkit-line-clamp: 2;
1735
+ }
1736
+ .promotion-coupon-row__sub {
1737
+ display: -webkit-box;
1738
+ -webkit-box-orient: vertical;
1739
+ -webkit-line-clamp: 2;
1740
+ overflow: hidden;
1741
+ color: rgba(11, 15, 23, 0.55);
1742
+ font-size: 17px;
1743
+ line-height: 23px;
1744
+ }
1745
+ .promotion-coupon-row__price {
1746
+ display: flex;
1747
+ align-items: baseline;
1748
+ gap: 8px;
1749
+ min-width: 0;
1750
+ margin-top: 2px;
1751
+ }
1752
+ .promotion-coupon-row__price > b {
1753
+ flex-shrink: 0;
1754
+ color: #e8471c;
1755
+ font-size: 26px;
1756
+ font-weight: 800;
1757
+ line-height: 32px;
1758
+ }
1759
+ .promotion-coupon-row__discount {
1760
+ flex-shrink: 0;
1761
+ padding: 1px 6px;
1762
+ border-radius: 4px;
1763
+ color: #e8471c;
1764
+ background: #fff1eb;
1765
+ font-size: 14px;
1766
+ font-style: normal;
1767
+ font-weight: 700;
1768
+ line-height: 20px;
1769
+ }
1770
+
1771
+ /* 我的券复用券行骨架,两处差异:有效期跟在额度后,右侧是状态而非动作 */
1772
+ .promotion-coupon-row__validity {
1773
+ flex-shrink: 0;
1774
+ color: rgba(11, 15, 23, 0.45);
1775
+ font-size: 17px;
1776
+ font-weight: 400;
1777
+ }
1778
+ .promotion-coupon-row__state {
1779
+ flex-shrink: 0;
1780
+ align-self: center;
1781
+ padding: 8px 14px;
1782
+ border-radius: 8px;
1783
+ background: #fff5f1;
1784
+ color: #9f3d24;
1785
+ font-size: 22px;
1786
+ font-weight: 600;
1787
+ white-space: nowrap;
1788
+ }
1789
+ /* 不可再用的券退成中性灰:暖色会让它读作还能用 */
1790
+ .promotion-coupon-row__state--used,
1791
+ .promotion-coupon-row__state--expired,
1792
+ .promotion-coupon-row__state--invalid,
1793
+ .promotion-coupon-row__state--unknown {
1794
+ background: #f4f5f7;
1795
+ color: #5f6671;
1796
+ }
1797
+ .promotion-coupon-row__price > s {
1798
+ overflow: hidden;
1799
+ color: rgba(11, 15, 23, 0.38);
1800
+ font-size: 17px;
1801
+ line-height: 23px;
1802
+ text-overflow: ellipsis;
1803
+ white-space: nowrap;
1804
+ }
1805
+ /* 可领券列表拿掉期限行后,把释放出的纵向空间还给核心信息;
1806
+ 「我的券」仍复用原尺寸,避免状态型列表被连带放大。 */
1807
+ .promotion-list--coupon .promotion-coupon-row__main {
1808
+ gap: 7px;
1809
+ }
1810
+ .promotion-list--coupon .promotion-coupon-row__title {
1811
+ font-size: 25px;
1812
+ line-height: 32px;
1813
+ }
1814
+ .promotion-list--coupon .promotion-coupon-row__tags {
1815
+ gap: 6px;
1816
+ margin-top: 0;
1817
+ }
1818
+ .promotion-list--coupon .promotion-coupon-row__tags em {
1819
+ padding: 4px 9px;
1820
+ font-size: 16px;
1821
+ line-height: 24px;
1822
+ }
1823
+ .promotion-list--coupon .promotion-coupon-row__tag--rank {
1824
+ padding: 4px 9px !important;
1825
+ font-size: 16px !important;
1826
+ }
1827
+ .promotion-list--coupon .promotion-coupon-row__price > b {
1828
+ font-size: 28px;
1829
+ line-height: 34px;
1830
+ }
1831
+ .promotion-list--coupon .promotion-coupon-row__discount {
1832
+ padding: 2px 7px;
1833
+ font-size: 15px;
1834
+ line-height: 21px;
1835
+ }
1836
+ .promotion-list--coupon .promotion-coupon-row__price > s {
1837
+ font-size: 18px;
1838
+ line-height: 24px;
1839
+ }
1840
+ .promotion-item-actions--coupon {
1841
+ flex-shrink: 0;
1842
+ }
1843
+ .promotion-owned-action {
1844
+ justify-self: end;
1845
+ pointer-events: none;
1846
+ }
1847
+
1848
+ /* 神券与门店导览对齐;独立作用域避免影响复用券行的「我的券」。 */
1849
+ .promotion-list--offers {
1850
+ padding-bottom: 24px;
1851
+ }
1852
+ .promotion-list--offers .promotion-list__items {
1853
+ padding-bottom: 0;
1854
+ }
1855
+ .promotion-list--offers .promotion-list__items > .promotion-coupon-row {
1856
+ grid-template-columns: 136px minmax(0, 1fr) auto;
1857
+ gap: 0 18px;
1858
+ padding: 20px 0;
1859
+ border: 0;
1860
+ }
1861
+ .promotion-list--offers .promotion-coupon-row__thumb {
1862
+ width: 136px;
1863
+ height: 136px;
1864
+ border-radius: 18px;
1865
+ }
1866
+ .promotion-list--offers .promotion-coupon-row__main {
1867
+ gap: 8px;
1868
+ }
1869
+ .promotion-list--offers .promotion-coupon-row__title {
1870
+ color: var(--tbox-text-primary, #202124);
1871
+ font-size: 28px;
1872
+ font-weight: 600;
1873
+ line-height: 38px;
1874
+ }
1875
+ .promotion-list--offers .promotion-coupon-row__tags {
1876
+ gap: 8px;
1877
+ }
1878
+ .promotion-list--offers .promotion-coupon-row__tags em {
1879
+ flex-shrink: 0;
1880
+ max-width: 160px;
1881
+ overflow: hidden;
1882
+ padding: 2px 10px;
1883
+ border-radius: 7px;
1884
+ color: #986415;
1885
+ background: #fff4df;
1886
+ font-size: 20px;
1887
+ font-weight: 400;
1888
+ line-height: 28px;
1889
+ text-overflow: ellipsis;
1890
+ white-space: nowrap;
1891
+ }
1892
+ .promotion-list--offers .promotion-list__toggle {
1893
+ display: flex;
1894
+ gap: 4px;
1895
+ min-height: 64px;
1896
+ padding: 0;
1897
+ border: 0;
1898
+ background: transparent;
1899
+ color: #686d69;
1900
+ font-size: 24px;
1901
+ font-weight: 400;
1902
+ }
1903
+ .promotion-list--offers .promotion-list__toggle:hover {
1904
+ filter: none;
1905
+ }
1906
+ .promotion-list--offers .promotion-list__toggle:focus-visible {
1907
+ outline: 3px solid rgba(9, 107, 250, 0.28);
1908
+ outline-offset: 2px;
1909
+ border-radius: 10px;
1910
+ }
1911
+
1912
+ /* 不可领:退成描边灰。与可领同样醒目的米金实心会让人以为点下去能领到 */
1913
+ .promotion-chip--coupon-off,
1914
+ .promotion-chip--coupon-off:hover:not(:disabled) {
1915
+ background: #f5f5f7;
1916
+ color: rgba(11, 15, 23, 0.45);
1917
+ box-shadow: inset 0 0 0 1px #e3e4e8;
1918
+ }
1919
+
1920
+ /* ===== 券详情浮层 =====
1921
+ 底部抽屉而非居中弹窗:这是从列表行「拉起来」的详情,从下方升起与手势方向一致;
1922
+ 高度封顶 82vh,内容长了在内部滚,底部价格与领取条始终贴边不随内容跑掉。 */
1923
+ .promotion-sheet {
1924
+ position: fixed;
1925
+ inset: 0;
1926
+ z-index: 60;
1927
+ display: flex;
1928
+ align-items: flex-end;
1929
+ justify-content: center;
1930
+ background: rgba(11, 15, 23, 0.42);
1931
+ animation: promotion-sheet-in 180ms ease-out;
1932
+ }
1933
+ .promotion-sheet__panel {
1934
+ position: relative;
1935
+ display: flex;
1936
+ width: 100%;
1937
+ max-width: 750px;
1938
+ max-height: 82vh;
1939
+ flex-direction: column;
1940
+ border-radius: 36px 36px 0 0;
1941
+ background: #fff;
1942
+ animation: promotion-sheet-up 220ms cubic-bezier(0.22, 1, 0.36, 1);
1943
+ }
1944
+ .promotion-sheet__close {
1945
+ position: absolute;
1946
+ top: 24px;
1947
+ right: 24px;
1948
+ z-index: 2;
1949
+ display: grid;
1950
+ width: 60px;
1951
+ height: 60px;
1952
+ place-items: center;
1953
+ border: 0;
1954
+ border-radius: 50%;
1955
+ background: rgba(11, 15, 23, 0.42);
1956
+ color: #fff;
1957
+ cursor: pointer;
1958
+ }
1959
+ .promotion-sheet__scroll {
1960
+ overflow-y: auto;
1961
+ padding: 0 0 12px;
1962
+ -webkit-overflow-scrolling: touch;
1963
+ }
1964
+ .promotion-sheet__image {
1965
+ width: 100%;
1966
+ height: 420px;
1967
+ border-radius: 36px 36px 0 0;
1968
+ /* 券图比例由厂商配置决定,完整展示避免横幅/竖图被裁切。 */
1969
+ object-fit: contain;
1970
+ background: #f5f6f8;
1971
+ }
1972
+ .promotion-sheet__price {
1973
+ display: flex;
1974
+ align-items: baseline;
1975
+ gap: 16px;
1976
+ padding: 24px 32px;
1977
+ background: linear-gradient(180deg, #fdf1e8 0%, #fbe7d9 100%);
1978
+ }
1979
+ .promotion-sheet__price > b {
1980
+ color: #e8471c;
1981
+ font-size: 46px;
1982
+ font-weight: 800;
1983
+ line-height: 54px;
1984
+ }
1985
+ .promotion-sheet__price > s {
1986
+ color: rgba(11, 15, 23, 0.4);
1987
+ font-size: 22px;
1988
+ }
1989
+ .promotion-sheet__stock {
1990
+ margin-left: auto;
1991
+ color: rgba(11, 15, 23, 0.55);
1992
+ font-size: 22px;
1993
+ }
1994
+ .promotion-sheet__title {
1995
+ margin: 28px 32px 0;
1996
+ color: rgba(11, 15, 23, 0.9);
1997
+ font-size: 34px;
1998
+ font-weight: 750;
1999
+ line-height: 46px;
2000
+ }
2001
+ .promotion-sheet__sub {
2002
+ margin: 12px 32px 0;
2003
+ color: rgba(11, 15, 23, 0.55);
2004
+ font-size: 26px;
2005
+ line-height: 38px;
2006
+ }
2007
+ .promotion-sheet__notice-strip {
2008
+ display: grid;
2009
+ gap: 6px;
2010
+ margin: 12px 32px 0;
2011
+ padding: 12px 14px;
2012
+ border-radius: 10px;
2013
+ background: #fff8ef;
2014
+ font-size: 26px;
2015
+ line-height: 38px;
2016
+ }
2017
+ .promotion-sheet__notice-strip span {
2018
+ display: grid;
2019
+ grid-template-columns: 144px minmax(0, 1fr);
2020
+ gap: 12px;
2021
+ }
2022
+ .promotion-sheet__notice-strip b {
2023
+ width: auto;
2024
+ text-align: left;
2025
+ color: #b38a3e;
2026
+ }
2027
+ .promotion-sheet__notice-strip span + span b {
2028
+ color: #ef7654;
2029
+ }
2030
+ .promotion-sheet__section {
2031
+ margin: 34px 32px 0;
2032
+ color: rgba(11, 15, 23, 0.9);
2033
+ font-size: 28px;
2034
+ font-weight: 700;
2035
+ line-height: 40px;
2036
+ }
2037
+ .promotion-sheet__facts {
2038
+ margin: 16px 32px 0;
2039
+ padding: 6px 24px;
2040
+ border-radius: 20px;
2041
+ background: #f7f8fa;
2042
+ }
2043
+ .promotion-sheet__facts > div {
2044
+ display: flex;
2045
+ gap: 12px;
2046
+ padding: 22px 0;
2047
+ border-bottom: 1px solid #ecedf1;
2048
+ }
2049
+ .promotion-sheet__facts > div:last-child {
2050
+ border-bottom: 0;
2051
+ }
2052
+ .promotion-sheet__facts dt {
2053
+ display: flex;
2054
+ flex-shrink: 0;
2055
+ align-items: center;
2056
+ gap: 7px;
2057
+ width: 140px;
2058
+ color: rgba(11, 15, 23, 0.55);
2059
+ font-size: 24px;
2060
+ line-height: 34px;
2061
+ }
2062
+ .promotion-sheet__facts dd {
2063
+ color: rgba(11, 15, 23, 0.85);
2064
+ font-size: 26px;
2065
+ line-height: 38px;
2066
+ overflow-wrap: anywhere;
2067
+ }
2068
+ .promotion-sheet__foot {
2069
+ display: flex;
2070
+ align-items: center;
2071
+ justify-content: space-between;
2072
+ gap: 24px;
2073
+ padding: 22px 32px calc(22px + env(safe-area-inset-bottom, 0px));
2074
+ border-top: 1px solid #eef0f3;
2075
+ background: #fff;
2076
+ }
2077
+ .promotion-sheet__foot-price {
2078
+ display: flex;
2079
+ align-items: baseline;
2080
+ gap: 8px;
2081
+ min-width: 0;
2082
+ }
2083
+ .promotion-sheet__foot-price > b {
2084
+ color: #e8471c;
2085
+ font-size: 40px;
2086
+ font-weight: 800;
2087
+ }
2088
+ .promotion-sheet__foot-price > s {
2089
+ color: rgba(11, 15, 23, 0.4);
2090
+ font-size: 22px;
2091
+ }
2092
+ .promotion-chip--coupon-lg {
2093
+ min-width: 240px;
2094
+ height: 84px;
2095
+ font-size: 26px;
2096
+ }
2097
+ @keyframes promotion-sheet-in {
2098
+ from { opacity: 0; }
2099
+ to { opacity: 1; }
2100
+ }
2101
+ @keyframes promotion-sheet-up {
2102
+ from { transform: translateY(14%); }
2103
+ to { transform: translateY(0); }
2104
+ }
2105
+ @keyframes promotion-sheet-out {
2106
+ from { opacity: 1; }
2107
+ to { opacity: 0; }
2108
+ }
2109
+ @keyframes promotion-sheet-down {
2110
+ from { transform: translateY(0); }
2111
+ to { transform: translateY(100%); }
2112
+ }
2113
+ .promotion-sheet--closing {
2114
+ pointer-events: none;
2115
+ animation: promotion-sheet-out 180ms ease-in both;
2116
+ }
2117
+ .promotion-sheet--closing .promotion-sheet__panel {
2118
+ animation: promotion-sheet-down 180ms ease-in both;
2119
+ }
2120
+ @media (prefers-reduced-motion: reduce) {
2121
+ .promotion-sheet,
2122
+ .promotion-sheet__panel,
2123
+ .promotion-sheet--closing .promotion-sheet__panel {
2124
+ animation-duration: 1ms;
2125
+ }
2126
+ }
2127
+ /* 券行整行可点:给出可点的手感,但不喧宾夺主 */
2128
+ .promotion-coupon-row[role='button'] {
2129
+ cursor: pointer;
2130
+ }
2131
+ .promotion-coupon-row[role='button']:focus-visible {
2132
+ outline: 2px solid var(--promo-primary);
2133
+ outline-offset: -2px;
2134
+ border-radius: 12px;
2135
+ }