@taskon/widget-react 0.0.1-beta.1

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 (48) hide show
  1. package/README.md +1065 -0
  2. package/dist/CommunityTaskList.css +4893 -0
  3. package/dist/EligibilityInfo.css +2337 -0
  4. package/dist/LeaderboardWidget.css +815 -0
  5. package/dist/PageBuilder.css +54 -0
  6. package/dist/Quest.css +4214 -0
  7. package/dist/TaskOnProvider.css +163 -0
  8. package/dist/TipPopover.css +210 -0
  9. package/dist/UserCenterWidget.css +297 -0
  10. package/dist/UserCenterWidget2.css +3519 -0
  11. package/dist/WidgetShell.css +182 -0
  12. package/dist/chunks/CommunityTaskList-DoPGZsw1.js +6813 -0
  13. package/dist/chunks/EligibilityInfo-C7GZ2G5u.js +22228 -0
  14. package/dist/chunks/LeaderboardWidget-CmYfDeHV.js +1068 -0
  15. package/dist/chunks/PageBuilder-Tmhf2GTS.js +150 -0
  16. package/dist/chunks/Quest-DKFZ-pPU.js +8839 -0
  17. package/dist/chunks/TaskOnProvider-BD6Vp2x8.js +1435 -0
  18. package/dist/chunks/ThemeProvider-wnSXrNQb.js +1118 -0
  19. package/dist/chunks/TipPopover-BrW8jo71.js +2926 -0
  20. package/dist/chunks/UserCenterWidget-BE329iS7.js +3546 -0
  21. package/dist/chunks/UserCenterWidget-BVw_IEEd.js +3989 -0
  22. package/dist/chunks/WidgetShell-D_5OjvNZ.js +1517 -0
  23. package/dist/chunks/common-ja-DWhTaFHb.js +23 -0
  24. package/dist/chunks/common-ko-80ezXsMG.js +23 -0
  25. package/dist/chunks/dynamic-import-helper-DxEFwm31.js +537 -0
  26. package/dist/chunks/index-CwMvO_wZ.js +777 -0
  27. package/dist/chunks/leaderboardwidget-ja-Bj6gz6y1.js +119 -0
  28. package/dist/chunks/leaderboardwidget-ko-f1cLO9ic.js +119 -0
  29. package/dist/chunks/useToast-B-wyO5zL.js +93 -0
  30. package/dist/chunks/useWidgetLocale-JDelxtt8.js +74 -0
  31. package/dist/chunks/usercenter-ja-uu-XfVF9.js +332 -0
  32. package/dist/chunks/usercenter-ko-DYgUOVzd.js +332 -0
  33. package/dist/community-task.d.ts +451 -0
  34. package/dist/community-task.js +9 -0
  35. package/dist/core.d.ts +803 -0
  36. package/dist/core.js +22 -0
  37. package/dist/dynamic-import-helper.css +389 -0
  38. package/dist/index.d.ts +1660 -0
  39. package/dist/index.js +41 -0
  40. package/dist/leaderboard.d.ts +547 -0
  41. package/dist/leaderboard.js +18 -0
  42. package/dist/page-builder.d.ts +20 -0
  43. package/dist/page-builder.js +4 -0
  44. package/dist/quest.d.ts +400 -0
  45. package/dist/quest.js +8 -0
  46. package/dist/user-center.d.ts +1780 -0
  47. package/dist/user-center.js +713 -0
  48. package/package.json +105 -0
