@taskon/widget-react 0.0.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 (37) hide show
  1. package/README.md +1064 -0
  2. package/dist/CommunityTaskList.css +5010 -0
  3. package/dist/EligibilityInfo.css +1966 -0
  4. package/dist/LeaderboardWidget.css +815 -0
  5. package/dist/Quest.css +4584 -0
  6. package/dist/Table.css +389 -0
  7. package/dist/TaskOnProvider.css +163 -0
  8. package/dist/WidgetShell.css +182 -0
  9. package/dist/chunks/CommunityTaskList-CrH6r4Av.js +6886 -0
  10. package/dist/chunks/EligibilityInfo-DesW9-k9.js +24900 -0
  11. package/dist/chunks/LeaderboardWidget-BSGpHKTk.js +1156 -0
  12. package/dist/chunks/Quest-uSIVq78I.js +8581 -0
  13. package/dist/chunks/Table-CWGf2FKV.js +449 -0
  14. package/dist/chunks/TaskOnProvider-QMwxGL44.js +1435 -0
  15. package/dist/chunks/ThemeProvider-Cs8IUVQj.js +1118 -0
  16. package/dist/chunks/WidgetShell-NlOgn1x5.js +1517 -0
  17. package/dist/chunks/common-ja-DWhTaFHb.js +23 -0
  18. package/dist/chunks/common-ko-80ezXsMG.js +23 -0
  19. package/dist/chunks/index-CwMvO_wZ.js +777 -0
  20. package/dist/chunks/leaderboardwidget-ja-Bj6gz6y1.js +119 -0
  21. package/dist/chunks/leaderboardwidget-ko-f1cLO9ic.js +119 -0
  22. package/dist/chunks/useToast-BGJhd3BX.js +93 -0
  23. package/dist/chunks/useWidgetLocale-BVcopbZS.js +74 -0
  24. package/dist/chunks/usercenter-ja-DBj_dtuz.js +329 -0
  25. package/dist/chunks/usercenter-ko-DYTkHAld.js +329 -0
  26. package/dist/community-task.d.ts +451 -0
  27. package/dist/community-task.js +9 -0
  28. package/dist/core.d.ts +803 -0
  29. package/dist/core.js +22 -0
  30. package/dist/index.css +3662 -0
  31. package/dist/index.d.ts +1627 -0
  32. package/dist/index.js +7372 -0
  33. package/dist/leaderboard.d.ts +547 -0
  34. package/dist/leaderboard.js +17 -0
  35. package/dist/quest.d.ts +389 -0
  36. package/dist/quest.js +8 -0
  37. package/package.json +97 -0
package/dist/Quest.css ADDED
@@ -0,0 +1,4584 @@
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
+ * OperateFooter styles
2295
+ * Following Widget naming convention: .taskon-quest-footer-*
2296
+ */
2297
+
2298
+ /* ============================================================================
2299
+ Main Container
2300
+ ============================================================================ */
2301
+
2302
+ .taskon-quest-footer {
2303
+ margin-top: 20px;
2304
+ position: relative;
2305
+ }
2306
+
2307
+ @media (max-width: 750px) {
2308
+ .taskon-quest-footer {
2309
+ margin-top: 0;
2310
+ }
2311
+ }
2312
+
2313
+ /* ============================================================================
2314
+ Status Card - New Design (v2)
2315
+ ============================================================================ */
2316
+
2317
+ /* Container for the entire status section */
2318
+ .taskon-quest-footer-status {
2319
+ display: flex;
2320
+ flex-direction: column;
2321
+ gap: 12px;
2322
+ }
2323
+
2324
+ /* Title row: title + badge */
2325
+ .taskon-quest-footer-title-row {
2326
+ display: flex;
2327
+ align-items: center;
2328
+ gap: 8px;
2329
+ }
2330
+
2331
+ /* Badge styles */
2332
+ .taskon-quest-footer-badge {
2333
+ display: inline-flex;
2334
+ align-items: center;
2335
+ justify-content: center;
2336
+ height: 20px;
2337
+ padding: 0 8px;
2338
+ border-radius: 12px;
2339
+ font-size: 12px;
2340
+ font-weight: 600;
2341
+ line-height: 16px;
2342
+ text-transform: uppercase;
2343
+ }
2344
+
2345
+ .taskon-quest-footer-badge--winner {
2346
+ color: #cbff01;
2347
+ background: linear-gradient(
2348
+ 90deg,
2349
+ rgba(203, 255, 1, 0.1) 0%,
2350
+ rgba(203, 255, 1, 0.1) 100%
2351
+ ),
2352
+ linear-gradient(
2353
+ 90deg,
2354
+ rgba(255, 255, 255, 0.1) 0%,
2355
+ rgba(255, 255, 255, 0.1) 100%
2356
+ );
2357
+ }
2358
+
2359
+ .taskon-quest-footer-badge--qualifier,
2360
+ .taskon-quest-footer-badge--submitter {
2361
+ color: #1affab;
2362
+ background: linear-gradient(
2363
+ 90deg,
2364
+ rgba(26, 255, 171, 0.1) 0%,
2365
+ rgba(26, 255, 171, 0.1) 100%
2366
+ ),
2367
+ linear-gradient(
2368
+ 90deg,
2369
+ rgba(255, 255, 255, 0.1) 0%,
2370
+ rgba(255, 255, 255, 0.1) 100%
2371
+ );
2372
+ }
2373
+
2374
+ /* Dark content card */
2375
+ .taskon-quest-footer-card {
2376
+ display: flex;
2377
+ gap: 12px;
2378
+ align-items: center;
2379
+ padding: 12px;
2380
+ border-radius: 8px;
2381
+ background: linear-gradient(
2382
+ 90deg,
2383
+ rgba(255, 255, 255, 0.1) 0%,
2384
+ rgba(255, 255, 255, 0.1) 100%
2385
+ ),
2386
+ linear-gradient(90deg, #0d0d0d 0%, #0d0d0d 100%);
2387
+ }
2388
+
2389
+ @media (max-width: 750px) {
2390
+ .taskon-quest-footer-card {
2391
+ flex-direction: column;
2392
+ align-items: stretch;
2393
+ gap: 8px;
2394
+ padding: 3.2vw;
2395
+ }
2396
+ }
2397
+
2398
+ /* Card message text (for simple messages) */
2399
+ .taskon-quest-footer-card-message {
2400
+ font-size: 16px;
2401
+ font-weight: 600;
2402
+ line-height: 24px;
2403
+ color: #fff;
2404
+ }
2405
+
2406
+ /* ============================================================================
2407
+ Status Card - Legacy styles (keep for compatibility)
2408
+ ============================================================================ */
2409
+
2410
+ /* Card content area */
2411
+ .taskon-quest-footer-card-content {
2412
+ display: flex;
2413
+ flex-direction: column;
2414
+ gap: 2px;
2415
+ }
2416
+
2417
+ /* ============================================================================
2418
+ Title and Description - New Design (v2)
2419
+ ============================================================================ */
2420
+
2421
+ .taskon-quest-footer-title {
2422
+ font-size: 20px;
2423
+ font-weight: 600;
2424
+ line-height: 28px;
2425
+ color: #fff;
2426
+ }
2427
+
2428
+ @media (max-width: 750px) {
2429
+ .taskon-quest-footer-title {
2430
+ font-size: 4.267vw;
2431
+ line-height: 5.867vw;
2432
+ }
2433
+ }
2434
+
2435
+ .taskon-quest-footer-desc {
2436
+ margin-top: 2px;
2437
+ font-size: 14px;
2438
+ font-weight: 500;
2439
+ line-height: 18px;
2440
+ color: rgba(255, 255, 255, 0.6);
2441
+ }
2442
+
2443
+ @media (max-width: 750px) {
2444
+ .taskon-quest-footer-desc {
2445
+ margin-top: 0.533vw;
2446
+ font-size: 3.2vw;
2447
+ line-height: 3.733vw;
2448
+ }
2449
+ }
2450
+
2451
+ /* ============================================================================
2452
+ Connect Wallet
2453
+ ============================================================================ */
2454
+
2455
+ .taskon-quest-footer-connect {
2456
+ display: flex;
2457
+ justify-content: center;
2458
+ }
2459
+
2460
+ .taskon-quest-footer-connect-btn {
2461
+ width: 100%;
2462
+ padding: 12px 24px;
2463
+ font-size: 16px;
2464
+ font-weight: 600;
2465
+ color: #000;
2466
+ background-color: #cbff01;
2467
+ border: none;
2468
+ border-radius: 8px;
2469
+ cursor: pointer;
2470
+ transition: background-color 0.2s ease;
2471
+ }
2472
+
2473
+ .taskon-quest-footer-connect-btn:hover {
2474
+ background-color: #b8e600;
2475
+ }
2476
+
2477
+ /* ============================================================================
2478
+ Complete Button
2479
+ ============================================================================ */
2480
+
2481
+ .taskon-quest-footer-complete-btn {
2482
+ width: 100%;
2483
+ padding: 12px 24px;
2484
+ font-size: 16px;
2485
+ font-weight: 600;
2486
+ color: #000;
2487
+ background-color: #cbff01;
2488
+ border: none;
2489
+ border-radius: 8px;
2490
+ cursor: pointer;
2491
+ transition: background-color 0.2s ease, opacity 0.2s ease;
2492
+ }
2493
+
2494
+ .taskon-quest-footer-complete-btn:hover:not(:disabled) {
2495
+ background-color: #b8e600;
2496
+ }
2497
+
2498
+ .taskon-quest-footer-complete-btn:disabled {
2499
+ opacity: 0.5;
2500
+ cursor: not-allowed;
2501
+ }
2502
+
2503
+ @media (max-width: 750px) {
2504
+ .taskon-quest-footer-complete-btn {
2505
+ height: 13.33vw;
2506
+ font-weight: bold;
2507
+ }
2508
+ }
2509
+
2510
+ /* Complete Button Loading State */
2511
+ .taskon-quest-footer-complete-btn--loading {
2512
+ pointer-events: none;
2513
+ }
2514
+
2515
+ .taskon-quest-footer-complete-btn-loading {
2516
+ display: flex;
2517
+ align-items: center;
2518
+ justify-content: center;
2519
+ gap: 8px;
2520
+ }
2521
+
2522
+ .taskon-quest-footer-complete-btn-spinner {
2523
+ width: 16px;
2524
+ height: 16px;
2525
+ border: 2px solid rgba(0, 0, 0, 0.2);
2526
+ border-top-color: #000;
2527
+ border-radius: 50%;
2528
+ animation: taskon-spin 0.8s linear infinite;
2529
+ }
2530
+
2531
+ @keyframes taskon-spin {
2532
+ to {
2533
+ transform: rotate(360deg);
2534
+ }
2535
+ }
2536
+
2537
+ /* ============================================================================
2538
+ Earned Rewards Placeholder (will be replaced in phase 4)
2539
+ ============================================================================ */
2540
+
2541
+ .taskon-quest-footer-earned-placeholder {
2542
+ margin-top: 10px;
2543
+ display: flex;
2544
+ align-items: center;
2545
+ gap: 10px;
2546
+ overflow: auto;
2547
+ }
2548
+
2549
+ .taskon-quest-footer-earned-hint {
2550
+ font-size: 14px;
2551
+ font-weight: 500;
2552
+ color: rgba(0, 0, 0, 0.6);
2553
+ }
2554
+
2555
+ @media (max-width: 750px) {
2556
+ .taskon-quest-footer-earned-placeholder {
2557
+ margin-top: 2vw;
2558
+ gap: 2.267vw;
2559
+ }
2560
+ }
2561
+
2562
+ /* ============================================================================
2563
+ Earned Rewards - New Design (v2)
2564
+ ============================================================================ */
2565
+
2566
+ .taskon-quest-footer-earned {
2567
+ display: flex;
2568
+ flex-direction: column;
2569
+ gap: 0;
2570
+ overflow: visible;
2571
+ margin-top: 0;
2572
+ }
2573
+
2574
+ @media (max-width: 750px) {
2575
+ .taskon-quest-footer-earned {
2576
+ gap: 0;
2577
+ }
2578
+ }
2579
+
2580
+ .taskon-quest-footer-earned-list {
2581
+ display: flex;
2582
+ flex-direction: column;
2583
+ gap: 0;
2584
+ }
2585
+
2586
+ /* Single reward inner card */
2587
+ .taskon-quest-footer-earned-single {
2588
+ display: flex;
2589
+ flex-direction: column;
2590
+ gap: 0;
2591
+ padding: 8px;
2592
+ border-radius: 8px;
2593
+ border: 1px solid rgba(255, 255, 255, 0.04);
2594
+ background: linear-gradient(
2595
+ 90deg,
2596
+ rgba(255, 255, 255, 0.04) 0%,
2597
+ rgba(255, 255, 255, 0.04) 100%
2598
+ ),
2599
+ linear-gradient(90deg, #0d0d0d 0%, #0d0d0d 100%);
2600
+ }
2601
+
2602
+ .taskon-quest-footer-earned-single-row {
2603
+ display: flex;
2604
+ align-items: center;
2605
+ gap: 8px;
2606
+ }
2607
+
2608
+ .taskon-quest-footer-earned-single-info {
2609
+ display: flex;
2610
+ align-items: center;
2611
+ gap: 4px;
2612
+ }
2613
+
2614
+ .taskon-quest-footer-earned-single-icon {
2615
+ width: 20px;
2616
+ height: 20px;
2617
+ border-radius: 50%;
2618
+ object-fit: cover;
2619
+ }
2620
+
2621
+ .taskon-quest-footer-earned-single-type {
2622
+ font-size: 18px;
2623
+ font-weight: 600;
2624
+ line-height: 24px;
2625
+ color: #fff;
2626
+ }
2627
+
2628
+ .taskon-quest-footer-earned-single-name {
2629
+ font-size: 12px;
2630
+ font-weight: 500;
2631
+ line-height: normal;
2632
+ color: rgba(255, 255, 255, 0.4);
2633
+ text-transform: capitalize;
2634
+ }
2635
+
2636
+ /* Multi reward row */
2637
+ .taskon-quest-footer-earned-multi {
2638
+ display: flex;
2639
+ align-items: center;
2640
+ gap: 12px;
2641
+ }
2642
+
2643
+ .taskon-quest-footer-earned-multi-text {
2644
+ font-size: 16px;
2645
+ font-weight: 600;
2646
+ line-height: 24px;
2647
+ color: #fff;
2648
+ }
2649
+
2650
+ /* Hide first reward on mobile when has multiple rewards */
2651
+ @media (max-width: 750px) {
2652
+ .taskon-quest-footer-earned-first--hide-mobile {
2653
+ display: none;
2654
+ }
2655
+ }
2656
+
2657
+ .taskon-quest-footer-earned-more {
2658
+ display: flex;
2659
+ flex-direction: column;
2660
+ justify-content: center;
2661
+ align-items: flex-start;
2662
+ flex: 1;
2663
+ gap: 4px;
2664
+ overflow: hidden;
2665
+ border-radius: 4px;
2666
+ background-color: #000;
2667
+ padding: 4px 8px;
2668
+ }
2669
+
2670
+ @media (max-width: 750px) {
2671
+ .taskon-quest-footer-earned-more {
2672
+ flex-direction: row;
2673
+ align-items: center;
2674
+ gap: 3vw;
2675
+ padding: 2vw;
2676
+ }
2677
+ }
2678
+
2679
+ /* ============================================================================
2680
+ Reward Card (for future implementation)
2681
+ ============================================================================ */
2682
+
2683
+ .taskon-quest-footer-reward {
2684
+ display: flex;
2685
+ flex-direction: column;
2686
+ justify-content: center;
2687
+ flex: 1;
2688
+ border-radius: 4px;
2689
+ background-color: #000;
2690
+ padding: 4px 8px;
2691
+ }
2692
+
2693
+ @media (max-width: 750px) {
2694
+ .taskon-quest-footer-reward {
2695
+ padding: 2vw;
2696
+ }
2697
+ }
2698
+
2699
+ /* ============================================================================
2700
+ Base Info (for future implementation)
2701
+ ============================================================================ */
2702
+
2703
+ .taskon-quest-footer-reward-info {
2704
+ display: flex;
2705
+ align-items: center;
2706
+ gap: 4px;
2707
+ font-size: 18px;
2708
+ }
2709
+
2710
+ @media (max-width: 750px) {
2711
+ .taskon-quest-footer-reward-info {
2712
+ gap: 2vw;
2713
+ }
2714
+ }
2715
+
2716
+ .taskon-quest-footer-reward-info img {
2717
+ height: 20px;
2718
+ width: 20px;
2719
+ border-radius: 50%;
2720
+ object-fit: cover;
2721
+ }
2722
+
2723
+ @media (max-width: 750px) {
2724
+ .taskon-quest-footer-reward-info img {
2725
+ height: 8vw;
2726
+ width: 8vw;
2727
+ }
2728
+ }
2729
+
2730
+ .taskon-quest-footer-reward-amount {
2731
+ color: #cbff01;
2732
+ }
2733
+
2734
+ .taskon-quest-footer-reward-type {
2735
+ color: #fff;
2736
+ }
2737
+
2738
+ .taskon-quest-footer-reward-name {
2739
+ color: #cbff01;
2740
+ }
2741
+
2742
+ /* ============================================================================
2743
+ Action Button (for future implementation)
2744
+ ============================================================================ */
2745
+
2746
+ .taskon-quest-footer-action-btn {
2747
+ display: flex;
2748
+ align-items: center;
2749
+ gap: 4px;
2750
+ font-size: 14px;
2751
+ color: rgba(255, 255, 255, 0.6);
2752
+ cursor: pointer;
2753
+ transition: color 0.2s ease;
2754
+ }
2755
+
2756
+ .taskon-quest-footer-action-btn:not(.taskon-quest-footer-action-btn--disabled):hover {
2757
+ color: rgba(255, 255, 255, 0.8);
2758
+ }
2759
+
2760
+ .taskon-quest-footer-action-btn--disabled {
2761
+ cursor: not-allowed;
2762
+ }
2763
+
2764
+ /* ============================================================================
2765
+ Claim Button (for future implementation)
2766
+ ============================================================================ */
2767
+
2768
+ .taskon-quest-footer-claim-btn {
2769
+ padding: 4px 12px;
2770
+ font-size: 14px;
2771
+ font-weight: 600;
2772
+ color: #000;
2773
+ background-color: #cbff01;
2774
+ border: none;
2775
+ border-radius: 4px;
2776
+ cursor: pointer;
2777
+ transition: background-color 0.2s ease, opacity 0.2s ease;
2778
+ }
2779
+
2780
+ .taskon-quest-footer-claim-btn:hover:not(:disabled) {
2781
+ background-color: #b8e600;
2782
+ }
2783
+
2784
+ .taskon-quest-footer-claim-btn:disabled {
2785
+ opacity: 0.5;
2786
+ cursor: not-allowed;
2787
+ }
2788
+
2789
+ .taskon-quest-footer-claim-btn--loading {
2790
+ pointer-events: none;
2791
+ }
2792
+
2793
+ .taskon-quest-footer-claim-btn-spinner {
2794
+ width: 14px;
2795
+ height: 14px;
2796
+ border: 2px solid rgba(0, 0, 0, 0.2);
2797
+ border-top-color: #000;
2798
+ border-radius: 50%;
2799
+ animation: taskon-spin 0.8s linear infinite;
2800
+ }
2801
+
2802
+ /* ============================================================================
2803
+ Earned Rewards - More section
2804
+ ============================================================================ */
2805
+
2806
+ .taskon-quest-footer-earned-more-text {
2807
+ font-size: 14px;
2808
+ font-weight: 600;
2809
+ color: #fff;
2810
+ }
2811
+
2812
+ /* ============================================================================
2813
+ Reward Card - Row layout
2814
+ ============================================================================ */
2815
+
2816
+ .taskon-quest-footer-reward-row {
2817
+ display: flex;
2818
+ align-items: center;
2819
+ gap: 8px;
2820
+ flex-wrap: wrap;
2821
+ }
2822
+
2823
+ /* ============================================================================
2824
+ Reward Badges
2825
+ ============================================================================ */
2826
+
2827
+ .taskon-quest-footer-reward-badges {
2828
+ display: flex;
2829
+ align-items: center;
2830
+ gap: 4px;
2831
+ }
2832
+
2833
+ .taskon-quest-footer-reward-badge {
2834
+ display: inline-flex;
2835
+ align-items: center;
2836
+ padding: 2px 6px;
2837
+ font-size: 12px;
2838
+ font-weight: 500;
2839
+ color: #000;
2840
+ background-color: rgba(203, 255, 1, 0.8);
2841
+ border-radius: 2px;
2842
+ }
2843
+
2844
+ .taskon-quest-footer-reward-badge-icon {
2845
+ margin-left: 4px;
2846
+ width: 18px;
2847
+ height: 18px;
2848
+ object-fit: cover;
2849
+ }
2850
+
2851
+ @media (max-width: 750px) {
2852
+ .taskon-quest-footer-reward-badge-icon {
2853
+ margin-left: 1.067vw;
2854
+ width: 3.2vw;
2855
+ height: 3.2vw;
2856
+ }
2857
+ }
2858
+
2859
+ .taskon-quest-footer-reward-badge-line {
2860
+ margin-left: 4px;
2861
+ width: 1px;
2862
+ height: 10px;
2863
+ opacity: 0.1;
2864
+ background: #d9d9d9;
2865
+ }
2866
+
2867
+ @media (max-width: 750px) {
2868
+ .taskon-quest-footer-reward-badge-line {
2869
+ margin-left: 0.8vw;
2870
+ height: 2.267vw;
2871
+ }
2872
+ }
2873
+
2874
+ /* ============================================================================
2875
+ Reward - Tx Hash
2876
+ ============================================================================ */
2877
+
2878
+ .taskon-quest-footer-reward-tx {
2879
+ display: flex;
2880
+ align-items: center;
2881
+ gap: 4px;
2882
+ font-size: 14px;
2883
+ }
2884
+
2885
+ .taskon-quest-footer-reward-tx-label {
2886
+ color: rgba(255, 255, 255, 0.6);
2887
+ }
2888
+
2889
+ .taskon-quest-footer-reward-tx-link {
2890
+ color: #fff;
2891
+ text-decoration: none;
2892
+ }
2893
+
2894
+ .taskon-quest-footer-reward-tx-link:hover {
2895
+ text-decoration: underline;
2896
+ }
2897
+
2898
+ /* ============================================================================
2899
+ Reward - Dropping status
2900
+ ============================================================================ */
2901
+
2902
+ .taskon-quest-footer-reward-dropping {
2903
+ margin-top: 4px;
2904
+ font-size: 14px;
2905
+ color: rgba(255, 255, 255, 0.6);
2906
+ }
2907
+
2908
+ /* ============================================================================
2909
+ Reward Chain Icon
2910
+ ============================================================================ */
2911
+
2912
+ .taskon-quest-footer-reward-chain-icon {
2913
+ width: 20px;
2914
+ height: 20px;
2915
+ border-radius: 50%;
2916
+ object-fit: cover;
2917
+ }
2918
+
2919
+ @media (max-width: 750px) {
2920
+ .taskon-quest-footer-reward-chain-icon {
2921
+ width: 8vw;
2922
+ height: 8vw;
2923
+ }
2924
+ }
2925
+
2926
+ /* ============================================================================
2927
+ Detail Panel Dialog
2928
+ ============================================================================ */
2929
+
2930
+ .taskon-quest-footer-detail-dialog {
2931
+ background-color: #1a1a1a;
2932
+ }
2933
+
2934
+ .taskon-quest-footer-detail-panel {
2935
+ padding: 0;
2936
+ }
2937
+
2938
+ .taskon-quest-footer-detail-title {
2939
+ font-size: 22px;
2940
+ font-weight: 600;
2941
+ color: #fff;
2942
+ margin: 0 0 20px 0;
2943
+ }
2944
+
2945
+ @media (max-width: 750px) {
2946
+ .taskon-quest-footer-detail-title {
2947
+ font-size: 4.8vw;
2948
+ margin-bottom: 4vw;
2949
+ }
2950
+ }
2951
+
2952
+ .taskon-quest-footer-detail-content {
2953
+ display: flex;
2954
+ flex-direction: column;
2955
+ gap: 24px;
2956
+ }
2957
+
2958
+ @media (max-width: 750px) {
2959
+ .taskon-quest-footer-detail-content {
2960
+ gap: 5vw;
2961
+ }
2962
+ }
2963
+
2964
+ /* ============================================================================
2965
+ Selection Item
2966
+ ============================================================================ */
2967
+
2968
+ .taskon-quest-footer-selection-item {
2969
+ /* spacing handled by parent gap */
2970
+ }
2971
+
2972
+ .taskon-quest-footer-selection-item + .taskon-quest-footer-selection-item {
2973
+ margin-top: 24px;
2974
+ }
2975
+
2976
+ @media (max-width: 750px) {
2977
+ .taskon-quest-footer-selection-item + .taskon-quest-footer-selection-item {
2978
+ margin-top: 5vw;
2979
+ }
2980
+ }
2981
+
2982
+ .taskon-quest-footer-selection-label {
2983
+ font-size: 16px;
2984
+ font-weight: 500;
2985
+ color: rgba(255, 255, 255, 0.8);
2986
+ }
2987
+
2988
+ .taskon-quest-footer-selection-rewards {
2989
+ margin-top: 10px;
2990
+ display: flex;
2991
+ flex-direction: column;
2992
+ gap: 24px;
2993
+ }
2994
+
2995
+ @media (max-width: 750px) {
2996
+ .taskon-quest-footer-selection-rewards {
2997
+ margin-top: 2vw;
2998
+ gap: 5vw;
2999
+ }
3000
+ }
3001
+
3002
+ /* Selection Item - Transparent reward card background */
3003
+ .taskon-quest-footer-selection-rewards .taskon-quest-footer-reward {
3004
+ background: transparent;
3005
+ }
3006
+
3007
+ /* Selection Failed */
3008
+ .taskon-quest-footer-selection-failed {
3009
+ display: flex;
3010
+ align-items: center;
3011
+ gap: 6px;
3012
+ font-size: 14px;
3013
+ line-height: 18px;
3014
+ color: rgba(255, 255, 255, 0.6);
3015
+ }
3016
+
3017
+ .taskon-quest-footer-selection-failed-icon {
3018
+ width: 16px;
3019
+ height: 16px;
3020
+ }
3021
+
3022
+ /* Selection Wait */
3023
+ .taskon-quest-footer-selection-wait {
3024
+ display: flex;
3025
+ align-items: center;
3026
+ gap: 8px;
3027
+ font-size: 14px;
3028
+ font-weight: 500;
3029
+ line-height: 16px;
3030
+ color: #fff;
3031
+ }
3032
+
3033
+ .taskon-quest-footer-selection-wait-icon {
3034
+ width: 34px;
3035
+ height: 34px;
3036
+ }
3037
+
3038
+ /* ============================================================================
3039
+ Detail Panel - Bonus Section
3040
+ ============================================================================ */
3041
+
3042
+ .taskon-quest-footer-detail-bonus {
3043
+ margin-top: 24px;
3044
+ padding-top: 24px;
3045
+ display: flex;
3046
+ border-top: 1px solid rgba(255, 255, 255, 0.06);
3047
+ }
3048
+
3049
+ @media (max-width: 750px) {
3050
+ .taskon-quest-footer-detail-bonus {
3051
+ margin-top: 5vw;
3052
+ padding-top: 0;
3053
+ border-top: none;
3054
+ }
3055
+ }
3056
+
3057
+ .taskon-quest-footer-detail-bonus-label {
3058
+ font-size: 16px;
3059
+ font-weight: 500;
3060
+ color: rgba(255, 255, 255, 0.8);
3061
+ }
3062
+
3063
+ .taskon-quest-footer-detail-bonus-right {
3064
+ flex: 1;
3065
+ text-align: right;
3066
+ }
3067
+
3068
+ .taskon-quest-footer-detail-bonus-item {
3069
+ font-size: 14px;
3070
+ font-weight: 600;
3071
+ text-align: right;
3072
+ color: #fff;
3073
+ }
3074
+
3075
+ .taskon-quest-footer-detail-bonus-item + .taskon-quest-footer-detail-bonus-item {
3076
+ margin-top: 8px;
3077
+ }
3078
+
3079
+ @media (max-width: 750px) {
3080
+ .taskon-quest-footer-detail-bonus-item + .taskon-quest-footer-detail-bonus-item {
3081
+ margin-top: 2vw;
3082
+ }
3083
+ }
3084
+
3085
+ /* ============================================================================
3086
+ Action Button - Arrow icon
3087
+ ============================================================================ */
3088
+
3089
+ .taskon-quest-footer-action-arrow {
3090
+ width: 6px;
3091
+ height: 10px;
3092
+ }
3093
+
3094
+ /* Link style for ActionButton */
3095
+ a.taskon-quest-footer-action-btn {
3096
+ text-decoration: none;
3097
+ }
3098
+ /**
3099
+ * TaskValidationDialog Styles
3100
+ * @module widgets/Quest/components/OperateFooter/styles/task-validation-dialog
3101
+ */
3102
+
3103
+ .taskon-task-validation-dialog {
3104
+ display: flex;
3105
+ flex-direction: column;
3106
+ align-items: center;
3107
+ padding: 24px;
3108
+ text-align: center;
3109
+ }
3110
+
3111
+ .taskon-task-validation-dialog-icon-wrap {
3112
+ margin-bottom: 16px;
3113
+ }
3114
+
3115
+ .taskon-task-validation-dialog-icon {
3116
+ width: 48px;
3117
+ height: 48px;
3118
+ }
3119
+
3120
+ .taskon-task-validation-dialog-message {
3121
+ margin: 0;
3122
+ margin-bottom: 16px;
3123
+ font-size: 16px;
3124
+ line-height: 1.5;
3125
+ color: rgba(255, 255, 255, 0.9);
3126
+ }
3127
+
3128
+ .taskon-task-validation-dialog-progress {
3129
+ margin: 0;
3130
+ margin-bottom: 16px;
3131
+ font-size: 14px;
3132
+ line-height: 1.5;
3133
+ color: rgba(255, 255, 255, 0.6);
3134
+ }
3135
+
3136
+ .taskon-task-validation-dialog-btn {
3137
+ width: 100%;
3138
+ max-width: 200px;
3139
+ padding: 12px 24px;
3140
+ border: none;
3141
+ border-radius: 8px;
3142
+ background: #cbff01;
3143
+ color: #000;
3144
+ font-size: 16px;
3145
+ font-weight: 600;
3146
+ cursor: pointer;
3147
+ transition: opacity 0.2s ease;
3148
+ }
3149
+
3150
+ .taskon-task-validation-dialog-btn:hover {
3151
+ opacity: 0.9;
3152
+ }
3153
+
3154
+ .taskon-task-validation-dialog-btn:active {
3155
+ opacity: 0.8;
3156
+ }
3157
+ /**
3158
+ * RewardBindDialog Styles
3159
+ * @module widgets/Quest/components/OperateFooter/styles/reward-bind-dialog
3160
+ */
3161
+
3162
+ .taskon-reward-bind-dialog {
3163
+ padding: 16px 24px 24px;
3164
+ }
3165
+
3166
+ .taskon-reward-bind-tip {
3167
+ margin: 0;
3168
+ margin-bottom: 20px;
3169
+ font-size: 14px;
3170
+ line-height: 1.6;
3171
+ color: rgba(255, 255, 255, 0.7);
3172
+ }
3173
+
3174
+ .taskon-reward-bind-list {
3175
+ display: flex;
3176
+ flex-direction: column;
3177
+ gap: 12px;
3178
+ }
3179
+
3180
+ .taskon-reward-bind-item {
3181
+ display: flex;
3182
+ align-items: center;
3183
+ justify-content: space-between;
3184
+ padding: 12px 16px;
3185
+ background: rgba(255, 255, 255, 0.05);
3186
+ border-radius: 8px;
3187
+ border: 1px solid rgba(255, 255, 255, 0.1);
3188
+ }
3189
+
3190
+ .taskon-reward-bind-item--bound {
3191
+ border-color: rgba(26, 255, 171, 0.3);
3192
+ background: rgba(26, 255, 171, 0.05);
3193
+ }
3194
+
3195
+ .taskon-reward-bind-item-label {
3196
+ font-size: 14px;
3197
+ font-weight: 500;
3198
+ color: rgba(255, 255, 255, 0.9);
3199
+ }
3200
+
3201
+ .taskon-reward-bind-item-status {
3202
+ display: flex;
3203
+ align-items: center;
3204
+ gap: 6px;
3205
+ font-size: 13px;
3206
+ color: #1affab;
3207
+ }
3208
+
3209
+ .taskon-reward-bind-item-btn {
3210
+ display: flex;
3211
+ align-items: center;
3212
+ gap: 6px;
3213
+ padding: 8px 16px;
3214
+ border: none;
3215
+ border-radius: 6px;
3216
+ background: #cbff01;
3217
+ color: #000;
3218
+ font-size: 13px;
3219
+ font-weight: 600;
3220
+ cursor: pointer;
3221
+ transition: opacity 0.2s ease;
3222
+ }
3223
+
3224
+ .taskon-reward-bind-item-btn:hover:not(:disabled) {
3225
+ opacity: 0.9;
3226
+ }
3227
+
3228
+ .taskon-reward-bind-item-btn:disabled {
3229
+ opacity: 0.7;
3230
+ cursor: not-allowed;
3231
+ }
3232
+
3233
+ .taskon-reward-bind-item-spinner {
3234
+ width: 14px;
3235
+ height: 14px;
3236
+ animation: taskon-reward-bind-spin 1s linear infinite;
3237
+ }
3238
+
3239
+ @keyframes taskon-reward-bind-spin {
3240
+ from {
3241
+ transform: rotate(0deg);
3242
+ }
3243
+ to {
3244
+ transform: rotate(360deg);
3245
+ }
3246
+ }
3247
+
3248
+ .taskon-reward-bind-skip-btn {
3249
+ width: 100%;
3250
+ margin-top: 20px;
3251
+ padding: 14px 24px;
3252
+ border: 1px solid rgba(255, 255, 255, 0.2);
3253
+ border-radius: 8px;
3254
+ background: transparent;
3255
+ color: rgba(255, 255, 255, 0.9);
3256
+ font-size: 14px;
3257
+ font-weight: 500;
3258
+ cursor: pointer;
3259
+ transition: all 0.2s ease;
3260
+ }
3261
+
3262
+ .taskon-reward-bind-skip-btn:hover {
3263
+ background: rgba(255, 255, 255, 0.05);
3264
+ border-color: rgba(255, 255, 255, 0.3);
3265
+ }
3266
+ /**
3267
+ * DiscordBindDialog Styles
3268
+ * @module widgets/Quest/components/OperateFooter/styles/discord-bind-dialog
3269
+ */
3270
+
3271
+ .taskon-discord-bind-dialog {
3272
+ display: flex;
3273
+ flex-direction: column;
3274
+ align-items: center;
3275
+ padding: 24px;
3276
+ text-align: center;
3277
+ }
3278
+
3279
+ .taskon-discord-bind-dialog-icon-wrap {
3280
+ margin-bottom: 20px;
3281
+ }
3282
+
3283
+ .taskon-discord-bind-dialog-icon {
3284
+ width: 48px;
3285
+ height: 48px;
3286
+ }
3287
+
3288
+ .taskon-discord-bind-dialog-desc {
3289
+ margin: 0;
3290
+ margin-bottom: 24px;
3291
+ font-size: 14px;
3292
+ line-height: 1.6;
3293
+ color: rgba(255, 255, 255, 0.7);
3294
+ }
3295
+
3296
+ .taskon-discord-bind-dialog-buttons {
3297
+ display: flex;
3298
+ flex-direction: column;
3299
+ gap: 12px;
3300
+ width: 100%;
3301
+ }
3302
+
3303
+ .taskon-discord-bind-dialog-btn {
3304
+ width: 100%;
3305
+ padding: 14px 24px;
3306
+ border-radius: 8px;
3307
+ font-size: 14px;
3308
+ font-weight: 600;
3309
+ cursor: pointer;
3310
+ transition: all 0.2s ease;
3311
+ }
3312
+
3313
+ .taskon-discord-bind-dialog-btn--primary {
3314
+ border: none;
3315
+ background: #cbff01;
3316
+ color: #000;
3317
+ }
3318
+
3319
+ .taskon-discord-bind-dialog-btn--primary:hover {
3320
+ opacity: 0.9;
3321
+ }
3322
+
3323
+ .taskon-discord-bind-dialog-btn--secondary {
3324
+ border: 1px solid rgba(255, 255, 255, 0.2);
3325
+ background: transparent;
3326
+ color: rgba(255, 255, 255, 0.9);
3327
+ }
3328
+
3329
+ .taskon-discord-bind-dialog-btn--secondary:hover {
3330
+ background: rgba(255, 255, 255, 0.05);
3331
+ border-color: rgba(255, 255, 255, 0.3);
3332
+ }
3333
+ /**
3334
+ * WinnersRow 组件样式
3335
+ * 与 QuestRewards 卡片样式保持一致
3336
+ */
3337
+
3338
+ /* WinnersRow 容器 - 纯色背景,与 reward 卡片一致 */
3339
+ .taskon-quest-winners-row {
3340
+ display: flex;
3341
+ align-items: center;
3342
+ width: 100%;
3343
+ padding: 16px;
3344
+ border-radius: 10px;
3345
+ border: none;
3346
+ cursor: pointer;
3347
+ background: rgba(255, 255, 255, 0.04);
3348
+ transition: background-color 0.2s ease;
3349
+ }
3350
+
3351
+ .taskon-quest-winners-row:hover {
3352
+ background: rgba(255, 255, 255, 0.08);
3353
+ }
3354
+
3355
+ /* Winners 标签 */
3356
+ .taskon-quest-winners-row-label {
3357
+ font-size: 18px;
3358
+ font-weight: 500;
3359
+ line-height: 23px;
3360
+ color: #ffffff;
3361
+ }
3362
+
3363
+ /* 数量 */
3364
+ .taskon-quest-winners-row-count {
3365
+ flex: 1;
3366
+ margin-left: 8px;
3367
+ font-size: 18px;
3368
+ font-weight: 600;
3369
+ line-height: 23px;
3370
+ text-align: left;
3371
+ color: #00ffa3;
3372
+ }
3373
+
3374
+ /* 右箭头图标 */
3375
+ .taskon-quest-winners-row-arrow {
3376
+ width: 16px;
3377
+ height: 16px;
3378
+ color: rgba(255, 255, 255, 0.6);
3379
+ flex-shrink: 0;
3380
+ }
3381
+ /**
3382
+ * WinnersStatus Component Styles
3383
+ * @description Styles for winners status display including:
3384
+ * - POW review alert
3385
+ * - Drawing winners alert
3386
+ * - Winners row
3387
+ *
3388
+ * Reference: taskon-website/apps/website/src/common/CampaignStatus/
3389
+ */
3390
+
3391
+ /* ==========================================================================
3392
+ Container - Match reward module style
3393
+ ========================================================================== */
3394
+ .taskon-winners {
3395
+ border-radius: 10px;
3396
+ background: var(--taskon-bg-card, rgba(255, 255, 255, 0.04));
3397
+ overflow: hidden;
3398
+ }
3399
+
3400
+ /* ==========================================================================
3401
+ Status Alert (POW Reviewing / Drawing Winners)
3402
+ ========================================================================== */
3403
+ .taskon-winners-alert {
3404
+ display: flex;
3405
+ align-items: center;
3406
+ justify-content: center;
3407
+ gap: 8px;
3408
+ padding: 16px;
3409
+ background: rgba(255, 255, 255, 0.05);
3410
+ font-size: 16px;
3411
+ font-weight: 500;
3412
+ color: rgba(255, 255, 255, 0.7);
3413
+ text-decoration: none;
3414
+ transition: color 0.2s ease;
3415
+ }
3416
+
3417
+ .taskon-winners-alert:hover {
3418
+ color: rgba(255, 255, 255, 0.9);
3419
+ }
3420
+
3421
+ .taskon-winners-alert-icon {
3422
+ width: 12px;
3423
+ height: 12px;
3424
+ flex-shrink: 0;
3425
+ }
3426
+
3427
+ .taskon-winners-alert-text {
3428
+ flex: 1;
3429
+ }
3430
+
3431
+ .taskon-winners-alert-community {
3432
+ font-weight: 600;
3433
+ color: rgba(255, 255, 255, 0.9);
3434
+ }
3435
+
3436
+ .taskon-winners-alert-link-icon {
3437
+ width: 16px;
3438
+ height: 16px;
3439
+ flex-shrink: 0;
3440
+ }
3441
+
3442
+ /* ==========================================================================
3443
+ POW Review Info Card
3444
+ ========================================================================== */
3445
+ .taskon-winners-content {
3446
+ padding: 16px;
3447
+ }
3448
+
3449
+ .taskon-winners-pow-info {
3450
+ font-size: 12px;
3451
+ line-height: 1.5;
3452
+ color: rgba(255, 212, 101, 0.6);
3453
+ margin-bottom: 16px;
3454
+ }
3455
+
3456
+ .taskon-winners-pow-info-community {
3457
+ font-weight: 500;
3458
+ color: #ffd465;
3459
+ }
3460
+
3461
+ .taskon-winners-pow-info-only {
3462
+ font-weight: 500;
3463
+ color: #ffd465;
3464
+ }
3465
+
3466
+ /* ==========================================================================
3467
+ Status Info Card - Match reward module card style
3468
+ ========================================================================== */
3469
+ .taskon-winners-card {
3470
+ padding: 16px;
3471
+ border-radius: 8px;
3472
+ background: var(--taskon-bg-card, rgba(255, 255, 255, 0.04));
3473
+ display: flex;
3474
+ flex-direction: column;
3475
+ gap: 16px;
3476
+ }
3477
+
3478
+ .taskon-winners-card-row {
3479
+ display: flex;
3480
+ align-items: center;
3481
+ justify-content: space-between;
3482
+ font-size: 16px;
3483
+ }
3484
+
3485
+ .taskon-winners-card-label {
3486
+ font-weight: 500;
3487
+ color: rgba(255, 255, 255, 0.7);
3488
+ }
3489
+
3490
+ .taskon-winners-card-value {
3491
+ font-weight: 500;
3492
+ color: #9aff73;
3493
+ }
3494
+
3495
+ .taskon-winners-card-value--primary {
3496
+ font-weight: 600;
3497
+ color: var(--taskon-primary, #cbff01);
3498
+ }
3499
+
3500
+ /* ==========================================================================
3501
+ Winners Row (already has separate styles in winners-row.css)
3502
+ ========================================================================== */
3503
+
3504
+ /* Ensure winners row integrates well with status card */
3505
+ .taskon-winners-card .taskon-quest-winners-row {
3506
+ padding: 0;
3507
+ background: transparent;
3508
+ }
3509
+ /**
3510
+ * Quest Widget 基础样式
3511
+ * @description 采用 .taskon-quest-* 命名空间,避免样式冲突
3512
+ * @design 参考 Figma 设计稿
3513
+ */
3514
+
3515
+ /* ============================================================================
3516
+ CSS 变量定义
3517
+ ============================================================================ */
3518
+
3519
+ .taskon-quest {
3520
+ /* 颜色系统 */
3521
+ --taskon-quest-bg-body: #111111;
3522
+ --taskon-quest-text-lightest: #ffffff;
3523
+ --taskon-quest-text-lighter: rgba(255, 255, 255, 0.8);
3524
+ --taskon-quest-text-light: rgba(255, 255, 255, 0.6);
3525
+ --taskon-quest-text-dark: rgba(255, 255, 255, 0.4);
3526
+ --taskon-quest-text-darkest: rgba(255, 255, 255, 0.1);
3527
+ --taskon-quest-text-invisible: rgba(255, 255, 255, 0.04);
3528
+ --taskon-quest-primary: #cbff01;
3529
+ --taskon-quest-secondary: #1affab;
3530
+ --taskon-quest-link: #58afff;
3531
+ --taskon-quest-button-primary-color: #000000;
3532
+
3533
+ /* 间距系统 */
3534
+ --taskon-quest-spacing-xxs: 4px;
3535
+ --taskon-quest-spacing-xs: 8px;
3536
+ --taskon-quest-spacing-s: 12px;
3537
+ --taskon-quest-spacing-m: 16px;
3538
+ --taskon-quest-spacing-l: 20px;
3539
+ --taskon-quest-spacing-xl: 24px;
3540
+ --taskon-quest-spacing-xxl: 32px;
3541
+ --taskon-quest-spacing-3xl: 40px;
3542
+
3543
+ /* 圆角系统 */
3544
+ --taskon-quest-radius-s: 4px;
3545
+ --taskon-quest-radius-m: 6px;
3546
+ --taskon-quest-radius-l: 8px;
3547
+ --taskon-quest-radius-xl: 12px;
3548
+ }
3549
+
3550
+ /* ============================================================================
3551
+ Quest Widget 根容器
3552
+ ============================================================================ */
3553
+
3554
+ .taskon-quest {
3555
+ font-size: 16px;
3556
+ line-height: 1.5;
3557
+ color: var(--taskon-quest-text-lightest);
3558
+ background-color: var(--taskon-quest-bg-body);
3559
+ }
3560
+
3561
+ /* ============================================================================
3562
+ Loading 状态
3563
+ ============================================================================ */
3564
+
3565
+ .taskon-quest-loading {
3566
+ display: flex;
3567
+ flex-direction: column;
3568
+ align-items: center;
3569
+ justify-content: center;
3570
+ padding: 48px 24px;
3571
+ gap: 12px;
3572
+ color: var(--taskon-quest-text-light);
3573
+ }
3574
+
3575
+ .taskon-quest-loading-spinner {
3576
+ width: 32px;
3577
+ height: 32px;
3578
+ border: 3px solid var(--taskon-quest-text-darkest);
3579
+ border-top-color: var(--taskon-quest-primary);
3580
+ border-radius: 50%;
3581
+ animation: taskon-quest-spin 1s linear infinite;
3582
+ }
3583
+
3584
+ @keyframes taskon-quest-spin {
3585
+ to {
3586
+ transform: rotate(360deg);
3587
+ }
3588
+ }
3589
+
3590
+ /* ============================================================================
3591
+ Error 状态
3592
+ ============================================================================ */
3593
+
3594
+ .taskon-quest-error {
3595
+ display: flex;
3596
+ flex-direction: column;
3597
+ align-items: center;
3598
+ justify-content: center;
3599
+ padding: 48px 24px;
3600
+ gap: 12px;
3601
+ text-align: center;
3602
+ }
3603
+
3604
+ .taskon-quest-error-icon {
3605
+ font-size: 32px;
3606
+ }
3607
+
3608
+ .taskon-quest-error-message {
3609
+ color: #ef4444;
3610
+ font-size: 14px;
3611
+ }
3612
+
3613
+ .taskon-quest-error-retry {
3614
+ margin-top: 8px;
3615
+ padding: 8px 16px;
3616
+ font-size: 14px;
3617
+ color: var(--taskon-quest-text-lightest);
3618
+ background-color: var(--taskon-quest-primary);
3619
+ border: none;
3620
+ border-radius: var(--taskon-quest-radius-m);
3621
+ cursor: pointer;
3622
+ transition: background-color 0.2s;
3623
+ }
3624
+
3625
+ .taskon-quest-error-retry:hover {
3626
+ opacity: 0.9;
3627
+ }
3628
+
3629
+ /* ============================================================================
3630
+ Empty 状态
3631
+ ============================================================================ */
3632
+
3633
+ .taskon-quest-empty {
3634
+ display: flex;
3635
+ align-items: center;
3636
+ justify-content: center;
3637
+ padding: 48px 24px;
3638
+ color: var(--taskon-quest-text-light);
3639
+ font-size: 14px;
3640
+ }
3641
+
3642
+ /* ============================================================================
3643
+ 左中右三栏布局
3644
+ ============================================================================ */
3645
+
3646
+ .taskon-quest-layout {
3647
+ display: flex;
3648
+ gap: var(--taskon-quest-spacing-3xl);
3649
+ align-items: flex-start;
3650
+ }
3651
+
3652
+ /* 左侧主内容区(固定比例 2:1) */
3653
+ .taskon-quest-content {
3654
+ flex: 2;
3655
+ min-width: 0;
3656
+ display: flex;
3657
+ flex-direction: column;
3658
+ gap: var(--taskon-quest-spacing-xl);
3659
+ }
3660
+
3661
+ /* 中间分割线 */
3662
+ .taskon-quest-divider {
3663
+ width: 1px;
3664
+ align-self: stretch;
3665
+ background: linear-gradient(
3666
+ to bottom,
3667
+ var(--taskon-quest-text-invisible),
3668
+ var(--taskon-quest-text-darkest),
3669
+ var(--taskon-quest-text-invisible)
3670
+ );
3671
+ flex-shrink: 0;
3672
+ }
3673
+
3674
+ /* 右侧边栏(固定比例 2:1) */
3675
+ .taskon-quest-sidebar {
3676
+ flex: 1;
3677
+ min-width: 0;
3678
+ display: flex;
3679
+ flex-direction: column;
3680
+ gap: var(--taskon-quest-spacing-xxl);
3681
+ }
3682
+
3683
+ /* ============================================================================
3684
+ Quest Header 区域
3685
+ ============================================================================ */
3686
+
3687
+ .taskon-quest-header {
3688
+ display: flex;
3689
+ flex-direction: column;
3690
+ gap: var(--taskon-quest-spacing-l);
3691
+ }
3692
+
3693
+ /* 标题 + 倒计时区域 */
3694
+ .taskon-quest-header-title-section {
3695
+ display: flex;
3696
+ flex-direction: column;
3697
+ gap: var(--taskon-quest-spacing-xs);
3698
+ }
3699
+
3700
+ .taskon-quest-title {
3701
+ margin: 0;
3702
+ font-size: 28px;
3703
+ font-weight: 600;
3704
+ line-height: 38px;
3705
+ color: var(--taskon-quest-text-lightest);
3706
+ }
3707
+
3708
+ /* 倒计时 + 时间范围 */
3709
+ .taskon-quest-header-meta {
3710
+ display: flex;
3711
+ align-items: center;
3712
+ gap: var(--taskon-quest-spacing-s);
3713
+ padding: var(--taskon-quest-spacing-xxs) 0;
3714
+ border-radius: var(--taskon-quest-radius-s);
3715
+ }
3716
+
3717
+ .taskon-quest-countdown {
3718
+ display: flex;
3719
+ gap: var(--taskon-quest-spacing-xs);
3720
+ align-items: center;
3721
+ }
3722
+
3723
+ .taskon-quest-countdown-icon {
3724
+ display: flex;
3725
+ align-items: center;
3726
+ justify-content: center;
3727
+ color: var(--taskon-quest-text-lightest);
3728
+ }
3729
+
3730
+ .taskon-quest-countdown-label {
3731
+ font-size: 16px;
3732
+ font-weight: 400;
3733
+ line-height: 24px;
3734
+ color: var(--taskon-quest-text-lighter);
3735
+ }
3736
+
3737
+ /* 已结束状态的标签样式 */
3738
+ .taskon-quest-countdown-label--ended {
3739
+ font-weight: 600;
3740
+ text-transform: uppercase;
3741
+ }
3742
+
3743
+ .taskon-quest-countdown-value {
3744
+ font-size: 16px;
3745
+ font-weight: 600;
3746
+ line-height: 24px;
3747
+ color: var(--taskon-quest-primary);
3748
+ }
3749
+
3750
+ .taskon-quest-countdown-divider {
3751
+ width: 1px;
3752
+ height: 20px;
3753
+ background-color: var(--taskon-quest-text-darkest);
3754
+ }
3755
+
3756
+ .taskon-quest-time-range {
3757
+ font-size: 16px;
3758
+ font-weight: 400;
3759
+ line-height: 24px;
3760
+ color: var(--taskon-quest-text-lighter);
3761
+ }
3762
+
3763
+ /* Banner 图片 */
3764
+ .taskon-quest-banner {
3765
+ display: block;
3766
+ margin: 0 auto;
3767
+ width: 100%;
3768
+ border-radius: 10px;
3769
+ }
3770
+
3771
+ .taskon-quest-banner-img {
3772
+ display: block;
3773
+ width: 100%;
3774
+ border-radius: 10px;
3775
+ }
3776
+
3777
+ /* 方形图片在 PC 端限制宽度 */
3778
+ @media (min-width: 751px) {
3779
+ .taskon-quest-banner--square .taskon-quest-banner-img {
3780
+ width: 340px;
3781
+ max-width: 100%;
3782
+ margin: 0 auto;
3783
+ }
3784
+ }
3785
+
3786
+ /* 描述 + View More */
3787
+ .taskon-quest-desc {
3788
+ position: relative;
3789
+ display: flex;
3790
+ flex-direction: column;
3791
+ gap: var(--taskon-quest-spacing-m);
3792
+ }
3793
+
3794
+ .taskon-quest-desc-text {
3795
+ margin: 0;
3796
+ font-size: 16px;
3797
+ font-weight: 400;
3798
+ line-height: 24px;
3799
+ color: var(--taskon-quest-text-lighter);
3800
+ max-height: 120px;
3801
+ overflow: hidden;
3802
+ position: relative;
3803
+ }
3804
+
3805
+ /* 展开后移除高度限制和渐变 */
3806
+ .taskon-quest-desc-text--expanded {
3807
+ max-height: none;
3808
+ }
3809
+
3810
+ /* 描述渐变遮罩 - 仅在未展开时显示 */
3811
+ .taskon-quest-desc-text:not(.taskon-quest-desc-text--expanded)::after {
3812
+ content: "";
3813
+ position: absolute;
3814
+ bottom: 0;
3815
+ left: 0;
3816
+ right: 0;
3817
+ height: 49px;
3818
+ background: linear-gradient(
3819
+ 0.83deg,
3820
+ var(--taskon-quest-bg-body) 10.557%,
3821
+ rgba(17, 17, 17, 0) 93.799%
3822
+ );
3823
+ pointer-events: none;
3824
+ }
3825
+
3826
+ /* 富文本样式重置 */
3827
+ .taskon-quest-desc-text p {
3828
+ margin: 0 0 var(--taskon-quest-spacing-xs) 0;
3829
+ }
3830
+
3831
+ .taskon-quest-desc-text p:last-child {
3832
+ margin-bottom: 0;
3833
+ }
3834
+
3835
+ .taskon-quest-desc-text a {
3836
+ color: var(--taskon-quest-link);
3837
+ text-decoration: underline;
3838
+ }
3839
+
3840
+ .taskon-quest-desc-text ul,
3841
+ .taskon-quest-desc-text ol {
3842
+ margin: var(--taskon-quest-spacing-xs) 0;
3843
+ padding-left: var(--taskon-quest-spacing-xl);
3844
+ }
3845
+
3846
+ .taskon-quest-desc-text li {
3847
+ margin: var(--taskon-quest-spacing-xxs) 0;
3848
+ }
3849
+
3850
+ /* 图片样式:限制最大宽度,防止溢出 */
3851
+ .taskon-quest-desc-text img {
3852
+ max-width: 100%;
3853
+ height: auto;
3854
+ border-radius: var(--taskon-quest-radius-m);
3855
+ }
3856
+
3857
+ /* iframe 样式:限制最大宽度 */
3858
+ .taskon-quest-desc-text iframe {
3859
+ max-width: 100%;
3860
+ border-radius: var(--taskon-quest-radius-m);
3861
+ }
3862
+
3863
+ .taskon-quest-desc-more {
3864
+ font-size: 16px;
3865
+ font-weight: 600;
3866
+ line-height: 24px;
3867
+ color: var(--taskon-quest-text-lightest);
3868
+ text-decoration: underline;
3869
+ text-decoration-skip-ink: none;
3870
+ text-underline-position: from-font;
3871
+ background: none;
3872
+ border: none;
3873
+ cursor: pointer;
3874
+ padding: 0;
3875
+ align-self: flex-start;
3876
+ }
3877
+
3878
+ .taskon-quest-desc-more:hover {
3879
+ opacity: 0.8;
3880
+ }
3881
+
3882
+ /* 分割线 */
3883
+ .taskon-quest-content-divider {
3884
+ height: 1px;
3885
+ background: linear-gradient(
3886
+ to right,
3887
+ var(--taskon-quest-text-invisible),
3888
+ var(--taskon-quest-text-darkest),
3889
+ var(--taskon-quest-text-invisible)
3890
+ );
3891
+ }
3892
+
3893
+ /* ============================================================================
3894
+ Quest 任务列表区域
3895
+ ============================================================================ */
3896
+
3897
+ .taskon-quest-tasks {
3898
+ display: flex;
3899
+ flex-direction: column;
3900
+ gap: var(--taskon-quest-spacing-m);
3901
+ }
3902
+
3903
+ /* Quest 标题 */
3904
+ .taskon-quest-tasks-header {
3905
+ display: flex;
3906
+ gap: var(--taskon-quest-spacing-m);
3907
+ align-items: center;
3908
+ }
3909
+
3910
+ .taskon-quest-tasks-title {
3911
+ margin: 0;
3912
+ font-size: 24px;
3913
+ font-weight: 600;
3914
+ line-height: 32px;
3915
+ color: var(--taskon-quest-text-lightest);
3916
+ }
3917
+
3918
+ /* 任务列表 */
3919
+ .taskon-quest-tasks-list {
3920
+ display: flex;
3921
+ flex-direction: column;
3922
+ gap: var(--taskon-quest-spacing-m);
3923
+ }
3924
+
3925
+ .taskon-quest-task-placeholder {
3926
+ display: flex;
3927
+ justify-content: space-between;
3928
+ align-items: center;
3929
+ padding: var(--taskon-quest-spacing-m);
3930
+ height: 66px;
3931
+ background: linear-gradient(
3932
+ 90deg,
3933
+ rgba(255, 255, 255, 0.1) 0%,
3934
+ rgba(255, 255, 255, 0.1) 100%
3935
+ ),
3936
+ linear-gradient(90deg, #0d0d0d 0%, #0d0d0d 100%);
3937
+ border: 1px solid var(--taskon-quest-text-invisible);
3938
+ border-radius: var(--taskon-quest-radius-l);
3939
+ font-size: 18px;
3940
+ font-weight: 600;
3941
+ color: var(--taskon-quest-text-lightest);
3942
+ }
3943
+
3944
+ .taskon-quest-task-template {
3945
+ color: var(--taskon-quest-text-dark);
3946
+ font-size: 14px;
3947
+ font-weight: 500;
3948
+ }
3949
+
3950
+ /* Complete 按钮 */
3951
+ .taskon-quest-complete-btn {
3952
+ width: 100%;
3953
+ margin-top: var(--taskon-quest-spacing-xl);
3954
+ padding: var(--taskon-quest-spacing-m) var(--taskon-quest-spacing-3xl);
3955
+ font-size: 18px;
3956
+ font-weight: 600;
3957
+ line-height: 24px;
3958
+ color: var(--taskon-quest-button-primary-color);
3959
+ background-color: var(--taskon-quest-primary);
3960
+ border: none;
3961
+ border-radius: var(--taskon-quest-radius-l);
3962
+ cursor: pointer;
3963
+ transition: opacity 0.2s;
3964
+ display: flex;
3965
+ align-items: center;
3966
+ justify-content: center;
3967
+ gap: var(--taskon-quest-spacing-xs);
3968
+ }
3969
+
3970
+ .taskon-quest-complete-btn:hover:not(:disabled) {
3971
+ opacity: 0.9;
3972
+ }
3973
+
3974
+ .taskon-quest-complete-btn:disabled {
3975
+ opacity: 0.5;
3976
+ cursor: not-allowed;
3977
+ }
3978
+
3979
+ /* ============================================================================
3980
+ 右侧边栏 - Winners Section (入口区域)
3981
+ ============================================================================ */
3982
+
3983
+ .taskon-quest-winners-section {
3984
+ display: flex;
3985
+ flex-direction: column;
3986
+ gap: var(--taskon-quest-spacing-m);
3987
+ margin-bottom: var(--taskon-quest-spacing-xl);
3988
+ }
3989
+
3990
+ .taskon-quest-winners-section-title {
3991
+ margin: 0;
3992
+ font-size: 24px;
3993
+ font-weight: 600;
3994
+ line-height: 32px;
3995
+ color: var(--taskon-quest-text-lightest);
3996
+ }
3997
+
3998
+ /* ============================================================================
3999
+ 右侧边栏 - Quest Rewards Section
4000
+ ============================================================================ */
4001
+
4002
+ .taskon-quest-rewards-section {
4003
+ display: flex;
4004
+ flex-direction: column;
4005
+ gap: var(--taskon-quest-spacing-l);
4006
+ }
4007
+
4008
+ .taskon-quest-rewards-section-title {
4009
+ margin: 0;
4010
+ font-size: 24px;
4011
+ font-weight: 600;
4012
+ line-height: 32px;
4013
+ color: var(--taskon-quest-text-lightest);
4014
+ }
4015
+
4016
+ /* QuestRewards 组件 CSS 变量映射 */
4017
+ .taskon-quest-rewards-section {
4018
+ --taskon-text-primary: var(--taskon-quest-text-lightest);
4019
+ --taskon-text-secondary: var(--taskon-quest-text-lighter);
4020
+ --taskon-text-tertiary: var(--taskon-quest-text-light);
4021
+ --taskon-bg-card: var(--taskon-quest-text-invisible);
4022
+ --taskon-bg-secondary: rgba(255, 255, 255, 0.03);
4023
+ --taskon-bg-tertiary: var(--taskon-quest-text-darkest);
4024
+ --taskon-border-color: var(--taskon-quest-text-darkest);
4025
+ --taskon-primary: var(--taskon-quest-primary);
4026
+ --taskon-success: var(--taskon-quest-secondary);
4027
+ --taskon-link: var(--taskon-quest-link);
4028
+ --taskon-warning: #ffc107;
4029
+ }
4030
+
4031
+ /* ============================================================================
4032
+ 右侧边栏 - Quest Rewards (旧版,保留兼容)
4033
+ ============================================================================ */
4034
+
4035
+ .taskon-quest-rewards {
4036
+ display: flex;
4037
+ flex-direction: column;
4038
+ gap: var(--taskon-quest-spacing-l);
4039
+ }
4040
+
4041
+ .taskon-quest-rewards-title {
4042
+ margin: 0;
4043
+ font-size: 24px;
4044
+ font-weight: 600;
4045
+ line-height: 32px;
4046
+ color: var(--taskon-quest-text-lightest);
4047
+ }
4048
+
4049
+ .taskon-quest-rewards-list {
4050
+ display: flex;
4051
+ flex-direction: column;
4052
+ gap: var(--taskon-quest-spacing-m);
4053
+ }
4054
+
4055
+ .taskon-quest-reward-item {
4056
+ display: flex;
4057
+ justify-content: space-between;
4058
+ align-items: center;
4059
+ padding: var(--taskon-quest-spacing-m);
4060
+ background-color: var(--taskon-quest-text-invisible);
4061
+ border-radius: var(--taskon-quest-radius-xl);
4062
+ font-size: 16px;
4063
+ color: var(--taskon-quest-text-lightest);
4064
+ }
4065
+
4066
+ /* ============================================================================
4067
+ 右侧边栏 - Eligibility Section
4068
+ ============================================================================ */
4069
+
4070
+ .taskon-quest-eligs-section {
4071
+ margin-top: var(--taskon-quest-spacing-xl);
4072
+ }
4073
+
4074
+ .taskon-quest-eligs-section-header {
4075
+ display: flex;
4076
+ align-items: center;
4077
+ justify-content: space-between;
4078
+ margin-bottom: var(--taskon-quest-spacing-m);
4079
+ }
4080
+
4081
+ .taskon-quest-eligs-section-title {
4082
+ margin: 0;
4083
+ font-size: 20px;
4084
+ font-weight: 600;
4085
+ line-height: 28px;
4086
+ color: var(--taskon-quest-text-lightest);
4087
+ }
4088
+
4089
+ /* ============================================================================
4090
+ 右侧边栏 - Participants Info
4091
+ ============================================================================ */
4092
+
4093
+ .taskon-quest-participants {
4094
+ display: flex;
4095
+ flex-direction: column;
4096
+ gap: var(--taskon-quest-spacing-l);
4097
+ }
4098
+
4099
+ .taskon-quest-participants-title {
4100
+ margin: 0;
4101
+ font-size: 24px;
4102
+ font-weight: 600;
4103
+ line-height: 32px;
4104
+ color: var(--taskon-quest-text-lightest);
4105
+ }
4106
+
4107
+ .taskon-quest-participants-item {
4108
+ display: flex;
4109
+ justify-content: space-between;
4110
+ align-items: center;
4111
+ font-size: 16px;
4112
+ font-weight: 500;
4113
+ line-height: 24px;
4114
+ }
4115
+
4116
+ .taskon-quest-participants-label {
4117
+ color: var(--taskon-quest-text-lighter);
4118
+ }
4119
+
4120
+ .taskon-quest-participants-value {
4121
+ color: var(--taskon-quest-text-lightest);
4122
+ }
4123
+
4124
+ /* ============================================================================
4125
+ 响应式布局(TODO: Phase 13 完善)
4126
+ ============================================================================ */
4127
+
4128
+ @media (max-width: 1200px) {
4129
+ .taskon-quest-layout {
4130
+ flex-direction: column;
4131
+ }
4132
+
4133
+ .taskon-quest-divider {
4134
+ width: 100%;
4135
+ height: 1px;
4136
+ background: linear-gradient(
4137
+ to right,
4138
+ var(--taskon-quest-text-invisible),
4139
+ var(--taskon-quest-text-darkest),
4140
+ var(--taskon-quest-text-invisible)
4141
+ );
4142
+ }
4143
+
4144
+ .taskon-quest-sidebar {
4145
+ width: 100%;
4146
+ }
4147
+ }
4148
+
4149
+ /* ============================================================================
4150
+ Eligibility (资格验证) 组件样式
4151
+ ============================================================================ */
4152
+
4153
+ /* 主容器 */
4154
+ .taskon-quest-eligs {
4155
+ margin-top: 25px;
4156
+ padding: 0 18px;
4157
+ border: 1px solid var(--taskon-quest-text-darkest);
4158
+ border-radius: 10px;
4159
+ }
4160
+
4161
+ /* 动画效果 - 用于引导用户注意 */
4162
+ .taskon-quest-eligs--animate {
4163
+ animation: taskon-quest-eligs-glow 800ms ease-out infinite alternate;
4164
+ }
4165
+
4166
+ @keyframes taskon-quest-eligs-glow {
4167
+ 0% {
4168
+ border-color: var(--taskon-quest-text-darkest);
4169
+ }
4170
+ 100% {
4171
+ border-color: rgba(255, 255, 255, 0.4);
4172
+ }
4173
+ }
4174
+
4175
+ /* 折叠头部 */
4176
+ .taskon-quest-eligs-header {
4177
+ height: 60px;
4178
+ display: flex;
4179
+ align-items: center;
4180
+ gap: 10px;
4181
+ font-size: 16px;
4182
+ line-height: 20px;
4183
+ cursor: pointer;
4184
+ user-select: none;
4185
+ }
4186
+
4187
+ .taskon-quest-eligs-header:hover {
4188
+ opacity: 0.9;
4189
+ }
4190
+
4191
+ /* 状态图标 */
4192
+ .taskon-quest-eligs-header-status {
4193
+ flex-shrink: 0;
4194
+ }
4195
+
4196
+ /* 头部文本 */
4197
+ .taskon-quest-eligs-header-text {
4198
+ flex: 1;
4199
+ color: var(--taskon-quest-text-lightest);
4200
+ }
4201
+
4202
+ /* 高亮表达式 (all/any) */
4203
+ .taskon-quest-eligs-header-express {
4204
+ color: var(--taskon-quest-secondary);
4205
+ }
4206
+
4207
+ /* 刷新按钮 */
4208
+ .taskon-quest-eligs-refresh {
4209
+ display: flex;
4210
+ align-items: center;
4211
+ justify-content: center;
4212
+ width: 32px;
4213
+ height: 32px;
4214
+ padding: 0;
4215
+ margin-left: auto;
4216
+ background: transparent;
4217
+ border: 1px solid var(--taskon-quest-text-darkest);
4218
+ border-radius: 6px;
4219
+ color: var(--taskon-quest-text-lighter);
4220
+ cursor: pointer;
4221
+ transition: all 0.2s;
4222
+ }
4223
+
4224
+ .taskon-quest-eligs-refresh:hover:not(:disabled) {
4225
+ border-color: var(--taskon-quest-text-light);
4226
+ color: var(--taskon-quest-text-lightest);
4227
+ }
4228
+
4229
+ .taskon-quest-eligs-refresh:disabled {
4230
+ opacity: 0.5;
4231
+ cursor: not-allowed;
4232
+ }
4233
+
4234
+ .taskon-quest-eligs-refresh--loading .taskon-quest-eligs-refresh-icon {
4235
+ animation: taskon-quest-spin 1s linear infinite;
4236
+ }
4237
+
4238
+ /* 箭头图标 */
4239
+ .taskon-quest-eligs-header-arrow {
4240
+ flex-shrink: 0;
4241
+ width: 6px;
4242
+ height: 10px;
4243
+ color: var(--taskon-quest-text-lighter);
4244
+ transform: rotate(90deg);
4245
+ transition: transform 0.3s;
4246
+ }
4247
+
4248
+ .taskon-quest-eligs-header-arrow--expanded {
4249
+ transform: rotate(-90deg);
4250
+ }
4251
+
4252
+ /* 列表 */
4253
+ .taskon-quest-eligs-list {
4254
+ text-align: left;
4255
+ padding: 20px 0;
4256
+ margin: 0;
4257
+ list-style: none;
4258
+ border-top: 1px solid var(--taskon-quest-text-darkest);
4259
+ }
4260
+
4261
+ /* 单项 */
4262
+ .taskon-quest-eligs-item {
4263
+ line-height: 18px;
4264
+ }
4265
+
4266
+ .taskon-quest-eligs-item + .taskon-quest-eligs-item {
4267
+ margin-top: 24px;
4268
+ }
4269
+
4270
+ .taskon-quest-eligs-item-container {
4271
+ display: flex;
4272
+ align-items: flex-start;
4273
+ }
4274
+
4275
+ /* 状态图标 */
4276
+ .taskon-quest-eligs-item-icon {
4277
+ flex-shrink: 0;
4278
+ margin-right: 10px;
4279
+ margin-top: 2px;
4280
+ opacity: 0;
4281
+ }
4282
+
4283
+ .taskon-quest-eligs-item-icon-placeholder {
4284
+ flex-shrink: 0;
4285
+ width: 16px;
4286
+ height: 16px;
4287
+ margin-right: 10px;
4288
+ margin-top: 2px;
4289
+ }
4290
+
4291
+ .taskon-quest-eligs-item--passed .taskon-quest-eligs-item-icon,
4292
+ .taskon-quest-eligs-item--failed .taskon-quest-eligs-item-icon {
4293
+ opacity: 1;
4294
+ }
4295
+
4296
+ /* 内容区 */
4297
+ .taskon-quest-eligs-item-content {
4298
+ flex: 1;
4299
+ font-size: 14px;
4300
+ line-height: 18px;
4301
+ color: var(--taskon-quest-text-lighter);
4302
+ }
4303
+
4304
+ /* 类型组件样式 */
4305
+ .taskon-quest-eligs-type {
4306
+ color: var(--taskon-quest-text-lighter);
4307
+ }
4308
+
4309
+ .taskon-quest-eligs-type--tooltip {
4310
+ position: relative;
4311
+ cursor: help;
4312
+ }
4313
+
4314
+ /* 高亮文本 */
4315
+ .taskon-quest-eligs-highlight {
4316
+ color: var(--taskon-quest-primary);
4317
+ }
4318
+
4319
+ /* 链接样式 */
4320
+ .taskon-quest-eligs-link {
4321
+ color: var(--taskon-quest-link);
4322
+ text-decoration: underline;
4323
+ }
4324
+
4325
+ .taskon-quest-eligs-link:hover {
4326
+ opacity: 0.8;
4327
+ }
4328
+
4329
+ /* Tooltip */
4330
+ .taskon-quest-eligs-tooltip {
4331
+ position: absolute;
4332
+ top: 100%;
4333
+ left: 0;
4334
+ z-index: 10;
4335
+ margin-top: 4px;
4336
+ padding: 8px 12px;
4337
+ max-width: 300px;
4338
+ font-size: 12px;
4339
+ line-height: 16px;
4340
+ color: var(--taskon-quest-text-lightest);
4341
+ background-color: rgba(0, 0, 0, 0.9);
4342
+ border-radius: 6px;
4343
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
4344
+ white-space: normal;
4345
+ word-break: break-word;
4346
+ }
4347
+
4348
+ /* 子条件容器 */
4349
+ .taskon-quest-eligs-sub {
4350
+ width: 100%;
4351
+ }
4352
+
4353
+ .taskon-quest-eligs-sub-header {
4354
+ display: flex;
4355
+ align-items: center;
4356
+ justify-content: space-between;
4357
+ font-weight: 600;
4358
+ cursor: pointer;
4359
+ }
4360
+
4361
+ .taskon-quest-eligs-sub-header:hover {
4362
+ opacity: 0.9;
4363
+ }
4364
+
4365
+ .taskon-quest-eligs-sub-label {
4366
+ flex: 1;
4367
+ }
4368
+
4369
+ .taskon-quest-eligs-sub-arrow {
4370
+ flex-shrink: 0;
4371
+ width: 8px;
4372
+ height: 8px;
4373
+ color: var(--taskon-quest-text-lighter);
4374
+ transform: rotate(-90deg);
4375
+ transition: transform 0.3s;
4376
+ }
4377
+
4378
+ .taskon-quest-eligs-sub-arrow--expanded {
4379
+ transform: rotate(90deg);
4380
+ }
4381
+
4382
+ .taskon-quest-eligs-sub-list {
4383
+ margin-top: 10px;
4384
+ padding-left: 14px;
4385
+ list-style: disc;
4386
+ display: flex;
4387
+ flex-direction: column;
4388
+ gap: 8px;
4389
+ }
4390
+
4391
+ .taskon-quest-eligs-sub-list li {
4392
+ font-size: 14px;
4393
+ line-height: 18px;
4394
+ color: var(--taskon-quest-text-lighter);
4395
+ }
4396
+
4397
+ /* ============================================================================
4398
+ Eligibility 响应式样式
4399
+ ============================================================================ */
4400
+
4401
+ @media (max-width: 750px) {
4402
+ .taskon-quest-eligs {
4403
+ margin-top: 5.07vw;
4404
+ padding: 0 4vw;
4405
+ }
4406
+
4407
+ .taskon-quest-eligs-header {
4408
+ height: 12vw;
4409
+ font-size: 3.47vw;
4410
+ line-height: 4.4vw;
4411
+ }
4412
+
4413
+ .taskon-quest-eligs-header-arrow {
4414
+ width: 1.2vw;
4415
+ height: 2.4vw;
4416
+ }
4417
+
4418
+ .taskon-quest-eligs-list {
4419
+ padding: 3.73vw 0;
4420
+ }
4421
+
4422
+ .taskon-quest-eligs-item + .taskon-quest-eligs-item {
4423
+ margin-top: 3.73vw;
4424
+ }
4425
+
4426
+ .taskon-quest-eligs-item-icon,
4427
+ .taskon-quest-eligs-item-icon-placeholder {
4428
+ margin-top: 0.8vw;
4429
+ margin-right: 1.87vw;
4430
+ width: 3.2vw;
4431
+ height: 3.2vw;
4432
+ }
4433
+
4434
+ .taskon-quest-eligs-item-content {
4435
+ font-size: 3.47vw;
4436
+ line-height: 4.4vw;
4437
+ }
4438
+ }
4439
+
4440
+ /* ============================================================================
4441
+ Eligibility - OnChainVerify Tooltip Styles
4442
+ ============================================================================ */
4443
+
4444
+ .taskon-quest-eligs-onchain-item {
4445
+ display: inline;
4446
+ }
4447
+
4448
+ .taskon-quest-eligs-onchain-link {
4449
+ position: relative;
4450
+ display: inline;
4451
+ text-decoration: underline;
4452
+ cursor: pointer;
4453
+ color: var(--taskon-quest-text-lightest);
4454
+ }
4455
+
4456
+ .taskon-quest-eligs-onchain-link:hover {
4457
+ color: var(--taskon-quest-link);
4458
+ }
4459
+
4460
+ .taskon-quest-eligs-onchain-tooltip {
4461
+ position: absolute;
4462
+ bottom: calc(100% + 8px);
4463
+ left: 0;
4464
+ min-width: 260px;
4465
+ padding: 12px 16px;
4466
+ background-color: #222222;
4467
+ border: 1px solid rgba(255, 255, 255, 0.1);
4468
+ border-radius: var(--taskon-quest-radius-l);
4469
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);
4470
+ z-index: 100;
4471
+ font-size: 14px;
4472
+ line-height: 1.5;
4473
+ }
4474
+
4475
+ .taskon-quest-eligs-onchain-tooltip::before {
4476
+ content: "";
4477
+ position: absolute;
4478
+ bottom: -6px;
4479
+ left: 16px;
4480
+ width: 12px;
4481
+ height: 12px;
4482
+ background-color: #222222;
4483
+ border-right: 1px solid rgba(255, 255, 255, 0.1);
4484
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
4485
+ transform: rotate(45deg);
4486
+ }
4487
+
4488
+ .taskon-quest-eligs-onchain-tooltip p {
4489
+ margin: 0 0 8px 0;
4490
+ color: var(--taskon-quest-text-lighter);
4491
+ }
4492
+
4493
+ .taskon-quest-eligs-onchain-tooltip ul {
4494
+ margin: 0;
4495
+ padding: 0;
4496
+ list-style: disc;
4497
+ list-style-position: inside;
4498
+ }
4499
+
4500
+ .taskon-quest-eligs-onchain-tooltip ul li {
4501
+ margin: 4px 0;
4502
+ }
4503
+
4504
+ .taskon-quest-eligs-onchain-tooltip-link {
4505
+ color: var(--taskon-quest-link);
4506
+ text-decoration: underline;
4507
+ font-size: 14px;
4508
+ line-height: 18px;
4509
+ }
4510
+
4511
+ .taskon-quest-eligs-onchain-tooltip-link:hover {
4512
+ color: var(--taskon-quest-text-lightest);
4513
+ }
4514
+
4515
+ /* Poh provider item styles */
4516
+ .taskon-quest-eligs-poh-provider {
4517
+ font-weight: 500;
4518
+ }
4519
+
4520
+ /* NFT Holder copy styles */
4521
+ .taskon-quest-eligs-nft-name {
4522
+ position: relative;
4523
+ display: inline;
4524
+ color: var(--taskon-quest-secondary);
4525
+ cursor: pointer;
4526
+ text-decoration: underline;
4527
+ }
4528
+
4529
+ .taskon-quest-eligs-nft-name:hover {
4530
+ color: var(--taskon-quest-link);
4531
+ }
4532
+
4533
+ .taskon-quest-eligs-copied {
4534
+ position: absolute;
4535
+ bottom: calc(100% + 4px);
4536
+ left: 50%;
4537
+ transform: translateX(-50%);
4538
+ padding: 4px 8px;
4539
+ background-color: #222222;
4540
+ border-radius: var(--taskon-quest-radius-s);
4541
+ font-size: 12px;
4542
+ color: var(--taskon-quest-secondary);
4543
+ white-space: nowrap;
4544
+ pointer-events: none;
4545
+ animation: taskon-quest-fade-in 0.2s ease-out;
4546
+ }
4547
+
4548
+ @keyframes taskon-quest-fade-in {
4549
+ from {
4550
+ opacity: 0;
4551
+ transform: translateX(-50%) translateY(4px);
4552
+ }
4553
+ to {
4554
+ opacity: 1;
4555
+ transform: translateX(-50%) translateY(0);
4556
+ }
4557
+ }
4558
+
4559
+ /* ============================================================================
4560
+ BlindBox Dialog Wrapper
4561
+ ============================================================================ */
4562
+
4563
+ .taskon-quest-blindbox-dialog-wrapper {
4564
+ background: #0d0d0d;
4565
+ padding: 0;
4566
+ width: auto;
4567
+ max-width: 560px;
4568
+ }
4569
+
4570
+ .taskon-quest-blindbox-dialog-wrapper .taskon-dialog-body {
4571
+ padding: 0;
4572
+ }
4573
+
4574
+ .taskon-quest-blindbox-reward-wrapper {
4575
+ background: #0d0d0d;
4576
+ padding: 0;
4577
+ width: auto;
4578
+ max-width: 560px;
4579
+ }
4580
+
4581
+ .taskon-quest-blindbox-reward-wrapper .taskon-dialog-body {
4582
+ padding: 0;
4583
+ }
4584
+