package/dist/Quest.css ADDED
@@ -0,0 +1,4214 @@
1
+ /**
2
+ * ButtonTabs 组件样式
3
+ *
4
+ * 按钮边框样式的标签页切换
5
+ * 参考 Vue 版本的 light-border / dark-border 按钮样式
6
+ */
7
+
8
+ /* ========== 容器 ========== */
9
+ .taskon-button-tabs {
10
+ display: inline-flex;
11
+ align-items: center;
12
+ flex-wrap: wrap;
13
+ }
14
+
15
+ /* ========== Tab 按钮基础样式 ========== */
16
+ .taskon-button-tabs__tab {
17
+ flex-shrink: 0;
18
+ display: inline-flex;
19
+ align-items: center;
20
+ justify-content: center;
21
+ background-color: transparent;
22
+ border: 1px solid rgba(255, 255, 255, 0.2);
23
+ color: rgba(255, 255, 255, 0.6);
24
+ font-weight: 500;
25
+ white-space: nowrap;
26
+ cursor: pointer;
27
+ transition: all 0.2s ease;
28
+ }
29
+
30
+ /* ========== 尺寸变体 ========== */
31
+
32
+ /* Small 尺寸 */
33
+ .taskon-button-tabs__tab--small {
34
+ height: 32px;
35
+ padding: 4px 12px;
36
+ font-size: 14px;
37
+ line-height: 20px;
38
+ border-radius: 6px;
39
+ }
40
+
41
+ /* Medium 尺寸 */
42
+ .taskon-button-tabs__tab--medium {
43
+ height: 36px;
44
+ padding: 6px 16px;
45
+ font-size: 14px;
46
+ line-height: 20px;
47
+ border-radius: 8px;
48
+ }
49
+
50
+ /* ========== 状态样式 ========== */
51
+
52
+ /* Hover 状态(未选中) */
53
+ .taskon-button-tabs__tab:hover:not(.taskon-button-tabs__tab--active):not(.taskon-button-tabs__tab--disabled) {
54
+ border-color: rgba(255, 255, 255, 0.6);
55
+ color: rgba(255, 255, 255, 0.8);
56
+ }
57
+
58
+ /* 选中状态 (light-border) */
59
+ .taskon-button-tabs__tab--active {
60
+ background-color: transparent;
61
+ border-color: #ffffff;
62
+ color: #ffffff;
63
+ }
64
+
65
+ .taskon-button-tabs__tab--active:hover {
66
+ opacity: 0.8;
67
+ }
68
+
69
+ /* 禁用状态 */
70
+ .taskon-button-tabs__tab--disabled {
71
+ color: rgba(255, 255, 255, 0.3);
72
+ border-color: rgba(255, 255, 255, 0.1);
73
+ cursor: not-allowed;
74
+ }
75
+ /* CompletedCount - 完成计数组件样式 */
76
+ .taskon-completed-count {
77
+ display: flex;
78
+ align-items: center;
79
+ gap: 8px;
80
+ }
81
+
82
+ .taskon-completed-count-check {
83
+ width: 12px;
84
+ height: 9px;
85
+ }
86
+
87
+ .taskon-completed-count-text {
88
+ font-size: 14px;
89
+ line-height: 18px;
90
+ color: rgba(255, 255, 255, 0.6);
91
+ }
92
+
93
+ .taskon-completed-count-em {
94
+ color: #fff;
95
+ }
96
+ /**
97
+ * EligsNotPassDialog 样式
98
+ * 与 Vue 版本 EligsNotPass.vue 样式保持一致
99
+ */
100
+
101
+ /* 弹窗容器 */
102
+ .taskon-eligs-dialog-container {
103
+ display: flex;
104
+ flex-direction: column;
105
+ align-items: center;
106
+ gap: 16px;
107
+ }
108
+
109
+ /* 头部图标和标题 */
110
+ .taskon-eligs-dialog-header {
111
+ display: flex;
112
+ flex-direction: column;
113
+ align-items: center;
114
+ gap: 12px;
115
+ }
116
+
117
+ .taskon-eligs-dialog-icon {
118
+ width: 48px;
119
+ height: 48px;
120
+ }
121
+
122
+ .taskon-eligs-dialog-title {
123
+ margin: 0;
124
+ font-size: 20px;
125
+ font-weight: 600;
126
+ color: var(--taskon-text-primary, #fff);
127
+ }
128
+
129
+ /* 描述文本 */
130
+ .taskon-eligs-dialog-desc {
131
+ margin: 0;
132
+ font-size: 14px;
133
+ line-height: 1.5;
134
+ color: var(--taskon-text-secondary, #a0a0a0);
135
+ text-align: center;
136
+ }
137
+
138
+ .taskon-eligs-dialog-desc--success {
139
+ color: var(--taskon-success, #52c41a);
140
+ }
141
+
142
+ .taskon-eligs-dialog-highlight {
143
+ color: var(--taskon-primary, #6366f1);
144
+ font-weight: 500;
145
+ }
146
+
147
+ /* 资格条件区域 */
148
+ .taskon-eligs-dialog-eligs {
149
+ width: 100%;
150
+ border: 1px solid var(--taskon-border, #333);
151
+ border-radius: 10px;
152
+ overflow: hidden;
153
+ }
154
+
155
+ .taskon-eligs-dialog-eligs-header {
156
+ display: flex;
157
+ align-items: center;
158
+ gap: 10px;
159
+ width: 100%;
160
+ height: 60px;
161
+ padding: 0 16px;
162
+ background: transparent;
163
+ border: none;
164
+ cursor: pointer;
165
+ color: var(--taskon-text-primary, #fff);
166
+ font-size: 14px;
167
+ text-align: left;
168
+ transition: background 0.2s;
169
+ }
170
+
171
+ .taskon-eligs-dialog-eligs-header:hover {
172
+ background: var(--taskon-bg-hover, rgba(255, 255, 255, 0.05));
173
+ }
174
+
175
+ .taskon-eligs-dialog-eligs-icon {
176
+ width: 16px;
177
+ height: 16px;
178
+ }
179
+
180
+ .taskon-eligs-dialog-eligs-label {
181
+ flex: 1;
182
+ }
183
+
184
+ .taskon-eligs-dialog-arrow {
185
+ width: 6px;
186
+ height: 10px;
187
+ color: var(--taskon-text-secondary, #a0a0a0);
188
+ transition: transform 0.3s;
189
+ transform: rotate(90deg);
190
+ }
191
+
192
+ .taskon-eligs-dialog-arrow--expanded {
193
+ transform: rotate(-90deg);
194
+ }
195
+
196
+ .taskon-eligs-dialog-eligs-list {
197
+ padding: 0 16px 16px;
198
+ }
199
+
200
+ /* 底部按钮 */
201
+ .taskon-eligs-dialog-button {
202
+ width: 100%;
203
+ height: 48px;
204
+ padding: 0 24px;
205
+ border: none;
206
+ border-radius: 8px;
207
+ background: var(--taskon-primary, #6366f1);
208
+ color: #fff;
209
+ font-size: 16px;
210
+ font-weight: 500;
211
+ cursor: pointer;
212
+ transition: opacity 0.2s, background 0.2s;
213
+ }
214
+
215
+ .taskon-eligs-dialog-button:hover:not(:disabled) {
216
+ opacity: 0.9;
217
+ }
218
+
219
+ .taskon-eligs-dialog-button:disabled {
220
+ cursor: not-allowed;
221
+ opacity: 0.7;
222
+ }
223
+
224
+ .taskon-eligs-dialog-button--loading {
225
+ background: var(--taskon-bg-secondary, #2a2a2a);
226
+ }
227
+
228
+ .taskon-eligs-dialog-loading {
229
+ display: flex;
230
+ align-items: center;
231
+ justify-content: center;
232
+ gap: 8px;
233
+ }
234
+
235
+ .taskon-eligs-dialog-spinner {
236
+ width: 16px;
237
+ height: 16px;
238
+ border: 2px solid transparent;
239
+ border-top-color: currentColor;
240
+ border-radius: 50%;
241
+ animation: taskon-eligs-spin 0.8s linear infinite;
242
+ }
243
+
244
+ @keyframes taskon-eligs-spin {
245
+ to {
246
+ transform: rotate(360deg);
247
+ }
248
+ }
249
+ /**
250
+ * EligsBindDialog 样式
251
+ * Eligibility 绑定弹窗组件样式
252
+ */
253
+
254
+ .taskon-eligs-bind-dialog {
255
+ padding: 0 8px 8px;
256
+ }
257
+
258
+ /* Eligibility 条件列表区域 */
259
+ .taskon-eligs-bind-eligs-section {
260
+ margin-bottom: 20px;
261
+ padding-bottom: 20px;
262
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
263
+ }
264
+
265
+ .taskon-eligs-bind-section-title {
266
+ margin: 0 0 12px;
267
+ font-size: 16px;
268
+ font-weight: 600;
269
+ color: #fff;
270
+ }
271
+
272
+ /* 提示文本 */
273
+ .taskon-eligs-bind-tip {
274
+ margin: 0 0 20px;
275
+ font-size: 14px;
276
+ line-height: 1.5;
277
+ color: rgba(255, 255, 255, 0.6);
278
+ }
279
+
280
+ /* 绑定区域 */
281
+ .taskon-eligs-bind-section {
282
+ margin-bottom: 20px;
283
+ }
284
+
285
+ .taskon-eligs-bind-section-subtitle {
286
+ margin: 0 0 12px;
287
+ font-size: 14px;
288
+ font-weight: 500;
289
+ color: rgba(255, 255, 255, 0.8);
290
+ }
291
+
292
+ /* 绑定列表 */
293
+ .taskon-eligs-bind-list {
294
+ display: flex;
295
+ flex-direction: column;
296
+ gap: 8px;
297
+ }
298
+
299
+ /* 单个绑定项 */
300
+ .taskon-eligs-bind-item {
301
+ display: flex;
302
+ align-items: center;
303
+ justify-content: space-between;
304
+ padding: 12px 16px;
305
+ background: rgba(255, 255, 255, 0.05);
306
+ border-radius: 8px;
307
+ border: 1px solid rgba(255, 255, 255, 0.1);
308
+ }
309
+
310
+ .taskon-eligs-bind-item--bound {
311
+ background: rgba(74, 222, 128, 0.1);
312
+ border-color: rgba(74, 222, 128, 0.3);
313
+ }
314
+
315
+ .taskon-eligs-bind-item-label {
316
+ font-size: 14px;
317
+ font-weight: 500;
318
+ color: #fff;
319
+ }
320
+
321
+ /* 绑定按钮 */
322
+ .taskon-eligs-bind-item-btn {
323
+ display: inline-flex;
324
+ align-items: center;
325
+ gap: 6px;
326
+ padding: 6px 16px;
327
+ font-size: 13px;
328
+ font-weight: 500;
329
+ color: #000;
330
+ background: linear-gradient(90deg, #00d1ff 0%, #00ff94 100%);
331
+ border: none;
332
+ border-radius: 6px;
333
+ cursor: pointer;
334
+ transition: opacity 0.2s;
335
+ }
336
+
337
+ .taskon-eligs-bind-item-btn:hover {
338
+ opacity: 0.9;
339
+ }
340
+
341
+ .taskon-eligs-bind-item-btn:disabled {
342
+ opacity: 0.6;
343
+ cursor: not-allowed;
344
+ }
345
+
346
+ /* 绑定中的加载动画 */
347
+ .taskon-eligs-bind-item-spinner {
348
+ width: 14px;
349
+ height: 14px;
350
+ animation: taskon-eligs-bind-spin 1s linear infinite;
351
+ }
352
+
353
+ @keyframes taskon-eligs-bind-spin {
354
+ from {
355
+ transform: rotate(0deg);
356
+ }
357
+ to {
358
+ transform: rotate(360deg);
359
+ }
360
+ }
361
+
362
+ /* 已绑定状态 */
363
+ .taskon-eligs-bind-item-status {
364
+ display: inline-flex;
365
+ align-items: center;
366
+ gap: 4px;
367
+ font-size: 13px;
368
+ font-weight: 500;
369
+ color: #4ade80;
370
+ }
371
+
372
+ /* 跳过按钮 */
373
+ .taskon-eligs-bind-skip-btn {
374
+ display: block;
375
+ width: 100%;
376
+ padding: 12px 24px;
377
+ margin-top: 20px;
378
+ font-size: 14px;
379
+ font-weight: 500;
380
+ color: #000;
381
+ background: linear-gradient(90deg, #00d1ff 0%, #00ff94 100%);
382
+ border: none;
383
+ border-radius: 8px;
384
+ cursor: pointer;
385
+ transition: opacity 0.2s;
386
+ }
387
+
388
+ .taskon-eligs-bind-skip-btn:hover {
389
+ opacity: 0.9;
390
+ }
391
+ /**
392
+ * ShareDropdown - 分享下拉菜单样式
393
+ * @module widgets/Quest/components/ShareDropdown
394
+ * 与原版 ShareInfo.vue 保持一致
395
+ */
396
+
397
+ /* 分享触发按钮 - 方形图标按钮(SimpleBox 样式) */
398
+ .taskon-quest-share-trigger {
399
+ display: flex;
400
+ align-items: center;
401
+ justify-content: center;
402
+ width: 40px;
403
+ height: 40px;
404
+ padding: 0;
405
+ margin-left: auto;
406
+ background: var(--taskon-quest-color-darkest, #1a1a1a);
407
+ border: none;
408
+ border-radius: 6px;
409
+ cursor: pointer;
410
+ transition: background 0.2s;
411
+ flex-shrink: 0;
412
+ }
413
+
414
+ .taskon-quest-share-trigger:hover {
415
+ background: var(--taskon-quest-color-darker, #2a2a2a);
416
+ }
417
+
418
+ .taskon-quest-share-trigger svg {
419
+ color: var(--taskon-quest-text-lightest, #fff);
420
+ }
421
+
422
+ /* 下拉菜单 */
423
+ .taskon-quest-share-menu {
424
+ width: 230px;
425
+ background: var(--taskon-quest-share-bg, #222);
426
+ border-radius: 10px;
427
+ overflow: hidden;
428
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);
429
+ z-index: 100;
430
+ text-align: left;
431
+ }
432
+
433
+ /* 菜单项 */
434
+ .taskon-quest-share-menu-item {
435
+ display: flex;
436
+ align-items: center;
437
+ width: 100%;
438
+ padding: 12px;
439
+ font-size: 14px;
440
+ font-weight: 500;
441
+ color: #fff;
442
+ background: transparent;
443
+ border: none;
444
+ cursor: pointer;
445
+ text-align: left;
446
+ }
447
+
448
+ .taskon-quest-share-menu-item:hover {
449
+ background: var(--taskon-quest-menu-hover-bg, rgba(255, 255, 255, 0.08));
450
+ }
451
+
452
+ .taskon-quest-share-menu-item svg {
453
+ width: 28px;
454
+ height: 28px;
455
+ margin-right: 10px;
456
+ flex-shrink: 0;
457
+ }
458
+
459
+ /* ============================================================================
460
+ 二维码弹窗样式 - 与原版 ShareQrCodeDialog.vue 一致
461
+ ============================================================================ */
462
+
463
+ /* 覆盖 Dialog 默认样式 - 移除卡片背景,让内容区域完全透明 */
464
+ .taskon-quest-qr-dialog-content {
465
+ background: transparent !important;
466
+ border-radius: 0 !important;
467
+ max-width: 400px !important;
468
+ box-shadow: none !important;
469
+ }
470
+
471
+ .taskon-quest-qr-dialog-content .taskon-dialog-body {
472
+ padding: 0 !important;
473
+ }
474
+
475
+ .taskon-quest-qr-dialog {
476
+ width: 100%;
477
+ max-width: 400px;
478
+ }
479
+
480
+ /* 海报外层容器 */
481
+ .taskon-quest-qr-poster-outer {
482
+ border-radius: 12px;
483
+ overflow: hidden;
484
+ }
485
+
486
+ /* 海报内容 */
487
+ .taskon-quest-qr-poster {
488
+ width: 100%;
489
+ }
490
+
491
+ /* 海报顶部 - 绿色渐变区域 */
492
+ .taskon-quest-qr-poster-header {
493
+ background: linear-gradient(89.87deg, #e2ff97 0.13%, #cffd55 99.92%);
494
+ padding: 30px;
495
+ color: #000;
496
+ }
497
+
498
+ /* 社区信息 */
499
+ .taskon-quest-qr-owner {
500
+ display: flex;
501
+ align-items: center;
502
+ }
503
+
504
+ .taskon-quest-qr-owner-avatar {
505
+ width: 30px;
506
+ height: 30px;
507
+ border-radius: 50%;
508
+ margin-right: 6px;
509
+ border: 2px solid #000;
510
+ object-fit: cover;
511
+ }
512
+
513
+ .taskon-quest-qr-owner-name {
514
+ font-size: 24px;
515
+ font-weight: 600;
516
+ white-space: nowrap;
517
+ overflow: hidden;
518
+ text-overflow: ellipsis;
519
+ }
520
+
521
+ /* 活动名称 */
522
+ .taskon-quest-qr-campaign-name {
523
+ margin-top: 14px;
524
+ margin-bottom: 8px;
525
+ font-size: 16px;
526
+ line-height: 24px;
527
+ font-weight: 600;
528
+ display: -webkit-box;
529
+ -webkit-line-clamp: 2;
530
+ -webkit-box-orient: vertical;
531
+ text-overflow: ellipsis;
532
+ word-break: break-all;
533
+ overflow: hidden;
534
+ }
535
+
536
+ /* Banner 图片 */
537
+ .taskon-quest-qr-banner {
538
+ width: 100%;
539
+ border-radius: 10px;
540
+ display: block;
541
+ }
542
+
543
+ /* 海报底部 - 黑色区域 */
544
+ .taskon-quest-qr-poster-footer {
545
+ padding: 30px;
546
+ background: #000;
547
+ display: flex;
548
+ justify-content: space-between;
549
+ align-items: flex-start;
550
+ }
551
+
552
+ /* 信息区域 */
553
+ .taskon-quest-qr-info {
554
+ width: calc(100% - 80px);
555
+ }
556
+
557
+ /* 奖励标题 */
558
+ .taskon-quest-qr-reward-title {
559
+ display: flex;
560
+ align-items: center;
561
+ color: #fff;
562
+ font-weight: 500;
563
+ }
564
+
565
+ .taskon-quest-qr-reward-title svg {
566
+ margin-left: 6px;
567
+ }
568
+
569
+ /* 时间范围 */
570
+ .taskon-quest-qr-time {
571
+ display: flex;
572
+ align-items: center;
573
+ margin-top: 15px;
574
+ margin-bottom: 6px;
575
+ font-size: 14px;
576
+ font-weight: 500;
577
+ color: #fff;
578
+ }
579
+
580
+ .taskon-quest-qr-time svg {
581
+ margin-right: 6px;
582
+ flex-shrink: 0;
583
+ }
584
+
585
+ /* 二维码 */
586
+ .taskon-quest-qr-code {
587
+ width: 80px;
588
+ height: 80px;
589
+ border-radius: 6px;
590
+ overflow: hidden;
591
+ flex-shrink: 0;
592
+ }
593
+
594
+ .taskon-quest-qr-code img {
595
+ display: block;
596
+ width: 100%;
597
+ height: 100%;
598
+ }
599
+
600
+ /* 操作按钮 */
601
+ .taskon-quest-qr-actions {
602
+ display: grid;
603
+ grid-template-columns: 1fr 1fr;
604
+ gap: 16px;
605
+ padding: 0 16px;
606
+ margin-top: 16px;
607
+ }
608
+
609
+ /* 奖励列表 - 与原版 RewardsLabels.vue 一致 */
610
+ .taskon-quest-qr-rewards-list {
611
+ display: inline-flex;
612
+ align-items: center;
613
+ flex-wrap: wrap;
614
+ gap: 10px;
615
+ margin-top: 6px;
616
+ margin-right: 10px;
617
+ }
618
+
619
+ /* 单个奖励项 */
620
+ .taskon-quest-qr-reward-item {
621
+ display: inline-flex;
622
+ align-items: center;
623
+ white-space: nowrap;
624
+ color: #fff;
625
+ font-size: 16px;
626
+ font-weight: 400;
627
+ }
628
+
629
+ /* 奖励标签 - 高亮绿色 */
630
+ .taskon-quest-qr-reward-label {
631
+ color: #cbff01;
632
+ }
633
+
634
+ /* 链图标 */
635
+ .taskon-quest-qr-reward-chain-icon {
636
+ width: 15px;
637
+ height: 15px;
638
+ border-radius: 50%;
639
+ margin-left: 4px;
640
+ }
641
+
642
+ /* 奖励间的 & 符号 */
643
+ .taskon-quest-qr-reward-and {
644
+ margin-left: 6px;
645
+ color: #fff;
646
+ }
647
+ /**
648
+ * ParticipantsInfo 组件样式
649
+ * @description 参与人数信息模块样式
650
+ * @design 基于 Figma 设计稿
651
+ *
652
+ * Design tokens from Figma:
653
+ * - font/Heading/H4: Font(family: "Outfit", style: SemiBold, size: 24, weight: 600, lineHeight: 32)
654
+ * - font/16px/Light: Font(family: "Outfit", style: Medium, size: 16, weight: 500, lineHeight: 24)
655
+ * - spacing/padding/l: 20px
656
+ * - spacing/padding/xs: 8px
657
+ * - taskon-color/text/lightest: white
658
+ * - taskon-color/text/lighter: rgba(255,255,255,0.8)
659
+ */
660
+
661
+ /* ============================================================================
662
+ ParticipantsInfo 容器
663
+ ============================================================================ */
664
+
665
+ .taskon-quest-participants-info {
666
+ display: flex;
667
+ flex-direction: column;
668
+ gap: var(--taskon-quest-spacing-l, 20px);
669
+ align-items: stretch;
670
+ width: 100%;
671
+ }
672
+
673
+ /* ============================================================================
674
+ Header 区域(标题 + info 图标)
675
+ ============================================================================ */
676
+
677
+ .taskon-quest-participants-info-header {
678
+ display: flex;
679
+ gap: var(--taskon-quest-spacing-xs, 8px);
680
+ align-items: center;
681
+ padding: 0;
682
+ margin: 0;
683
+ background: none;
684
+ border: none;
685
+ cursor: pointer;
686
+ outline: none;
687
+ }
688
+
689
+ .taskon-quest-participants-info-header:hover .taskon-quest-participants-info-title,
690
+ .taskon-quest-participants-info-header:hover .taskon-quest-participants-info-icon {
691
+ color: var(--taskon-quest-text-lightest, #ffffff);
692
+ }
693
+
694
+ .taskon-quest-participants-info-header:focus-visible {
695
+ outline: 2px solid var(--taskon-quest-primary, #cbff01);
696
+ outline-offset: 2px;
697
+ border-radius: 4px;
698
+ }
699
+
700
+ .taskon-quest-participants-info-title {
701
+ margin: 0;
702
+ font-size: 24px;
703
+ font-weight: 600;
704
+ line-height: 32px;
705
+ color: var(--taskon-quest-text-lightest, #ffffff);
706
+ }
707
+
708
+ .taskon-quest-participants-info-icon {
709
+ display: flex;
710
+ align-items: center;
711
+ justify-content: center;
712
+ width: 12px;
713
+ height: 12px;
714
+ color: var(--taskon-quest-text-lighter, rgba(255, 255, 255, 0.8));
715
+ flex-shrink: 0;
716
+ transition: color 0.2s;
717
+ }
718
+
719
+ /* ============================================================================
720
+ 统计行(Label + Value)
721
+ ============================================================================ */
722
+
723
+ .taskon-quest-participants-info-row {
724
+ display: flex;
725
+ justify-content: space-between;
726
+ align-items: center;
727
+ font-size: 16px;
728
+ font-weight: 500;
729
+ line-height: 24px;
730
+ width: 100%;
731
+ }
732
+
733
+ /* Winners 行可点击样式 */
734
+ .taskon-quest-participants-info-row--clickable {
735
+ padding: 0;
736
+ margin: 0;
737
+ background: none;
738
+ border: none;
739
+ cursor: pointer;
740
+ outline: none;
741
+ transition: opacity 0.2s;
742
+ }
743
+
744
+ .taskon-quest-participants-info-row--clickable:hover {
745
+ opacity: 0.8;
746
+ }
747
+
748
+ .taskon-quest-participants-info-row--clickable:focus-visible {
749
+ outline: 2px solid var(--taskon-quest-primary, #cbff01);
750
+ outline-offset: 2px;
751
+ border-radius: 4px;
752
+ }
753
+
754
+ .taskon-quest-participants-info-label {
755
+ color: var(--taskon-quest-text-lighter, rgba(255, 255, 255, 0.8));
756
+ }
757
+
758
+ .taskon-quest-participants-info-value {
759
+ color: var(--taskon-quest-text-lightest, #ffffff);
760
+ text-align: right;
761
+ }
762
+
763
+ /* Winners 行的可点击值样式 */
764
+ .taskon-quest-participants-info-value--clickable {
765
+ display: flex;
766
+ align-items: center;
767
+ gap: 4px;
768
+ }
769
+
770
+ .taskon-quest-participants-info-arrow {
771
+ color: var(--taskon-quest-text-lighter, rgba(255, 255, 255, 0.8));
772
+ flex-shrink: 0;
773
+ transition: transform 0.2s;
774
+ }
775
+
776
+ .taskon-quest-participants-info-row--clickable:hover .taskon-quest-participants-info-arrow {
777
+ transform: translateX(2px);
778
+ }
779
+
780
+ /* ============================================================================
781
+ Info 弹窗样式
782
+ ============================================================================ */
783
+
784
+ .taskon-quest-participants-dialog {
785
+ display: flex;
786
+ flex-direction: column;
787
+ }
788
+
789
+ .taskon-quest-participants-dialog-title {
790
+ margin: 0 0 20px 0;
791
+ font-size: 22px;
792
+ font-weight: 600;
793
+ line-height: 28px;
794
+ color: var(--taskon-quest-text-lightest, #ffffff);
795
+ }
796
+
797
+ .taskon-quest-participants-dialog-section {
798
+ margin-bottom: 20px;
799
+ }
800
+
801
+ .taskon-quest-participants-dialog-subtitle {
802
+ font-size: 16px;
803
+ font-weight: 600;
804
+ line-height: 24px;
805
+ color: var(--taskon-quest-text-lightest, #ffffff);
806
+ }
807
+
808
+ .taskon-quest-participants-dialog-desc {
809
+ margin-top: 4px;
810
+ font-size: 14px;
811
+ font-weight: 500;
812
+ line-height: 20px;
813
+ color: rgba(255, 255, 255, 0.6);
814
+ }
815
+
816
+ /* Flow Chart */
817
+ .taskon-quest-participants-dialog-chart {
818
+ display: flex;
819
+ align-items: flex-start;
820
+ margin-bottom: 30px;
821
+ }
822
+
823
+ .taskon-quest-participants-dialog-arrow-wrap {
824
+ flex-shrink: 0;
825
+ display: flex;
826
+ align-items: stretch;
827
+ }
828
+
829
+ .taskon-quest-participants-dialog-arrow {
830
+ width: 36px;
831
+ height: auto;
832
+ }
833
+
834
+ .taskon-quest-participants-dialog-cards {
835
+ flex: 1;
836
+ margin-left: 20px;
837
+ display: flex;
838
+ flex-direction: column;
839
+ gap: 4px;
840
+ }
841
+
842
+ .taskon-quest-participants-dialog-card {
843
+ padding: 8px 20px;
844
+ border-radius: 6px;
845
+ }
846
+
847
+ .taskon-quest-participants-dialog-card--level1 {
848
+ background: rgba(0, 255, 163, 0.2);
849
+ }
850
+
851
+ .taskon-quest-participants-dialog-card--level2 {
852
+ background: rgba(0, 255, 163, 0.3);
853
+ }
854
+
855
+ .taskon-quest-participants-dialog-card--level3 {
856
+ background: rgba(0, 255, 163, 0.4);
857
+ }
858
+
859
+ .taskon-quest-participants-dialog-card--level4 {
860
+ background: rgba(0, 255, 163, 0.5);
861
+ }
862
+
863
+ .taskon-quest-participants-dialog-card-title {
864
+ font-size: 14px;
865
+ font-weight: 600;
866
+ line-height: 20px;
867
+ color: var(--taskon-quest-text-lightest, #ffffff);
868
+ }
869
+
870
+ .taskon-quest-participants-dialog-card-desc {
871
+ font-size: 12px;
872
+ font-weight: 500;
873
+ line-height: 16px;
874
+ color: rgba(255, 255, 255, 0.6);
875
+ }
876
+
877
+ /* Confirm Button */
878
+ .taskon-quest-participants-dialog-btn {
879
+ width: 100%;
880
+ }
881
+ /**
882
+ * WinnerListModal 组件样式
883
+ * @description Winner 列表弹窗样式
884
+ */
885
+
886
+ /* ============================================================================
887
+ Modal 容器
888
+ ============================================================================ */
889
+
890
+ .taskon-quest-winner-modal {
891
+ max-height: 80vh;
892
+ }
893
+
894
+ .taskon-quest-winner-content {
895
+ display: flex;
896
+ flex-direction: column;
897
+ min-height: 300px;
898
+ }
899
+
900
+ /* ============================================================================
901
+ Header 区域
902
+ ============================================================================ */
903
+
904
+ .taskon-quest-winner-header {
905
+ margin-bottom: 16px;
906
+ }
907
+
908
+ .taskon-quest-winner-title {
909
+ margin: 0;
910
+ font-size: 22px;
911
+ font-weight: 600;
912
+ line-height: 28px;
913
+ color: var(--taskon-quest-text-lightest, #ffffff);
914
+ }
915
+
916
+ /* ============================================================================
917
+ Tab 切换
918
+ ============================================================================ */
919
+
920
+ .taskon-quest-winner-tabs {
921
+ margin-bottom: 20px;
922
+ }
923
+
924
+ /* ============================================================================
925
+ 错误状态
926
+ ============================================================================ */
927
+
928
+ .taskon-quest-winner-error {
929
+ display: flex;
930
+ flex-direction: column;
931
+ align-items: center;
932
+ justify-content: center;
933
+ gap: 16px;
934
+ padding: 40px 20px;
935
+ text-align: center;
936
+ }
937
+
938
+ .taskon-quest-winner-error p {
939
+ margin: 0;
940
+ color: var(--taskon-quest-text-lighter, rgba(255, 255, 255, 0.8));
941
+ }
942
+
943
+ /* ============================================================================
944
+ 列表区域
945
+ ============================================================================ */
946
+
947
+ .taskon-quest-winner-list {
948
+ flex: 1;
949
+ min-height: 200px;
950
+ max-height: 50vh;
951
+ overflow-y: auto;
952
+ overflow-x: hidden;
953
+ }
954
+
955
+ /* ============================================================================
956
+ 表格样式
957
+ ============================================================================ */
958
+
959
+ .taskon-quest-winner-table {
960
+ width: 100%;
961
+ border-collapse: collapse;
962
+ }
963
+
964
+ .taskon-quest-winner-table thead {
965
+ position: sticky;
966
+ top: 0;
967
+ z-index: 1;
968
+ background: var(--taskon-quest-bg, #1d2123);
969
+ }
970
+
971
+ .taskon-quest-winner-table th {
972
+ padding: 12px 16px;
973
+ text-align: left;
974
+ font-size: 14px;
975
+ font-weight: 500;
976
+ line-height: 20px;
977
+ color: var(--taskon-quest-text-lighter, rgba(255, 255, 255, 0.6));
978
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
979
+ }
980
+
981
+ .taskon-quest-winner-table th:last-child {
982
+ text-align: right;
983
+ }
984
+
985
+ .taskon-quest-winner-table td {
986
+ padding: 12px 16px;
987
+ font-size: 14px;
988
+ font-weight: 500;
989
+ line-height: 20px;
990
+ color: var(--taskon-quest-text-lightest, #ffffff);
991
+ border-bottom: 1px solid rgba(255, 255, 255, 0.05);
992
+ vertical-align: middle;
993
+ }
994
+
995
+ .taskon-quest-winner-table tr:hover td {
996
+ background: rgba(255, 255, 255, 0.02);
997
+ }
998
+
999
+ /* ============================================================================
1000
+ Position 列
1001
+ ============================================================================ */
1002
+
1003
+ .taskon-quest-winner-position {
1004
+ width: 80px;
1005
+ font-weight: 600;
1006
+ color: var(--taskon-quest-primary, #cbff01);
1007
+ }
1008
+
1009
+ /* ============================================================================
1010
+ User 列(不显示头像,不可点击)
1011
+ ============================================================================ */
1012
+
1013
+ .taskon-quest-winner-user {
1014
+ min-width: 120px;
1015
+ }
1016
+
1017
+ .taskon-quest-winner-user-name {
1018
+ display: block;
1019
+ max-width: 180px;
1020
+ overflow: hidden;
1021
+ text-overflow: ellipsis;
1022
+ white-space: nowrap;
1023
+ color: var(--taskon-quest-text-lightest, #ffffff);
1024
+ }
1025
+
1026
+ /* ============================================================================
1027
+ Rewards 列
1028
+ ============================================================================ */
1029
+
1030
+ .taskon-quest-winner-rewards {
1031
+ text-align: right !important;
1032
+ }
1033
+
1034
+ .taskon-quest-winner-rewards-list {
1035
+ display: inline-flex;
1036
+ flex-wrap: wrap;
1037
+ justify-content: flex-end;
1038
+ gap: 8px;
1039
+ max-width: 300px;
1040
+ }
1041
+
1042
+ /* ============================================================================
1043
+ 空状态
1044
+ ============================================================================ */
1045
+
1046
+ .taskon-quest-winner-empty {
1047
+ padding: 40px 20px !important;
1048
+ text-align: center !important;
1049
+ color: var(--taskon-quest-text-lighter, rgba(255, 255, 255, 0.6)) !important;
1050
+ }
1051
+
1052
+ /* ============================================================================
1053
+ 加载状态
1054
+ ============================================================================ */
1055
+
1056
+ .taskon-quest-winner-loading {
1057
+ display: flex;
1058
+ align-items: center;
1059
+ justify-content: center;
1060
+ gap: 8px;
1061
+ padding: 20px;
1062
+ color: var(--taskon-quest-text-lighter, rgba(255, 255, 255, 0.6));
1063
+ }
1064
+
1065
+ .taskon-quest-winner-loading-spinner {
1066
+ width: 16px;
1067
+ height: 16px;
1068
+ border: 2px solid rgba(255, 255, 255, 0.2);
1069
+ border-top-color: var(--taskon-quest-primary, #cbff01);
1070
+ border-radius: 50%;
1071
+ animation: taskon-quest-winner-spin 0.8s linear infinite;
1072
+ }
1073
+
1074
+ @keyframes taskon-quest-winner-spin {
1075
+ to {
1076
+ transform: rotate(360deg);
1077
+ }
1078
+ }
1079
+
1080
+ /* ============================================================================
1081
+ 奖励标签样式
1082
+ ============================================================================ */
1083
+
1084
+ .taskon-quest-winner-reward-label {
1085
+ display: inline-flex;
1086
+ align-items: center;
1087
+ gap: 4px;
1088
+ padding: 4px 8px;
1089
+ background: rgba(255, 255, 255, 0.1);
1090
+ border-radius: 4px;
1091
+ font-size: 12px;
1092
+ font-weight: 500;
1093
+ line-height: 16px;
1094
+ white-space: nowrap;
1095
+ }
1096
+
1097
+ .taskon-quest-winner-reward-label-type {
1098
+ color: var(--taskon-quest-text-lighter, rgba(255, 255, 255, 0.6));
1099
+ }
1100
+
1101
+ .taskon-quest-winner-reward-label-value {
1102
+ color: var(--taskon-quest-primary, #cbff01);
1103
+ }
1104
+ /**
1105
+ * QuestRewards 样式
1106
+ * @description Quest 奖励展示模块的样式定义
1107
+ *
1108
+ * 命名规范:
1109
+ * - 主容器:.taskon-quest-rewards
1110
+ * - 子元素:.taskon-quest-rewards-{element}
1111
+ * - 状态修饰:.taskon-quest-rewards-{element}--{state}
1112
+ */
1113
+
1114
+ /* ============================================================================
1115
+ 主容器
1116
+ ============================================================================ */
1117
+
1118
+ .taskon-quest-rewards {
1119
+ overflow: hidden;
1120
+ border-radius: 10px;
1121
+ background: var(--taskon-bg-card, rgba(255, 255, 255, 0.04));
1122
+ }
1123
+
1124
+ .taskon-quest-rewards-container {
1125
+ padding: 20px 18px;
1126
+ display: flex;
1127
+ flex-direction: column;
1128
+ gap: 28px;
1129
+ }
1130
+
1131
+ /* ============================================================================
1132
+ 用户信息(Ranking 模式)
1133
+ ============================================================================ */
1134
+
1135
+ .taskon-quest-rewards-user {
1136
+ display: flex;
1137
+ align-items: center;
1138
+ }
1139
+
1140
+ .taskon-quest-rewards-user-avatar {
1141
+ width: 50px;
1142
+ height: 50px;
1143
+ border-radius: 50%;
1144
+ border: 2px solid #f688ff;
1145
+ object-fit: cover;
1146
+ margin-right: 16px;
1147
+ }
1148
+
1149
+ .taskon-quest-rewards-user-name {
1150
+ flex: 1;
1151
+ overflow: hidden;
1152
+ white-space: nowrap;
1153
+ text-overflow: ellipsis;
1154
+ color: var(--taskon-text-primary, #fff);
1155
+ font-size: 22px;
1156
+ font-weight: 500;
1157
+ line-height: 28px;
1158
+ }
1159
+
1160
+ /* ============================================================================
1161
+ 排名积分信息(Ranking 模式)
1162
+ ============================================================================ */
1163
+
1164
+ .taskon-quest-rewards-ranking-point {
1165
+ padding: 16px;
1166
+ border-radius: 10px;
1167
+ border: 1px solid var(--taskon-border-color, rgba(255, 255, 255, 0.06));
1168
+ background: var(--taskon-bg-card, rgba(255, 255, 255, 0.04));
1169
+ }
1170
+
1171
+ .taskon-quest-rewards-ranking-point-row {
1172
+ display: flex;
1173
+ align-items: center;
1174
+ }
1175
+
1176
+ .taskon-quest-rewards-ranking-point-row--points {
1177
+ margin-top: 24px;
1178
+ }
1179
+
1180
+ .taskon-quest-rewards-ranking-point-label {
1181
+ display: flex;
1182
+ align-items: center;
1183
+ color: var(--taskon-text-tertiary, rgba(255, 255, 255, 0.5));
1184
+ font-size: 16px;
1185
+ font-weight: 500;
1186
+ line-height: 20px;
1187
+ }
1188
+
1189
+ /* Tip icon margin (controlled externally as TipPopover has no internal margin) */
1190
+ .taskon-quest-rewards-ranking-point-tip-icon {
1191
+ margin-left: 6px;
1192
+ }
1193
+
1194
+ .taskon-quest-rewards-ranking-point-value {
1195
+ position: relative;
1196
+ margin-left: auto;
1197
+ }
1198
+
1199
+ .taskon-quest-rewards-ranking-point-number {
1200
+ color: var(--taskon-primary, #cbff01);
1201
+ font-size: 22px;
1202
+ font-weight: 700;
1203
+ line-height: 28px;
1204
+ }
1205
+
1206
+ .taskon-quest-rewards-ranking-point-tier {
1207
+ position: absolute;
1208
+ top: 100%;
1209
+ right: 0;
1210
+ color: var(--taskon-text-tertiary, rgba(255, 255, 255, 0.5));
1211
+ font-size: 13px;
1212
+ font-weight: 500;
1213
+ line-height: 16px;
1214
+ white-space: nowrap;
1215
+ }
1216
+
1217
+ .taskon-quest-rewards-ranking-point-amount {
1218
+ margin-left: auto;
1219
+ color: var(--taskon-secondary, #00ffa3);
1220
+ font-size: 22px;
1221
+ font-weight: 700;
1222
+ line-height: 28px;
1223
+ }
1224
+
1225
+ .taskon-quest-rewards-ranking-point-tip {
1226
+ text-align: right;
1227
+ margin-left: auto;
1228
+ width: 50%;
1229
+ font-size: 12px;
1230
+ line-height: 16px;
1231
+ color: var(--taskon-text-tertiary, rgba(255, 255, 255, 0.5));
1232
+ }
1233
+
1234
+ .taskon-quest-rewards-ranking-point-tip-highlight {
1235
+ color: var(--taskon-primary, #cbff01);
1236
+ }
1237
+
1238
+ /* ============================================================================
1239
+ 奖励分组
1240
+ ============================================================================ */
1241
+
1242
+ .taskon-quest-rewards-group {
1243
+ display: flex;
1244
+ flex-direction: column;
1245
+ }
1246
+
1247
+ .taskon-quest-rewards-group-header {
1248
+ display: flex;
1249
+ align-items: center;
1250
+ justify-content: space-between;
1251
+ margin-bottom: 12px;
1252
+ }
1253
+
1254
+ .taskon-quest-rewards-group-title {
1255
+ margin: 0;
1256
+ font-size: 16px;
1257
+ line-height: 20px;
1258
+ font-weight: 500;
1259
+ color: var(--taskon-text-primary, #fff);
1260
+ }
1261
+
1262
+ .taskon-quest-rewards-group-cards {
1263
+ display: flex;
1264
+ flex-direction: column;
1265
+ }
1266
+
1267
+ /* ============================================================================
1268
+ 奖励卡片
1269
+ ============================================================================ */
1270
+
1271
+ .taskon-quest-rewards-card {
1272
+ margin-top: 12px;
1273
+ background: var(--taskon-bg-card, rgba(255, 255, 255, 0.04));
1274
+ border-radius: 8px;
1275
+ overflow: hidden;
1276
+ }
1277
+
1278
+ .taskon-quest-rewards-card:first-child {
1279
+ margin-top: 0;
1280
+ }
1281
+
1282
+ .taskon-quest-rewards-card--active {
1283
+ border: 1px solid #cbff01;
1284
+ }
1285
+
1286
+ /* Tier 表头(仅 PointRanking 模式) */
1287
+ .taskon-quest-rewards-card-tier {
1288
+ display: flex;
1289
+ align-items: center;
1290
+ justify-content: space-between;
1291
+ gap: 8px;
1292
+ padding: 8px 16px;
1293
+ background: var(--taskon-bg-darkest, rgba(0, 0, 0, 0.4));
1294
+ font-size: 16px;
1295
+ line-height: 20px;
1296
+ }
1297
+
1298
+ .taskon-quest-rewards-card-tier--active {
1299
+ background: linear-gradient(90deg, rgba(203, 255, 1, 0.9) 0%, rgba(0, 255, 163, 0.9) 100%);
1300
+ }
1301
+
1302
+ .taskon-quest-rewards-card-tier-label {
1303
+ font-weight: 500;
1304
+ color: var(--taskon-text-primary, #fff);
1305
+ }
1306
+
1307
+ .taskon-quest-rewards-card-tier--active .taskon-quest-rewards-card-tier-label {
1308
+ color: var(--taskon-text-inverse, #000);
1309
+ }
1310
+
1311
+ .taskon-quest-rewards-card-tier-range {
1312
+ color: var(--taskon-text-tertiary, rgba(255, 255, 255, 0.5));
1313
+ }
1314
+
1315
+ .taskon-quest-rewards-card-tier--active .taskon-quest-rewards-card-tier-range {
1316
+ color: var(--taskon-text-inverse-secondary, rgba(0, 0, 0, 0.6));
1317
+ }
1318
+
1319
+ /* 卡片主体 */
1320
+ .taskon-quest-rewards-card-body {
1321
+ padding: 20px;
1322
+ display: flex;
1323
+ flex-direction: column;
1324
+ gap: 20px;
1325
+ }
1326
+
1327
+ /* ============================================================================
1328
+ Whitelist Description(可折叠)
1329
+ ============================================================================ */
1330
+
1331
+ .taskon-quest-rewards-whitelist-desc {
1332
+ width: 100%;
1333
+ }
1334
+
1335
+ .taskon-quest-rewards-whitelist-desc-trigger {
1336
+ width: 100%;
1337
+ background: none;
1338
+ border: none;
1339
+ padding: 0;
1340
+ cursor: pointer;
1341
+ text-align: left;
1342
+ }
1343
+
1344
+ .taskon-quest-rewards-whitelist-desc-icon {
1345
+ color: var(--taskon-text-tertiary, rgba(255, 255, 255, 0.5));
1346
+ transition: transform 0.3s ease;
1347
+ flex-shrink: 0;
1348
+ }
1349
+
1350
+ .taskon-quest-rewards-whitelist-desc-icon--open {
1351
+ transform: rotate(180deg);
1352
+ }
1353
+
1354
+ .taskon-quest-rewards-whitelist-desc-content {
1355
+ margin-top: 8px;
1356
+ font-size: 14px;
1357
+ line-height: 20px;
1358
+ color: var(--taskon-text-secondary, rgba(255, 255, 255, 0.7));
1359
+ }
1360
+
1361
+ /* ============================================================================
1362
+ 基础行组件
1363
+ ============================================================================ */
1364
+
1365
+ .taskon-quest-rewards-row {
1366
+ display: flex;
1367
+ align-items: center;
1368
+ justify-content: space-between;
1369
+ gap: 8px;
1370
+ }
1371
+
1372
+ .taskon-quest-rewards-row-label {
1373
+ font-size: 18px;
1374
+ line-height: 24px;
1375
+ font-weight: 500;
1376
+ color: var(--taskon-text-primary, #fff);
1377
+ flex-shrink: 0;
1378
+ }
1379
+
1380
+ .taskon-quest-rewards-row-value {
1381
+ display: flex;
1382
+ align-items: center;
1383
+ gap: 8px;
1384
+ font-size: 14px;
1385
+ line-height: 16px;
1386
+ color: var(--taskon-text-primary, #fff);
1387
+ }
1388
+
1389
+ /* ============================================================================
1390
+ 链图标
1391
+ ============================================================================ */
1392
+
1393
+ .taskon-quest-rewards-chain-icon {
1394
+ border-radius: 50%;
1395
+ flex-shrink: 0;
1396
+ }
1397
+
1398
+ /* Chain Icon Tooltip */
1399
+ .taskon-quest-rewards-chain-tooltip {
1400
+ padding: 6px 10px;
1401
+ background: var(--taskon-bg-popover, #1a1a1a);
1402
+ border: 1px solid var(--taskon-border-color, rgba(255, 255, 255, 0.1));
1403
+ border-radius: 6px;
1404
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
1405
+ font-size: 12px;
1406
+ line-height: 16px;
1407
+ color: var(--taskon-text-primary, #fff);
1408
+ z-index: 1000;
1409
+ white-space: nowrap;
1410
+ }
1411
+
1412
+ .taskon-quest-rewards-chain-tooltip-arrow {
1413
+ fill: var(--taskon-bg-popover, #1a1a1a);
1414
+ }
1415
+
1416
+ /* ============================================================================
1417
+ Token 奖励
1418
+ ============================================================================ */
1419
+
1420
+ .taskon-quest-rewards-token {
1421
+ display: flex;
1422
+ flex-direction: column;
1423
+ gap: 0;
1424
+ }
1425
+
1426
+ .taskon-quest-rewards-token-blindbox {
1427
+ display: flex;
1428
+ align-items: center;
1429
+ gap: 8px;
1430
+ font-size: 16px;
1431
+ line-height: 20px;
1432
+ font-weight: 600;
1433
+ margin-bottom: 20px;
1434
+ opacity: 0.9;
1435
+ }
1436
+
1437
+ .taskon-quest-rewards-token-blindbox span:last-child {
1438
+ background: linear-gradient(90deg, #cbff01 0%, #00ffa3 100%);
1439
+ -webkit-background-clip: text;
1440
+ background-clip: text;
1441
+ -webkit-text-fill-color: transparent;
1442
+ }
1443
+
1444
+ .taskon-quest-rewards-token-pool {
1445
+ display: flex;
1446
+ align-items: center;
1447
+ gap: 8px;
1448
+ font-weight: 600;
1449
+ }
1450
+
1451
+ .taskon-quest-rewards-token-amount {
1452
+ font-size: 22px;
1453
+ line-height: 28px;
1454
+ color: var(--taskon-primary, #cbff01);
1455
+ }
1456
+
1457
+ .taskon-quest-rewards-token-name {
1458
+ font-size: 22px;
1459
+ line-height: 28px;
1460
+ color: var(--taskon-primary, #cbff01);
1461
+ }
1462
+
1463
+ .taskon-quest-rewards-token-usdt-tag {
1464
+ font-size: 12px;
1465
+ line-height: 14px;
1466
+ padding: 2px 6px;
1467
+ background: var(--taskon-bg-secondary, rgba(255, 255, 255, 0.1));
1468
+ border-radius: 4px;
1469
+ color: var(--taskon-text-secondary, rgba(255, 255, 255, 0.7));
1470
+ }
1471
+
1472
+ .taskon-quest-rewards-token-per {
1473
+ display: flex;
1474
+ align-items: center;
1475
+ gap: 8px;
1476
+ margin-top: 4px;
1477
+ }
1478
+
1479
+ .taskon-quest-rewards-token-per-label {
1480
+ font-size: 14px;
1481
+ line-height: 16px;
1482
+ color: var(--taskon-text-tertiary, rgba(255, 255, 255, 0.5));
1483
+ }
1484
+
1485
+ .taskon-quest-rewards-token-per-value {
1486
+ margin-left: auto;
1487
+ font-size: 14px;
1488
+ line-height: 16px;
1489
+ color: var(--taskon-text-secondary, rgba(255, 255, 255, 0.7));
1490
+ }
1491
+
1492
+ /* BRC20 标签 */
1493
+ .taskon-quest-rewards-token-brc20 {
1494
+ padding: 2px 6px;
1495
+ font-size: 12px;
1496
+ line-height: 14px;
1497
+ font-weight: 500;
1498
+ color: #f97316;
1499
+ background: rgba(249, 115, 22, 0.15);
1500
+ border-radius: 4px;
1501
+ }
1502
+
1503
+ /* ============================================================================
1504
+ NFT 奖励
1505
+ ============================================================================ */
1506
+
1507
+ .taskon-quest-rewards-nft-info,
1508
+ .taskon-quest-rewards-minted-nft-info,
1509
+ .taskon-quest-rewards-cap-info,
1510
+ .taskon-quest-rewards-whitelist-info {
1511
+ display: flex;
1512
+ align-items: center;
1513
+ gap: 8px;
1514
+ cursor: pointer;
1515
+ }
1516
+
1517
+ .taskon-quest-rewards-nft-name,
1518
+ .taskon-quest-rewards-minted-nft-name,
1519
+ .taskon-quest-rewards-cap-name,
1520
+ .taskon-quest-rewards-whitelist-name {
1521
+ font-size: 22px;
1522
+ line-height: 28px;
1523
+ font-weight: 600;
1524
+ color: var(--taskon-text-primary, #fff);
1525
+ overflow: hidden;
1526
+ text-overflow: ellipsis;
1527
+ white-space: nowrap;
1528
+ max-width: 200px;
1529
+ }
1530
+
1531
+ .taskon-quest-rewards-minted-nft-quantity {
1532
+ font-size: 14px;
1533
+ line-height: 16px;
1534
+ color: var(--taskon-text-secondary, rgba(255, 255, 255, 0.7));
1535
+ }
1536
+
1537
+ /* ============================================================================
1538
+ Popover 弹出层(NFT/Minted NFT 使用)
1539
+ ============================================================================ */
1540
+
1541
+ .taskon-quest-rewards-popover-content {
1542
+ padding: 12px 16px;
1543
+ background: var(--taskon-bg-popover, #1a1a1a);
1544
+ border: 1px solid var(--taskon-border-color, rgba(255, 255, 255, 0.1));
1545
+ border-radius: 8px;
1546
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
1547
+ max-width: 300px;
1548
+ z-index: 1000;
1549
+ }
1550
+
1551
+ .taskon-quest-rewards-popover-name {
1552
+ font-size: 14px;
1553
+ line-height: 18px;
1554
+ color: var(--taskon-text-primary, #fff);
1555
+ word-break: break-all;
1556
+ }
1557
+
1558
+ .taskon-quest-rewards-popover-address {
1559
+ margin-top: 8px;
1560
+ }
1561
+
1562
+ .taskon-quest-rewards-popover-address-title {
1563
+ font-size: 14px;
1564
+ line-height: 18px;
1565
+ font-weight: 500;
1566
+ color: var(--taskon-text-primary, #fff);
1567
+ }
1568
+
1569
+ .taskon-quest-rewards-popover-address-row {
1570
+ margin-top: 4px;
1571
+ display: flex;
1572
+ align-items: center;
1573
+ gap: 8px;
1574
+ background: none;
1575
+ border: none;
1576
+ padding: 0;
1577
+ cursor: pointer;
1578
+ width: 100%;
1579
+ text-align: left;
1580
+ outline: none;
1581
+ }
1582
+
1583
+ .taskon-quest-rewards-popover-address-text {
1584
+ flex: 1;
1585
+ font-size: 12px;
1586
+ line-height: 16px;
1587
+ color: var(--taskon-text-tertiary, rgba(255, 255, 255, 0.5));
1588
+ word-break: break-all;
1589
+ }
1590
+
1591
+ .taskon-quest-rewards-popover-address-copy {
1592
+ flex-shrink: 0;
1593
+ display: flex;
1594
+ align-items: center;
1595
+ color: var(--taskon-text-tertiary, rgba(255, 255, 255, 0.5));
1596
+ transition: color 0.2s;
1597
+ }
1598
+
1599
+ .taskon-quest-rewards-popover-address-row:hover .taskon-quest-rewards-popover-address-copy {
1600
+ color: var(--taskon-primary, #cbff01);
1601
+ }
1602
+
1603
+ .taskon-quest-rewards-popover-arrow {
1604
+ fill: var(--taskon-bg-popover, #1a1a1a);
1605
+ }
1606
+
1607
+ /* ============================================================================
1608
+ 积分/经验值奖励
1609
+ ============================================================================ */
1610
+
1611
+ .taskon-quest-rewards-points-info,
1612
+ .taskon-quest-rewards-exp-info {
1613
+ display: flex;
1614
+ align-items: center;
1615
+ gap: 8px;
1616
+ }
1617
+
1618
+ .taskon-quest-rewards-points-icon {
1619
+ width: 20px;
1620
+ height: 20px;
1621
+ border-radius: 50%;
1622
+ }
1623
+
1624
+ .taskon-quest-rewards-points-amount,
1625
+ .taskon-quest-rewards-exp-amount {
1626
+ font-size: 22px;
1627
+ line-height: 28px;
1628
+ font-weight: 600;
1629
+ color: var(--taskon-primary, #cbff01);
1630
+ }
1631
+
1632
+ .taskon-quest-rewards-points-name,
1633
+ .taskon-quest-rewards-exp-label {
1634
+ font-size: 22px;
1635
+ line-height: 28px;
1636
+ color: var(--taskon-text-primary, #fff);
1637
+ }
1638
+
1639
+ /* ============================================================================
1640
+ Discord 角色
1641
+ ============================================================================ */
1642
+
1643
+ .taskon-quest-rewards-discord-role-info {
1644
+ display: flex;
1645
+ align-items: center;
1646
+ gap: 8px;
1647
+ }
1648
+
1649
+ .taskon-quest-rewards-discord-role-name {
1650
+ font-size: 22px;
1651
+ line-height: 28px;
1652
+ color: var(--taskon-link, #5865f2);
1653
+ cursor: pointer;
1654
+ }
1655
+
1656
+ .taskon-quest-rewards-discord-role-name:hover {
1657
+ text-decoration: underline;
1658
+ }
1659
+
1660
+ .taskon-quest-rewards-discord-role-warning {
1661
+ font-size: 12px;
1662
+ line-height: 14px;
1663
+ color: var(--taskon-warning, #ffc107);
1664
+ }
1665
+
1666
+ /* ============================================================================
1667
+ Winner 数量
1668
+ ============================================================================ */
1669
+
1670
+ .taskon-quest-rewards-winner-open {
1671
+ font-size: 22px;
1672
+ line-height: 28px;
1673
+ color: var(--taskon-secondary, #00ffa3);
1674
+ }
1675
+
1676
+ .taskon-quest-rewards-winner-fcfs {
1677
+ display: flex;
1678
+ flex-direction: column;
1679
+ align-items: flex-end;
1680
+ text-align: right;
1681
+ }
1682
+
1683
+ .taskon-quest-rewards-winner-fcfs-row {
1684
+ display: flex;
1685
+ align-items: baseline;
1686
+ font-size: 18px;
1687
+ line-height: 24px;
1688
+ }
1689
+
1690
+ .taskon-quest-rewards-winner-available {
1691
+ color: var(--taskon-secondary, #00ffa3);
1692
+ }
1693
+
1694
+ .taskon-quest-rewards-winner-separator {
1695
+ color: var(--taskon-text-primary, #fff);
1696
+ }
1697
+
1698
+ .taskon-quest-rewards-winner-total {
1699
+ color: var(--taskon-text-primary, #fff);
1700
+ }
1701
+
1702
+ .taskon-quest-rewards-winner-label {
1703
+ font-size: 14px;
1704
+ line-height: 16px;
1705
+ color: var(--taskon-text-secondary, rgba(255, 255, 255, 0.7));
1706
+ }
1707
+
1708
+ .taskon-quest-rewards-winner-count {
1709
+ font-size: 22px;
1710
+ line-height: 28px;
1711
+ color: var(--taskon-secondary, #00ffa3);
1712
+ }
1713
+
1714
+ .taskon-quest-rewards-winner-ranking {
1715
+ font-size: 22px;
1716
+ line-height: 28px;
1717
+ color: var(--taskon-secondary, #00ffa3);
1718
+ }
1719
+
1720
+ /* ============================================================================
1721
+ Gas Station 进度条(与 Vue 原版 GasStationProgress.vue + ColorfulProgress.vue 一致)
1722
+ ============================================================================ */
1723
+
1724
+ .taskon-quest-rewards-gas {
1725
+ display: flex;
1726
+ align-items: center;
1727
+ gap: 12px;
1728
+ margin-top: 8px;
1729
+ }
1730
+
1731
+ .taskon-quest-rewards-gas-label {
1732
+ font-size: 14px;
1733
+ line-height: 16px;
1734
+ color: var(--taskon-text-tertiary, rgba(255, 255, 255, 0.5));
1735
+ white-space: nowrap;
1736
+ }
1737
+
1738
+ .taskon-quest-rewards-gas-bar {
1739
+ flex: 1;
1740
+ position: relative;
1741
+ height: 8px;
1742
+ background: rgba(255, 255, 255, 0.2);
1743
+ border-radius: 2px;
1744
+ overflow: hidden;
1745
+ }
1746
+
1747
+ /* 进度条靠右对齐(显示剩余量) */
1748
+ .taskon-quest-rewards-gas-progress {
1749
+ position: absolute;
1750
+ right: 0;
1751
+ top: 0;
1752
+ height: 100%;
1753
+ display: flex;
1754
+ align-items: center;
1755
+ gap: 6px;
1756
+ background: linear-gradient(90deg, #00ffa3 -229.89%, #cbff01 100%);
1757
+ border-radius: 2px;
1758
+ overflow: hidden;
1759
+ }
1760
+
1761
+ /* 波浪纹条纹 */
1762
+ .taskon-quest-rewards-gas-wave {
1763
+ width: 3px;
1764
+ flex-shrink: 0;
1765
+ height: 200%;
1766
+ transform: rotate(45deg);
1767
+ background: rgba(0, 0, 0, 0.1);
1768
+ }
1769
+
1770
+ /* ============================================================================
1771
+ NFT 预览图
1772
+ ============================================================================ */
1773
+
1774
+ .taskon-quest-rewards-preview {
1775
+ width: 100%;
1776
+ padding: 26px;
1777
+ border: 1px solid var(--taskon-border-color, rgba(255, 255, 255, 0.1));
1778
+ border-radius: 8px;
1779
+ box-sizing: border-box;
1780
+ }
1781
+
1782
+ .taskon-quest-rewards-preview-image,
1783
+ .taskon-quest-rewards-preview-video {
1784
+ width: 100%;
1785
+ border-radius: 8px;
1786
+ display: block;
1787
+ }
1788
+
1789
+ /* ============================================================================
1790
+ 预估奖励
1791
+ ============================================================================ */
1792
+
1793
+ .taskon-quest-rewards-estimated {
1794
+ position: relative;
1795
+ padding: 16px;
1796
+ background: transparent;
1797
+ border-radius: 8px;
1798
+ border: 1px solid rgba(0, 255, 163, 0.4);
1799
+ overflow: hidden;
1800
+ }
1801
+
1802
+ .taskon-quest-rewards-estimated-row {
1803
+ display: flex;
1804
+ align-items: center;
1805
+ justify-content: space-between;
1806
+ gap: 8px;
1807
+ }
1808
+
1809
+ .taskon-quest-rewards-estimated-title {
1810
+ font-size: 14px;
1811
+ line-height: 16px;
1812
+ font-weight: 500;
1813
+ color: var(--taskon-text-secondary, rgba(255, 255, 255, 0.7));
1814
+ }
1815
+
1816
+ .taskon-quest-rewards-estimated-value {
1817
+ display: flex;
1818
+ align-items: baseline;
1819
+ gap: 4px;
1820
+ font-size: 18px;
1821
+ line-height: 24px;
1822
+ font-weight: 600;
1823
+ text-align: right;
1824
+ }
1825
+
1826
+ .taskon-quest-rewards-estimated-amount {
1827
+ color: var(--taskon-primary, #cbff01);
1828
+ }
1829
+
1830
+ .taskon-quest-rewards-estimated-symbol {
1831
+ color: var(--taskon-text-primary, #fff);
1832
+ }
1833
+
1834
+ .taskon-quest-rewards-estimated-formula {
1835
+ font-size: 12px;
1836
+ line-height: 14px;
1837
+ color: var(--taskon-text-tertiary, rgba(255, 255, 255, 0.5));
1838
+ margin-top: 4px;
1839
+ }
1840
+
1841
+ .taskon-quest-rewards-estimated-label {
1842
+ font-size: 14px;
1843
+ line-height: 16px;
1844
+ font-weight: 500;
1845
+ color: var(--taskon-text-secondary, rgba(255, 255, 255, 0.7));
1846
+ }
1847
+
1848
+ .taskon-quest-rewards-estimated-points {
1849
+ font-size: 18px;
1850
+ line-height: 24px;
1851
+ font-weight: 700;
1852
+ color: var(--taskon-text-primary, #fff);
1853
+ }
1854
+
1855
+ .taskon-quest-rewards-estimated-total {
1856
+ display: flex;
1857
+ align-items: center;
1858
+ justify-content: space-between;
1859
+ gap: 8px;
1860
+ font-size: 14px;
1861
+ line-height: 16px;
1862
+ color: var(--taskon-text-secondary, rgba(255, 255, 255, 0.7));
1863
+ }
1864
+
1865
+ /* 未完成遮罩层 */
1866
+ .taskon-quest-rewards-estimated-mask {
1867
+ position: absolute;
1868
+ inset: 0;
1869
+ display: flex;
1870
+ flex-direction: column;
1871
+ align-items: center;
1872
+ justify-content: center;
1873
+ background: rgba(48, 48, 48, 0.4);
1874
+ border-radius: 8px;
1875
+ backdrop-filter: blur(4px);
1876
+ padding: 16px;
1877
+ }
1878
+
1879
+ .taskon-quest-rewards-estimated-mask-icon {
1880
+ width: 49px;
1881
+ height: 56px;
1882
+ }
1883
+
1884
+ .taskon-quest-rewards-estimated-mask-title {
1885
+ margin-top: 8px;
1886
+ font-size: 14px;
1887
+ line-height: 16px;
1888
+ font-weight: 500;
1889
+ color: var(--taskon-secondary, #00ffa3);
1890
+ text-align: center;
1891
+ }
1892
+
1893
+ .taskon-quest-rewards-estimated-mask-subtitle {
1894
+ margin-top: 4px;
1895
+ font-size: 12px;
1896
+ line-height: 14px;
1897
+ color: var(--taskon-text-primary, #fff);
1898
+ text-align: center;
1899
+ }
1900
+
1901
+ /* ============================================================================
1902
+ Bonus 奖励模块
1903
+ ============================================================================ */
1904
+
1905
+ .taskon-quest-rewards-bonus {
1906
+ /* 父元素 .taskon-quest-rewards-section 已有 gap,无需 margin */
1907
+ }
1908
+
1909
+ .taskon-quest-rewards-bonus-title {
1910
+ font-size: 16px;
1911
+ line-height: 20px;
1912
+ font-weight: 500;
1913
+ color: var(--taskon-text-primary, #fff);
1914
+ }
1915
+
1916
+ .taskon-quest-rewards-bonus-card {
1917
+ margin-top: 14px;
1918
+ padding: 20px 18px;
1919
+ display: flex;
1920
+ flex-direction: column;
1921
+ gap: 24px;
1922
+ border-radius: 10px;
1923
+ background: var(--taskon-bg-card, rgba(255, 255, 255, 0.04));
1924
+ }
1925
+
1926
+ /* 覆盖 BaseRow 的 label 样式,匹配 Vue 版本 */
1927
+ .taskon-quest-rewards-bonus-card .taskon-quest-rewards-row-label {
1928
+ color: var(--taskon-text-secondary, rgba(255, 255, 255, 0.7));
1929
+ font-size: 16px;
1930
+ line-height: 20px;
1931
+ }
1932
+
1933
+ .taskon-quest-rewards-bonus-desc {
1934
+ color: var(--taskon-text-tertiary, rgba(255, 255, 255, 0.5));
1935
+ font-size: 14px;
1936
+ line-height: 18px;
1937
+ text-align: right;
1938
+ }
1939
+
1940
+ .taskon-quest-rewards-bonus-value {
1941
+ display: flex;
1942
+ align-items: flex-end;
1943
+ color: var(--taskon-text-primary, #fff);
1944
+ text-align: right;
1945
+ font-size: 16px;
1946
+ font-weight: 600;
1947
+ line-height: normal;
1948
+ }
1949
+
1950
+ .taskon-quest-rewards-bonus-amount {
1951
+ margin-right: 4px;
1952
+ }
1953
+
1954
+ .taskon-quest-rewards-bonus-unit {
1955
+ font-size: 14px;
1956
+ font-weight: 400;
1957
+ }
1958
+
1959
+ /* ============================================================================
1960
+ 移动端响应式
1961
+ ============================================================================ */
1962
+
1963
+ @media (max-width: 750px) {
1964
+ .taskon-quest-rewards {
1965
+ margin-top: 4vw;
1966
+ }
1967
+
1968
+ .taskon-quest-rewards-container {
1969
+ padding: 4vw;
1970
+ gap: 7.2vw;
1971
+ }
1972
+
1973
+ /* 用户信息移动端样式 */
1974
+ .taskon-quest-rewards-user-avatar {
1975
+ margin-right: 2.933vw;
1976
+ width: 10.667vw;
1977
+ height: 10.667vw;
1978
+ }
1979
+
1980
+ .taskon-quest-rewards-user-name {
1981
+ font-size: 4.8vw;
1982
+ line-height: 6vw;
1983
+ }
1984
+
1985
+ /* 排名积分移动端样式 */
1986
+ .taskon-quest-rewards-ranking-point {
1987
+ padding: 3.467vw 4vw;
1988
+ }
1989
+
1990
+ .taskon-quest-rewards-ranking-point-label {
1991
+ font-size: 3.733vw;
1992
+ line-height: 4.667vw;
1993
+ }
1994
+
1995
+ .taskon-quest-rewards-ranking-point-number,
1996
+ .taskon-quest-rewards-ranking-point-amount {
1997
+ font-size: 4.533vw;
1998
+ line-height: 5.733vw;
1999
+ }
2000
+
2001
+ .taskon-quest-rewards-ranking-point-row--points {
2002
+ margin-top: 6.4vw;
2003
+ }
2004
+
2005
+ .taskon-quest-rewards-ranking-point-tier {
2006
+ font-size: 2.933vw;
2007
+ line-height: 3.733vw;
2008
+ }
2009
+
2010
+ .taskon-quest-rewards-card {
2011
+ margin-top: 1.6vw;
2012
+ }
2013
+
2014
+ .taskon-quest-rewards-card-tier {
2015
+ gap: 0.8vw;
2016
+ padding: 0.8vw 1.333vw;
2017
+ font-size: 3.467vw;
2018
+ line-height: 4.4vw;
2019
+ }
2020
+
2021
+ .taskon-quest-rewards-card-body {
2022
+ padding: 1.6vw;
2023
+ gap: 2.133vw;
2024
+ }
2025
+
2026
+ .taskon-quest-rewards-row-label {
2027
+ font-size: 3.867vw;
2028
+ line-height: 4.8vw;
2029
+ }
2030
+
2031
+ .taskon-quest-rewards-token-amount,
2032
+ .taskon-quest-rewards-token-name,
2033
+ .taskon-quest-rewards-nft-name,
2034
+ .taskon-quest-rewards-minted-nft-name,
2035
+ .taskon-quest-rewards-cap-name,
2036
+ .taskon-quest-rewards-whitelist-name,
2037
+ .taskon-quest-rewards-points-amount,
2038
+ .taskon-quest-rewards-points-name,
2039
+ .taskon-quest-rewards-exp-amount,
2040
+ .taskon-quest-rewards-exp-label,
2041
+ .taskon-quest-rewards-discord-role-name,
2042
+ .taskon-quest-rewards-winner-count,
2043
+ .taskon-quest-rewards-winner-ranking,
2044
+ .taskon-quest-rewards-winner-open {
2045
+ font-size: 4.267vw;
2046
+ line-height: 5.333vw;
2047
+ }
2048
+
2049
+ .taskon-quest-rewards-preview {
2050
+ padding: 6.267vw;
2051
+ }
2052
+
2053
+ /* Bonus 模块移动端样式 */
2054
+ .taskon-quest-rewards-bonus-card {
2055
+ margin-top: 2.667vw;
2056
+ padding: 4vw;
2057
+ gap: 5.333vw;
2058
+ }
2059
+
2060
+ .taskon-quest-rewards-bonus-card .taskon-quest-rewards-row-label {
2061
+ font-size: 3.467vw;
2062
+ line-height: 4.4vw;
2063
+ }
2064
+
2065
+ .taskon-quest-rewards-bonus-desc {
2066
+ font-size: 3.2vw;
2067
+ line-height: 4vw;
2068
+ }
2069
+
2070
+ .taskon-quest-rewards-bonus-value {
2071
+ font-size: 3.733vw;
2072
+ line-height: 4vw;
2073
+ }
2074
+
2075
+ .taskon-quest-rewards-bonus-amount {
2076
+ margin-right: 0.8vw;
2077
+ }
2078
+
2079
+ .taskon-quest-rewards-bonus-unit {
2080
+ font-size: 3.2vw;
2081
+ }
2082
+
2083
+ /* View Leaderboard 按钮移动端样式 */
2084
+ .taskon-quest-rewards-view-leaderboard {
2085
+ font-size: 3.2vw;
2086
+ line-height: 4vw;
2087
+ }
2088
+
2089
+ .taskon-quest-rewards-view-leaderboard-arrow {
2090
+ margin-left: 1.867vw;
2091
+ }
2092
+
2093
+ /* Gas Station 移动端样式 */
2094
+ .taskon-quest-rewards-gas {
2095
+ flex-direction: column;
2096
+ align-items: flex-start;
2097
+ gap: 2vw;
2098
+ }
2099
+
2100
+ .taskon-quest-rewards-gas-label {
2101
+ font-size: 3.2vw;
2102
+ line-height: 4vw;
2103
+ }
2104
+
2105
+ .taskon-quest-rewards-gas-bar {
2106
+ width: 100%;
2107
+ height: 1.6vw;
2108
+ }
2109
+
2110
+ .taskon-quest-rewards-gas-wave {
2111
+ width: 0.6vw;
2112
+ gap: 1.2vw;
2113
+ }
2114
+ }
2115
+
2116
+ /* ============================================================================
2117
+ View Leaderboard 按钮(链接样式,与原版一致)
2118
+ ============================================================================ */
2119
+
2120
+ .taskon-quest-rewards-view-leaderboard {
2121
+ display: inline-flex;
2122
+ align-items: center;
2123
+ gap: 8px;
2124
+ padding: 0;
2125
+ background: none;
2126
+ border: none;
2127
+ cursor: pointer;
2128
+ color: var(--taskon-link, #58afff);
2129
+ font-size: 14px;
2130
+ line-height: 18px;
2131
+ transition: opacity 0.2s ease;
2132
+ }
2133
+
2134
+ .taskon-quest-rewards-view-leaderboard:hover {
2135
+ opacity: 0.8;
2136
+ }
2137
+
2138
+ .taskon-quest-rewards-view-leaderboard-icon {
2139
+ display: none; /* 原版无图标 */
2140
+ }
2141
+
2142
+ .taskon-quest-rewards-view-leaderboard-text {
2143
+ font-size: 14px;
2144
+ font-weight: 400;
2145
+ }
2146
+
2147
+ .taskon-quest-rewards-view-leaderboard-arrow {
2148
+ font-size: 12px;
2149
+ margin-left: 4px;
2150
+ }
2151
+
2152
+ /* ============================================================================
2153
+ Leaderboard 弹窗样式
2154
+ ============================================================================ */
2155
+
2156
+ .taskon-quest-leaderboard-modal {
2157
+ background: var(--taskon-bg-card, #1a1a1a);
2158
+ }
2159
+
2160
+ .taskon-quest-leaderboard-content {
2161
+ display: flex;
2162
+ flex-direction: column;
2163
+ gap: 16px;
2164
+ }
2165
+
2166
+ .taskon-quest-leaderboard-title {
2167
+ margin: 0;
2168
+ font-size: 24px;
2169
+ font-weight: 600;
2170
+ color: var(--taskon-text-primary, #fff);
2171
+ }
2172
+
2173
+ .taskon-quest-leaderboard-subtitle {
2174
+ margin: 0;
2175
+ font-size: 14px;
2176
+ color: var(--taskon-text-secondary, rgba(255, 255, 255, 0.7));
2177
+ }
2178
+
2179
+ .taskon-quest-leaderboard-error {
2180
+ display: flex;
2181
+ flex-direction: column;
2182
+ align-items: center;
2183
+ gap: 12px;
2184
+ padding: 24px;
2185
+ text-align: center;
2186
+ color: var(--taskon-text-secondary, rgba(255, 255, 255, 0.7));
2187
+ }
2188
+
2189
+ .taskon-quest-leaderboard-table {
2190
+ margin-top: 8px;
2191
+ }
2192
+
2193
+ .taskon-quest-leaderboard-pagination {
2194
+ display: flex;
2195
+ justify-content: center;
2196
+ margin-top: 16px;
2197
+ }
2198
+
2199
+ /* 排名徽章 */
2200
+ .taskon-quest-leaderboard-rank {
2201
+ display: inline-flex;
2202
+ align-items: center;
2203
+ font-size: 14px;
2204
+ font-weight: 500;
2205
+ color: var(--taskon-text-primary, #fff);
2206
+ }
2207
+
2208
+ /* Unranked / N/A 状态 */
2209
+ .taskon-quest-leaderboard-rank--unranked {
2210
+ font-size: 14px;
2211
+ font-weight: 500;
2212
+ color: var(--taskon-text-tertiary, rgba(255, 255, 255, 0.5));
2213
+ }
2214
+
2215
+ /* 表头带提示框的容器 */
2216
+ .taskon-quest-leaderboard-header {
2217
+ display: inline-flex;
2218
+ align-items: center;
2219
+ gap: 4px;
2220
+ }
2221
+
2222
+ /* 层级列 */
2223
+ .taskon-quest-leaderboard-tier {
2224
+ font-size: 14px;
2225
+ font-weight: 500;
2226
+ color: var(--taskon-text-primary, #fff);
2227
+ }
2228
+
2229
+ /* 用户单元格 */
2230
+ .taskon-quest-leaderboard-user {
2231
+ display: flex;
2232
+ align-items: center;
2233
+ }
2234
+
2235
+ .taskon-quest-leaderboard-user--current {
2236
+ justify-content: flex-start;
2237
+ }
2238
+
2239
+ .taskon-quest-leaderboard-user-badge {
2240
+ padding: 2px 8px;
2241
+ font-size: 12px;
2242
+ font-weight: 600;
2243
+ color: var(--taskon-bg-body, #111);
2244
+ background: var(--taskon-secondary, #00ffa3);
2245
+ border-radius: 4px;
2246
+ }
2247
+
2248
+ .taskon-quest-leaderboard-user-name {
2249
+ font-size: 14px;
2250
+ color: var(--taskon-text-primary, #fff);
2251
+ overflow: hidden;
2252
+ text-overflow: ellipsis;
2253
+ white-space: nowrap;
2254
+ }
2255
+
2256
+ /* 积分 */
2257
+ .taskon-quest-leaderboard-points {
2258
+ font-size: 14px;
2259
+ font-weight: 500;
2260
+ color: var(--taskon-text-primary, #fff);
2261
+ }
2262
+
2263
+ /* 奖励 */
2264
+ .taskon-quest-leaderboard-reward-cell {
2265
+ display: inline-flex;
2266
+ align-items: center;
2267
+ gap: 4px;
2268
+ text-align: right;
2269
+ }
2270
+
2271
+ .taskon-quest-leaderboard-reward-type {
2272
+ font-size: 14px;
2273
+ font-weight: 600;
2274
+ color: var(--taskon-text-primary, #fff);
2275
+ }
2276
+
2277
+ .taskon-quest-leaderboard-reward {
2278
+ font-size: 14px;
2279
+ font-weight: 600;
2280
+ color: var(--taskon-primary, #cbff01);
2281
+ }
2282
+
2283
+ .taskon-quest-leaderboard-not-qualified {
2284
+ font-size: 14px;
2285
+ font-weight: 600;
2286
+ color: var(--taskon-text-tertiary, rgba(255, 255, 255, 0.5));
2287
+ }
2288
+
2289
+ .taskon-quest-leaderboard-no-reward {
2290
+ font-size: 14px;
2291
+ color: var(--taskon-text-tertiary, rgba(255, 255, 255, 0.5));
2292
+ }
2293
+ /**
2294
+ * RewardModuleDialog styles
2295
+ * Scope UserCenter module styles inside Quest popup
2296
+ */
2297
+
2298
+ .taskon-quest-reward-dialog .taskon-user-center {
2299
+ padding: 32px 0 0 0;
2300
+ background: transparent;
2301
+ border-radius: 0;
2302
+ gap: 24px;
2303
+ }
2304
+
2305
+ .taskon-quest-reward-dialog .taskon-my-rewards {
2306
+ gap: 24px;
2307
+ }
2308
+
2309
+ .taskon-quest-reward-dialog .taskon-my-rewards__section {
2310
+ gap: 16px;
2311
+ }
2312
+
2313
+ .taskon-quest-reward-dialog .taskon-points-list {
2314
+ background: transparent;
2315
+ }
2316
+ /**
2317
+ * OperateFooter styles
2318
+ * Following Widget naming convention: .taskon-quest-footer-*
2319
+ */
2320
+
2321
+ /* ============================================================================
2322
+ Main Container
2323
+ ============================================================================ */
2324
+
2325
+ .taskon-quest-footer {
2326
+ margin-top: 20px;
2327
+ position: relative;
2328
+ }
2329
+
2330
+ @media (max-width: 750px) {
2331
+ .taskon-quest-footer {
2332
+ margin-top: 0;
2333
+ }
2334
+ }
2335
+
2336
+ /* ============================================================================
2337
+ Status Card - New Design (v2)
2338
+ ============================================================================ */
2339
+
2340
+ /* Container for the entire status section */
2341
+ .taskon-quest-footer-status {
2342
+ display: flex;
2343
+ flex-direction: column;
2344
+ gap: 12px;
2345
+ }
2346
+
2347
+ /* Title row: title + badge */
2348
+ .taskon-quest-footer-title-row {
2349
+ display: flex;
2350
+ align-items: center;
2351
+ gap: 8px;
2352
+ }
2353
+
2354
+ /* Badge styles */
2355
+ .taskon-quest-footer-badge {
2356
+ display: inline-flex;
2357
+ align-items: center;
2358
+ justify-content: center;
2359
+ height: 20px;
2360
+ padding: 0 8px;
2361
+ border-radius: 12px;
2362
+ font-size: 12px;
2363
+ font-weight: 600;
2364
+ line-height: 16px;
2365
+ text-transform: uppercase;
2366
+ }
2367
+
2368
+ .taskon-quest-footer-badge--winner {
2369
+ color: #cbff01;
2370
+ background: linear-gradient(
2371
+ 90deg,
2372
+ rgba(203, 255, 1, 0.1) 0%,
2373
+ rgba(203, 255, 1, 0.1) 100%
2374
+ ),
2375
+ linear-gradient(
2376
+ 90deg,
2377
+ rgba(255, 255, 255, 0.1) 0%,
2378
+ rgba(255, 255, 255, 0.1) 100%
2379
+ );
2380
+ }
2381
+
2382
+ .taskon-quest-footer-badge--qualifier,
2383
+ .taskon-quest-footer-badge--submitter {
2384
+ color: #1affab;
2385
+ background: linear-gradient(
2386
+ 90deg,
2387
+ rgba(26, 255, 171, 0.1) 0%,
2388
+ rgba(26, 255, 171, 0.1) 100%
2389
+ ),
2390
+ linear-gradient(
2391
+ 90deg,
2392
+ rgba(255, 255, 255, 0.1) 0%,
2393
+ rgba(255, 255, 255, 0.1) 100%
2394
+ );
2395
+ }
2396
+
2397
+ /* Dark content card */
2398
+ .taskon-quest-footer-card {
2399
+ display: flex;
2400
+ gap: 12px;
2401
+ align-items: center;
2402
+ padding: 12px;
2403
+ border-radius: 8px;
2404
+ background: linear-gradient(
2405
+ 90deg,
2406
+ rgba(255, 255, 255, 0.1) 0%,
2407
+ rgba(255, 255, 255, 0.1) 100%
2408
+ ),
2409
+ linear-gradient(90deg, #0d0d0d 0%, #0d0d0d 100%);
2410
+ }
2411
+
2412
+ @media (max-width: 750px) {
2413
+ .taskon-quest-footer-card {
2414
+ flex-direction: column;
2415
+ align-items: stretch;
2416
+ gap: 8px;
2417
+ padding: 3.2vw;
2418
+ }
2419
+ }
2420
+
2421
+ /* Card message text (for simple messages) */
2422
+ .taskon-quest-footer-card-message {
2423
+ font-size: 16px;
2424
+ font-weight: 600;
2425
+ line-height: 24px;
2426
+ color: #fff;
2427
+ }
2428
+
2429
+ /* ============================================================================
2430
+ Status Card - Legacy styles (keep for compatibility)
2431
+ ============================================================================ */
2432
+
2433
+ /* Card content area */
2434
+ .taskon-quest-footer-card-content {
2435
+ display: flex;
2436
+ flex-direction: column;
2437
+ gap: 2px;
2438
+ }
2439
+
2440
+ /* ============================================================================
2441
+ Title and Description - New Design (v2)
2442
+ ============================================================================ */
2443
+
2444
+ .taskon-quest-footer-title {
2445
+ font-size: 20px;
2446
+ font-weight: 600;
2447
+ line-height: 28px;
2448
+ color: #fff;
2449
+ }
2450
+
2451
+ @media (max-width: 750px) {
2452
+ .taskon-quest-footer-title {
2453
+ font-size: 4.267vw;
2454
+ line-height: 5.867vw;
2455
+ }
2456
+ }
2457
+
2458
+ .taskon-quest-footer-desc {
2459
+ margin-top: 2px;
2460
+ font-size: 14px;
2461
+ font-weight: 500;
2462
+ line-height: 18px;
2463
+ color: rgba(255, 255, 255, 0.6);
2464
+ }
2465
+
2466
+ @media (max-width: 750px) {
2467
+ .taskon-quest-footer-desc {
2468
+ margin-top: 0.533vw;
2469
+ font-size: 3.2vw;
2470
+ line-height: 3.733vw;
2471
+ }
2472
+ }
2473
+
2474
+ /* ============================================================================
2475
+ Connect Wallet
2476
+ ============================================================================ */
2477
+
2478
+ .taskon-quest-footer-connect {
2479
+ display: flex;
2480
+ justify-content: center;
2481
+ }
2482
+
2483
+ .taskon-quest-footer-connect-btn {
2484
+ width: 100%;
2485
+ padding: 12px 24px;
2486
+ font-size: 16px;
2487
+ font-weight: 600;
2488
+ color: #000;
2489
+ background-color: #cbff01;
2490
+ border: none;
2491
+ border-radius: 8px;
2492
+ cursor: pointer;
2493
+ transition: background-color 0.2s ease;
2494
+ }
2495
+
2496
+ .taskon-quest-footer-connect-btn:hover {
2497
+ background-color: #b8e600;
2498
+ }
2499
+
2500
+ /* ============================================================================
2501
+ Complete Button
2502
+ ============================================================================ */
2503
+
2504
+ .taskon-quest-footer-complete-btn {
2505
+ width: 100%;
2506
+ padding: 12px 24px;
2507
+ font-size: 16px;
2508
+ font-weight: 600;
2509
+ color: #000;
2510
+ background-color: #cbff01;
2511
+ border: none;
2512
+ border-radius: 8px;
2513
+ cursor: pointer;
2514
+ transition: background-color 0.2s ease, opacity 0.2s ease;
2515
+ }
2516
+
2517
+ .taskon-quest-footer-complete-btn:hover:not(:disabled) {
2518
+ background-color: #b8e600;
2519
+ }
2520
+
2521
+ .taskon-quest-footer-complete-btn:disabled {
2522
+ opacity: 0.5;
2523
+ cursor: not-allowed;
2524
+ }
2525
+
2526
+ @media (max-width: 750px) {
2527
+ .taskon-quest-footer-complete-btn {
2528
+ height: 13.33vw;
2529
+ font-weight: bold;
2530
+ }
2531
+ }
2532
+
2533
+ /* Complete Button Loading State */
2534
+ .taskon-quest-footer-complete-btn--loading {
2535
+ pointer-events: none;
2536
+ }
2537
+
2538
+ .taskon-quest-footer-complete-btn-loading {
2539
+ display: flex;
2540
+ align-items: center;
2541
+ justify-content: center;
2542
+ gap: 8px;
2543
+ }
2544
+
2545
+ .taskon-quest-footer-complete-btn-spinner {
2546
+ width: 16px;
2547
+ height: 16px;
2548
+ border: 2px solid rgba(0, 0, 0, 0.2);
2549
+ border-top-color: #000;
2550
+ border-radius: 50%;
2551
+ animation: taskon-spin 0.8s linear infinite;
2552
+ }
2553
+
2554
+ @keyframes taskon-spin {
2555
+ to {
2556
+ transform: rotate(360deg);
2557
+ }
2558
+ }
2559
+
2560
+ /* ============================================================================
2561
+ Earned Rewards Placeholder (will be replaced in phase 4)
2562
+ ============================================================================ */
2563
+
2564
+ .taskon-quest-footer-earned-placeholder {
2565
+ margin-top: 10px;
2566
+ display: flex;
2567
+ align-items: center;
2568
+ gap: 10px;
2569
+ overflow: auto;
2570
+ }
2571
+
2572
+ .taskon-quest-footer-earned-hint {
2573
+ font-size: 14px;
2574
+ font-weight: 500;
2575
+ color: rgba(0, 0, 0, 0.6);
2576
+ }
2577
+
2578
+ @media (max-width: 750px) {
2579
+ .taskon-quest-footer-earned-placeholder {
2580
+ margin-top: 2vw;
2581
+ gap: 2.267vw;
2582
+ }
2583
+ }
2584
+
2585
+ /* ============================================================================
2586
+ Earned Rewards - New Design (v2)
2587
+ ============================================================================ */
2588
+
2589
+ .taskon-quest-footer-earned {
2590
+ display: flex;
2591
+ flex-direction: column;
2592
+ gap: 0;
2593
+ overflow: visible;
2594
+ margin-top: 0;
2595
+ }
2596
+
2597
+ @media (max-width: 750px) {
2598
+ .taskon-quest-footer-earned {
2599
+ gap: 0;
2600
+ }
2601
+ }
2602
+
2603
+ .taskon-quest-footer-earned-list {
2604
+ display: flex;
2605
+ flex-direction: column;
2606
+ gap: 0;
2607
+ }
2608
+
2609
+ /* Single reward inner card */
2610
+ .taskon-quest-footer-earned-single {
2611
+ display: flex;
2612
+ flex-direction: column;
2613
+ gap: 0;
2614
+ padding: 8px;
2615
+ border-radius: 8px;
2616
+ border: 1px solid rgba(255, 255, 255, 0.04);
2617
+ background: linear-gradient(
2618
+ 90deg,
2619
+ rgba(255, 255, 255, 0.04) 0%,
2620
+ rgba(255, 255, 255, 0.04) 100%
2621
+ ),
2622
+ linear-gradient(90deg, #0d0d0d 0%, #0d0d0d 100%);
2623
+ }
2624
+
2625
+ .taskon-quest-footer-earned-single-row {
2626
+ display: flex;
2627
+ align-items: center;
2628
+ gap: 8px;
2629
+ }
2630
+
2631
+ .taskon-quest-footer-earned-single-info {
2632
+ display: flex;
2633
+ align-items: center;
2634
+ gap: 4px;
2635
+ }
2636
+
2637
+ .taskon-quest-footer-earned-single-icon {
2638
+ width: 20px;
2639
+ height: 20px;
2640
+ border-radius: 50%;
2641
+ object-fit: cover;
2642
+ }
2643
+
2644
+ .taskon-quest-footer-earned-single-type {
2645
+ font-size: 18px;
2646
+ font-weight: 600;
2647
+ line-height: 24px;
2648
+ color: #fff;
2649
+ }
2650
+
2651
+ .taskon-quest-footer-earned-single-name {
2652
+ font-size: 12px;
2653
+ font-weight: 500;
2654
+ line-height: normal;
2655
+ color: rgba(255, 255, 255, 0.4);
2656
+ text-transform: capitalize;
2657
+ }
2658
+
2659
+ /* Multi reward row */
2660
+ .taskon-quest-footer-earned-multi {
2661
+ display: flex;
2662
+ align-items: center;
2663
+ gap: 12px;
2664
+ }
2665
+
2666
+ .taskon-quest-footer-earned-multi-text {
2667
+ font-size: 16px;
2668
+ font-weight: 600;
2669
+ line-height: 24px;
2670
+ color: #fff;
2671
+ }
2672
+
2673
+ /* Redirect mode row (same layout as multi) */
2674
+ .taskon-quest-footer-earned-redirect {
2675
+ display: flex;
2676
+ align-items: center;
2677
+ gap: 12px;
2678
+ }
2679
+
2680
+ .taskon-quest-footer-earned-redirect-text {
2681
+ font-size: 16px;
2682
+ font-weight: 600;
2683
+ line-height: 24px;
2684
+ color: #fff;
2685
+ flex: 1;
2686
+ }
2687
+
2688
+ /* Hide first reward on mobile when has multiple rewards */
2689
+ @media (max-width: 750px) {
2690
+ .taskon-quest-footer-earned-first--hide-mobile {
2691
+ display: none;
2692
+ }
2693
+ }
2694
+
2695
+ .taskon-quest-footer-earned-more {
2696
+ display: flex;
2697
+ flex-direction: column;
2698
+ justify-content: center;
2699
+ align-items: flex-start;
2700
+ flex: 1;
2701
+ gap: 4px;
2702
+ overflow: hidden;
2703
+ border-radius: 4px;
2704
+ background-color: #000;
2705
+ padding: 4px 8px;
2706
+ }
2707
+
2708
+ @media (max-width: 750px) {
2709
+ .taskon-quest-footer-earned-more {
2710
+ flex-direction: row;
2711
+ align-items: center;
2712
+ gap: 3vw;
2713
+ padding: 2vw;
2714
+ }
2715
+ }
2716
+
2717
+ /* ============================================================================
2718
+ Reward Card (for future implementation)
2719
+ ============================================================================ */
2720
+
2721
+ .taskon-quest-footer-reward {
2722
+ display: flex;
2723
+ flex-direction: column;
2724
+ justify-content: center;
2725
+ flex: 1;
2726
+ border-radius: 4px;
2727
+ background-color: #000;
2728
+ padding: 4px 8px;
2729
+ }
2730
+
2731
+ @media (max-width: 750px) {
2732
+ .taskon-quest-footer-reward {
2733
+ padding: 2vw;
2734
+ }
2735
+ }
2736
+
2737
+ /* ============================================================================
2738
+ Base Info (for future implementation)
2739
+ ============================================================================ */
2740
+
2741
+ .taskon-quest-footer-reward-info {
2742
+ display: flex;
2743
+ align-items: center;
2744
+ gap: 4px;
2745
+ font-size: 18px;
2746
+ }
2747
+
2748
+ @media (max-width: 750px) {
2749
+ .taskon-quest-footer-reward-info {
2750
+ gap: 2vw;
2751
+ }
2752
+ }
2753
+
2754
+ .taskon-quest-footer-reward-info img {
2755
+ height: 20px;
2756
+ width: 20px;
2757
+ border-radius: 50%;
2758
+ object-fit: cover;
2759
+ }
2760
+
2761
+ @media (max-width: 750px) {
2762
+ .taskon-quest-footer-reward-info img {
2763
+ height: 8vw;
2764
+ width: 8vw;
2765
+ }
2766
+ }
2767
+
2768
+ .taskon-quest-footer-reward-amount {
2769
+ color: #cbff01;
2770
+ }
2771
+
2772
+ .taskon-quest-footer-reward-type {
2773
+ color: #fff;
2774
+ }
2775
+
2776
+ .taskon-quest-footer-reward-name {
2777
+ color: #cbff01;
2778
+ }
2779
+
2780
+ /* ============================================================================
2781
+ Action Button (for future implementation)
2782
+ ============================================================================ */
2783
+
2784
+ .taskon-quest-footer-action-btn {
2785
+ display: flex;
2786
+ align-items: center;
2787
+ gap: 4px;
2788
+ font-size: 14px;
2789
+ color: rgba(255, 255, 255, 0.6);
2790
+ cursor: pointer;
2791
+ transition: color 0.2s ease;
2792
+ }
2793
+
2794
+ .taskon-quest-footer-action-btn:not(.taskon-quest-footer-action-btn--disabled):hover {
2795
+ color: rgba(255, 255, 255, 0.8);
2796
+ }
2797
+
2798
+ .taskon-quest-footer-action-btn--disabled {
2799
+ cursor: not-allowed;
2800
+ }
2801
+
2802
+ /* ============================================================================
2803
+ Claim Button (for future implementation)
2804
+ ============================================================================ */
2805
+
2806
+ .taskon-quest-footer-claim-btn {
2807
+ padding: 4px 12px;
2808
+ font-size: 14px;
2809
+ font-weight: 600;
2810
+ color: #000;
2811
+ background-color: #cbff01;
2812
+ border: none;
2813
+ border-radius: 4px;
2814
+ cursor: pointer;
2815
+ transition: background-color 0.2s ease, opacity 0.2s ease;
2816
+ }
2817
+
2818
+ .taskon-quest-footer-claim-btn:hover:not(:disabled) {
2819
+ background-color: #b8e600;
2820
+ }
2821
+
2822
+ .taskon-quest-footer-claim-btn:disabled {
2823
+ opacity: 0.5;
2824
+ cursor: not-allowed;
2825
+ }
2826
+
2827
+ .taskon-quest-footer-claim-btn--loading {
2828
+ pointer-events: none;
2829
+ }
2830
+
2831
+ .taskon-quest-footer-claim-btn-spinner {
2832
+ width: 14px;
2833
+ height: 14px;
2834
+ border: 2px solid rgba(0, 0, 0, 0.2);
2835
+ border-top-color: #000;
2836
+ border-radius: 50%;
2837
+ animation: taskon-spin 0.8s linear infinite;
2838
+ }
2839
+
2840
+ /* ============================================================================
2841
+ Earned Rewards - More section
2842
+ ============================================================================ */
2843
+
2844
+ .taskon-quest-footer-earned-more-text {
2845
+ font-size: 14px;
2846
+ font-weight: 600;
2847
+ color: #fff;
2848
+ }
2849
+
2850
+ /* ============================================================================
2851
+ Reward Card - Row layout
2852
+ ============================================================================ */
2853
+
2854
+ .taskon-quest-footer-reward-row {
2855
+ display: flex;
2856
+ align-items: center;
2857
+ gap: 8px;
2858
+ flex-wrap: wrap;
2859
+ }
2860
+
2861
+ /* ============================================================================
2862
+ Reward Badges
2863
+ ============================================================================ */
2864
+
2865
+ .taskon-quest-footer-reward-badges {
2866
+ display: flex;
2867
+ align-items: center;
2868
+ gap: 4px;
2869
+ }
2870
+
2871
+ .taskon-quest-footer-reward-badge {
2872
+ display: inline-flex;
2873
+ align-items: center;
2874
+ padding: 2px 6px;
2875
+ font-size: 12px;
2876
+ font-weight: 500;
2877
+ color: #000;
2878
+ background-color: rgba(203, 255, 1, 0.8);
2879
+ border-radius: 2px;
2880
+ }
2881
+
2882
+ .taskon-quest-footer-reward-badge-icon {
2883
+ margin-left: 4px;
2884
+ width: 18px;
2885
+ height: 18px;
2886
+ object-fit: cover;
2887
+ }
2888
+
2889
+ @media (max-width: 750px) {
2890
+ .taskon-quest-footer-reward-badge-icon {
2891
+ margin-left: 1.067vw;
2892
+ width: 3.2vw;
2893
+ height: 3.2vw;
2894
+ }
2895
+ }
2896
+
2897
+ .taskon-quest-footer-reward-badge-line {
2898
+ margin-left: 4px;
2899
+ width: 1px;
2900
+ height: 10px;
2901
+ opacity: 0.1;
2902
+ background: #d9d9d9;
2903
+ }
2904
+
2905
+ @media (max-width: 750px) {
2906
+ .taskon-quest-footer-reward-badge-line {
2907
+ margin-left: 0.8vw;
2908
+ height: 2.267vw;
2909
+ }
2910
+ }
2911
+
2912
+ /* ============================================================================
2913
+ Reward - Tx Hash
2914
+ ============================================================================ */
2915
+
2916
+ .taskon-quest-footer-reward-tx {
2917
+ display: flex;
2918
+ align-items: center;
2919
+ gap: 4px;
2920
+ font-size: 14px;
2921
+ }
2922
+
2923
+ .taskon-quest-footer-reward-tx-label {
2924
+ color: rgba(255, 255, 255, 0.6);
2925
+ }
2926
+
2927
+ .taskon-quest-footer-reward-tx-link {
2928
+ color: #fff;
2929
+ text-decoration: none;
2930
+ }
2931
+
2932
+ .taskon-quest-footer-reward-tx-link:hover {
2933
+ text-decoration: underline;
2934
+ }
2935
+
2936
+ /* ============================================================================
2937
+ Reward - Dropping status
2938
+ ============================================================================ */
2939
+
2940
+ .taskon-quest-footer-reward-dropping {
2941
+ margin-top: 4px;
2942
+ font-size: 14px;
2943
+ color: rgba(255, 255, 255, 0.6);
2944
+ }
2945
+
2946
+ /* ============================================================================
2947
+ Reward Chain Icon
2948
+ ============================================================================ */
2949
+
2950
+ .taskon-quest-footer-reward-chain-icon {
2951
+ width: 20px;
2952
+ height: 20px;
2953
+ border-radius: 50%;
2954
+ object-fit: cover;
2955
+ }
2956
+
2957
+ @media (max-width: 750px) {
2958
+ .taskon-quest-footer-reward-chain-icon {
2959
+ width: 8vw;
2960
+ height: 8vw;
2961
+ }
2962
+ }
2963
+
2964
+ /* ============================================================================
2965
+ Detail Panel Dialog
2966
+ ============================================================================ */
2967
+
2968
+ .taskon-quest-footer-detail-dialog {
2969
+ background-color: #1a1a1a;
2970
+ }
2971
+
2972
+ .taskon-quest-footer-detail-panel {
2973
+ padding: 0;
2974
+ }
2975
+
2976
+ .taskon-quest-footer-detail-title {
2977
+ font-size: 22px;
2978
+ font-weight: 600;
2979
+ color: #fff;
2980
+ margin: 0 0 20px 0;
2981
+ }
2982
+
2983
+ @media (max-width: 750px) {
2984
+ .taskon-quest-footer-detail-title {
2985
+ font-size: 4.8vw;
2986
+ margin-bottom: 4vw;
2987
+ }
2988
+ }
2989
+
2990
+ .taskon-quest-footer-detail-content {
2991
+ display: flex;
2992
+ flex-direction: column;
2993
+ gap: 24px;
2994
+ }
2995
+
2996
+ @media (max-width: 750px) {
2997
+ .taskon-quest-footer-detail-content {
2998
+ gap: 5vw;
2999
+ }
3000
+ }
3001
+
3002
+ /* ============================================================================
3003
+ Selection Item
3004
+ ============================================================================ */
3005
+
3006
+ .taskon-quest-footer-selection-item {
3007
+ /* spacing handled by parent gap */
3008
+ }
3009
+
3010
+ .taskon-quest-footer-selection-item + .taskon-quest-footer-selection-item {
3011
+ margin-top: 24px;
3012
+ }
3013
+
3014
+ @media (max-width: 750px) {
3015
+ .taskon-quest-footer-selection-item + .taskon-quest-footer-selection-item {
3016
+ margin-top: 5vw;
3017
+ }
3018
+ }
3019
+
3020
+ .taskon-quest-footer-selection-label {
3021
+ font-size: 16px;
3022
+ font-weight: 500;
3023
+ color: rgba(255, 255, 255, 0.8);
3024
+ }
3025
+
3026
+ .taskon-quest-footer-selection-rewards {
3027
+ margin-top: 10px;
3028
+ display: flex;
3029
+ flex-direction: column;
3030
+ gap: 24px;
3031
+ }
3032
+
3033
+ @media (max-width: 750px) {
3034
+ .taskon-quest-footer-selection-rewards {
3035
+ margin-top: 2vw;
3036
+ gap: 5vw;
3037
+ }
3038
+ }
3039
+
3040
+ /* Selection Item - Transparent reward card background */
3041
+ .taskon-quest-footer-selection-rewards .taskon-quest-footer-reward {
3042
+ background: transparent;
3043
+ }
3044
+
3045
+ /* Selection Failed */
3046
+ .taskon-quest-footer-selection-failed {
3047
+ display: flex;
3048
+ align-items: center;
3049
+ gap: 6px;
3050
+ font-size: 14px;
3051
+ line-height: 18px;
3052
+ color: rgba(255, 255, 255, 0.6);
3053
+ }
3054
+
3055
+ .taskon-quest-footer-selection-failed-icon {
3056
+ width: 16px;
3057
+ height: 16px;
3058
+ }
3059
+
3060
+ /* Selection Wait */
3061
+ .taskon-quest-footer-selection-wait {
3062
+ display: flex;
3063
+ align-items: center;
3064
+ gap: 8px;
3065
+ font-size: 14px;
3066
+ font-weight: 500;
3067
+ line-height: 16px;
3068
+ color: #fff;
3069
+ }
3070
+
3071
+ .taskon-quest-footer-selection-wait-icon {
3072
+ width: 34px;
3073
+ height: 34px;
3074
+ }
3075
+
3076
+ /* ============================================================================
3077
+ Detail Panel - Bonus Section
3078
+ ============================================================================ */
3079
+
3080
+ .taskon-quest-footer-detail-bonus {
3081
+ margin-top: 24px;
3082
+ padding-top: 24px;
3083
+ display: flex;
3084
+ border-top: 1px solid rgba(255, 255, 255, 0.06);
3085
+ }
3086
+
3087
+ @media (max-width: 750px) {
3088
+ .taskon-quest-footer-detail-bonus {
3089
+ margin-top: 5vw;
3090
+ padding-top: 0;
3091
+ border-top: none;
3092
+ }
3093
+ }
3094
+
3095
+ .taskon-quest-footer-detail-bonus-label {
3096
+ font-size: 16px;
3097
+ font-weight: 500;
3098
+ color: rgba(255, 255, 255, 0.8);
3099
+ }
3100
+
3101
+ .taskon-quest-footer-detail-bonus-right {
3102
+ flex: 1;
3103
+ text-align: right;
3104
+ }
3105
+
3106
+ .taskon-quest-footer-detail-bonus-item {
3107
+ font-size: 14px;
3108
+ font-weight: 600;
3109
+ text-align: right;
3110
+ color: #fff;
3111
+ }
3112
+
3113
+ .taskon-quest-footer-detail-bonus-item + .taskon-quest-footer-detail-bonus-item {
3114
+ margin-top: 8px;
3115
+ }
3116
+
3117
+ @media (max-width: 750px) {
3118
+ .taskon-quest-footer-detail-bonus-item + .taskon-quest-footer-detail-bonus-item {
3119
+ margin-top: 2vw;
3120
+ }
3121
+ }
3122
+
3123
+ /* ============================================================================
3124
+ Action Button - Arrow icon
3125
+ ============================================================================ */
3126
+
3127
+ .taskon-quest-footer-action-arrow {
3128
+ width: 6px;
3129
+ height: 10px;
3130
+ }
3131
+
3132
+ /* Link style for ActionButton */
3133
+ a.taskon-quest-footer-action-btn {
3134
+ text-decoration: none;
3135
+ }
3136
+ /**
3137
+ * TaskValidationDialog Styles
3138
+ * @module widgets/Quest/components/OperateFooter/styles/task-validation-dialog
3139
+ */
3140
+
3141
+ .taskon-task-validation-dialog {
3142
+ display: flex;
3143
+ flex-direction: column;
3144
+ align-items: center;
3145
+ padding: 24px;
3146
+ text-align: center;
3147
+ }
3148
+
3149
+ .taskon-task-validation-dialog-icon-wrap {
3150
+ margin-bottom: 16px;
3151
+ }
3152
+
3153
+ .taskon-task-validation-dialog-icon {
3154
+ width: 48px;
3155
+ height: 48px;
3156
+ }
3157
+
3158
+ .taskon-task-validation-dialog-message {
3159
+ margin: 0;
3160
+ margin-bottom: 16px;
3161
+ font-size: 16px;
3162
+ line-height: 1.5;
3163
+ color: rgba(255, 255, 255, 0.9);
3164
+ }
3165
+
3166
+ .taskon-task-validation-dialog-progress {
3167
+ margin: 0;
3168
+ margin-bottom: 16px;
3169
+ font-size: 14px;
3170
+ line-height: 1.5;
3171
+ color: rgba(255, 255, 255, 0.6);
3172
+ }
3173
+
3174
+ .taskon-task-validation-dialog-btn {
3175
+ width: 100%;
3176
+ max-width: 200px;
3177
+ padding: 12px 24px;
3178
+ border: none;
3179
+ border-radius: 8px;
3180
+ background: #cbff01;
3181
+ color: #000;
3182
+ font-size: 16px;
3183
+ font-weight: 600;
3184
+ cursor: pointer;
3185
+ transition: opacity 0.2s ease;
3186
+ }
3187
+
3188
+ .taskon-task-validation-dialog-btn:hover {
3189
+ opacity: 0.9;
3190
+ }
3191
+
3192
+ .taskon-task-validation-dialog-btn:active {
3193
+ opacity: 0.8;
3194
+ }
3195
+ /**
3196
+ * RewardBindDialog Styles
3197
+ * @module widgets/Quest/components/OperateFooter/styles/reward-bind-dialog
3198
+ */
3199
+
3200
+ .taskon-reward-bind-dialog {
3201
+ padding: 16px 24px 24px;
3202
+ }
3203
+
3204
+ .taskon-reward-bind-tip {
3205
+ margin: 0;
3206
+ margin-bottom: 20px;
3207
+ font-size: 14px;
3208
+ line-height: 1.6;
3209
+ color: rgba(255, 255, 255, 0.7);
3210
+ }
3211
+
3212
+ .taskon-reward-bind-list {
3213
+ display: flex;
3214
+ flex-direction: column;
3215
+ gap: 12px;
3216
+ }
3217
+
3218
+ .taskon-reward-bind-item {
3219
+ display: flex;
3220
+ align-items: center;
3221
+ justify-content: space-between;
3222
+ padding: 12px 16px;
3223
+ background: rgba(255, 255, 255, 0.05);
3224
+ border-radius: 8px;
3225
+ border: 1px solid rgba(255, 255, 255, 0.1);
3226
+ }
3227
+
3228
+ .taskon-reward-bind-item--bound {
3229
+ border-color: rgba(26, 255, 171, 0.3);
3230
+ background: rgba(26, 255, 171, 0.05);
3231
+ }
3232
+
3233
+ .taskon-reward-bind-item-label {
3234
+ font-size: 14px;
3235
+ font-weight: 500;
3236
+ color: rgba(255, 255, 255, 0.9);
3237
+ }
3238
+
3239
+ .taskon-reward-bind-item-status {
3240
+ display: flex;
3241
+ align-items: center;
3242
+ gap: 6px;
3243
+ font-size: 13px;
3244
+ color: #1affab;
3245
+ }
3246
+
3247
+ .taskon-reward-bind-item-btn {
3248
+ display: flex;
3249
+ align-items: center;
3250
+ gap: 6px;
3251
+ padding: 8px 16px;
3252
+ border: none;
3253
+ border-radius: 6px;
3254
+ background: #cbff01;
3255
+ color: #000;
3256
+ font-size: 13px;
3257
+ font-weight: 600;
3258
+ cursor: pointer;
3259
+ transition: opacity 0.2s ease;
3260
+ }
3261
+
3262
+ .taskon-reward-bind-item-btn:hover:not(:disabled) {
3263
+ opacity: 0.9;
3264
+ }
3265
+
3266
+ .taskon-reward-bind-item-btn:disabled {
3267
+ opacity: 0.7;
3268
+ cursor: not-allowed;
3269
+ }
3270
+
3271
+ .taskon-reward-bind-item-spinner {
3272
+ width: 14px;
3273
+ height: 14px;
3274
+ animation: taskon-reward-bind-spin 1s linear infinite;
3275
+ }
3276
+
3277
+ @keyframes taskon-reward-bind-spin {
3278
+ from {
3279
+ transform: rotate(0deg);
3280
+ }
3281
+ to {
3282
+ transform: rotate(360deg);
3283
+ }
3284
+ }
3285
+
3286
+ .taskon-reward-bind-skip-btn {
3287
+ width: 100%;
3288
+ margin-top: 20px;
3289
+ padding: 14px 24px;
3290
+ border: 1px solid rgba(255, 255, 255, 0.2);
3291
+ border-radius: 8px;
3292
+ background: transparent;
3293
+ color: rgba(255, 255, 255, 0.9);
3294
+ font-size: 14px;
3295
+ font-weight: 500;
3296
+ cursor: pointer;
3297
+ transition: all 0.2s ease;
3298
+ }
3299
+
3300
+ .taskon-reward-bind-skip-btn:hover {
3301
+ background: rgba(255, 255, 255, 0.05);
3302
+ border-color: rgba(255, 255, 255, 0.3);
3303
+ }
3304
+ /**
3305
+ * DiscordBindDialog Styles
3306
+ * @module widgets/Quest/components/OperateFooter/styles/discord-bind-dialog
3307
+ */
3308
+
3309
+ .taskon-discord-bind-dialog {
3310
+ display: flex;
3311
+ flex-direction: column;
3312
+ align-items: center;
3313
+ padding: 24px;
3314
+ text-align: center;
3315
+ }
3316
+
3317
+ .taskon-discord-bind-dialog-icon-wrap {
3318
+ margin-bottom: 20px;
3319
+ }
3320
+
3321
+ .taskon-discord-bind-dialog-icon {
3322
+ width: 48px;
3323
+ height: 48px;
3324
+ }
3325
+
3326
+ .taskon-discord-bind-dialog-desc {
3327
+ margin: 0;
3328
+ margin-bottom: 24px;
3329
+ font-size: 14px;
3330
+ line-height: 1.6;
3331
+ color: rgba(255, 255, 255, 0.7);
3332
+ }
3333
+
3334
+ .taskon-discord-bind-dialog-buttons {
3335
+ display: flex;
3336
+ flex-direction: column;
3337
+ gap: 12px;
3338
+ width: 100%;
3339
+ }
3340
+
3341
+ .taskon-discord-bind-dialog-btn {
3342
+ width: 100%;
3343
+ padding: 14px 24px;
3344
+ border-radius: 8px;
3345
+ font-size: 14px;
3346
+ font-weight: 600;
3347
+ cursor: pointer;
3348
+ transition: all 0.2s ease;
3349
+ }
3350
+
3351
+ .taskon-discord-bind-dialog-btn--primary {
3352
+ border: none;
3353
+ background: #cbff01;
3354
+ color: #000;
3355
+ }
3356
+
3357
+ .taskon-discord-bind-dialog-btn--primary:hover {
3358
+ opacity: 0.9;
3359
+ }
3360
+
3361
+ .taskon-discord-bind-dialog-btn--secondary {
3362
+ border: 1px solid rgba(255, 255, 255, 0.2);
3363
+ background: transparent;
3364
+ color: rgba(255, 255, 255, 0.9);
3365
+ }
3366
+
3367
+ .taskon-discord-bind-dialog-btn--secondary:hover {
3368
+ background: rgba(255, 255, 255, 0.05);
3369
+ border-color: rgba(255, 255, 255, 0.3);
3370
+ }
3371
+ /**
3372
+ * WinnersRow 组件样式
3373
+ * 与 QuestRewards 卡片样式保持一致
3374
+ */
3375
+
3376
+ /* WinnersRow 容器 - 纯色背景,与 reward 卡片一致 */
3377
+ .taskon-quest-winners-row {
3378
+ display: flex;
3379
+ align-items: center;
3380
+ width: 100%;
3381
+ padding: 16px;
3382
+ border-radius: 10px;
3383
+ border: none;
3384
+ cursor: pointer;
3385
+ background: rgba(255, 255, 255, 0.04);
3386
+ transition: background-color 0.2s ease;
3387
+ }
3388
+
3389
+ .taskon-quest-winners-row:hover {
3390
+ background: rgba(255, 255, 255, 0.08);
3391
+ }
3392
+
3393
+ /* Winners 标签 */
3394
+ .taskon-quest-winners-row-label {
3395
+ font-size: 18px;
3396
+ font-weight: 500;
3397
+ line-height: 23px;
3398
+ color: #ffffff;
3399
+ }
3400
+
3401
+ /* 数量 */
3402
+ .taskon-quest-winners-row-count {
3403
+ flex: 1;
3404
+ margin-left: 8px;
3405
+ font-size: 18px;
3406
+ font-weight: 600;
3407
+ line-height: 23px;
3408
+ text-align: left;
3409
+ color: #00ffa3;
3410
+ }
3411
+
3412
+ /* 右箭头图标 */
3413
+ .taskon-quest-winners-row-arrow {
3414
+ width: 16px;
3415
+ height: 16px;
3416
+ color: rgba(255, 255, 255, 0.6);
3417
+ flex-shrink: 0;
3418
+ }
3419
+ /**
3420
+ * WinnersStatus Component Styles
3421
+ * @description Styles for winners status display including:
3422
+ * - POW review alert
3423
+ * - Drawing winners alert
3424
+ * - Winners row
3425
+ *
3426
+ * Reference: taskon-website/apps/website/src/common/CampaignStatus/
3427
+ */
3428
+
3429
+ /* ==========================================================================
3430
+ Container - Match reward module style
3431
+ ========================================================================== */
3432
+ .taskon-winners {
3433
+ border-radius: 10px;
3434
+ background: var(--taskon-bg-card, rgba(255, 255, 255, 0.04));
3435
+ overflow: hidden;
3436
+ }
3437
+
3438
+ /* ==========================================================================
3439
+ Status Alert (POW Reviewing / Drawing Winners)
3440
+ ========================================================================== */
3441
+ .taskon-winners-alert {
3442
+ display: flex;
3443
+ align-items: center;
3444
+ justify-content: center;
3445
+ gap: 8px;
3446
+ padding: 16px;
3447
+ background: rgba(255, 255, 255, 0.05);
3448
+ font-size: 16px;
3449
+ font-weight: 500;
3450
+ color: rgba(255, 255, 255, 0.7);
3451
+ text-decoration: none;
3452
+ transition: color 0.2s ease;
3453
+ }
3454
+
3455
+ .taskon-winners-alert:hover {
3456
+ color: rgba(255, 255, 255, 0.9);
3457
+ }
3458
+
3459
+ .taskon-winners-alert-icon {
3460
+ width: 12px;
3461
+ height: 12px;
3462
+ flex-shrink: 0;
3463
+ }
3464
+
3465
+ .taskon-winners-alert-text {
3466
+ flex: 1;
3467
+ }
3468
+
3469
+ .taskon-winners-alert-community {
3470
+ font-weight: 600;
3471
+ color: rgba(255, 255, 255, 0.9);
3472
+ }
3473
+
3474
+ .taskon-winners-alert-link-icon {
3475
+ width: 16px;
3476
+ height: 16px;
3477
+ flex-shrink: 0;
3478
+ }
3479
+
3480
+ /* ==========================================================================
3481
+ POW Review Info Card
3482
+ ========================================================================== */
3483
+ .taskon-winners-content {
3484
+ padding: 16px;
3485
+ }
3486
+
3487
+ .taskon-winners-pow-info {
3488
+ font-size: 12px;
3489
+ line-height: 1.5;
3490
+ color: rgba(255, 212, 101, 0.6);
3491
+ margin-bottom: 16px;
3492
+ }
3493
+
3494
+ .taskon-winners-pow-info-community {
3495
+ font-weight: 500;
3496
+ color: #ffd465;
3497
+ }
3498
+
3499
+ .taskon-winners-pow-info-only {
3500
+ font-weight: 500;
3501
+ color: #ffd465;
3502
+ }
3503
+
3504
+ /* ==========================================================================
3505
+ Status Info Card - Match reward module card style
3506
+ ========================================================================== */
3507
+ .taskon-winners-card {
3508
+ padding: 16px;
3509
+ border-radius: 8px;
3510
+ background: var(--taskon-bg-card, rgba(255, 255, 255, 0.04));
3511
+ display: flex;
3512
+ flex-direction: column;
3513
+ gap: 16px;
3514
+ }
3515
+
3516
+ .taskon-winners-card-row {
3517
+ display: flex;
3518
+ align-items: center;
3519
+ justify-content: space-between;
3520
+ font-size: 16px;
3521
+ }
3522
+
3523
+ .taskon-winners-card-label {
3524
+ font-weight: 500;
3525
+ color: rgba(255, 255, 255, 0.7);
3526
+ }
3527
+
3528
+ .taskon-winners-card-value {
3529
+ font-weight: 500;
3530
+ color: #9aff73;
3531
+ }
3532
+
3533
+ .taskon-winners-card-value--primary {
3534
+ font-weight: 600;
3535
+ color: var(--taskon-primary, #cbff01);
3536
+ }
3537
+
3538
+ /* ==========================================================================
3539
+ Winners Row (already has separate styles in winners-row.css)
3540
+ ========================================================================== */
3541
+
3542
+ /* Ensure winners row integrates well with status card */
3543
+ .taskon-winners-card .taskon-quest-winners-row {
3544
+ padding: 0;
3545
+ background: transparent;
3546
+ }
3547
+ /**
3548
+ * Quest Widget 基础样式
3549
+ * @description 采用 .taskon-quest-* 命名空间,避免样式冲突
3550
+ * @design 参考 Figma 设计稿
3551
+ */
3552
+
3553
+ /* ============================================================================
3554
+ CSS 变量定义
3555
+ ============================================================================ */
3556
+
3557
+ .taskon-quest {
3558
+ /* 颜色系统 */
3559
+ --taskon-quest-bg-body: #111111;
3560
+ --taskon-quest-text-lightest: #ffffff;
3561
+ --taskon-quest-text-lighter: rgba(255, 255, 255, 0.8);
3562
+ --taskon-quest-text-light: rgba(255, 255, 255, 0.6);
3563
+ --taskon-quest-text-dark: rgba(255, 255, 255, 0.4);
3564
+ --taskon-quest-text-darkest: rgba(255, 255, 255, 0.1);
3565
+ --taskon-quest-text-invisible: rgba(255, 255, 255, 0.04);
3566
+ --taskon-quest-primary: #cbff01;
3567
+ --taskon-quest-secondary: #1affab;
3568
+ --taskon-quest-link: #58afff;
3569
+ --taskon-quest-button-primary-color: #000000;
3570
+
3571
+ /* 间距系统 */
3572
+ --taskon-quest-spacing-xxs: 4px;
3573
+ --taskon-quest-spacing-xs: 8px;
3574
+ --taskon-quest-spacing-s: 12px;
3575
+ --taskon-quest-spacing-m: 16px;
3576
+ --taskon-quest-spacing-l: 20px;
3577
+ --taskon-quest-spacing-xl: 24px;
3578
+ --taskon-quest-spacing-xxl: 32px;
3579
+ --taskon-quest-spacing-3xl: 40px;
3580
+
3581
+ /* 圆角系统 */
3582
+ --taskon-quest-radius-s: 4px;
3583
+ --taskon-quest-radius-m: 6px;
3584
+ --taskon-quest-radius-l: 8px;
3585
+ --taskon-quest-radius-xl: 12px;
3586
+ }
3587
+
3588
+ /* ============================================================================
3589
+ Quest Widget 根容器
3590
+ ============================================================================ */
3591
+
3592
+ .taskon-quest {
3593
+ font-size: 16px;
3594
+ line-height: 1.5;
3595
+ color: var(--taskon-quest-text-lightest);
3596
+ background-color: var(--taskon-quest-bg-body);
3597
+ }
3598
+
3599
+ /* ============================================================================
3600
+ Loading 状态
3601
+ ============================================================================ */
3602
+
3603
+ .taskon-quest-loading {
3604
+ display: flex;
3605
+ flex-direction: column;
3606
+ align-items: center;
3607
+ justify-content: center;
3608
+ padding: 48px 24px;
3609
+ gap: 12px;
3610
+ color: var(--taskon-quest-text-light);
3611
+ }
3612
+
3613
+ .taskon-quest-loading-spinner {
3614
+ width: 32px;
3615
+ height: 32px;
3616
+ border: 3px solid var(--taskon-quest-text-darkest);
3617
+ border-top-color: var(--taskon-quest-primary);
3618
+ border-radius: 50%;
3619
+ animation: taskon-quest-spin 1s linear infinite;
3620
+ }
3621
+
3622
+ @keyframes taskon-quest-spin {
3623
+ to {
3624
+ transform: rotate(360deg);
3625
+ }
3626
+ }
3627
+
3628
+ /* ============================================================================
3629
+ Error 状态
3630
+ ============================================================================ */
3631
+
3632
+ .taskon-quest-error {
3633
+ display: flex;
3634
+ flex-direction: column;
3635
+ align-items: center;
3636
+ justify-content: center;
3637
+ padding: 48px 24px;
3638
+ gap: 12px;
3639
+ text-align: center;
3640
+ }
3641
+
3642
+ .taskon-quest-error-icon {
3643
+ font-size: 32px;
3644
+ }
3645
+
3646
+ .taskon-quest-error-message {
3647
+ color: #ef4444;
3648
+ font-size: 14px;
3649
+ }
3650
+
3651
+ .taskon-quest-error-retry {
3652
+ margin-top: 8px;
3653
+ padding: 8px 16px;
3654
+ font-size: 14px;
3655
+ color: var(--taskon-quest-text-lightest);
3656
+ background-color: var(--taskon-quest-primary);
3657
+ border: none;
3658
+ border-radius: var(--taskon-quest-radius-m);
3659
+ cursor: pointer;
3660
+ transition: background-color 0.2s;
3661
+ }
3662
+
3663
+ .taskon-quest-error-retry:hover {
3664
+ opacity: 0.9;
3665
+ }
3666
+
3667
+ /* ============================================================================
3668
+ Empty 状态
3669
+ ============================================================================ */
3670
+
3671
+ .taskon-quest-empty {
3672
+ display: flex;
3673
+ align-items: center;
3674
+ justify-content: center;
3675
+ padding: 48px 24px;
3676
+ color: var(--taskon-quest-text-light);
3677
+ font-size: 14px;
3678
+ }
3679
+
3680
+ /* ============================================================================
3681
+ 左中右三栏布局
3682
+ ============================================================================ */
3683
+
3684
+ .taskon-quest-layout {
3685
+ display: flex;
3686
+ gap: var(--taskon-quest-spacing-3xl);
3687
+ align-items: flex-start;
3688
+ }
3689
+
3690
+ /* 左侧主内容区(固定比例 2:1) */
3691
+ .taskon-quest-content {
3692
+ flex: 2;
3693
+ min-width: 0;
3694
+ display: flex;
3695
+ flex-direction: column;
3696
+ gap: var(--taskon-quest-spacing-xl);
3697
+ }
3698
+
3699
+ /* 中间分割线 */
3700
+ .taskon-quest-divider {
3701
+ width: 1px;
3702
+ align-self: stretch;
3703
+ background: linear-gradient(
3704
+ to bottom,
3705
+ var(--taskon-quest-text-invisible),
3706
+ var(--taskon-quest-text-darkest),
3707
+ var(--taskon-quest-text-invisible)
3708
+ );
3709
+ flex-shrink: 0;
3710
+ }
3711
+
3712
+ /* 右侧边栏(固定比例 2:1) */
3713
+ .taskon-quest-sidebar {
3714
+ flex: 1;
3715
+ min-width: 0;
3716
+ display: flex;
3717
+ flex-direction: column;
3718
+ gap: var(--taskon-quest-spacing-xxl);
3719
+ }
3720
+
3721
+ /* ============================================================================
3722
+ Quest Header 区域
3723
+ ============================================================================ */
3724
+
3725
+ .taskon-quest-header {
3726
+ display: flex;
3727
+ flex-direction: column;
3728
+ gap: var(--taskon-quest-spacing-l);
3729
+ }
3730
+
3731
+ /* 标题 + 倒计时区域 */
3732
+ .taskon-quest-header-title-section {
3733
+ display: flex;
3734
+ flex-direction: column;
3735
+ gap: var(--taskon-quest-spacing-xs);
3736
+ }
3737
+
3738
+ .taskon-quest-title {
3739
+ margin: 0;
3740
+ font-size: 28px;
3741
+ font-weight: 600;
3742
+ line-height: 38px;
3743
+ color: var(--taskon-quest-text-lightest);
3744
+ }
3745
+
3746
+ /* 倒计时 + 时间范围 */
3747
+ .taskon-quest-header-meta {
3748
+ display: flex;
3749
+ align-items: center;
3750
+ gap: var(--taskon-quest-spacing-s);
3751
+ padding: var(--taskon-quest-spacing-xxs) 0;
3752
+ border-radius: var(--taskon-quest-radius-s);
3753
+ }
3754
+
3755
+ .taskon-quest-countdown {
3756
+ display: flex;
3757
+ gap: var(--taskon-quest-spacing-xs);
3758
+ align-items: center;
3759
+ }
3760
+
3761
+ .taskon-quest-countdown-icon {
3762
+ display: flex;
3763
+ align-items: center;
3764
+ justify-content: center;
3765
+ color: var(--taskon-quest-text-lightest);
3766
+ }
3767
+
3768
+ .taskon-quest-countdown-label {
3769
+ font-size: 16px;
3770
+ font-weight: 400;
3771
+ line-height: 24px;
3772
+ color: var(--taskon-quest-text-lighter);
3773
+ }
3774
+
3775
+ /* 已结束状态的标签样式 */
3776
+ .taskon-quest-countdown-label--ended {
3777
+ font-weight: 600;
3778
+ text-transform: uppercase;
3779
+ }
3780
+
3781
+ .taskon-quest-countdown-value {
3782
+ font-size: 16px;
3783
+ font-weight: 600;
3784
+ line-height: 24px;
3785
+ color: var(--taskon-quest-primary);
3786
+ }
3787
+
3788
+ .taskon-quest-countdown-divider {
3789
+ width: 1px;
3790
+ height: 20px;
3791
+ background-color: var(--taskon-quest-text-darkest);
3792
+ }
3793
+
3794
+ .taskon-quest-time-range {
3795
+ font-size: 16px;
3796
+ font-weight: 400;
3797
+ line-height: 24px;
3798
+ color: var(--taskon-quest-text-lighter);
3799
+ }
3800
+
3801
+ /* Banner 图片 */
3802
+ .taskon-quest-banner {
3803
+ display: block;
3804
+ margin: 0 auto;
3805
+ width: 100%;
3806
+ border-radius: 10px;
3807
+ }
3808
+
3809
+ .taskon-quest-banner-img {
3810
+ display: block;
3811
+ width: 100%;
3812
+ border-radius: 10px;
3813
+ }
3814
+
3815
+ /* 方形图片在 PC 端限制宽度 */
3816
+ @media (min-width: 751px) {
3817
+ .taskon-quest-banner--square .taskon-quest-banner-img {
3818
+ width: 340px;
3819
+ max-width: 100%;
3820
+ margin: 0 auto;
3821
+ }
3822
+ }
3823
+
3824
+ /* 描述 + View More */
3825
+ .taskon-quest-desc {
3826
+ position: relative;
3827
+ display: flex;
3828
+ flex-direction: column;
3829
+ gap: var(--taskon-quest-spacing-m);
3830
+ }
3831
+
3832
+ .taskon-quest-desc-text {
3833
+ margin: 0;
3834
+ font-size: 16px;
3835
+ font-weight: 400;
3836
+ line-height: 24px;
3837
+ color: var(--taskon-quest-text-lighter);
3838
+ max-height: 120px;
3839
+ overflow: hidden;
3840
+ position: relative;
3841
+ }
3842
+
3843
+ /* 展开后移除高度限制和渐变 */
3844
+ .taskon-quest-desc-text--expanded {
3845
+ max-height: none;
3846
+ }
3847
+
3848
+ /* 描述渐变遮罩 - 仅在未展开时显示 */
3849
+ .taskon-quest-desc-text:not(.taskon-quest-desc-text--expanded)::after {
3850
+ content: "";
3851
+ position: absolute;
3852
+ bottom: 0;
3853
+ left: 0;
3854
+ right: 0;
3855
+ height: 49px;
3856
+ background: linear-gradient(
3857
+ 0.83deg,
3858
+ var(--taskon-quest-bg-body) 10.557%,
3859
+ rgba(17, 17, 17, 0) 93.799%
3860
+ );
3861
+ pointer-events: none;
3862
+ }
3863
+
3864
+ /* 富文本样式重置 */
3865
+ .taskon-quest-desc-text p {
3866
+ margin: 0 0 var(--taskon-quest-spacing-xs) 0;
3867
+ }
3868
+
3869
+ .taskon-quest-desc-text p:last-child {
3870
+ margin-bottom: 0;
3871
+ }
3872
+
3873
+ .taskon-quest-desc-text a {
3874
+ color: var(--taskon-quest-link);
3875
+ text-decoration: underline;
3876
+ }
3877
+
3878
+ .taskon-quest-desc-text ul,
3879
+ .taskon-quest-desc-text ol {
3880
+ margin: var(--taskon-quest-spacing-xs) 0;
3881
+ padding-left: var(--taskon-quest-spacing-xl);
3882
+ }
3883
+
3884
+ .taskon-quest-desc-text li {
3885
+ margin: var(--taskon-quest-spacing-xxs) 0;
3886
+ }
3887
+
3888
+ /* 图片样式:限制最大宽度,防止溢出 */
3889
+ .taskon-quest-desc-text img {
3890
+ max-width: 100%;
3891
+ height: auto;
3892
+ border-radius: var(--taskon-quest-radius-m);
3893
+ }
3894
+
3895
+ /* iframe 样式:限制最大宽度 */
3896
+ .taskon-quest-desc-text iframe {
3897
+ max-width: 100%;
3898
+ border-radius: var(--taskon-quest-radius-m);
3899
+ }
3900
+
3901
+ .taskon-quest-desc-more {
3902
+ font-size: 16px;
3903
+ font-weight: 600;
3904
+ line-height: 24px;
3905
+ color: var(--taskon-quest-text-lightest);
3906
+ text-decoration: underline;
3907
+ text-decoration-skip-ink: none;
3908
+ text-underline-position: from-font;
3909
+ background: none;
3910
+ border: none;
3911
+ cursor: pointer;
3912
+ padding: 0;
3913
+ align-self: flex-start;
3914
+ }
3915
+
3916
+ .taskon-quest-desc-more:hover {
3917
+ opacity: 0.8;
3918
+ }
3919
+
3920
+ /* 分割线 */
3921
+ .taskon-quest-content-divider {
3922
+ height: 1px;
3923
+ background: linear-gradient(
3924
+ to right,
3925
+ var(--taskon-quest-text-invisible),
3926
+ var(--taskon-quest-text-darkest),
3927
+ var(--taskon-quest-text-invisible)
3928
+ );
3929
+ }
3930
+
3931
+ /* ============================================================================
3932
+ Quest 任务列表区域
3933
+ ============================================================================ */
3934
+
3935
+ .taskon-quest-tasks {
3936
+ display: flex;
3937
+ flex-direction: column;
3938
+ gap: var(--taskon-quest-spacing-m);
3939
+ }
3940
+
3941
+ /* Quest 标题 */
3942
+ .taskon-quest-tasks-header {
3943
+ display: flex;
3944
+ gap: var(--taskon-quest-spacing-m);
3945
+ align-items: center;
3946
+ }
3947
+
3948
+ .taskon-quest-tasks-title {
3949
+ margin: 0;
3950
+ font-size: 24px;
3951
+ font-weight: 600;
3952
+ line-height: 32px;
3953
+ color: var(--taskon-quest-text-lightest);
3954
+ }
3955
+
3956
+ /* 任务列表 */
3957
+ .taskon-quest-tasks-list {
3958
+ display: flex;
3959
+ flex-direction: column;
3960
+ gap: var(--taskon-quest-spacing-m);
3961
+ }
3962
+
3963
+ .taskon-quest-task-placeholder {
3964
+ display: flex;
3965
+ justify-content: space-between;
3966
+ align-items: center;
3967
+ padding: var(--taskon-quest-spacing-m);
3968
+ height: 66px;
3969
+ background: linear-gradient(
3970
+ 90deg,
3971
+ rgba(255, 255, 255, 0.1) 0%,
3972
+ rgba(255, 255, 255, 0.1) 100%
3973
+ ),
3974
+ linear-gradient(90deg, #0d0d0d 0%, #0d0d0d 100%);
3975
+ border: 1px solid var(--taskon-quest-text-invisible);
3976
+ border-radius: var(--taskon-quest-radius-l);
3977
+ font-size: 18px;
3978
+ font-weight: 600;
3979
+ color: var(--taskon-quest-text-lightest);
3980
+ }
3981
+
3982
+ .taskon-quest-task-template {
3983
+ color: var(--taskon-quest-text-dark);
3984
+ font-size: 14px;
3985
+ font-weight: 500;
3986
+ }
3987
+
3988
+ /* Complete 按钮 */
3989
+ .taskon-quest-complete-btn {
3990
+ width: 100%;
3991
+ margin-top: var(--taskon-quest-spacing-xl);
3992
+ padding: var(--taskon-quest-spacing-m) var(--taskon-quest-spacing-3xl);
3993
+ font-size: 18px;
3994
+ font-weight: 600;
3995
+ line-height: 24px;
3996
+ color: var(--taskon-quest-button-primary-color);
3997
+ background-color: var(--taskon-quest-primary);
3998
+ border: none;
3999
+ border-radius: var(--taskon-quest-radius-l);
4000
+ cursor: pointer;
4001
+ transition: opacity 0.2s;
4002
+ display: flex;
4003
+ align-items: center;
4004
+ justify-content: center;
4005
+ gap: var(--taskon-quest-spacing-xs);
4006
+ }
4007
+
4008
+ .taskon-quest-complete-btn:hover:not(:disabled) {
4009
+ opacity: 0.9;
4010
+ }
4011
+
4012
+ .taskon-quest-complete-btn:disabled {
4013
+ opacity: 0.5;
4014
+ cursor: not-allowed;
4015
+ }
4016
+
4017
+ /* ============================================================================
4018
+ 右侧边栏 - Winners Section (入口区域)
4019
+ ============================================================================ */
4020
+
4021
+ .taskon-quest-winners-section {
4022
+ display: flex;
4023
+ flex-direction: column;
4024
+ gap: var(--taskon-quest-spacing-m);
4025
+ margin-bottom: var(--taskon-quest-spacing-xl);
4026
+ }
4027
+
4028
+ .taskon-quest-winners-section-title {
4029
+ margin: 0;
4030
+ font-size: 24px;
4031
+ font-weight: 600;
4032
+ line-height: 32px;
4033
+ color: var(--taskon-quest-text-lightest);
4034
+ }
4035
+
4036
+ /* ============================================================================
4037
+ 右侧边栏 - Quest Rewards Section
4038
+ ============================================================================ */
4039
+
4040
+ .taskon-quest-rewards-section {
4041
+ display: flex;
4042
+ flex-direction: column;
4043
+ gap: var(--taskon-quest-spacing-l);
4044
+ }
4045
+
4046
+ .taskon-quest-rewards-section-title {
4047
+ margin: 0;
4048
+ font-size: 24px;
4049
+ font-weight: 600;
4050
+ line-height: 32px;
4051
+ color: var(--taskon-quest-text-lightest);
4052
+ }
4053
+
4054
+ /* QuestRewards 组件 CSS 变量映射 */
4055
+ .taskon-quest-rewards-section {
4056
+ --taskon-text-primary: var(--taskon-quest-text-lightest);
4057
+ --taskon-text-secondary: var(--taskon-quest-text-lighter);
4058
+ --taskon-text-tertiary: var(--taskon-quest-text-light);
4059
+ --taskon-bg-card: var(--taskon-quest-text-invisible);
4060
+ --taskon-bg-secondary: rgba(255, 255, 255, 0.03);
4061
+ --taskon-bg-tertiary: var(--taskon-quest-text-darkest);
4062
+ --taskon-border-color: var(--taskon-quest-text-darkest);
4063
+ --taskon-primary: var(--taskon-quest-primary);
4064
+ --taskon-success: var(--taskon-quest-secondary);
4065
+ --taskon-link: var(--taskon-quest-link);
4066
+ --taskon-warning: #ffc107;
4067
+ }
4068
+
4069
+ /* ============================================================================
4070
+ 右侧边栏 - Quest Rewards (旧版,保留兼容)
4071
+ ============================================================================ */
4072
+
4073
+ .taskon-quest-rewards {
4074
+ display: flex;
4075
+ flex-direction: column;
4076
+ gap: var(--taskon-quest-spacing-l);
4077
+ }
4078
+
4079
+ .taskon-quest-rewards-title {
4080
+ margin: 0;
4081
+ font-size: 24px;
4082
+ font-weight: 600;
4083
+ line-height: 32px;
4084
+ color: var(--taskon-quest-text-lightest);
4085
+ }
4086
+
4087
+ .taskon-quest-rewards-list {
4088
+ display: flex;
4089
+ flex-direction: column;
4090
+ gap: var(--taskon-quest-spacing-m);
4091
+ }
4092
+
4093
+ .taskon-quest-reward-item {
4094
+ display: flex;
4095
+ justify-content: space-between;
4096
+ align-items: center;
4097
+ padding: var(--taskon-quest-spacing-m);
4098
+ background-color: var(--taskon-quest-text-invisible);
4099
+ border-radius: var(--taskon-quest-radius-xl);
4100
+ font-size: 16px;
4101
+ color: var(--taskon-quest-text-lightest);
4102
+ }
4103
+
4104
+ /* ============================================================================
4105
+ 右侧边栏 - Eligibility Section
4106
+ ============================================================================ */
4107
+
4108
+ .taskon-quest-eligs-section {
4109
+ margin-top: var(--taskon-quest-spacing-xl);
4110
+ }
4111
+
4112
+ .taskon-quest-eligs-section-header {
4113
+ display: flex;
4114
+ align-items: center;
4115
+ justify-content: space-between;
4116
+ margin-bottom: var(--taskon-quest-spacing-m);
4117
+ }
4118
+
4119
+ .taskon-quest-eligs-section-title {
4120
+ margin: 0;
4121
+ font-size: 20px;
4122
+ font-weight: 600;
4123
+ line-height: 28px;
4124
+ color: var(--taskon-quest-text-lightest);
4125
+ }
4126
+
4127
+ /* ============================================================================
4128
+ 右侧边栏 - Participants Info
4129
+ ============================================================================ */
4130
+
4131
+ .taskon-quest-participants {
4132
+ display: flex;
4133
+ flex-direction: column;
4134
+ gap: var(--taskon-quest-spacing-l);
4135
+ }
4136
+
4137
+ .taskon-quest-participants-title {
4138
+ margin: 0;
4139
+ font-size: 24px;
4140
+ font-weight: 600;
4141
+ line-height: 32px;
4142
+ color: var(--taskon-quest-text-lightest);
4143
+ }
4144
+
4145
+ .taskon-quest-participants-item {
4146
+ display: flex;
4147
+ justify-content: space-between;
4148
+ align-items: center;
4149
+ font-size: 16px;
4150
+ font-weight: 500;
4151
+ line-height: 24px;
4152
+ }
4153
+
4154
+ .taskon-quest-participants-label {
4155
+ color: var(--taskon-quest-text-lighter);
4156
+ }
4157
+
4158
+ .taskon-quest-participants-value {
4159
+ color: var(--taskon-quest-text-lightest);
4160
+ }
4161
+
4162
+ /* ============================================================================
4163
+ 响应式布局(TODO: Phase 13 完善)
4164
+ ============================================================================ */
4165
+
4166
+ @media (max-width: 1200px) {
4167
+ .taskon-quest-layout {
4168
+ flex-direction: column;
4169
+ }
4170
+
4171
+ .taskon-quest-divider {
4172
+ width: 100%;
4173
+ height: 1px;
4174
+ background: linear-gradient(
4175
+ to right,
4176
+ var(--taskon-quest-text-invisible),
4177
+ var(--taskon-quest-text-darkest),
4178
+ var(--taskon-quest-text-invisible)
4179
+ );
4180
+ }
4181
+
4182
+ .taskon-quest-sidebar {
4183
+ width: 100%;
4184
+ }
4185
+ }
4186
+
4187
+ /* Eligibility 组件样式已抽取到独立文件: Quest/components/Eligibility/eligibility.css */
4188
+
4189
+ /* ============================================================================
4190
+ BlindBox Dialog Wrapper
4191
+ ============================================================================ */
4192
+
4193
+ .taskon-quest-blindbox-dialog-wrapper {
4194
+ background: #0d0d0d;
4195
+ padding: 0;
4196
+ width: auto;
4197
+ max-width: 560px;
4198
+ }
4199
+
4200
+ .taskon-quest-blindbox-dialog-wrapper .taskon-dialog-body {
4201
+ padding: 0;
4202
+ }
4203
+
4204
+ .taskon-quest-blindbox-reward-wrapper {
4205
+ background: #0d0d0d;
4206
+ padding: 0;
4207
+ width: auto;
4208
+ max-width: 560px;
4209
+ }
4210
+
4211
+ .taskon-quest-blindbox-reward-wrapper .taskon-dialog-body {
4212
+ padding: 0;
4213
+ }
4214
+